用Java实现连连看小游戏

很多人写游戏都是从连连看或者五子棋这类的简单小游戏入手的,最近我也尝试着写了一个连连看,想要再梳理一遍其中的思路。

连连看的规则

连连看要求在一定范围内找到两个特征一样并且能够通过空白的通道在两折(直角)以内相连的东西,连续点击两个东西之后消除。
通常我们会选择用图片来进行匹配,这样更直观有趣。

如何存储连连看的数据

使用二维数组进行存储,每一个数组元素对应一个位置上的图片种类。
例如我们分别用1,2,3,4代表四个不同的图片,用0代表没有图片;那么二维数组{{},{},{},{}}就相应地存储对应位置的数据。如果要对图片进行变更(连连看中的消除),那么只需要改变该位置对应的数组元素的值就行了(在这个例子中,消除就改为0)。

如何实现数组数据的初始化

1、一般来说连连看开始都会随机生成图片,此处的随机生成需要用到Random类里面的nextInt方法,能随机生成给定范围内的随机一个整数。
2、我们生成数组的时候要考虑一个问题:连连看相同的图片个数是偶数,这样才不会到最后形成落单的尴尬局面。

//随机给出数组值,初始化游戏数据
public int[][] DATA(int[][] data){
            
            int[][] d=data;
            Random random=new Random();
            for(int i=0;i<8;i++){
                d[0][i]=0;
                d[7][i]=0;
            }
            for(int i=1;i<7;i++){
                d[i][0]=0;
                d[i][7]=0;
            }
            for(int i=0;i<18;i++){
                
            
                int m=random.nextInt(Const.Const_TYPECOUNNT)+1;
                int x1=random.nextInt(Const.COL)+1;
                int y1=random.nextInt(Const.COL)+1;
                
                while(d[x1][y1]!=0){
                    
                    x1=random.nextInt(Const.COL)+1;
                    y1=random.nextInt(Const.COL)+1;
                }
                d[x1][y1]=m;    
                int x2=random.nextInt(Const.COL)+1;
                int y2=random.nextInt(Const.COL)+1;
                while(d[x2][y2]!=0){
                    
                    x2=random.nextInt(Const.COL)+1;
                    y2=random.nextInt(Const.COL)+1;
                
            }
            d[x2][y2]=m;
            }
            return(d);
            
        }

如何绘制图片

连连看的存储都是以int的类型存储的,可我们要呈现出来的效果是一张一张的图片……
先用Image导入所有图片,最好图片的命名能够用数字命名,这样就可以批量导入了。这里就不过多赘述了,看实例代码吧:

 public void init(){
        imgArr = new Image[Const.Const_TYPECOUNNT];
        for(int i=0; i < imgArr.length; i++){
        imgArr[i] = new ImageIcon("llkImage/"+i+".jpg").getImage();
        }
    }

关于图片大小的调整我用的是比较原始的方法:编辑图片本身像素大小;还可以通过drawImage来直接规定大小。

重绘棋子

没有重绘的窗体在我们对其进行拖动或者最小化等改变的时候会变成空白的,重绘就是将窗体的paint方法重写,这样对窗体的任何操作都会将paint方法重新写一遍。也就是在屏幕上重新画一遍。
我们的棋子都存在一个二维数组里面,那么我们就可以将棋子绘制的步骤放在重绘里面来实现,那么棋子就跟窗体一样,可以“一直存在”了,也可以根据数组的改变来改变。

代码示例:

public void paint(Graphics g) {
        // 重绘paint方法
        super.paint(g);
        //

        for (int i = 1; i < Const.COL+1; i++) {
            for (int j = 1; j < Const.ROW+1; j++) {        
        if (data[i][j] == 0) {
            g.setColor(new Color(69,175,198));
            g.fillRect(Const.START_X + i * Const.SIZE, Const.START_Y + j * Const.SIZE, Const.SIZE, Const.SIZE);
        } 
        else {
            g.drawImage(imgArr[data[i][j]-1], Const.START_X + i * Const.SIZE, Const.START_Y + j * Const.SIZE, null);
             
            }
        }
    }

连连看的实现算法

两个图片消除的方法有三种:

1.直线连接
2.一折连接
3.二折连接

其中二折连接可以找一个点既与其中一个图片一折连接又与另一个图片直线连接;一折连接又可以找一个点与其中一个图片直线连接又与另一个图片直线连接。
所以综上所述,只需要写出一个直线连接的判断方法,我们所有的规则方法就都可以实现了。

数组的元素=0时代表这里的图片为空,有路可走。
首先,两个数组元素直线相连的前提是这两个元素的横坐标或者纵坐标相等且路径上的数组元素全部为零。

代码示例:

//0折点的方法
public boolean zero(int[][] data,int X1, int Y1,int X2,int Y2){
        int max; 
        int min;
    
        //x值相等
        if(X1==X2){
            max=Y1 > Y2 ? Y1:Y2;
            min=Y1 < Y2 ? Y1:Y2;
            for(int i=min+1;i<max;i++){
                if(data[X1][i]!=0){
                    return false;
                }
            }
            return true;
        }
        //y值相等
        else if(Y1==Y2){
            max=X1 > X2 ? X1:X2;
            min=X1 < X2 ? X1:X2;
            for(int i=min+1;i<max;i++){
                if(data[i][Y1]!=0){
                    return false;
                }
            }
        return true;
        }
        else return false;
    }
    //1折点的方法
    public boolean one(int[][] data,int X1, int Y1,int X2,int Y2){
        
        if((zero(data,X1,Y1,X1,Y2)&&zero(data,X1,Y2,X2,Y2)&&data[X1][Y2]==0)||(data[X2][Y1]==0&&zero(data,X1,Y1,X2,Y1)&&zero(data,X2,Y1,X2,Y2))){
            return true;
        }
        return false;
        }
    
    //2折点的方法
    public boolean two(int[][] data,int X1, int Y1,int X2,int Y2){ 
        //向下寻找一个第一折点
        for(int i=X1+1;i<=Const.COL+1;i++){
            if(zero(data,X1,Y1,i,Y1)&&one(data,i,Y1,X2,Y2)){
                return true;
            }
        }
        //向上寻找一个第一折点
        for(int i=X1-1;i>=0;i--){
            if(zero(data,X1,Y1,i,Y1)&&one(data,i,Y1,X2,Y2)){
                return true;
            }
        }
        //向左
        for(int i=Y1-1;i>=0;i--){
            if(zero(data,X1,Y1,X1,i)&&one(data,X1,i,X2,Y2)){
                return true;
            }
        }
        //向右
        for(int i=Y1+1;i<=Const.ROW+1;i++){
            if(zero(data,X1,Y1,X1,i)&&one(data,X1,i,X2,Y2)){
                return true;
            }
        }
        return false;
    }

如何获取两次鼠标点击的位置

废话不多说,直接上代码:

//鼠标点击松开事件
public void mouseReleased(MouseEvent e) {
        int x,y;
        Rule rule = new Rule();
        x = e.getX();
        y = e.getY();
        
        if(count%2==0){
        X1 = (x - Const.START_X) / Const.SIZE;
        Y1 = (y - Const.START_Y) / Const.SIZE;
        count++;
        }
        else {
        X2 = (x - Const.START_X) / Const.SIZE;
        Y2 = (y - Const.START_Y) / Const.SIZE;
        count++;
        if (rule.judge(X1, Y1, X2, Y2, data)&&
                (rule.zero(data,X1,Y1,X2,Y2)||rule.one(data, X1, Y1, X2, Y2)||rule.two(data, X1, Y1, X2, Y2))){
            data[X1][Y1]=0;data[X2][Y2]=0;
        }
        }
        
        ui.repaint();
        
    }

成果展示

以上,我的游戏还是个很简单的模板,仍待完善,可以把界面做得更精美,还可以增加游戏难度的选择以及时间和步数的规定,最后还可以加上游戏的输赢判断,希望能够帮助到有需要的人。

(0)

相关推荐

  • java基于swing实现的连连看代码

    本文实例讲述了java基于swing实现连连看代码.分享给大家供大家参考. 主要功能代码如下: 复制代码 代码如下: package llkan; import javax.swing.*; import java.awt.*; import java.awt.event.*; /**  * 连连看游戏  * @author Administrator  *2014年10月17日  */ public class MainGame implements ActionListener {     

  • java仿QQ连连看游戏

    关于这个项目,真的是花了很多心思在上面,从开始构思,到最后完成,真的是花了整整一个月.大概是11月初开始学java swing的时候有的想法,然后开始构思整个思路,相关算法讨论以及调试. 最开始先对连连看基础算法进行测试,就用一般的二维数组,然后就用控制台输入两个点的坐标进行删除,这一步就调试了我整整一个星期,基础算法搞完了 终于开始设计界面了,反正也不知道那时候花了多长时间才把界面给设计好,反正还设计的特别丑(至今也如此). 功能如下: 运行程序后有背景音乐 菜单栏有:重新开始,提示,炸弹,排

  • java连连看游戏菜单设计

    本文实例为大家分享了java连连看游戏菜单的具体实现代码,供大家参考,具体内容如下 先写GUI. 首先初始化框架,菜单,按钮,需要把菜单和按钮都添加在框架中.注意添加的顺序,首先要设置菜单,再设置框架,再设置按钮,如果交换了设置菜单和框架的顺序,会导致菜单显示不出,被框架挡住.对菜单设置了三个选项,第一个选项有五个下拉按键,用循环添加,第二个和第三个选项的下拉按键直接添加. GUI代码如下: package gui; import java.awt.Font; import javax.swin

  • Java实现连连看算法

    连连看是个经典的小游戏,规则是:两图案相同的方块在2折以内的线连接下可以消除.里面的算法还是非常有趣,今天来研究一下. 初始化棋盘 假设有一个8*8的棋盘,我们要将其扩充至10*10,为什么?因为这样外围的连接就可以不用越界了. 消除基本条件 判断是否具备消除的基本条件有 3 个 两个方块不能是同一个坐标 两个方块必须是同种类型(图案) 两个方块中不能有任何一个已经消除过的(消除过后的值用 mark 表示) // 判断是否具备消除的基本条件:两个方块不能是同一个坐标:两个方块必须是同种类型:两个

  • java实现连连看游戏

    本文实例为大家分享了java实现连连看游戏的具体代码,供大家参考,具体内容如下 代码会实现共享的,这个是截图 代码: package com.lr.bean; import java.util.Scanner; import java.util.Random; import com.lr.bean.Point; public class Link{ public static void main(String[] args){ Scanner sc=new Scanner(System.in);

  • Java实现简单连连看游戏

    本文实例为大家分享了Java实现连连看游戏的具体代码,供大家参考,具体内容如下 大二时做的Java课程设计,拿了个优秀,用了icon来模拟做了个简单的连连看,代码量不多,仅供参考. 课设要求是实现连连看最基本的功能,所以这里写了个简单的初始界面和经典模式的一个界面. 初始界面 代码如下: public class PictureMatching {     JButton classical = new JButton("经典模式");     JButton about = new

  • 用Java实现连连看小游戏

    很多人写游戏都是从连连看或者五子棋这类的简单小游戏入手的,最近我也尝试着写了一个连连看,想要再梳理一遍其中的思路. 连连看的规则 连连看要求在一定范围内找到两个特征一样并且能够通过空白的通道在两折(直角)以内相连的东西,连续点击两个东西之后消除.通常我们会选择用图片来进行匹配,这样更直观有趣. 如何存储连连看的数据 使用二维数组进行存储,每一个数组元素对应一个位置上的图片种类.例如我们分别用1,2,3,4代表四个不同的图片,用0代表没有图片:那么二维数组{{},{},{},{}}就相应地存储对应

  • java实现简易连连看小游戏

    本文实例为大家分享了java实现简易连连看小游戏的具体代码,供大家参考,具体内容如下 新手上路,分享一下 直接上代码 package linkgame; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.

  • java实现五子棋小游戏

    java实现五子棋小游戏 package Gomoku; import java.awt.Toolkit; import javax.swing.JFrame; public class GomokuFrame extends JFrame { //定义一个操作面板 OperatorPane op=null; public GomokuFrame() { //设置名称 this.setTitle("五子棋"); //设置窗口大小 this.setSize(510,510); //设置窗

  • Java编程经典小游戏设计-打砖块小游戏源码

    [程序中使用的数据结构和符号说明] HitBrick类 GreenBallThread控制小球路线 xUp,yUp,bouncing定义变量存储16位数值形式 x,y小球坐标 xDx,yDy坐标增量 MAX_X,MAX_Y坐标最大值 renew初始化 label标签 Rx,Ry横板坐标 Brick[]砖块 ball小球 HitBrick()定义小球横板及砖块位置坐标 keyPressd(keyEent)定义小球启动键(按空格键启动) keyReleased(keyEvent)接收键盘事件侦听器接

  • java实现桌球小游戏

    本文实例为大家分享了java实现桌球小游戏的具体代码,供大家参考,具体内容如下 桌球小游戏 两张图片放在src的同级目录下 版本一.出现窗口 package cn.xjion.game; /** * 出现窗口 * @author xjion * */ import java.awt.*; import javax.swing.*; //继承窗口类 public class BallGame extends JFrame{ // 窗口加载的方法 void launchFrame(){ // 窗口的

  • python递归法实现简易连连看小游戏

    问题:简单版连连看小游戏 一个分割成w*h个正方格子的矩形板上,每个正方格子可以有游戏卡,也可以没有游戏卡 两个游戏卡之间有一条路径相连需满足以下三个条件: 1.路径只包含水平和垂直的直线段 2.路径不能穿过别的游戏卡片 3.允许路径临时离开矩形板 输入要求: 第一行包括两个整数:w 和 h ; w:矩形板的宽度,h:矩形板的长度 下面h行,每行包括w个字符,表示矩形板上卡片的分布情况:'X'代表这个地方有卡片:'O'代表无卡片 之后一行包括4个整数:X1,Y1,X2,Y2(1<=X1,X2<

  • java猜数字小游戏案例

    本文实例为大家分享了java猜数字小游戏案例,供大家参考,具体内容如下 package day08; import java.util.Scanner; public class GuessNumber { /** * 猜数字小游戏:. 需求: 随机产生一个整数数1-100(被猜数)不设置输出 * 键盘录入一个玩家要猜的数字 * 判断猜大还是猜小了或者猜中 */ public static void main(String[] args) { // 随机产生整数1-100 int number

  • java实现扫雷小游戏

    本文实例为大家分享了java实现扫雷小游戏的具体代码,供大家参考,具体内容如下 代码: package GUI; import java.util.Random; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.awt.BorderLayout; import java.awt.GridLayo

  • java实现象棋小游戏

    本文实例为大家分享了java实现象棋小游戏的具体代码,供大家参考,具体内容如下 用Eclipse编写 java环境1.8jdk 代码如下 package xiangqi象棋; /** *中国象棋Java版V3.0 *源文件:Chess.java *添加功能:实现了当前棋局的保存 **/ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.io.*; //

  • java实现2048小游戏

    本文实例为大家分享了java实现2048小游戏的具体代码,供大家参考,具体内容如下 一.实现效果 二.实现代码 Check表示格子,GameView实现游戏视图界面及功能,是核心. Check.java import java.awt.Color; import java.awt.Font; // 方格类 public class Check { public int value; Font font1 = new Font("宋体", Font.BOLD, 46); Font fon

随机推荐