java连连看
基于Java的“连连看”游戏
功 能 区面 板
游 戏 区面 板
4 . 2 菜 单
菜 单 的 功 能 均没 有 实 现 .读 者 可 以 自行 添 加 :
J B u t t o n [ ] [ J J L a b e I
J L a b e l
Ti me r
d o t s t i m e s t r
J Bu t t o n
s t a r t
开 始 按 钮
J Me n u me n u G a me=n e w J Me n u ( ” 游戏“ ) : J Me n u me n u Se t= n e w J Me n u ( ” 设置“ ) :
J Me n u me n u H e l p= n e w J Me n u ( “ 帮助” ) :
t h i s . s e t S i z e ( 7 8 0 , 5 0 0 ) ;
t h i s . s e t T i t l e ( “ 连连看游戏” ) :
t h i s . S e t D e f a u l t C I o s e Op e r a t i o n ( J F r a me . E X I L ON — C L OS E ) : a d d my Me n u 0 ; / / 添 加 菜 单 a d d F u n c t i o n P a n e I ( ) : ∥添 力 口 功台 E 区
表 2 L i n k Ga me类 中的 方 法
方 法 名 方 法 功 能
I ma g e l c o n ( “ i ma g e / 2 . g i f “ ) ) ) : me n u He l p . a d d S e p a r a t o r ( ) :
连连看原理
用 JAVA 开发游戏连连看其实不管是做软件也好,做游戏也好,只要是写程序,在动手之前是一定会存在需求和分析的,如果不经过一定的分析就开始动手写程序,那么,这个程序一定会很难写下去的,最后的结果可能会导致放弃。
那么,在我们动手之前,让我们先简单的分析一下吧。
由于“连连看”并不是一个我们凭空开发的游戏,并且网上也已经有很多别人已经开发好的版本,因此,对于我们来说,我们已经拥有了一个很好的原型(比如说 QQ 游戏中的“连连看”),分析起来也应该是轻松得多。
由于 QQ 中的“连连看”是网络版,为了开发上的简便,我们先放弃网络功能,做一个简单的单机版就行了。
现在,让我们现在来看一看 QQ 中的连连看吧。
“连连看”的游戏规则其实并不复杂,首先,游戏开始的时候,地图上会有由数张不同的图片随机分散在地图上(并且每张图片会出现偶数次,通常是 4 次),只需要在地图上找出两张相同的图片(点),并且这两个点之前可以用不超过 3 条的直线连接起来就可以消除这两点,如此下去,直到地图上的点全部消除完就算游戏结束,怎么样,规则很简单吧?:)我们的开发就完全按照些规则来吧。
分析游戏规则找出算法通过上面的分析,我们已经知道了游戏规则,可是,我们怎么样去实现呢?其实所谓的实现也就是算法,那我们怎么样找出算法呢?别急,让我们来看一看上图,或者自己动手玩一玩别人做好的。
通过对上图的观察,我们发现,可以将游戏中的地图看作是一个二维数组,其中的所有图片(以下称“点”)可以看作是数组中的一个具体的元素。
那么,游戏中相同的图片可以看作是数组中不同位置两个值相同的元素。
至于直线,让我们给组数中的每一个元素赋一个特殊的值如 0 ,以表示地图上空白的位置。
并且同时规定:当连续的具有该特殊值的点的横向索引或纵向索引相同时,可以认为这是一条直线,比如下图:当数组中两点的值相同并且两点间只需要不超过 3 根直线能连接起来的时候,就让这两点的值变为 0 ,如果数组中全是 0 值的点,就认为游戏已经结束:)怎么样,算法够简单了吧:)用伪代码来描述程序的结构现在,我们用伪代码来描述一下游戏,假设用户开始了游戏:消除两点;上次选择的点 = null ;if ( 地图上已没有可消除的点 ) { 游戏结束;}}else {上次选择的点 = 当前点;}}else {上次选择的点 = 当前点;}}游戏结束;看看有没有什么问题?如果没有问题,我们进入下一步吧:)确定程序需要的模块当伪代码完成后,并且在我们的大脑里转了几圈发现没有问题后,现在就可以开始进行模块的划分工作了。
基于Android的连连看游戏的设计与实现毕业论文
Android在Linux核心的基础上,提供了各种合用的函数库,和一个完整的应用程式框架。并采用较符合商用限制的Apache版权。在Linux核心的基础上提供Google自制的应用程式运行环境(称作Dalvik,与Sun的J2ME不同),并提供基于Eclipse整合开发环境(IDE)的免费、跨平台(Windows、Mac OS X、Linux)开发工具(SDK),便于应用程式开发者学习、使用。免费、熟悉的跨平台开发工具,让具备一些物件导向观念,或视窗程式开发经验的开发者,能在一定时间内上手。1000万美元的大奖赛则提供了足够的诱因,让第一支Android手机正式面市前,就拥有了各式各样的应用程式可供使用。从不同角度来说,Android代表着一个崭新的开放原始码作业系统平台、一个友善的免费应用程式开发环境、一个与世界各地的程式开发者,站在相同起跑点上的公平竞争机会。而连连看作为一款经典的益智小游戏,一直以来都被众多的游戏爱好者喜欢,这个游戏,男女老少皆宜。游戏的吸引力主要在于,它在让玩家打发时间的同时,可以让人实现在显示生活中不能实现的理想,得到在现实中不能得到的东西。
参考文献………………………………………………………………..….…………………………..…39
第1章
2007年11月由Google牵头有30多家移动技术和无线应用领域领先企业组成的开放手机联盟(openHandset Alliance)发布了其智能手机平台——Android。Android是一个真正意义上的开放性移动设备综合平台,它包括操作系统、用户界面、中间件和应用程序,拥有移动电话工作所需的全部软件,同时其开放性保证该平台不存在任何阻碍移动产业创新的专有权障碍。
连连看源代码
摘要:近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,特别是Java与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言。
Java语言的学习热潮并没有因为时间的推移而消退,相反,由于计算机技术的发展所带来的新应用的出现,Java越来越流行,这种情况是以往程序设计语言在其生存周期内所不多见的。
Java语言之所以这样长盛不衰,一是因为其众多的技术特点与现今的应用十分合拍,可以覆盖大部分的需求;二是因为SUN公司不断推出新的版本,完善Java自身的功能。
有了这两点,Java语言成为程序员首选的程序设计开发工具就在情理之中了.连连看来源于街机游戏《四川麻将》和《中国龙》,是给一堆图案中的相同图案进行配对的简单游戏,在2003年,一个叫做朱俊的网友将这种形式搬到了PC上,立刻成为办公一族的新宠,并迅速传遍了世界各地。
饱受工作压力的人们没有太多的时间进行复杂的游戏,而对于这种动动鼠标就能过关的游戏情有独钟。
之后村子的连连看风靡版,阿达的连连看奥运版,连连看反恐版,还有敏敏连连看,水晶连连看等遍地开花,造就了一个连连看的新世界。
连连看游戏有多种地图样式和道具系统、大大加强了游戏的可玩性,是一款老少皆宜的休闲佳品。
关键字:发展,java,连连看,程序设计;1.课程设计介绍课题设计的目的:1) 进一步加深对Java语言的理解和掌握;将所学的JAVA知识运用于实践中。
2) 课程设计将理论与实践相结合,提供了一个既动手又动脑,独立实践的机会,锻炼我们的分析解决;实际问题的能力,提高学生适应实际,实践编程的能力。
3)熟练掌握JAVA语言中图形用户界面程序的编写;4)大体了解怎样用JAVA来编写小游戏的,增强我们实践能力和创新精神的综合培养。
课程设计的要求:由于Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。
面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承学会java程序开发的环境搭建与配置,并在实际运用中学习和掌握Java程序开发的全过程。
java蔬菜连连看游戏程序设计组
《面向对象的程序设计》课程设计1、题目:蔬菜连连看游戏程序设计2、实验目的:通过在指定的窗口界面完成“连连看”小游戏程序的编写和调试加深对面向对象程序设计的理解3、主要功能:相同图片相邻或连成一条直线可消除,相同图片之间只转一个或两个弯也可消除4、平台:在Windows 7下使用MyEclipse 开发5、设计参数:A.该程序界面为方格类型,由纵10横10的直线交叉组成,分别是8行8列方块拼接,共64格小方块。
方块上随即分布一些数字,数字的要求是至两两相同,位置随机打乱。
B.游戏规则是将相同数字的方块连接,若连接一对成功就消失于界面,继续游戏,知道游戏结束。
C.游戏设有时间要求,时间到,游戏结束。
D.游戏可以选择难度,分别为简单,中等,较难、超难。
E.游戏有记录得分和关卡。
F.6、设计组:7、完成情况:a.本程序源代码保存形式为lianliankan.java,在MyEclipse工具下开发。
b.本程序由两个类构成,分别是class lianliankan 和 class lianliankanJPanel,其中class lianliankanJPanel是内部类。
c.本程序由画画函数 painComponent()、重载函数chongzai()、重新开始游戏newGame()、所有方块清除,进入下一关guoguan()、新建地图newMap()、判断是否在一条直线上linecheck()、判断能否折角相连zhejiaocheck()、判断能否两次折角相连liangcizejiaocheck()、能否在两次折角内连接ifcanTouch()、清除两个一样的符合条件的方块clearBlock()、选择难度itemStateChanged()、主函数main()、画画函数paintCompinent()等十三个函数组成。
8、工作评价:9、其他说明:附上代码:package lianliankan;import java.awt.*;// java.awt包,即java抽象窗口工具包,提供如Button(按钮)、TextField(文本框)和List(列表) import javax.swing.*;//javax.swing是图形可视包,导入进行图形化软件的开发import java.awt.event.*;public class lianliankan extends JFrame{private static final long serialVersionUID = 1L;public lianliankan(){lianliankanJPanel llk=new lianliankanJPanel();//是个容器,可以把JButton,JTextArea,JTextFiled等加入add(llk);}class lianliankanJPanel extends JPanel implements ActionListener,ItemListener{private static final long serialVersionUID = 1L;private int[][] map=new int[10][10];private int kinds,randomx,randomy,randomx1,randomy1;private int coordinatex,coordinatey,coordinatex1,coordinatey1;private Point lineStart=new Point(0,0);private int clicktimes;private int jishushengyu;private int fruitKinds=4;private int score;private int guanshu;loudou ld=new loudou();JButton BlockButton[][]=new JButton[10][10];Choice difficultChoice = new Choice();JButton newgameButton=new JButton("开始");JButton reLoad=new JButton("刷新");ImageIcon aIcon = new ImageIcon("image/sucai1.jpg");ImageIcon bIcon = new ImageIcon("image/sucai2.jpg");ImageIcon cIcon = new ImageIcon("image/sucai3.jpg");ImageIcon dIcon = new ImageIcon("image/sucai4.jpg");ImageIcon eIcon = new ImageIcon("image/sucai5.jpg");ImageIcon fIcon = new ImageIcon("image/sucai6.jpg");ImageIcon gIcon = new ImageIcon("image/sucai7.jpg");ImageIcon hIcon = new ImageIcon("image/sucai8.jpg");ImageIcon iIcon = new ImageIcon("image/sucai9.jpg");ImageIcon jIcon = new ImageIcon("image/sucai10.jpg");ImageIcon k1Icon = new ImageIcon("image/sucai11.jpg");ImageIcon lIcon = new ImageIcon("image/sucai12.jpg");ImageIcon mIcon = new ImageIcon("image/sucai13.jpg");ImageIcon nIcon = new ImageIcon("image/sucai14.jpg");ImageIcon oIcon = new ImageIcon("image/sucai15.jpg");ImageIcon kIcon = new ImageIcon("image/kongbai.jpg");public lianliankanJPanel(){this.setLayout(null);newMap();for(int i=0;i<10;i++){for(int j=0;j<10;j++){BlockButton[i][j]=new JButton();add(BlockButton[i][j]);BlockButton[i][j].addActionListener(this);BlockButton[i][j].setBounds(j*40, i*40, 40, 40);}}difficultChoice.add("简单");difficultChoice.add("中等");difficultChoice.add("较难");difficultChoice.add("超难");newgameButton.setBounds(map[0].length*40+30, 20, 60, 20);reLoad.setBounds(map[0].length*40+30, 60, 60, 20);difficultChoice.setBounds(map[0].length*40+30, 100, 60, 20);difficultChoice.addItemListener(this);newgameButton.addActionListener(this);reLoad.addActionListener(this);ld.setBounds(map[0].length*40+30, 240, 70, 160);this.add(ld);this.add(newgameButton);this.add(reLoad);this.add(difficultChoice);}public void paintComponent(Graphics g) //画画函数{super.paintComponent(g);g.drawString("得分: "+score, 430, 160);g.drawString("第 "+(guanshu+1)+" 关", 430, 200);for(int i=0;i<10;i++){for(int j=0;j<10;j++){switch (map[i][j]){case 0:BlockButton[i][j].setIcon(kIcon);break;case 1:BlockButton[i][j].setIcon(aIcon);break;case 2:BlockButton[i][j].setIcon(bIcon);break;case 3:BlockButton[i][j].setIcon(cIcon);break;case 4:BlockButton[i][j].setIcon(dIcon);break;case 5:BlockButton[i][j].setIcon(eIcon);break;case 6:BlockButton[i][j].setIcon(fIcon);break;case 7:BlockButton[i][j].setIcon(gIcon);break;case 8:BlockButton[i][j].setIcon(hIcon);break;case 9:BlockButton[i][j].setIcon(iIcon);break;case 10:BlockButton[i][j].setIcon(jIcon);break;case 11:BlockButton[i][j].setIcon(k1Icon);break;case 12:BlockButton[i][j].setIcon(lIcon);break;case 13:BlockButton[i][j].setIcon(mIcon);break;case 14:BlockButton[i][j].setIcon(nIcon);break;case 15:BlockButton[i][j].setIcon(oIcon);break;default:break;}}}}public void chongzai() //重载函数{jishushengyu=0;for(int i=1;i<9;i++){for(int j=1;j<9;j++){if(map[i][j]>0){jishushengyu++;}}}int[][] map1=new int[10][10];this.map=map1;for(int i=0;i<jishushengyu/2;i++){kinds=(int)(Math.random()*1000)%fruitKinds+1;do {randomx1=(int)(Math.random()*1000)%8+1;randomy1=(int)(Math.random()*1000)%8+1;} while (map[randomy1][randomx1]>0);map[randomy1][randomx1]=kinds;do {randomx=(int)(Math.random()*1000)%8+1;randomy=(int)(Math.random()*1000)%8+1;} while (map[randomy][randomx]>0);map[randomy][randomx]=kinds;}repaint();}public void newGame() //重新开始游戏{for(int i=0;i<10;i++){for(int j=0;j<10;j++){BlockButton[j][i].setEnabled(true);}}int[][] map=new int[10][10];this.map=map;newMap();ld.setTimes(0);score=0;guanshu=0;ld.setdijiguan(guanshu);}public void guoguan() //过关后所有方块自动清除进行下一关{int jishushengyu2=0;for(int i=1;i<9;i++){for(int j=1;j<9;j++){if(map[i][j]>0){jishushengyu2++;}}}if(jishushengyu2==0){int[][] map=new int[10][10];this.map=map;newMap();ld.setTimes(0);guanshu++;ld.setdijiguan(guanshu);reLoad.setEnabled(true);}}public void newMap() //新建地图{for(int i=0;i<32;i++){kinds=(int)(Math.random()*1000)%fruitKinds+1;do {randomx1=(int)(Math.random()*1000)%8+1;randomy1=(int)(Math.random()*1000)%8+1;} while (map[randomy1][randomx1]>0);map[randomy1][randomx1]=kinds;do {randomx=(int)(Math.random()*1000)%8+1;randomy=(int)(Math.random()*1000)%8+1;} while (map[randomy][randomx]>0);map[randomy][randomx]=kinds;}}public boolean linecheck(int y1,int x1,int y2,int x2){ //判断是否在一条直线上if(y1==y2){if(x2>x1){int j=0;for(int i=0;i<x2-x1-1;i++){if(map[y1][x1+i+1]>0)j++;}if(j==0)return true;}if(x1>x2){int j=0;for(int i=0;i<x1-x2-1;i++){if(map[y1][x2+i+1]>0)j++;}if(j==0)return true;}}if(x1==x2){if(y2>y1){int j=0;for(int i=0;i<y2-y1-1;i++){if(map[y1+i+1][x1]>0)j++;}if(j==0)return true;}if(y1>y2){int j=0;for(int i=0;i<y1-y2-1;i++){if(map[y2+i+1][x1]>0)j++;}if(j==0)return true;}}return false;}public boolean zhejiaocheck(int y1,int x1,int y2,int x2) //判断能否折角相连{if(linecheck(y1,x1,y2,x1)&&linecheck(y2,x1,y2,x2)&&map[y2][x1]==0){return true;}if(linecheck(y1,x1,y1,x2)&&linecheck(y1,x2,y2,x2)&&map[y1][x2]==0) {return true;}return false;}public boolean liangcizhejiaocheck(int y1,int x1,int y2,int x2) //判断能否两次折角相连{for(int i=0;i<9;i++){if(x2+1+i<10&&map[y2][x2+1+i]==0&&linecheck(y2, x2, y2, x2+1+i)){if(zhejiaocheck(y1, x1, y2, x2+1+i))return true;}if(x2-1-i>=0&&map[y2][x2-1-i]==0&&linecheck(y2, x2, y2, x2-1-i)){if(zhejiaocheck(y1, x1, y2, x2-1-i))return true;}if(y2+1+i<10&&map[y2+1+i][x2]==0&&linecheck(y2, x2, y2+1+i, x2)){if(zhejiaocheck(y1, x1, y2+1+i, x2))return true;}if(y2-1-i>=0&&map[y2-1-i][x2]==0&&linecheck(y2, x2, y2-1-i, x2)){if(zhejiaocheck(y1, x1, y2-1-i, x2))return true;}}return false;}public boolean ifcanTouch(int y1,int x1,int y2,int x2) //能否在两次折角内连接{if(y1==y2&&(x1==x2+1||x1==x2-1)) //相邻{return true;}if(x1==x2&&(y1==y2+1||y1==y2-1)){return true;}if(linecheck(y1,x1,y2, x2)) //一条线上{return true;}if(zhejiaocheck(y1, x1, y2, x2)) //折角上return true;}if(liangcizhejiaocheck(y1, x1, y2, x2)) //两次折角{return true;}if(liangcizhejiaocheck(y2, x2, y1, x1)){return true;}return false;}public void clearBlock() //清除符合条件的方块{if(clicktimes>=2){if(map[coordinatey1][coordinatex1]==map[coordinatey][coordinatex]&&!((coordinatex1==coordinatex)&&(coordinatey1==coordinatey))) {if(ifcanTouch(coordinatey1, coordinatex1, coordinatey, coordinatex)){if(map[coordinatey1][coordinatex1]>0)score=score+10;map[coordinatey1][coordinatex1]=0;map[coordinatey][coordinatex]=0;guoguan();}}}}public void actionPerformed(ActionEvent e){if(ld.getTimes()==55){for(int i=0;i<10;i++){for(int j=0;j<10;j++){BlockButton[j][i].setEnabled(false);}}if(e.getSource()==reLoad){chongzai();reLoad.setEnabled(false);}if(e.getSource()==newgameButton){newGame();reLoad.setEnabled(true);}for(int i=0;i<10;i++){for(int j=0;j<10;j++){if(e.getSource()==BlockButton[j][i]){clicktimes++;lineStart.move(i,j);if(clicktimes%2==1){coordinatex1=i;coordinatey1=j;}if(clicktimes%2==0){coordinatex=i;coordinatey=j;}}}}this.requestFocus();clearBlock();repaint();}public void itemStateChanged(ItemEvent e) //选择难度{if(e.getSource()==difficultChoice){String selected = difficultChoice.getSelectedItem();if(selected=="简单"){fruitKinds=4;newGame();repaint();}else if(selected=="中等"){fruitKinds=8;newGame();repaint();}else if(selected=="较难"){fruitKinds=12;newGame();repaint();}else if(selected=="超难"){fruitKinds=15;newGame();repaint();}}}}public static void main(String[] args) //主函数{lianliankan frame=new lianliankan();frame.setTitle("水果蔬菜连连看王春辉陈坤炜王国林杨彬程秋瑜 ");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setLocation(440, 100);frame.setSize(540,440);frame.setVisible(true);}}class loudou extends JPanel implements Runnable{private static final long serialVersionUID = 1L;private int dijiguan;int remainTimes=0;int y1=35;int x2=60;int y2=155;Thread nThread1;JLabel overJLabel=new JLabel("GAMESTART");JDialog dialog=new JDialog();public loudou(){nThread1=new Thread(this);nThread1.start();this.setLayout(null);this.add(overJLabel);overJLabel.setBounds(0, 0, 90, 30);}public void setdijiguan(int x){this.dijiguan=x;}public void paintComponent(Graphics g) //画画函数{super.paintComponent(g);g.setColor(Color.red);g.drawLine(x1, y1, x2, y2);g.drawLine(x2, y1, x1, y2);g.drawLine(x1, y1, x2, y1);g.drawLine(x1, y2, x2, y2);g.fill3DRect(x1, y1-5, x2+1, y1, true);g.fill3DRect(x1, y2, x2+1, y1+3, true);g.setColor(Color.lightGray);g.drawLine(x1, y1, x1, y2);g.drawLine(x2, y1, x2, y2);g.setColor(Color.green);for(int i=0;i<60;i++){g.drawLine(x1+i/2+2, y1+i, x2-i/2-2, y1+i);}if(remainTimes<55){for(int i=0;i<remainTimes;i++)g.drawLine(x1+i/2+2, y2-i-1, x2-i/2-2, y2-i-1);}g.drawLine((x1+x2)/2, (y1+y2)/2, (x1+x2)/2 ,y2-2);g.drawLine((x1+x2)/2+1, (y1+y2)/2+1, (x1+x2)/2+1 ,y2-2);g.setColor(getBackground());for(int i=0;i<remainTimes;i++){g.drawLine(x1+i/2+2, y1+i, x2-i/2-2, y1+i);}}if(remainTimes>=50&&remainTimes<=55)overJLabel.setText(" "+(55-remainTimes)+" SCEND");}public void setTimes(int x){this.remainTimes=x;}public int getTimes(){return remainTimes;}public void run(){while(dijiguan<20){if(remainTimes==0){overJLabel.setText(" START !");}if(remainTimes==56){overJLabel.setText("TIME'S UP");JOptionPane.showMessageDialog(null,"游戏结束");}remainTimes++;repaint();try {if(dijiguan<6)Thread.sleep(1200-dijiguan*100);if(dijiguan>=6&&dijiguan<=8)Thread.sleep(700-(dijiguan-5)*50);if(dijiguan>8)Thread.sleep(550-(dijiguan-8)*20);}catch (InterruptedException e){e.printStackTrace();}}}}运行产生以下界面:。
连连看实验报告
一、实验目的1. 熟悉并掌握使用Java语言进行图形界面编程的基本方法。
2. 理解并运用面向对象编程思想,提高编程能力。
3. 掌握连连看游戏的基本原理和实现方法。
4. 培养团队合作能力和创新意识。
二、实验内容1. 熟悉Java语言的基本语法和面向对象编程思想。
2. 使用Java Swing库开发图形界面。
3. 实现连连看游戏的基本功能,包括游戏界面、数据结构、逻辑算法等。
三、实验环境1. 操作系统:Windows 102. 开发工具:Eclipse3. 编程语言:Java四、实验步骤1. 创建Java项目,命名为“连连看游戏”。
2. 设计游戏界面,包括游戏区域、时间显示、分数显示等。
3. 定义数据结构,用于存储游戏中的图片和匹配关系。
4. 编写游戏逻辑算法,包括初始化游戏、随机生成图片、匹配图片等。
5. 实现游戏控制,包括鼠标点击事件、图片移动、匹配判断等。
6. 编写游戏结束判断和结果显示。
五、实验结果与分析1. 实验结果通过以上步骤,成功开发了一个连连看游戏。
游戏界面美观,功能完善,可以满足用户的基本需求。
2. 实验分析(1)游戏界面设计:采用Java Swing库中的JPanel、JLabel等组件,实现了游戏界面的布局。
通过设置背景图片、颜色等属性,使游戏界面更具吸引力。
(2)数据结构:使用二维数组存储游戏中的图片,每行每列代表一个位置。
通过遍历数组,判断相邻图片是否可以匹配。
(3)逻辑算法:在游戏开始时,随机生成图片并存储到数组中。
当用户点击一个图片时,判断其相邻图片是否可以匹配。
如果可以匹配,则将这两个图片移动到一起,并更新分数和时间。
(4)游戏控制:通过监听鼠标点击事件,实现图片的移动和匹配判断。
当图片移动到一起时,判断是否匹配,并更新游戏状态。
六、实验总结1. 通过本次实验,掌握了Java语言的基本语法和面向对象编程思想,提高了编程能力。
2. 熟悉了Java Swing库在图形界面编程中的应用,为以后开发类似项目奠定了基础。
连连看游戏(C#)
连连看游戏(C#)自己动手做一个简单的连连看游戏。
(很多可扩展的空能,留给各位自行扩展)游戏规则就不说了,大家应该都知道吧。
运行画面:图标区域就是连连看的操作区域,这部分的表示是程序随机生成的。
1,通过先后点击2个图标,程序会判断这2个图标是否可连接,如果可以连接就将这2个图标从图中消失(截图中,空白的2个图标,就是连接后,消失的)。
2,左下是计时区域。
目前可以计时,但时间倒数为0时,程序不会自动终止(各位可以自行实现这个功能)。
3,右上是设定区域。
当第一局游戏结束后,可以通过点击按钮“再开始”以开始新的游戏。
游戏模式可以自行设定。
例如“15*12----6”代表15行、12列、每种图标数量为6个(可以计算出需要15*12/6=30 个不同的图标)。
4,右下是帮助区域。
当找不到可以连接的图标时,可以点下“Help”寻求程序帮助(现状当程序无解的时候,不会自动提醒玩家,各位可自行实现)。
想要重排画面上的图标时(有时候很长时间都找不到怎么连接),可以点击“画面Data调整”按钮(各位可以自行实现)。
CheckBox“连接线表示”是在玩家点击了2个图标后,程序自动描画一个连接2个图标的线。
CheckBox“空格子表示”是为了给消失了的格子画线,不勾上的时候,消失的格子将不会有虚线框表示。
程序结构:1,Group文件夹内是44个系统图片,用来表示相同的格子。
代码中随机生成的是2维int数组,但是表示的时候,将相同的int数字用图片代替。
每一局游戏的图片都是随机从这44个图片中产生的。
2,Form1。
就是我们所看到的的主画面。
3,PnlCanvas。
左上操作区域的画布控件。
程序主要代码:各位可以自行尝试,或发邮件至********************索取源代码1,Form1.cs:using System;using System.Collections.Generic;using System.Drawing;using System.Windows.Forms;namespace GameLianliankan{public partial class Form1 : Form{///<summary>空位置坐标</summary>private static Point NullPoint = new Point(-1, -1);///<summary>空值</summary>private static int NullNum = -1;///<summary>横向起点基准坐标</summary>private static int basePX = 30;///<summary>纵向起点基准坐标</summary>private static int basePY = 30;///<summary>前一次选中格子的颜色</summary>private Color preClickBorderColor = Color.DeepPink;///<summary>前一次选中格子的位置</summary>private Point preClickPoint = NullPoint;///<summary>ヘルプ点1</summary>private Point ptHelp1 = NullPoint;///<summary>ヘルプ点2</summary>private Point ptHelp2 = NullPoint;private Color helpBorderColor = Color.DeepSkyBlue;private int totalTime = 600;private int curTime = 0;///<summary>每一个格子横向宽度</summary>private int lengthX = 50;///<summary>每一个格子纵向高度</summary>private int lengthY = 50;///<summary>格子值二维数组</summary>private int[,] aryPic;///<summary>连连看游戏图标</summary>private List<Icon> lstIcons = new List<Icon>();///<summary>格子值与图标Index之间的关系</summary>private Dictionary<int, int> dicValueToIndex = new Dictionary<int, int>();public Form1(){InitializeComponent();}///<summary>///画面Load場合、データ作成///</summary>///<param name="sender"></param>///<param name="e"></param>private void Form1_Load(object sender, EventArgs e){this.cmbKind.SelectedIndex = 0;for (int i = 1; i < 100; i++){object ob =Properties.Resources.ResourceManager.GetObject(string.Format("_{0}", i.ToString("00")));if (ob is Icon){Icon icon = ob as Icon;if (icon.Width == 32 && icon.Height == 32){lstIcons.Add(icon);}else{icon.Dispose();icon = null;}}}btnRestart_Click(null, null);}///<summary>///画面データ再作成///</summary>///<param name="sender"></param>///<param name="e"></param>private void btnRestart_Click(object sender, EventArgs e){this.ptHelp1 = NullPoint;this.ptHelp2 = NullPoint;timer.Stop();pgbTime.Value = 100;curTime = 0;int perCount = GetSetRowColCount();dicValueToIndex.Clear();//例:「列、行」aryPic = new int[(pnlShow.Width - 2 * basePX) / lengthX, (pnlShow.Height - 2 * basePY) / lengthY];Random random = new Random(Environment.TickCount);List<int> lstIndex = new List<int>();for (int i = 0; i < lstIcons.Count; i++){lstIndex.Add(i);}List<int> lstRandom = new List<int>(aryPic.GetLength(0) *aryPic.GetLength(1));for (int i = 0; i * perCount < lstRandom.Capacity; i++){for (int j = 0; j < perCount; j++){lstRandom.Add(i + 1);}int index = random.Next(0, lstIndex.Count - 1);dicValueToIndex.Add(i + 1, lstIndex[index]);lstIndex.RemoveAt(index);}//行for (int i = 0; i < aryPic.GetLength(1); i++){//列for (int j = 0; j < aryPic.GetLength(0); j++){int index = random.Next(0, lstRandom.Count - 1);aryPic[j, i] = lstRandom[index];lstRandom.RemoveAt(index);}}this.pnlShow.Refresh();timer.Start();}///<summary>///データを表示///</summary>///<param name="sender"></param>///<param name="e"></param>private void pnlShow_Paint(object sender, PaintEventArgs e) {#region基本格子的描画//行for (int i = 0; i < aryPic.GetLength(1); i++){//列for (int j = 0; j < aryPic.GetLength(0); j++){Rectangle rect = new Rectangle(new Point(j * lengthX + basePX, i * lengthY + basePY), new Size(lengthX, lengthY));if (aryPic[j, i] == NullNum){if (chkIsNullShow.Checked){using (Pen pen = new Pen(Color.Red)){pen.DashStyle =System.Drawing.Drawing2D.DashStyle.Dot;e.Graphics.DrawRectangle(pen, rect);}}continue;}using (Pen pen = new Pen(Color.LightSteelBlue)){e.Graphics.DrawRectangle(pen, rect);}#regionアイコン描画int index = dicValueToIndex[aryPic[j, i]];rect.X += (rect.Width - lstIcons[index].Width) / 2;rect.Y += (rect.Height - lstIcons[index].Height) / 2;e.Graphics.DrawIconUnstretched(lstIcons[index], rect);#endregion//TextRenderer.DrawText(e.Graphics, aryPic[j, i].ToString(), this.Font, rect, Color.Black);}}#endregion#region选中格子的描画if (preClickPoint != NullPoint){Rectangle rect = new Rectangle(new Point(preClickPoint.X * lengthX + basePX, preClickPoint.Y * lengthY + basePY), new Size(lengthX, lengthY));using (Pen pen = new Pen(preClickBorderColor)){pen.Width = 2;e.Graphics.DrawRectangle(pen, rect);}using (SolidBrush brush = new SolidBrush(Color.FromArgb(128, preClickBorderColor))){e.Graphics.FillRectangle(brush, rect);}}#endregion#region帮助格子的描画if (ptHelp1 != NullPoint && ptHelp2 != NullPoint){Rectangle rect1 = new Rectangle(new Point(ptHelp1.X * lengthX + basePX, ptHelp1.Y * lengthY + basePY), new Size(lengthX, lengthY));Rectangle rect2 = new Rectangle(new Point(ptHelp2.X * lengthX + basePX, ptHelp2.Y * lengthY + basePY), new Size(lengthX, lengthY));using (Pen pen = new Pen(helpBorderColor)){pen.Width = 2;e.Graphics.DrawRectangle(pen, rect1);e.Graphics.DrawRectangle(pen, rect2);}using (SolidBrush brush = new SolidBrush(Color.FromArgb(128, helpBorderColor))){e.Graphics.FillRectangle(brush, rect1);e.Graphics.FillRectangle(brush, rect2);}}#endregion}///<summary>///クリックエベント///</summary>///<param name="sender"></param>///<param name="e"></param>private void pnlShow_MouseClick(object sender, MouseEventArgs e) {if (e.X < basePX || e.Y < basePY){preClickPoint = NullPoint;pnlShow.Refresh();return;}//列int x = (e.X - basePX) / lengthX;//行int y = (e.Y - basePY) / lengthY;if (x >= aryPic.GetLength(0) || y >= aryPic.GetLength(1)){preClickPoint = NullPoint;pnlShow.Refresh();return;}if (aryPic[x, y] == NullNum){preClickPoint = NullPoint;}else{ptHelp1 = NullPoint;ptHelp2 = NullPoint;if (preClickPoint == NullPoint){preClickPoint.X = x;preClickPoint.Y = y;}else if (preClickPoint.X == x && preClickPoint.Y == y){return;}else{Point curClickPoint = new Point(x, y);bool isOK = TryToConnect(preClickPoint, curClickPoint);if (isOK){aryPic[preClickPoint.X, preClickPoint.Y] = NullNum; aryPic[curClickPoint.X, curClickPoint.Y] = NullNum; }else{}preClickPoint = NullPoint;}}pnlShow.Refresh();}///<summary>///帮助按钮按下后,由程序寻找可连接的两个格子///</summary>///<param name="sender"></param>///<param name="e"></param>private void btnHelp_Click(object sender, EventArgs e){bool existFlg = false;for (int i = 0; i < aryPic.GetLength(0); i++){for (int j = 0; j < aryPic.GetLength(1); j++){if (aryPic[i, j] == NullNum) continue;existFlg = true;for (int m = i; m < aryPic.GetLength(0); m++){for(int n = ((m == i) ? j + 1 : 0); n < aryPic.GetLength(1); n++) {if (aryPic[m, n] == NullNum) continue;if (aryPic[i, j] != aryPic[m, n]) continue;if (TryToConnect(new Point(i, j), new Point(m, n))){ptHelp1.X = i;ptHelp1.Y = j;ptHelp2.X = m;ptHelp2.Y = n;this.pnlShow.Refresh();return;}}}}}if (!existFlg){MessageBox.Show("所有格子都已连接完毕,请重新开始游戏!");}else{MessageBox.Show("已无可连接格子!\r\n请点击「画面データ調整」按钮以随机调整!");}}///<summary>///画面上剩余的格子数剧随机再调整///</summary>///<param name="sender"></param>///<param name="e"></param>private void btnResort_Click(object sender, EventArgs e){MessageBox.Show("...待实现...");}///<summary>///空格子表示///</summary>///<param name="sender"></param>///<param name="e"></param>private void chkIsNullShow_CheckedChanged(object sender, EventArgs e) {this.pnlShow.Refresh();}///<summary>///画面表示///</summary>///<param name="sender"></param>///<param name="e"></param>private void chkMode_CheckedChanged(object sender, EventArgs e){if (!chkMode.Checked){this.Width = 1011;chkMode.Text = "<";}else{this.Width = 685;chkMode.Text = ">";}}///<summary>///快捷键///</summary>///<param name="sender"></param>///<param name="e"></param>private void Form1_KeyDown(object sender, KeyEventArgs e){//ヘルプif (e.KeyCode == Keys.F1){this.btnHelp_Click(null, null);}//再開始else if (e.KeyCode == Keys.F5){if (MessageBox.Show("再開始?", "確認", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) {this.btnRestart_Click(null, null);}}}private void timer_Tick(object sender, EventArgs e){curTime++;int value = (totalTime - curTime) * 100 / totalTime;if (value < 0) value = 0;pgbTime.Value = value;this.lblTime.Text = string.Format("{0}:{1}", ((totalTime - curTime) / 60).ToString("00"), ((totalTime - curTime) % 60).ToString("00"));}#region主要方法///<summary>///連接計算///</summary>///<param name="preClickPoint"></param>///<param name="curClickPoint"></param>private bool TryToConnect(Point ptFrom, Point ptTo){if (ptFrom == NullPoint || ptTo == NullPoint){return false;}if (ptFrom.X < 0|| ptFrom.Y < 0|| ptFrom.X > aryPic.GetLength(0) - 1|| ptFrom.Y > aryPic.GetLength(1) - 1){return false;}if (ptTo.X < 0|| ptTo.Y < 0|| ptFrom.X > aryPic.GetLength(0) - 1|| ptFrom.Y > aryPic.GetLength(1) - 1){return false;}//值相等判断if (aryPic[ptFrom.X, ptFrom.Y] != aryPic[ptTo.X, ptTo.Y]){return false;}bool ret = false;#region横向联通判断for (int m = -1; m <= aryPic.GetLength(1); m++){bool isTry = true;//超过范围内的默认为联通if (m == -1 || m == aryPic.GetLength(1)){ }else{int start = ptFrom.X > ptTo.X ? ptTo.X : ptFrom.X;int end = ptFrom.X + ptTo.X - start;//判断是否联通for (int n = start; n <= end; n++){if ((ptFrom.X == n && ptFrom.Y == m) || (ptTo.X == n && ptTo.Y == m)){continue;}if (aryPic[n, m] != NullNum){isTry = false;break;}}}if (!isTry) continue;int from = ptFrom.Y > m ? m : ptFrom.Y;int to = ptFrom.Y + m - from;for (int t = from; t < to; t++){if (t == -1 || t == aryPic.GetLength(1)) continue;if (ptFrom.Y == t) continue;if (aryPic[ptFrom.X, t] != NullNum){isTry = false;break;}}if (!isTry) continue;from = ptTo.Y > m ? m : ptTo.Y;to = ptTo.Y + m - from;for (int t = from; t < to; t++){if (t == -1 || t == aryPic.GetLength(1)) continue;if (ptTo.Y == t) continue;if (aryPic[ptTo.X, t] != NullNum){isTry = false;break;}}if (isTry){ret = true;if (chkIsLineShow.Checked){DrawConnectLines(false, m, ptFrom, ptTo);}break;}}#endregionif (ret){return ret;}#region纵向联通判断for (int m = -1; m <= aryPic.GetLength(0); m++){bool isTry = true;if (m == -1 || m == aryPic.GetLength(0)){ }else{int start = ptFrom.Y > ptTo.Y ? ptTo.Y : ptFrom.Y;int end = ptFrom.Y + ptTo.Y - start;for (int n = start; n <= end; n++){if ((ptFrom.X == m && ptFrom.Y == n) || (ptTo.X == m && ptTo.Y == n)){continue;}if (aryPic[m, n] != NullNum){isTry = false;break;}}}if (!isTry) continue;int from = ptFrom.X > m ? m : ptFrom.X;int to = ptFrom.X + m - from;for (int t = from; t < to; t++){if (t == -1 || t == aryPic.GetLength(0)) continue;if (ptFrom.X == t) continue;if (aryPic[t, ptFrom.Y] != NullNum){isTry = false;break;}}if (!isTry) continue;from = ptTo.X > m ? m : ptTo.X;to = ptTo.X + m - from;for (int t = from; t < to; t++){if (t == -1 || t == aryPic.GetLength(0)) continue;if (ptTo.X == t) continue;if (aryPic[t, ptTo.Y] != NullNum){isTry = false;break;}}if (isTry){ret = true;if (chkIsLineShow.Checked){DrawConnectLines(true, m, ptFrom, ptTo);}break;}}#endregionreturn ret;}///<summary>///連接可、連接線を表示///</summary>///<param name="isVertical"></param>///<param name="posi"></param>///<param name="ptFrom"></param>///<param name="ptTo"></param>private void DrawConnectLines(bool isVertical, int posi, Point ptFrom, Point ptTo){List<Point> lstPoint = new List<Point>();lstPoint.Add(GetCenterPoint(ptFrom));if (!isVertical){if (posi == ptFrom.Y && posi == ptTo.Y){ }else if (posi == ptFrom.Y){lstPoint.Add(GetCenterPoint(ptTo.X, posi));}else if (posi == ptTo.Y){lstPoint.Add(GetCenterPoint(ptFrom.X, posi));}else{lstPoint.Add(GetCenterPoint(ptFrom.X, posi));lstPoint.Add(GetCenterPoint(ptTo.X, posi));}}else{if (posi == ptFrom.X && posi == ptTo.X){ }else if (posi == ptFrom.X){lstPoint.Add(GetCenterPoint(posi, ptTo.Y));}else if (posi == ptTo.X){lstPoint.Add(GetCenterPoint(posi, ptFrom.Y));}else{lstPoint.Add(GetCenterPoint(posi, ptFrom.Y));lstPoint.Add(GetCenterPoint(posi, ptTo.Y));}}lstPoint.Add(GetCenterPoint(ptTo));using (Pen pen = new Pen(Color.DarkRed)){this.pnlShow.CreateGraphics().DrawLines(pen, lstPoint.ToArray()); System.Threading.Thread.Sleep(400);}}#region内部方法///<summary>//////</summary>///<param name="pt"></param>///<returns></returns>private Point GetCenterPoint(Point pt){return GetCenterPoint(pt.X, pt.Y);}///<summary>//////</summary>///<param name="posiX"></param>///<param name="posiY"></param>///<returns></returns>private Point GetCenterPoint(int posiX, int posiY){return new Point(posiX * lengthX + basePX + lengthX / 2, posiY * lengthY + basePY + lengthY / 2);}#endregion#endregionprivate int GetSetRowColCount(){int ret = 6;switch (this.cmbKind.SelectedIndex){//12*12----8case 1:this.lengthX = 50;this.lengthY = 50;ret = 8;break;//12*12----12case 2:this.lengthX = 50;this.lengthY = 50;ret = 12;break;//15*12----6case 3:this.lengthX = 50;this.lengthY = 40;ret = 6;break;//15*12----10case 4:this.lengthX = 50;this.lengthY = 40;ret = 10;break;//15*12----12case 5:this.lengthX = 50;this.lengthY = 40;ret = 12;break;//12*12----6default:this.lengthX = 50;this.lengthY = 50;ret = 6;break;}return ret;}}}2,Form1.Designer.csnamespace GameLianliankan{partial class Form1{///<summary>///必要なデザイナ変数です。
Java课程设计连连看游戏(含代码)
Java程序课程设计任务书一、主要任务与目标1、了解图形用户界面的概念;2、了解AWT的基本体系结构,掌握窗口的基本原理;3、掌握几种布局管理器的使用方法;4、掌握java的事件处理机制;5、了解Swing的基本体系结构,掌握Swing组件的使用方法;6、掌握java小程序的工作原理和使用方法;7、该游戏还将设置退出,再来一局按钮,并实现相应的功能。
8、设计一个用户注册登录界面二、主要内容与基本要求游戏规则是模仿网络上普通的连连看游戏,主要是鼠标两次点击的图片能否消去的问题。
当前,前提是点击两张相同的图片,若点击的是同一张图片或者两张不同的图片,则不予处理。
在两张想同图片所能连通的所有路径中,如果存在一条转弯点不多于两个的路径,就可以消去;如果没有,则不予处理。
该游戏由30张不同的图片组成,游戏开始将会出现30张随机组合的图片,在规则下点击两张相同的图片后图片将会消失。
图片全部消完为游戏成功。
游戏还将设置退出,再来一局的按钮,和倒计时的功能,方便用户进行操作。
并且有一个用户登录注册界面,玩家必须登录以后才可以进行游戏。
三、计划进度12月28日~ 12月29日:课程设计选题,查找参考资料12月30日~ 12月31日:阅读参考书籍,收集资料,完成需求分析1月1日~ 1月3日:系统的代码设计及实现,数据库设计与实现1月4日~ 1月5日:系统的调试,修改,完善1月6日~ 1月7日:完成课程设计报告,准备答辩四、主要参考文献[1] 刘宝林.Java程序设计与案例习题解答与实验指导[M].[2] 王鹏何云峰.Swing图形界面开发与案例分析[M].[3](美)Karl Avedal , Danny Ayers, Timothy Briggs. JSP编程指南[M]. 电子工业出版社, 2004,47-125.[4](美)Mark Linsenbardt. JSP在数据库中的应用与开发[M]. 希望电子出版社,2005,210-236.[5] Dianne Phelan,Building a simple web database application[C].IEEE InternationalProfessional Communication Conference, 2004, 79-86.[6](美)Karl Avedal,Danny Ayers,Timothy Briggs.JSP编程指南[M].电子工业出版社,2006,47-125.[7] Dianne Phelan,Building a simple web database application[C].IEEE InternationalProfessional Communication Conference, 2005, 79-86.[8] Altendorf. Eric, Hohman. Moses, Zabicki. Roman. Using J2EE on a large,web-based project[J]. IEEE Software.2002,19(02):81-89.摘要当今社会,休闲型游戏越来越得到人们的喜爱,我所做的毕业设计实例“连连看游戏的设计与实现”是近几年来网络上非常流行的一种二维休闲游戏,它对电脑配置要求不高,娱乐性强,易于上手。
值得苦练的55个java小项目
值得苦练的55个java小项目在这个数字化时代,掌握一门编程语言对于个人发展和职业规划至关重要。
而在众多编程语言中,Java是一门广泛使用的编程语言,尤其在企业级应用开发中应用广泛。
为了帮助初学者提升自己的Java编程能力,以下是值得苦练的55个Java小项目。
1.计算器:创建一个简单的图形用户界面(GUI)来模拟一个计算器,并实现基本的加、减、乘、除功能。
2.猜数游戏:编写一个程序,在一定范围内生成一个随机数,然后用户通过输入猜测数字,程序逐步给出用户的猜测是否正确。
3.五子棋游戏:实现一个供两人玩的五子棋游戏,包括游戏规则、棋盘、计分等功能。
4.银行管理系统:设计和实现一个基本的银行管理系统,包括账户创建、存款、取款、转账等功能。
5.图书管理系统:创建一个图书管理系统,包括图书的添加、删除、借出和归还等功能。
6.学生成绩管理系统:创建一个学生成绩管理系统,包括学生信息录入、查询、修改和删除等功能。
7.聊天室应用:使用Socket编程创建一个简单的聊天室应用,允许多个用户之间进行实时通信。
8.网页爬虫:编写一个程序以网络爬虫的方式访问网页并提取所需的信息。
9.文件压缩器:创建一个程序,能够将多个文件压缩为一个压缩文件,并能够解压缩已压缩的文件。
10.文件比较器:编写一个程序,用于比较两个文件的内容,以确定它们是否相同或相似。
11.数据库连接应用:使用Java JDBC连接到数据库,并实现增加、删除和修改数据的功能。
12.日历应用:开发一个简单的日历应用,可以显示当前日期、添加事件和提醒等功能。
13.地址簿应用:创建一个能够存储联系人信息的地址簿应用,包括添加、查找、编辑和删除联系人等功能。
14.天气应用:使用天气API获取实时天气信息,并显示在一个简单的用户界面中。
15.网络速度测试应用:开发一个简单的应用程序,用于测试用户的网络速度。
16.电子邮件客户端:编写一个程序,用于发送和接收电子邮件。
C语言实现简易连连看游戏
C语⾔实现简易连连看游戏本⽂为⼤家分享了C语⾔实现连连看游戏位的具体代码,供⼤家参考,具体内容如下题⽬给定⼀个2N×2N的⽅阵⽹格游戏盘⾯,每个格⼦中放置⼀些符号。
这些符号⼀定是成对出现的,同⼀个符号可能不⽌⼀对。
程序读⼊玩家给出的⼀对位置(x1,y1)、(x2,y2),判断这两个位置上的符号是否匹配。
如果匹配成功,则将两个符号消为“*”并输出消去后的盘⾯;否则输出“Uh-oh”。
若匹配错误达到3次,则输出“Game Over”并结束游戏。
或者当全部符号匹配成功,则输出“Congratulations!”,然后结束游戏。
输⼊格式及样例格式输⼊在⼀⾏中给⼀个正整数N(<5)。
随后2N⾏,每⾏2N个⼤写英⽂字母(其间以1个空格分隔),表⽰游戏盘⾯。
盘⾯之后给出⼀个正整数K,随后K⾏,每⾏按照格式“x1y1x2y2”给出⼀个玩家的输⼊。
注意格⼦的⾏、列编号是从1到2N。
样例2I T I TA B A BA A A AC D C D91 1 1 31 2 1 42 1 2 32 2 2 43 1 3 23 3 3 44 1 4 34 2 4 34 2 4 4输出格式及样例格式根据玩家的每⼀步输⼊,输出相应的结果。
输出盘⾯时注意,每⾏字符间以1个空格分隔,⾏末不得有多余空格。
样例参考代码#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>void Print(int n,char**arr);int main() {int n,i,j;int fail = 0,secc=0;scanf("%d", &n);char** arr = (char**)malloc(sizeof(char*) * 2 * n);for (i = 1; i <= 2 * n; i++)arr[i] = (char*)malloc(sizeof(char) * 2 * n);for (i = 1; i <= 2 * n; i++)for (j = 1; j <= 2 * n; j++) {scanf("%c", &arr[i][j]);if (arr[i][j] == ' ' || arr[i][j] == '\n')j--;}int k;scanf("%d", &k);int** brr = (int**)malloc(sizeof(int*) * k);for (i = 1; i <= k; i++)brr[i] = (int*)malloc(sizeof(int) * 4);for (i = 1; i <= k; i++)for (j = 1; j <= 4; j++)scanf("%d", &brr[i][j]);for (i = 1; i <= k; i++) {char x, y;int x1, y1, x2, y2;x1 = brr[i][1];y1 = brr[i][2];x2 = brr[i][3];y2 = brr[i][4];x = arr[x1][y1];y = arr[x2][y2];//printf("%c %c\n",x ,y);if (x == y) {arr[x1][y1] = '*';arr[x2][y2] = '*';secc++;int m = (2*n * 2*n) / 2;if (secc == m&& n * n % 2 == 0) {printf("Congratulation!\n");exit(0);}Print(n,arr);//printf("\n");}else {printf("Uh-oh\n");fail++;if (fail == 3) {printf("Game Over\n");exit(0);}}//printf("%c %c\n", x, y);/*if (arr[(brr[i][1])][(brr[i][2])] == arr[(brr[i][3])][(brr[i][4])]) {arr[(brr[i][1])][(brr[i][2])] = '*';arr[(brr[i][3])][(brr[i][4])] = '*';}*/}return 0;}//-----------functionvoid Print(int n,char**arr) {/*char** arr = (char**)malloc(sizeof(char*) * 2 * n);for (int i = 1; i < 2 * n; i++)arr[i] = (char*)malloc(sizeof(char) * 2 * n);*/for (int i = 1; i <= 2 * n; i++) {printf("%c", arr[i][1]);for (int j = 2; j <= 2 * n; j++) {printf(" %c", arr[i][j]);}printf("\n");}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
java小游戏连连看源代码
Java小游戏——连连看源码连连看java源代码import javax.swing.*;import java.awt.*;import java.awt.event.*;public class lianliankan implements ActionListener{JFrame mainFrame; //主面板Container thisContainer;JPanel centerPanel,southPanel,northPanel; //子面板JButton diamondsButton[][] = new JButton[6][5];//游戏按钮数组JButton exitButton,resetButton,newlyButton; //退出,重列,重新开始按钮JLabel fractionLable=new JLabel("0"); //分数标签JButton firstButton,secondButton; //分别记录两次被选中的按钮int grid[][] = new int[8][7];//储存游戏按钮位置static boolean pressInformation=false; //判断是否有按钮被选中int x0=0,y0=0,x=0,y=0,fristMsg=0,secondMsg=0,validateLV; //游戏按钮的位置坐标int i,j,k,n;//消除方法控制public void init(){mainFrame=new JFrame("JKJ连连看");thisContainer = mainFrame.getContentPane();thisContainer.setLayout(new BorderLayout());centerPanel=new JPanel();southPanel=new JPanel();northPanel=new JPanel();thisContainer.add(centerPanel,"Center");thisContainer.add(southPanel,"South");thisContainer.add(northPanel,"North");centerPanel.setLayout(new GridLayout(6,5));for(int cols = 0;cols < 6;cols++){for(int rows = 0;rows < 5;rows++ ){diamondsButton[cols][rows]=new JButton(String.valueOf(grid[cols+1][rows+1])); diamondsButton[cols][rows].addActionListener(this);centerPanel.add(diamondsButton[cols][rows]);}}exitButton=new JButton("退出");exitButton.addActionListener(this);resetButton=new JButton("重列");resetButton.addActionListener(this);newlyButton=new JButton("再来一局");newlyButton.addActionListener(this);southPanel.add(exitButton);southPanel.add(resetButton);southPanel.add(newlyButton);fractionLable.setText(String.valueOf(Integer.parseInt(fractionLable.getText()))); northPanel.add(fractionLable);mainFrame.setBounds(280,100,500,450);mainFrame.setVisible(true);}public void randomBuild() {int randoms,cols,rows;for(int twins=1;twins<=15;twins++) {randoms=(int)(Math.random()*25+1);for(int alike=1;alike<=2;alike++) {cols=(int)(Math.random()*6+1);rows=(int)(Math.random()*5+1);while(grid[cols][rows]!=0) {cols=(int)(Math.random()*6+1);rows=(int)(Math.random()*5+1);}this.grid[cols][rows]=randoms;}}}public void fraction(){fractionLable.setText(String.valueOf(Integer.parseInt(fractionLable.getText())+100)); }public void reload() {int save[] = new int[30];int n=0,cols,rows;int grid[][]= new int[8][7];for(int i=0;i<=6;i++) {for(int j=0;j<=5;j++) {if(this.grid[i][j]!=0) {save[n]=this.grid[i][j];n++;}}}n=n-1;this.grid=grid;while(n>=0) {cols=(int)(Math.random()*6+1);rows=(int)(Math.random()*5+1);while(grid[cols][rows]!=0) {cols=(int)(Math.random()*6+1);rows=(int)(Math.random()*5+1);}this.grid[cols][rows]=save[n];n--;}mainFrame.setVisible(false);pressInformation=false; //这里一定要将按钮点击信息归为初始init();for(int i = 0;i < 6;i++){for(int j = 0;j < 5;j++ ){if(grid[i+1][j+1]==0)diamondsButton[i][j].setVisible(false);}}}public void estimateEven(int placeX,int placeY,JButton bz) {if(pressInformation==false) {x=placeX;y=placeY;secondMsg=grid[x][y];secondButton=bz;pressInformation=true;}else {x0=x;y0=y;fristMsg=secondMsg;firstButton=secondButton;x=placeX;y=placeY;secondMsg=grid[x][y];secondButton=bz;if(fristMsg==secondMsg。
java findall方法
java findall方法Java中的`findAll()`方法是`java.util.regex.Matcher`类中的一个方法,用于在给定的字符串中查找满足指定正则表达式的所有子串。
正则表达式是一种强大而灵活的模式匹配工具,可以用于字符串的搜索、替换以及一些复杂的文本操作。
`findAll()`方法返回一个`java.util.regex.MatchResult`对象的迭代器,该对象包含匹配到的子串以及相关的信息。
在本文中,我们将深入探讨`findAll()`方法,包括它的用法、参数、返回值以及示例代码。
用法`findAll()`方法的基本用法如下:javaMatcher matcher = pattern.matcher(input);while (matcher.find()) {处理匹配到的子串}首先,我们需要创建一个`Pattern`对象,该对象表示我们要使用的正则表达式。
然后,我们创建一个`Matcher`对象,将要匹配的字符串作为参数传递给它。
最后,我们使用`find()`方法迭代地查找满足正则表达式的所有子串,并在循环内对每个子串进行处理。
参数`findAll()`方法接受一个可选的参数,即指定开始匹配的位置。
默认情况下,匹配从字符串的开头开始。
如果我们想从指定位置开始匹配,可以使用`find(int start)`方法,其中`start`表示开始匹配的索引。
返回值`findAll()`方法返回一个`java.util.regex.MatchResult`对象的迭代器。
`MatchResult`接口表示一个匹配结果,并提供了一些方法用于检索匹配的子串以及相关的信息。
通过迭代这个迭代器,我们可以获取所有匹配到的子串。
示例代码下面是一个简单的示例代码,演示了如何使用`findAll()`方法查找满足特定模式的所有子串:javaimport java.util.regex.Matcher;import java.util.regex.Pattern;public class FindAllExample {public static void main(String[] args) {String input = "Java is a programming language. Java is widely used.";String patternString = "Java";Pattern pattern = Patternpile(patternString);Matcher matcher = pattern.matcher(input);while (matcher.find()) {int startIndex = matcher.start();int endIndex = matcher.end();String match = matcher.group();System.out.println("Match: " + match);System.out.println("Start index: " + startIndex);System.out.println("End index: " + endIndex);}}}在上面的示例中,我们使用正则表达式`"Java"`来匹配字符串`"Java is a programming language. Java is widely used."`。
基于“连连看”实例的Java程序设计课程教学研究
基 于实例 的教学是 近年来讨论 比较 多的话题 。 本文将结合 程序 设计课 程教学 实际 ,探讨如何将程序 实 例引入 到课 堂 ,让 学生更 好 的学 习面 向对象程 序设 计 这 门课 程 。 由于J a v a 语 言与 生俱来 的 “ 面 向对 象 ” 的特 点 ,众 多 高校 选 择 其作 为 面 向对 象 程 序设 计 课
构造出一个 1 1 1 9 的G r i d L a y o u t 布 局 ,而后在每个单元
格 中放人一个J B u t t o n  ̄ 的对象 ,代表贴砖对象 。这样 ,
一
通俗易懂 ,且能激发学生 的课堂兴趣。考 虑到学生通常 对小游戏存在兴趣 ,本文引入 了较为普及 的小游戏 “ 连 连看” ,通过该游戏 的设计 ,来探 索面向对象程序设计
码 ,从语法 的角度说明如何使用而 已,并不能给学生更 多的直观感受 。在 “ 连连看 ”实例 中,主界面 区域显然
二、 “ 连连 看 "实例 设计 与教 学
为 了能够 达到 教学效 果 ,实例 的选取需 要适 当斟
酌 。实例的选择 不仅要能够满足基本的教学需要 ,更要
可以看成是 一种典 型的G r i d L a y o u t 布局应用。我们 可以
程 教学 的编程 语言 。本文 的实 例亦建 立在J a v a 平 台之
卜
一
与设计过程 。
B)当进行 可视化 程序设计 的时候 ,界面布局是无
法 回避的问题 。现在几乎所有 的教材在描述这个问题的
时候 ,通常只是 简要地罗列 出J a v a 平 台下的几种布局 , 诸 ̄ H F l o wL a y o u t 、B o r d e r L a y o u t 等 ,然后给出一小段代
JAVA开发连连看游戏
1 引言1.1 连连看游戏发展[1]游戏“连连看”顾名思义就是找出相关联的东西,连连看游戏在网上基本是用于小游戏中,就是找出相同的两样东西,在一定的规则之内可以做为相关联处理。
“连连看”的发展经历了从桌面游戏、在线游戏、社交游戏三个过程。
在电脑普及发展的今天,网络小游戏、网页游戏越来越受网民欢迎,除了玩的方法简单外(不像其他游戏还需要注册下载繁琐过程),很多游戏不乏经典。
连连看游戏就是典型,因此不管走到哪个网页游戏网站,连连看游戏总是排在受玩家欢迎排名的前3位,休闲、趣味、益智是连连看玩不厌的精华,且不分男女老少、工薪白领,是一款适合大众的经典网络、单机休闲小游戏。
1.1.1 桌面连连看游戏发展游戏“连连看”是源自台湾的桌面小游戏,自从流入大陆以来风靡一时,也吸引众多程序员开发出多种版本的“连连看”。
这其中,顾方编写的“阿达连连看”以其精良的制作广受好评,这也成为顾方“阿达系列软件”的核心产品。
并于2004年,取得了国家版权局的计算机软件著作权登记证书。
1.1.2 在线连连看游戏发展随着Flash应用的流行,网上出现了多种在线Flash版本“连连看”。
如“水晶连连看”、“果蔬连连看”、“石头连连看”等。
1.1.3 社交连连看游戏发展2008年,随着社交网络的普及和开放平台的兴起,“连连看”被引入了社交网络。
“连连看”与个人空间相结合,被快速的传播,成为一款热门的社交游戏,其中以开发者Jonevey在Manyou开放平台上推出的“宠物连连看”最为流行。
1.2 连连看游戏介绍当今社会休闲型游戏越来越得到人们的喜爱,连连看游戏是近几年来网络上非常流行的一种二维休闲游戏,它对电脑配置要求不高,娱乐性强,易于上手,因此吸引了一大批玩家,且不分男女老少、工薪白领,是一款适合大众的经典网络、单机休闲小游戏。
1.2.1 连连看游戏基本规则如果两个相同的图案之间如果能画出一条不多于2折的连线,则消除这两个图案,直到所有的图案全部消除为止,这就是连连看。
基于Qt的连连看游戏的设计
摘要在现今电子信息高速发展的时代,电子游戏已然成为大众最受欢迎的娱乐消遣方式,经典的连连看是个老少皆宜的小游戏,它实现由各式各样的成对图片组成,然后存储在一个二维的数组中,计算机随机产生各种不同类型的图片,根据计算机时钟控制它在一定的时间内随机产生,用户可根据鼠标和回车键点击图片、若两次点击的图片一样,则消掉图片。
本文用QT来设计与实现简单的连连看游戏的基本功能,玩家可以在游戏区域中通过键盘控制来选取相同的两个物件,采用特定的消除规则对它们进行消除的操作,当游戏区域中的所有方块对都被消除后玩家即可胜利。
文章对该游戏的算法以及游戏图案的绘制进行详细的介绍。
实现起来较简单,同时也比较实用。
关键词:Qt;游戏设计;算法;数组;信号与槽ABSTRACTIn the current era of rapid development of electronic information, electronic game has become the most popular entertainment popular pastime, classic Russian square is a enjoyed by young and old little game, it achieved by four square of color piece, and then stored in a two dimensional array, computer random generation seven different types of square, according to the computer clock control it in certain time keep produced, the user can according to the keyboard four the direction key control block turns, moves left, move to the right, move down operation and the program according to the seven square are stacked into a different model. And Laura square is based on square in Russia, give the Russian square new challenge pattern, its inspiration from the network another kind of popular video games-tomb raider. Players to the identity of the adventurers into the game, players need only to a certain score, can challenge higher difficulty levels of the game, of course, if you are good, you will have the chance to open the mysterious hide organs, the more full of imagination and stimulation of play will wait for you take your challenge.Key words:Qt; Game design; Algorithm; Array;Signals and slots.目录摘要 (I)ABSTRACT (II)第一章绪论 (3)1.1 游戏背景 (3)1.2 游戏概述 (3)第二章方案论证 (5)2.1 选择开发语言 (5)第三章需求分析 (13)3.1软硬件需求 (13)3.2游戏功能需求 (13)第四章游戏总体设计 (15)4.1 总体设计 (15)4.2 游戏开始模块设计 (15)4.3 游戏设置模块设计 (16)4.4 游戏核心模块的设计 (16)第五章具体实现 (18)5.1模型层设计 (18)5.2 视图层设计 (18)5.3 其它相关技术的实现 (19)第六章游戏测试 (20)6.1 按键事件的功能测试 (20)6.2 图片消失测试 (20)6.3 声音和显示测试 (20)6.4 测试结果分析 (21)总结 (21)致谢 (23)参考文献 (24)附录源代码 (25)第一章绪论1.1 游戏背景说到连连看,就不得不从经典小游戏说起,连连看是一款古老的风靡全球的经典游戏,它最早出现在PC机上,我国的用户都是通过红白机了解、喜欢上它的,相信有很多人到现在还是对它念念不忘的。
Java连连看程序代码
Button p1,p2,br,bt1,bt2; //p1、p2为选定的按钮
Panel panel1,panel2;
int d[][]={ //用来和界面的按钮建立映射关系
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0},
{0,0,0,0,0,0,0}
};
public static void main(String[] args)
panel1.add(b7); panel1.add(b8); panel1.add(b9);
panel1.add(b10); panel1.add(b11); panel1.add(b12);
panel1.add(b13); panel1.add(b14); panel1.add(b15);
b4=new Button(String.valueOf(d[1][4]));
b5=new Button(String.valueOf(d[1][5]));
b6=new Button(String.valueOf(d[2][1]));
b7=new Button(String.valueOf(d[2][2]));
{0,0,0,0,0,0,0}
};
this.d=d;
suiji(); //调用随机函数,产生随机数;
f.setVisible(false);
连连看游戏设计报告
武汉工程大学计算机科学与工程学院综合设计报告设计名称:系统软件综合设计设计题目:手机连连看游戏设计与实现学生学号:1005090222专业班级:2010级计算机科学与技术(计算机科学方向)02班学生姓名:杨星学生成绩:指导教师(职称):徐银霞(讲师)课题工作时间:2013.12.30 至2014.1.10成绩评定表学生姓名:杨星学号:1005090222 班级:计算机科学02班答辩记录表指导教师评语目录摘要 (II)Abstract (III)第一章课题背景 (1)1.1 课题背景 (1)1.2 设计要求 (1)第二章设计方案论述 (3)2.1 需求分析 (3)2.2 模块设计 (3)第三章详细设计 (5)3.1 开发环境 (5)3.2 算法描述 (5)3.3 类的设计 (7)第四章设计结果及分析 (9)4.1 游戏启动测试 (9)4.2 游戏过程测试 (9)4.3 游戏结束测试 (10)总结 (12)致谢 (13)参考文献 (14)附录主要程序代码 (15)摘要连连看是一款经典的休闲游戏,将相同的两个图案以三根以内的线连接起来即可消除,规则简单易上手,游戏节奏快,不失乐趣,适合广大人群。
这里设计的连连看游戏实现在windows phone 8手机平台上。
旨在熟悉其基本的开发模式,了解手机平台应用开发与PC平台的不同之处,感受移动平台独特的特性。
作为手机游戏,操作直观,随时随地可进行游戏,更加方便快捷。
游戏实现计时,提示,重新开始等基本功能。
游戏核心算法为计算两个相同图案之间的最短路径。
分图案相邻和不相邻情况。
对于相邻图案直接可消除,对于不相邻图案,通过特定算法求解,寻求最短路径。
失败则无法消除。
游戏基于.NET平台,以Visual Studio Express For Windows Phone工具开发,采用Silverlight框架,用C#程序设计语言设计。
经测试可运行在windows phone 8手机上。
Java开发者的必备工具包
Java开发者的必备工具包在Java开发中,使用适当的工具和库可以极大地提高开发效率和质量。
本文将介绍一些Java开发者必备的工具包,帮助您更好地进行Java开发。
一、开发工具包1. JDK(Java Development Kit)JDK是Java开发者必备的工具之一,其中包含了Java语言的编译器、虚拟机等必要组件。
通过安装JDK,您可以编写、编译和运行Java程序。
2. EclipseEclipse是一款流行的Java集成开发环境(IDE),提供了丰富的功能和插件,可以帮助开发者更高效地编写代码、调试程序和管理项目。
3. IntelliJ IDEAIntelliJ IDEA是另一个常用的Java IDE,它提供了智能代码提示、自动补全、重构工具等功能,可以帮助开发者快速编写高质量的Java代码。
二、构建工具包1. MavenMaven是一款优秀的项目构建工具,它能够管理项目依赖、自动化构建过程,并提供了丰富的插件,可以简化Java项目的开发和部署。
2. GradleGradle是另一个强大的项目构建工具,它支持多种项目结构和构建方式,并且具有高度灵活性。
通过使用Gradle,您可以更加自由地定义和管理项目的构建过程。
三、测试工具包1. JUnitJUnit是一款广泛使用的Java单元测试框架,在Java开发中被广泛应用。
通过使用JUnit,您可以编写简洁而可靠的单元测试,确保代码的质量和可靠性。
2. MockitoMockito是一款强大的Java单元测试框架,它提供了丰富的API,可以方便地模拟和验证对象的行为。
通过使用Mockito,您可以更加灵活地进行单元测试,并提高测试覆盖率。
四、调试工具包1. JVisualVMJVisualVM是一款功能强大的Java虚拟机监控和调试工具,它可以帮助开发者分析程序性能问题、内存泄漏等。
通过使用JVisualVM,您可以深入了解程序运行时的状态,并进行优化和调试。
用JAVA设计手机连连看游戏
且 ,此款游戏与以往的连连看游戏不同 ,可以让用户自主设计
连连 看 游 戏 的 背 景 图 片 ,还 有 欢 快 的 背 景 音乐 舒 缓 神 经 ,增 添
了更多乐趣。因此,此款游戏有一定有广大的市场。
2基 本概 念 ’
, / 下 一 关 为上 一关 减 去5 秒 的时 间
t o t a l Ti me 一 = 5:
能 的 部分 代码 如 下 :
p u b l i c v o i d o n C l i c k ( Vi e w v )( n e w Al e r t Di a l o g . B u i l d e r ( S e t D i a l o g . t h i s )
.
以支持手机运行 。
2 l 世 纪 ,人们 所 承 受 的 来 自各 方 面 的压 力越 来 越 大 ,人 们
需要一个释放 自我的途径 。连连看小游戏 ,规则简单 ,生动有
趣 ,对 于 需 要 释 放 压 力 ,打 发 时 间 的 人 来 说 ,是不 二 之 选 。并
p r i v a t e R e f r e s h Ha n d l e r r e f r e s h H a n d l e r =n e w R e f r e s h Ha n d l e r 0 ;
s t a r t P l a y 0 ; )
2 Mi c r o E d i t i o n ,主 要 针 对 嵌入 式 系 统 ,包 括 手 机 、P DA 等 。针
( 3 )游戏 更 换 图片 代码 。
对 手 机应 用程 序 的开发 ,s u n 还 提供 了 免费 的J 2 ME Wi r e l e s s
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机学院 《面向对象程序设计》课程设计报告《面向对象程序设计》课程设计报告题目: 连连看游戏设计专业: 网络工程班级: 15(2)班姓名: 卢山指导教师: 杨星成绩:计算机学院2017年5月18日2016-2017学年 第2学期目录1设计内容及要求 (3)1.1设计内容 (3)1.2设计要求 (3)2概要设计 (4)2.1功能目标 (4)2.2游戏规则 (4)3 具体设计与实 (5)3.1界面设计与实现 (5)3.2程序算法设计 (7)4 运行结果界面 (10)5 结束语 (12)6 参考文献 (13)附源程序: (13)1设计内容及要求1.1设计内容游戏规则是模仿网络上普通的连连看游戏,主要是鼠标两次点击的图片能否消去的问题。
当前,前提是点击两张相同的图片,若点击的是同一张图片或者两张不同的图片,则不予处理。
在两张想同图片所能连通的所有路径中,如果存在一条转弯点不多于两个的路径,就可以消去;如果没有,则不予处理。
1.2设计要求1)系统采用图片连连看的方式,界面美观友好,用户使用灵活、方便。
2)实现用户登录注册功能。
3)图片的消除、排列清晰。
4)计分自动完成,提高工作效率。
5)用进度条来表现用掉的时间。
6)实现多条件查询。
7)可方便快捷地进行下一盘游戏,并且两盘的分数在规定的时间内会叠加起来。
8)操作员可以随时退出游戏。
9)对用户输入的信息,系统进行严格的信息检验,尽可能排除人为的错误。
10)系统最大限度地实现了易维护性和易操作性。
11)系统运行稳定、安全可靠。
2概要设计2.1功能目标1)该游戏开始前,将设置一个用户登录注册界面,如果没有注册的玩家在按下“注册”按钮后将进入注册界面,玩家需要填写用户名,密码,性别等信息完成注册,再进入登录界面,输入用户名和密码按下“确定”后就将进入游戏界面,开始游戏。
2)游戏中将有“退出”功能,选择退出命令后程序将终止执行,关闭窗口。
还将有“再来一局”功能,选择再来一局命令后程序将对图片重新排列,重新开始游戏。
该游戏还有一个时间倒计时的进度条,提醒玩家剩余的时间,增加游戏的难度。
在界面的顶部有计分功能,当玩家消去图片后就会赢得相应的分数。
2.2游戏规则玩家可以将2 个相同图案的对子连接起来,连接线不多于3 根直线,就可以成功将对子消除。
操作:第一次使用鼠标点击棋盘中的棋子,该棋子此时为“被选中”,以特殊方式显示;再次以鼠标点击其他棋子,若该棋子与被选中的棋子图案相同,且把第一个棋子到第二个棋子连起来,中间的直线不超过 3 根,则消掉这一对棋子,否则第一颗棋子恢复成未被选中状态,而第二颗棋子变成被选中状态。
3 具体设计与实3.1界面设计与实现图1 用户登录模块框图此函数的作用是创建登录界面,检测用户登陆的合法性,并确认用户输入了合法的登录名和口令。
部分代码:public void loginDialog() {//设置登录界面timer = new Timer(100, this);//创建时间对象***倒计时时间100秒login = new JDialog();//创建对象login.setTitle("登录");//在文本框中写入名字login.setLayout(new FlowLayout());//添加流布局login.add(new JLabel("用户名:"));//添加标签final JTextField name = new JTextField(10);//设置文本框长度login.add(name);login.add(new JLabel("密码:"));//添加标签final JPasswordField password = new JPasswordField(10); //设置文本框长度password.setEchoChar('*');//密码以*返回login.add(password);JButton confirm = new JButton("登录");//添加按钮confirm.addActionListener(new ActionListener() {//设置一个监视器public void actionPerformed(ActionEvent e) {if (compareUserData(name.getText().trim(),new String(password.getPassword()))) {login.setVisible(false);init();timer.start();} else {JOptionPane.showMessageDialog(login, "用户名或密码错误!", "错误提示",JOptionPane.ERROR_MESSAGE);}}});login.add(confirm);final JDialog regDialog = new JDialog(login, "注册", true);registerDialog(regDialog);JButton register = new JButton("注册");//添加按钮register.addActionListener(new ActionListener() {//设置一个监视器public void actionPerformed(ActionEvent e) {regDialog.setVisible(true);}});login.add(register);//添加组件login.setSize(400, 200);//设置登录界面的尺寸login.setResizable(false);login.setLocationRelativeTo(null);login.setVisible(true);//窗口可见}private boolean compareUserData(String name, String password) { //异常处理try {RandomAccessFile out = new RandomAccessFile("user.dat", "rw");String fname, fpassword = null;while (out.getFilePointer() < out.length()) {fname = out.readUTF();out.readUTF();fpassword = out.readUTF();if (fname.equals(name) && fpassword.equals(password))return true;}out.close();} catch (IOException e) {e.printStackTrace();}return false;}3.2程序算法设计连连看游戏中对于用户来说最简单的呈现就是单击两个连在一起的的相同的图像时这两个图像就会消去。
即使不是紧邻的两个相同的图像块消去时也不能超过两次转弯。
连连看游戏的联通算法一般包括回溯法和堆栈实现的迷宫算法。
在本次开发的连连看中两个图像块可以消去的情况分为以下几种情况。
设第一个图像块的横坐标为x1,纵坐标为y1,第二个图像块的横坐标为x2,纵坐标为y2.两个图像块在在统一行上面,即x1=x2且y1>y2或者x1=x2且y1<y2,如下图所示:图2 同行两个图像块在同一列,即y1=y2且x1>x2或者y1=y2且x1<x2,如下图所示:图3 同列两个相同的图像块是相对的,记一个图像在另一个图像的右下角,即:x1<x2且y1<y2或者x1>x2且y1>y2两种情况。
具体如下图所示:图4 对角的两个相同的图像块是相对的,记一个图像在另一个图像的右下角,即:x1<x2且y1>y2或者x1>x2且y1<y2两种情况。
具体如下图所示:图5 左对角在上面的四种情况当中又包含了许多中可能。
针对同行的两个相同的颜色的图像块来说又可分为两种情况,即:在同一行相邻和同一行不相邻的情况,不相临的情况下有可以分为两种,能消去的和不能消去的。
同在一列的也是这样。
至于两个点之间存在折线的,也可以分为两种情况,一种是存在折线但是能够消除掉这两个颜色相同的图像块,一种是不能消除的,本人在设计程序的时候针对不同的情况分别进行了判断和设计。
下面分别对程序的算法进行讨论。
首先是判断在同一行中除起始点图像块以外到其他的图像块之间还有没有其他的图像块。
如果有函数返回false,如果没有函数返回true。
IsLinePicEmpty方法主要是通过两个图像块的坐标来判断两个图像块之间是不是还有其他的图像块,(此处不分行)上面的函数实现了同在一行或一列的图像块的检测,下面的算法则实现了判断一条直线上的两个点是不是可以联通的。
算法逻辑跟上面IsLinePicEmpty算法一样,即检查相同的行或列上的两个相同图像块是不是可以连通的,即:两个之间是不是还有其他图像块。
在连连看的连接算法中上面的程序解决了在同一行或同一列中的相同图像块的检测,下面的算法则解决了在两个相同图像块之间存在一条折线的问题。
上面算法的逻辑是先判断两个点之间的的两条连通路径之间除起始点外时候有其他的图像块,如果没有就判断两个图像块之间的直线是否可通,如果可通函数返回值为真,不可通函数返回值为假。
4 运行结果界面图9 登录界面图10 注册界面图11 主界面图12 时间到界面5 结束语由于计算机的普及,网络游戏越来越受大家的欢迎,几乎每个拥有电脑的人都会玩网络游戏,不同的人玩的游戏当然大不相同。
现在网络上的小游戏越来丰富,我们此次的课程设计就是现在网络上非常流行的连连看游戏。
游戏“连连看”顾名思义就是找出相关联的东西,这个连连看在网上基本是用在小游戏中,就是找出相同的两样东西,在一定的规则之内可以做为相关联处理。
现在网络小游戏、网页游戏越来越受网民欢迎,除了玩的方法简单外,很多游戏不乏经典。
连连看游戏就是典型。
不管走到哪个网页游戏网站,连连看游戏总是排在受玩家欢迎排名的前5位,休闲、趣味、益智是连连看玩不厌的精华,且不分男女老少、工薪白领,是一款适合大众的经典网络休闲小游戏。
这次我们设计的游戏具有一般连连看的功能,玩法规则都与网络上的小游戏相同。
我们的游戏除了有退出,再来一局,计分,倒计时的功能外,在游戏有一个用户登录注册界面,用户需登录以后才能开始游戏。