多的不说,先上注释好的代码
主类:package 连连看V02;
import java.awt.Color; import java.awt.Graphics; import java.util.ArrayList; import javax.swing.ImageIcon; import javax.swing.JFrame; /* * * 连连看程序1.0 * 主类 * 本版本是从简单黑白棋版本过渡而来 */ public class ChessUI extends JFrame implements Config{ static{ //创建一个随机数d对象 java.util.Random random=new java.util.Random(); //将随机数加到一个队列中去 ArrayList<Integer> list=new ArrayList<Integer>(); for(int i=0;i<CHESSES.length*CHESSES[0].length/2;i++){ //随机一个数字,在1到10范围内 int number=random.nextInt(10)+1; //向队列中加两次,保证每个数字出现的次数为偶数 list.add(number); list.add(number); } /* * 创建图片时的理解: * 要求:1.图片总数比较是偶数,每一张图片的个数也必须是偶数 * 操作:将每一个类型的图片对应到队列的每一个数,CHESSES[i][j]表示的是在图形中的位置,CHESSES * 二维数组可以指向一个数,通过这个数,然后通过CHESSES_image[][]数组将图片按顺序存进去, * 这个1到10的随机数起到的是一个中间的过渡作用 */ for(int i=0;i<CHESSES.length;i++){ for(int j=0;j<CHESSES[i].length;j++){ //取一个随机的队列中的下标 int index=random.nextInt(list.size()); int t=list.remove(index);//从队列中移除这个随机数 //对二维数组中这个位置就行赋值,下一次循环时,代表这个t值的CHESSES[i][j]就取不到了, //因为这个t值已经从list中除去了 CHESSES[i][j]=t; CHESSES_image[i][j]=new ImageIcon("src/我的连连看V01/image/"+t+".gif"); } } } public static void main(String[] args){ ChessUI UI=new ChessUI(); UI.initChessUI(); } /* * 初始化界面的方法 */ public void initChessUI(){ this.setTitle("连连看v01"); this.setLocation(200, 200); this.setSize(600,600); //设置背景色 this.getContentPane().setBackground(new Color(134,224,13)); this.setResizable(false);//设置不可更改大小 this.setDefaultCloseOperation(3); this.setVisible(true); //setVisible之后就行抓取画布 Graphics g=this.getGraphics(); //给画布加上监听器 ChessListener csl=new ChessListener(g,this); //这里直接写UI是不行的,因为UI只是主类中的,并不能在方法中调用,所以用this表示ChessUI的对象 this.addMouseListener(csl); } /* * 编写一个重绘的方法 * * */ public void paint(Graphics g){ super.paint(g); this.paintTable(g); this.paintImage(g); } //重写一个画棋盘的方法 public void paintTable(Graphics g){ //画棋盘 //画横线 for(int i=0;i<ROWS;i++){ g.drawLine(X0, Y0+SIZE*i, X0+SIZE*(COLUMNS-1), Y0+SIZE*i); } //画竖线 for(int j=0;j<COLUMNS;j++){ g.drawLine(X0+SIZE*j,Y0,X0+SIZE*j,Y0+SIZE*(COLUMNS-1)); } } //重写一个画图片,其实也相当于棋子的方法 public void paintImage(Graphics g){ //重绘图片 for(int i=0;i<CHESSES.length;i++){ for(int j=0;j<CHESSES[i].length;j++){ //根据下标计算图片左上角的坐标 int X1=X0+SIZE*j; int Y1=Y0+SIZE*i; //如果数组值不等于0,就进行重绘 if(CHESSES[i][j]!=0){ g.drawImage(CHESSES_image[i][j].getImage(), X1, Y1, SIZE, SIZE, null); } } } } }
监听器类:
package 连连看V02; import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; /* * 监听器 * * * * */ public class ChessListener extends MouseAdapter implements Config{ private Graphics g; private ChessUI UI; int count=0;//用一个计数器使每两次相邻的点击在一个"组"内,再进行判断 int r1,c1,r2,c2;//两次点击的下标 int number1,number2; //构造函数,传入Graphics g这个变量 public ChessListener(Graphics g,ChessUI UI){ this.g=g; this.UI=UI; } //监听鼠标点击的地方,就行放子 //count的作用就是将这两次相邻的点击分为一组,避免了第二次点击的图形会和第三次点击的进行判断 public void mouseReleased(MouseEvent e){ int x=e.getX(); int y=e.getY(); if(count==0){ //算出是图片在在哪个单元格内 c1=(x-X0)/SIZE; r1=(y-Y0)/SIZE; number1=CHESSES[r1][c1]; count++; }else{ int c2=(x-X0)/SIZE; int r2=(y-Y0)/SIZE; number2=CHESSES[r2][c2]; count--; //如果是相同的图片,不是自己本身,而且不为空,则再进行算法的判断 if(number1==number2&(r1!= r2 || c1 != c2)&number1!=0){ //算法只要满足一个,就可以消去,消去就将对应位置的数组数据变为0 if(Suanfa.checkRow(r1,c1,r2,c2)||Suanfa.checkCulumn(r1,c1,r2,c2)){ CHESSES[r1][c1]=0; CHESSES[r2][c2]=0; // 刷新窗体,是个终极办法?但是要传入UI对象,所以要通过Listener()括号内传入UI javax.swing.SwingUtilities.updateComponentTreeUI(UI); } } } } }
算法类:
package 连连看V02; /* * 算法类:判断两个图片是否会被消掉 * 有以下几种情况: * 1.同行;2同列; * 3.两个图片只用2条线连起来(4种情况): * 4.两个图片用3条线连起来(这个是最复杂的,8种情况): * * * * */ public class Suanfa implements Config{ //同行的情况,算法 public static boolean checkRow(int r1,int c1,int r2,int c2){ //如果不同行,则返回false if(r1!=r2){ return false; } //同行时,那么这两个图片中间的都必须为空,否则返回false for(int i=Math.min(c1, c2)+1;i<Math.max(c1, c2);i++){ if(CHESSES[r1][i]!=0){ return false; } } //如果上面都成立则返回true return true; } //同列的情况,算法 public static boolean checkCulumn(int r1,int c1,int r2,int c2){ //同上 if(c1!=c2){ return false; } //同列时,两个图片的中间必须为空,否则返回false for(int j=Math.min(r1, r2)+1;j<Math.max(r1, r2);j++){ if(CHESSES[j][c1]!=0){ return false; } } //如果上面都成立则返回true return true; } }
保存常用参数的接口:package 连连看V02;
import javax.swing.ImageIcon; /* * 这是初级版本,画线只是为了方便标记位置 * 到后面的版本会去掉的 * * * */ //定义为接口,里面的属性可以被全局使用 public interface Config { public final int X0=50,Y0=50;//左上角的那个点的坐标 public final int ROWS=9,COLUMNS = 9;//定义横线和竖线的条数都为9 public final int SIZE=60;//定义单元格的大小为60 public final int CHESSSIZE=50;//定义棋子大小为50 //设置标记“棋子”的数组 public int[][] CHESSES=new int[ROWS-1][COLUMNS-1]; //设置放置图片的数组,与“棋子”位置对应 public ImageIcon[][] CHESSES_image=new ImageIcon[ROWS-1][COLUMNS-1]; }
这是代码,注释都在里面,今天学到了一个比较实用的自我检测错误的方法:打印。刚开始写完第一编。发现图片可以显示,但是点击鼠标无反应。这样我就在监听器类中就行打印。最后发现在将对应的数组赋值为0的操作中没有打印,说明那个if条件判断出了点问题,if条件判断里面是算法中的方法,找到根源,果然发现是在for循环中,i,j的下限是从两个数最小值+1开始的,因为忘记+1,所以导致无法判断。
下一步将对连连看进行改进吧:
1.背景换个好看点的。
2.算法写好,有许多种情况。
3.在鼠标按下的时候图片需要换一种状态,加个边框或者其他,今天在讲导入图片时,我记得有一个方法在后面是可以加上鼠标点击后的图片的。可以查下
上面是比较容易修改的。下面写几个扩展的,难一点吧
4.在图形消去的同时,画出比较淡的线连起这两个图片(初步想法觉得是在消去图形的前面调用drawLine的方法,具体要画什么样的线,当然可以根据上面判断的到底是调用的哪个算法来进行画线) 这里面还存在一个问题,有些情况会同时满足几个算法,例如2个在一行的,并且中间没有图形的,需要一个优先选择,选择那个最简单的来画线(想了下,在如果可以想消之后,套用3个if,就可以解决优先级顺序问题)
if(最简单的成立){
用最简单的算法
}else if(次简单的成立){
用次简单的方法
}else if{
用最麻烦的方法
}
5.消去的同时加个声音? 呵呵
6.提示和自动消除,重排序,当没有可消的时候,进行处理(1.直接随机换位置。2.提示不可消,自己手动用重排序功能)
7.倒计时,更高级的就是如果自己连的比较好,那么时间可以往上加。
8.不一定是一出来就是矩形,可以各种图形,像QQ连连看,随机的
9.是否可以弄个登陆界面,有几个选项,选择游戏难度,是否有声音,还有排行榜,或者可以选择用什么样的图形去排列图片
扩展功能还可以有很多吧,不想再多说了。因为我QQ连连看也有7W多分。所以对这个功能的多样性还是比较了解的。就看能实现多少了。慢慢来吧
相关推荐
MFC连连看 MFC连连看 MFC连连看 MFC连连看 MFC连连看
1. **图形界面**:C++通常会借助第三方库如Qt、SDL或SFML来创建图形用户界面(GUI)。这些库提供了绘制图形、处理用户输入等功能,使得我们可以构建出具有窗口和控件的游戏界面。连连看的界面通常包括游戏面板、时间...
《连连看》是一款深受大众喜爱的经典消除类游戏,它的核心玩法是通过寻找并连接两个相同图案的方块,使得它们在相连的路径上没有其他方块阻隔,从而达到消除的目的。这款游戏简单易上手,但却具有一定的挑战性和趣味...
连连看是一款广受欢迎的休闲消除类游戏,而MFC(Microsoft Foundation Classes)是微软提供的一套C++库,用于构建Windows应用程序。这个压缩包文件包含了使用MFC开发的连连看小游戏的源代码,适合对MFC编程感兴趣的...
连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看连连看...
连连看c#源码连连看c#源码连连看c#源码连连看c#源码连连看c#源码连连看c#源码连连看c#源码连连看c#源码连连看c#源码连连看c#源码连连看c#源码连连看c#源码连连看c#源码连连看c#源码连连看c#源码连连看c#源码连连看c#...
连连看,一款深受广大玩家喜爱的休闲益智游戏,以其简洁的规则和丰富的挑战性在众多游戏中独树一帜。本项目“连连看”正是基于CocosCreate开发的一款游戏,旨在为用户带来极致的娱乐体验。CocosCreate作为Cocos2d-x...
精品水晶连连看 精品水晶连连看. 精品水晶连连看 精品水晶连连看
好东西大家分享——JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看JAVA连连看
在本项目中,"连连看vc6.0实现"是一个基于Microsoft Visual C++ 6.0(简称VC6.0)开发的经典休闲游戏——连连看的实现。它利用了编程技术来构建游戏逻辑,其中涉及到了两个核心概念:双缓冲技术和连连看算法。 **双...
连连看20合一的超级连连看20合一的超级连连看20合一的超级连连看
连连看是一款广受欢迎的休闲消除类游戏,它的玩法简单,却又具有一定的挑战性。这个名为“连连看素材.rar”的压缩包文件显然包含了制作连连看游戏所需的图像资源。下面将详细探讨连连看游戏的设计元素以及这些素材在...
微信小游戏源码 奇葩连连看游戏源码(仅用于学习参考)微信小游戏源码 奇葩连连看游戏源码(仅用于学习参考)微信小游戏源码 奇葩连连看游戏源码(仅用于学习参考)微信小游戏源码 奇葩连连看游戏源码(仅用于学习...
java
《cocos creator连连看游戏》是一款使用Cocos Creator框架结合JavaScript语言开发的休闲益智类游戏,主要目标是通过连接相同图案的方块,直至消除所有方块来完成关卡。这款游戏适合初级开发者进行学习和实践,因为它...
连连看代码.cpp连连看代码.cpp连连看代码.cpp连连看代码.cpp连连看代码.cpp
总结,"H5连连看小游戏示例及源码"提供了一个快速创建H5连连看游戏的起点。开发者可以借此学习H5、CSS3和JavaScript的综合应用,并在此基础上进行个性化定制,以满足各种应用场景。无论是初学者还是有经验的开发者,...
在这个"Unity连连看小游戏"项目中,开发者已经构建了一个经典的游戏体验,包括游戏面板、视觉素材和核心算法。下面我们将深入探讨这个项目的各个方面。 首先,游戏面板是连连看游戏的核心组件,它是由一系列可匹配...
《使用MFC编写的连连看》是一款基于Microsoft Foundation Classes (MFC)库开发的经典益智游戏。MFC是微软提供的一套C++类库,它为Windows应用程序开发提供了丰富的功能和便捷的接口,使得开发者可以更高效地构建用户...
QQ连连看是一款深受玩家喜爱的经典休闲游戏,而“按键精灵”是一种自动化工具,它能够模拟用户的键盘和鼠标操作,极大地提升了工作效率或者游戏体验。在这个场景中,我们将关注的重点放在使用Vbscript(Visual Basic...