java连连看小游戏代码,
很多人从连连看或者五子棋等简单的游戏开始写游戏。最近也试着写了一篇连连看,试图把思路梳理一遍。
00-1010连连看要求通过一个空白通道,在一定范围内找到两个可以在两个对折(直角)内连接的特征相同的东西,然后连续点击两个东西就可以消除。我们一般会选择搭配图片,这样更直观,也更有趣。
00-1010二维数组用于存储,每个数组元素对应一个位置中的一个图片类型。比如我们用1,2,3,4代表四张不同的图片,0代表没有图片。那么二维数组{{}、{}、{}、{}}会相应地存储相应位置的数据。如果要对图片进行修改(连连看中的消去),只需要改变该位置对应的数组元素的值即可(本例中消去改为0)。
00-1010 1.一般来说,连看开始会随机生成图片。这里的随机生成需要使用random类中的nextInt方法,可以在给定的范围内随机生成一个随机整数。2.我们在生成数组的时候,需要考虑一个问题:连续图像的个数是偶数,这样才不会形成最后孤家寡人的尴尬局面。
//随机给一个数组值,初始化游戏数据public int[][]data(int[][]data){ int[][]d=data;Random Random=new Random();for(int I=0;i8;I){ d[0][I]=0;d[7][I]=0;} for(int I=1;i7;I){ d[I][0]=0;d[I][7]=0;} for(int I=0;i18i ){ 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的类型存储的,但是我们要呈现的效果是一张一张地图片.先导入所有带图像的图片,最好用数字给图片命名,这样可以批量导入。这里就不赘述了。请看示例代码:
public void init(){ im garr=new Image[Const。const _ TYPECOUNNT];for(int I=0;i imgArr.lengthi ){ imgArr[i]=新图像图标( llkImage/ i )。jpg’)。getImage();}}关于图片大小的调整,我用的是比较原始的方法:编辑图片本身的像素大小;也可以通过drawImage直接指定大小。
如何存储连连看的数据
当我们拖动或最小化一个没有重画的窗体时,它会变成空白。重绘意味着重写窗体的paint方法,这样窗体上的任何操作都会重写paint方法。也就是在屏幕上再画一遍。我们的棋子都是以二维数组的形式存在的,所以我们可以把画棋子的步骤放在重画中来实现,然后棋子就跟窗体一样,可以是ldq。
uo;一直存在了,也可以根据数组的改变来改变。
代码示例:
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(); }
成果展示
以上,我的游戏还是个很简单的模板,仍待完善,可以把界面做得更精美,还可以增加游戏难度的选择以及时间和步数的规定,最后还可以加上游戏的输赢判断,希望能够帮助到有需要的人。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。