连连看源代码
C#实现连连看功能(推荐)

C#实现连连看功能(推荐)本⽂是利⽤C#实现连连看的⼩例⼦,以供学习分享使⽤。
初始化布局(横竖⼗⾏⼗列,共100个单元格,每⼀个格⼀个按钮,背景图为⽔果图⽚,随机⽣成)。
初始化对应棋盘(⽤⼆维数组表⽰【0表⽰空⽩,⾮0表⽰界⾯对象】)和页⾯相对应,同步操作。
判断点击的图⽚是否可以消掉(转化为⼆维数组【以⽔平⽅向,垂直⽅向,⼀个拐⾓,两个拐⾓的步骤进⾏判断】)。
如可以消掉,隐藏图⽚,增加分数。
时间限制,采⽤倒计时⽅式。
线程:Thread,后台运⾏时间控制【倒计时⽅式】。
界⾯闪烁:当界⾯中的控件较多,且有背景图时,界⾯就会出现闪烁【解决⽅式:1,双缓冲⽅式 2. 设置控件创建样式,统⼀刷新】。
TableLayoutPanel:表⽰⼀个⾯板,它可以在⼀个由⾏和列组成的⽹格中对其内容进⾏动态布局【新增元素,设置⾏列,以及样式】。
资源⽂件:Resources ⽤于存放图⽚及其他资源。
Button:FlatAppearance获取⽤于指⽰选中状态和⿏标状态的边框外观和颜⾊。
效果图图下(⼀)【开始,初始化后,倒计时功能,停⽌功能】:效果图(⼆)【时间结束】核⼼代码如下:1234567891011121314151617 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34/// <summary>/// 连连看帮助类/// </summary>public class LinkHelper{/// <summary>/// 连连看,看板/// </summary>public int[,] LinkBoard { get; set; } /// <summary>/// 连线成功事件/// </summary>public event EventHandler SucClick; /// <summary>/// 连接失败事件/// </summary>public event EventHandler FailClick; private int col = 10;public int Col{35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 get{return col;}set{col = value;}}private int row = 10;public int Row{get{return row;}set{row = value;}}/// <summary>/// 尝试连线/// </summary>public void LinkLine(Point first, Point second){EventArgs e = new EventArgs();if(checkLink(first, second)){//连线成功this.LinkBoard[first.X, first.Y] = 0;this.LinkBoard[second.X, second.Y] = 0;if(this.SucClick != null){SucClick(this, e);}}else{//连线失败if(this.FailClick != null){FailClick(this, e);}}}/// <summary>/// 是否赋值/// </summary>/// <param name="p"></param>/// <returns></returns>public bool IsChecked(Point p){bool flag = false;if(p.X != -1 && p.Y != -1){flag = true;}return flag;}#region 核⼼算法/// <summary>/// 判断是否连线成功/// </summary>/// <param name="a">第⼀个点击对象</param>/// <param name="b">第⼆个点击对象</param>/// <returns></returns>private bool checkLink(Point a, Point b){if(!Point.Equals(a, b)){if(this.LinkBoard[a.X, a.Y] == this.LinkBoard[b.X, b.Y]) {97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 if(a.X == b.X && horizon(a, b)){return true;}if(a.Y == b.Y && vertical(a, b)){return true;}if(oneCorner(a, b)){return true;}else{return twoCorner(a, b);}}else{//如果点击的不是同⼀个图案,直接返回falsereturn false;}}else{//如果点击的是同⼀个位置的图案,直接返回false;return false;}}/// <summary>/// ⽔平连线/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>private bool horizon(Point a, Point b){int col_start = a.Y < b.Y ? a.Y : b.Y; //获取a,b中较⼩的y值 int col_end = a.Y < b.Y ? b.Y : a.Y; //获取a,b中较⼤的值 //遍历a,b之间是否通路,如果⼀个不是就返回false;for(int i = col_start + 1; i < col_end; i++){if(this.LinkBoard[a.X, i] != 0){return false;}}return true;}/// <summary>/// 垂直连线/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>private bool vertical(Point a, Point b){int row_start = a.X < b.X ? a.X : b.X;int row_end = a.X < b.X ? b.X : a.X;for(int i = row_start + 1; i < row_end; i++){if(this.LinkBoard[i, a.Y] != 0){return false;}}return true;}/// <summary>/// ⼀个拐⾓/// </summary>/// <param name="a"></param>/// <param name="b"></param>159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 /// <returns></returns>private bool oneCorner(Point a, Point b){Point c = new Point(b.X, a.Y);Point d = new Point(a.X, b.Y);//判断C点是否有元素if(this.LinkBoard[c.X, c.Y] == 0){bool path1 = horizon(b, c) && vertical(a, c);return path1;}//判断D点是否有元素if(this.LinkBoard[d.X, d.Y] == 0){bool path2 = horizon(a, d) && vertical(b, d);return path2;}else{return false;}}/// <summary>/// 两个拐⾓/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>private bool twoCorner(Point a, Point b){List<Line> ll = scan(a, b);if(ll.Count == 0){return false;}for(int i = 0; i < ll.Count; i++){Line tmpLine = ll[i];if(tmpLine.direct == 1){if(vertical(a, tmpLine.a) && vertical(b, tmpLine.b)){return true;}}else if(tmpLine.direct == 0){if(horizon(a, tmpLine.a) && horizon(b, tmpLine.b)){return true;}}}return false;}/// <summary>/// 扫描A与B之间的连接点组成的线/// </summary>/// <param name="a"></param>/// <param name="b"></param>/// <returns></returns>private List<Line> scan(Point a, Point b){List<Line> linkList = new List<Line>();//检测a点,b点的左侧是否能够垂直直连for(int i = a.Y; i >= 0; i--){if(this.LinkBoard[a.X, i] == 0 && this.LinkBoard[b.X, i] == 0 && vertical(new Point(a.X, i), new Point(b.X, i))) {linkList.Add(new Line(new Point(a.X, i), new Point(b.X, i), 0));221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262}}//检测a 点,b 点的右侧是否能够垂直直连 for (int i = a.Y; i < Col; i++) { if (this.LinkBoard[a.X, i] == 0 && this.LinkBoard[b.X, i] == 0 && vertical(new Point(a.X, i), new Point(b.X, i))) {linkList.Add(new Line(new Point(a.X, i), new Point(b.X, i), 0));}}//检测a 点,b 点的上侧是否能够⽔平直连 for (int j = a.X; j >= 0; j--) { if (this.LinkBoard[j, a.Y] == 0 && this.LinkBoard[j, b.Y] == 0 && horizon(new Point(j, a.Y), new Point(j, b.Y))) { linkList.Add(new Line(new Point(j, a.Y), new Point(j, b.Y), 1));}}//检测a 点,b 点的下侧是否能够⽔平直连 for (int j = a.X; j < Row; j++) { if (this.LinkBoard[j, a.Y] == 0 && this.LinkBoard[j, b.Y] == 0 && horizon(new Point(j, a.Y), new Point(j, b.Y))) { linkList.Add(new Line(new Point(j, a.Y), new Point(j, b.Y), 1)); }}return linkList;} #endregion }以上所述是⼩编给⼤家介绍的C# 实现连连看功能,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
FLASH连连看算法分析及源代码

FLASH连连看算法分析及源代码做FLASH连连看有专门的地方,下面咱们就详细分析FLASH连连看的算法。
在做连连看之前,咱们依照折线数的不同分为3种情形:第一种情形:如图,方块1与方块2 在同一水平线上,方块1与方块3在同一垂直线上,这确实是咱们的第一种情形:在实际应历时,咱们在1和2之间或1和3之间实例化一条线段,用hitTestObject 来测试,若是与这条线段相交的图片个数小于等于2,那么这两个图片确实是连通的。
第二种情形:确实是2和3 的关系了,在2和3之间实例化四条线段,两个水平的,两个垂直的,如以下图所示:与A相交的图片数加上与B相交的图片数小于等于2或与C相交的图片数加上与D相交的图片数小于等于2,那么这两个图片确实是连通的。
第三种情形:第三种情形要紧与前两种情形配合利用,若是前两种情形测试不成功,那么直接跳转到第三种情形,若是第三种情形测试仍然不成功,那么这两个图片不连通,也确实是说用户进行了一次错误操作。
第三种情形比较复杂,测试两个图片是不是连通分为两种情形,一种是A线段是水平的(垂直扫描),另一种是A线段是垂直的(水平扫描)。
线段是水平的,咱们要平均距离垂直扫描并实例化A线段,只有在测试到与A相交的图片数为0时,跳出扫描的循环,而且实例化B线段和C线段,若是与B线段相交的图片数加上与C线段相交的图片数小于等于2,那么两个图片连通。
线段是垂直的,算法与上者相同,只是扫描的方向不同。
好了,下面咱们来亲手做一个简单的连连看。
咱们那个连连看很简单,只要依照下面的操作就能够够了。
假设要运行此例如,请确保在FLASH文件同目录下有一个images文件夹,其中有,,...共40个32*32像素的gif格式的图片。
打开flash cs3,新建一个FLASH文档,在文档类中填写simplellk,在同目录下新建一个AS文件,名为,在其中输入以下代码:package {/**连连看原始模型,供AS3交流所用*/importimportimportpublic class simplellk extends Sprite {private var myllk:llk;private var myllkarr:Array=new Array;private var image:Loader;public function simplellk():void {setlisteners();addllk();}private function setlisteners():void { ("mouseDown",click_stage);("keyUp",keyup);}private function keyup(event):void{if==116){pl();}}private function addllk():void {for (var i:int=0; i<80; i++) {myllk=new llk;image=new Loader;(new URLRequest("images/"+((i%40)+1)+".gif")); (image);=30+(i%10)*40;=30+(i/10)*40;(myllk);addChild(myllk);}pl();itTestPoint(mouseX,mouseY)) {myllkarr[i].selected=!myllkarr[i].selected; myllkarr[i].show_selected();for (var j in myllkarr) {if (j!=i&&myllkarr[j].selected&&j%2)==i%2)) { if (testbylevel(i,j)) {myllkarr[i].removethis();myllkarr[j].removethis();if (i>j) {(i,1);(j,1);} else {(j,1);(i,1);}break;} else {myllkarr[i].selected=false;myllkarr[i].show_selected();myllkarr[j].selected=false;myllkarr[j].show_selected();}} else {if (j!=i) {myllkarr[j].selected=false;myllkarr[j].show_selected();}}}break;}}}private var plarr:Array=new Array;private function pl():void {=30 + () * 10) * 40;myllkarr[aa].y=30 + () * 8) * 40;for (var j:int=0; j < ; j++) {if (myllkarr[aa].x == plarr[j].x && myllkarr[aa].y == plarr[j].y) { cxpl(aa);break;}}for (var i:int=0; i < ; i++) {cxpl(i);(myllkarr[i]);}}private function testbylevel(a:Number,b:Number):Boolean { == myllkarr[b].y || myllkarr[a].x == myllkarr[b].x) {var sprite5:Sprite=new Sprite;+ 16,myllkarr[a].y + 16);+ 16,myllkarr[b].y + 16);addChild(sprite5);js=0;for (var i in myllkarr) {if (myllkarr[i].hitTestObject(sprite5)) {js++;if (js > 2) {break;}}if (js <= 2) {unit=true;} else {unit=testlevelthird(a,b);}} else {var sprite1:Sprite=new Sprite; var sprite2:Sprite=new Sprite; var sprite3:Sprite=new Sprite; var sprite4:Sprite=new Sprite; var test1:Boolean=false;var test2:Boolean=false;+ 10,myllkarr[a].y + 10);+ 10,myllkarr[a].y + 10);+ 10,myllkarr[a].y + 10);+ 10,myllkarr[b].y + 10);+ 10,myllkarr[a].y + 10);+ 10,myllkarr[b].y + 10);+ 10,myllkarr[b].y + 10);+ 10,myllkarr[b].y + 10);addChild(sprite1);addChild(sprite2);addChild(sprite3);addChild(sprite4);js=0;for (var d in myllkarr) {if (myllkarr[d].hitTestObject(sprite1) || myllkarr[d].hitTestObject(sprite2)) { js++;if (js > 2) {break;}}}if (js <= 2) {test1=true;}js=0;for (var e in myllkarr) {if (myllkarr[e].hitTestObject(sprite3) || myllkarr[e].hitTestObject(sprite4)) { js++;if (js > 2) {break;}}}if (js <= 2) {test2=true;}if (test1 || test2) {unit=true;} else {unit=testlevelthird(a,b);}}return unit;}private function testlevelthird(c:Number,d:Number):Boolean { var unit:Boolean=false;var js:int=0;itTestObject(sprite10)) {js++;break;}}if (js == 0) {var sprite11:Sprite=new Sprite;+ 16,6 + 40 * kk);+ 16,myllkarr[c].y + 16);addChild(sprite11);js=0;for (var qq in myllkarr) {if (myllkarr[qq].hitTestObject(sprite11)) { js++;if (js > 1) {break;}}}if (js <= 1) {test3=true;} else {test3=false;}var sprite12:Sprite=new Sprite;+ 16,6 + 40 * kk);+ 16,myllkarr[d].y + 16);addChild(sprite12);js=0;for (var ww in myllkarr) {if (myllkarr[ww].hitTestObject(sprite12)) { js++;if (js > 1) {break;}}}if (js <= 1) {test4=true;} else {test4=false;}if (test3 && test4) {unit=true;break;}}}for (var ii:int=0; ii < 12; ii++) { sprite7=new Sprite ;+ 40 * ii,myllkarr[c].y + 16);+ 40 * ii,myllkarr[d].y + 16); addChild(sprite7);js=0;for (var jj in myllkarr) {if (myllkarr[jj].hitTestObject(sprite7)) { js++;break;}}if (js == 0) {var sprite8:Sprite=new Sprite;+ 40 * ii,myllkarr[c].y + 16);+ 16,myllkarr[c].y + 16);addChild(sprite8);js=0;for (var pp in myllkarr) {if (myllkarr[pp].hitTestObject(sprite8)) { js++;if (js > 1) {break;}}}if (js <= 1) {test1=true;} else {test1=false;}var sprite9:Sprite=new Sprite;+ 40 * ii,myllkarr[d].y + 16);+ 16,myllkarr[d].y + 16);addChild(sprite9);js=0;for (var ll in myllkarr) {if (myllkarr[ll].hitTestObject(sprite9)) { js++;if (js > 1) {break;}}}if (js <= 1) {test2=true;} else {test2=false;}if (test1 && test2) {unit=true;break;}}}return unit;}}}importclass llk extends Sprite { private var mouver:Sprite; private var select:Sprite;public var selected:Boolean=false; public function llk():void {=true;setface();;0, 32, 32);=false;select = new Sprite;.3);0, 32, 32);=false;}private function configlisteners():void { ("mouseOver", over_this); ("mouseOut", out_this);}private function out_this(event):void { if (!selected) {try {removeChild(mouver);} catch (error:Error) {}}}private function over_this(event):void { if (!selected) {addChild(mouver);}}//------------------------------------------------------------------- //public functionspublic function show_selected():void {if (selected) {addChild(select);try {removeChild(mouver);} catch (error:Error) {}} else {try {removeChild(mouver);} catch (error:Error) {}try {removeChild(select);} catch (error:Error) {}}}public function removethis():void { ("mouseOver", over_this);("mouseOut", out_this);(this);}}好了,Ctrl+enter就能够够看到成效了,按F5能够重排。
连连看源代码

panel1.add(b7); panel1.add(b8); panel1.add(b9);
panel1.add(b10); panel1.add(b11); panel1.add(b12);
f.pack();
f.setBounds(25,10,600,750);
f.setResizable(false);
f.setVisible(true);
bc.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e) { ex(); }
bc=new Button(" EXIT");
br=new Button("RESET");
p1=new Button();
b1=new Button(String.valueOf(d[1][1]));
b2=new Button(String.valueOf(d[1][2]));
});
b23=new Button(String.valueOf(d[5][3]));
b24=new Button(String.valueOf(d[5][4]));
b25=new Button(String.valueOf(d[5][5]));
b26=new Button(String.valueOf(d[6][1]));
public void mouseClicked(MouseEvent e){ wei(1,1,b1); }
});
连连看delphi代码

function CheckLink(Link: TLink):Boolean;
function CheckPoint(Point:TPoint):Boolean;
function xyToPoint(MatrixPoint:TPoint):TPoint;
AppPath:string; //运行路径
DicPath:string; //字典图片路径
Fullscreen : TBitmap; //存放真个游戏窗体的图片
bmpMatrix:TBMPMatrix; //游戏中的小图构成的矩阵
Rect(0,0,WINDWIDTH,WINDHEIGHT));
//把整个屏幕复制到BITMAP中
finally
FullScreenCanvas.Free;//释放CANVAS对象
ReleaseDC(0,DC);//释放DC
end;
//WinBMP.LoadFromFile('C:\temp\w1.BMP');
GetDICBmps(dicPath); //加载字典图片数组DicBmps
SetWindPos(HWND_TOPMOST); //游戏窗体置前
end;
{windows api 设置游戏窗体最前}
function TfrmLinkTool.SetWindPos(HWND_TOPMOST:LongWord): Boolean;
procedure SetWorking(isValue:Boolean);
procedure RegHotKey();
procedure UnRegHotKey();
连连看源代码

}
}
}
if (x0>x) {
for (n=x0;n>=x+1 ;n-- ) {
if (grid[n][j]!=0) {
k=0;
break;
}
if(grid[n][j]==0 && n==x+1) {
remove();
}
}
}
rows=(int)(Math.random()*5+1);
}
this.grid[cols][rows]=randoms;
}
}
}
public void fraction(){
fractionLable.setText(String.valueOf(Integer.parseInt(fractionLable.getText())+100));
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);
centerPanel.add(diamondsButton[cols][rows]);
}
}
exitButton=new JButton("退出");
exitButton.addActionListener(this);
resetButton=new JButton("重列");
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.摘要当今社会,休闲型游戏越来越得到人们的喜爱,我所做的毕业设计实例“连连看游戏的设计与实现”是近几年来网络上非常流行的一种二维休闲游戏,它对电脑配置要求不高,娱乐性强,易于上手。
C语言实现数字连连看

C语⾔实现数字连连看本⽂实例为⼤家分享了C语⾔实现数字连连看的具体代码,供⼤家参考,具体内容如下要求连连看⼩游戏开发,使⽤⼆维数组来保存游戏地图的数据,实现连连看的核⼼功能。
欢乐连连看的功能有:主界⾯、开始游戏、消⼦、判断胜负、提⽰、重排、计时、游戏模式。
主界⾯游戏主界⾯就是进⾏各项操作的⼊⼝。
开始游戏玩家选择开始游戏模式,进⼊游戏后,选择开始游戏,系统根据设置随机⽣成数字,以供玩家点击消除。
消⼦对玩家选中的两张图⽚进⾏判断,判断是否符合消除规则。
只有符合以下规则的图⽚对才能被消除:⼀条直线连通两条直线连通三条直线连通如果可以消除,两个数字变为0。
如果不能消除,则保持原来的游戏地图。
判断胜负当游戏完成后,需要判断游戏胜负。
不同模式下判断胜负的规则不同。
基本模式时,如果在五分钟内将游戏地图的所有图⽚都消除,则提⽰玩家胜利。
休闲模式时,如果游戏地图中所有图⽚都被消除,则提⽰玩家获胜。
提⽰可以提⽰界⾯上能够消除的⼀对图⽚。
计时设定⼀定时间来辅助游戏是否结束。
游戏模式游戏模式有:基本模式、休闲模式和关卡模式三种,可以根据是否定时等规则进⾏设置。
代码#include <stdio.h>#include <stdlib.h>#include <time.h>#define WIDTH 10#define HEIGHT 12int datas[HEIGHT][WIDTH] = {0};int Choose_type ();void Creat_datas (int fol);bool IsHLinked(int x1,int y1,int x2,int y2);bool IsVLinked(int x1,int y1,int x2,int y2);bool IsZeroTurnLinked(int x1,int y1,int x2, int y2); //⼀条线bool IsOneTurnLinked(int x1, int y1, int x2,int y2); //⼆条线bool IsTwoTurnLinked(int x1,int y1,int x2,int y2); //三条线bool Judge_Answer (int x1,int y1,int x2,int y2); //判断是否可消去void Print_datas ();bool Play_Game (int Flo);bool Relax_Play ();//休闲bool Win_Play ();//闯关int main(){int Flo;Flo = Choose_type (); // choose the typeif (Flo == 0) return 0;srand(unsigned(time(NULL)));Creat_datas(Flo); //creat the graphPrint_datas ();bool ov;ov = Play_Game (Flo);if (ov == true){printf ("VICTORY");}else{printf ("FAILED");}return 0;}bool Basic_Play (){long int t1 ,t2 = 0 ;int op = 1;int x1,y1,x2,y2;bool ANS;printf ("五分钟计时开始\n");t1 = clock();while (t2 < 300000 && !Isblank() && op != 0 ){if (op == 1){Print_datas ();printf("请输⼊两者的坐标[x1 y1 x2 y2]:"); //从上到下,从左到右,先⾏后列 scanf("%d %d %d %d",&x1,&y1,&x2,&y2);if (Judge_Answer (x1, y1, x2,y2)){datas[x1][y1] = datas[x2][y2] = 0;Print_datas ();}else{printf("错误");}}if (op == 2){ANS = Help_ans ();Print_datas ();if (ANS == false){printf ("已没有可以消去的\n");return true;}}printf("是否继续游戏 1、YES 0、NO 2、HELP:");scanf ("%d",&op);t2 = clock() - t1;}if (t2 > 299){printf ("超时\n");return false;}if (Isblank()) return true;else return false;}bool Help_ans (){int k;for (int i = 1; i < 11;i++){if (datas[i][j] != 0){k = j+1;for (int m = i; m < 11;m++){for (int n = k; n < 9;n++){if (datas[i][j] == datas[m][n]){if (Judge_Answer(i,j,m,n)){printf ("(%d,%d) (%d,%d)\n",i,j,m,n);datas[i][j] = datas[m][n] = 0;return true;}}}k = 1;}}}}return false;}bool Relax_Play (){int op = 1;int x1,y1,x2,y2;bool ANS;while (!Isblank() && op != 0) //G isn't blank{if (op == 1){Print_datas ();printf("请输⼊两者的坐标[x1 y1 x2 y2]:");scanf("%d %d %d %d",&x1,&y1,&x2,&y2);if (Judge_Answer (x1, y1, x2,y2)){datas[x1][y1] = datas[x2][y2] = 0;Print_datas ();}else{printf("错误");}}if (op == 2){ANS = Help_ans ();Print_datas ();if (ANS == false){printf ("已没有可以消去的\n");return true;}}printf("是否继续游戏 1、YES 0、NO 2、HELP:"); scanf ("%d",&op);}if (!Isblank()) return false;else return true;}bool Win_Play (){int op = 1;int x1,y1,x2,y2;bool ANS;while (!Isblank() && op != 0) //G isn't blank{if (op == 1){Print_datas ();if (Judge_Answer (x1, y1, x2,y2)){datas[x1][y1] = datas[x2][y2] = 0;Print_datas ();}else{printf("错误");}}printf("是否继续游戏 1、YES 0、NO :");scanf ("%d",&op);}if (!Isblank() && Help_ans) return false;elsereturn true ;}bool Isblank (){for(int j=1; j < 10 ; j++){for (int i= 1; i< 8 ; i++){if (datas[j][i] != 0) return false;}}return true;}bool Play_Game (int Flo){bool Ans;if (Flo == 1) //the basic type{printf ("基本模式:\n");Ans = Basic_Play ();return Ans;}if (Flo == 2) //the relax type{printf ("休闲模式:\n");Ans = Relax_Play ();return Ans;}else //the win type{printf ("第%d关游戏:\n",Flo - 2);Ans = Win_Play ();return Ans;}}void Print_datas (){for(int j=1; j < 11 ; j++){printf("\t\t");for (int i= 1; i< 9 ; i++){printf("%d\t",datas[j][i]);}printf("\n");}}bool Judge_Answer (int x1,int y1,int x2,int y2){if (datas [x1][y1] != datas[x2][y2] || datas [x1][y1] == 0 || datas [x2][y2] == 0 ) return false; if (x1 == x2 && y1 == y2) return false;if (x1 > 11 || x2 > 11 || y1> 9 || y2 > 9) return false;if (x1 == x2 || y1 == y2){if (IsZeroTurnLinked(x1,y1,x2,y2) || IsTwoTurnLinked(x1,y1,x2,y2)) return true;}return false;}int Choose_type (){printf("请选择你要进⾏的操作:1,开始游戏 2,结束游戏\n");int op;scanf("%d",&op);if (op == 1){printf("\n请选择游戏模式:1、基本模式 2、休闲模式 3、关卡模式\n"); int ops;scanf ("%d",&ops);if (ops == 1) return 1;if (ops == 2) return 2;if (ops == 3){printf("\n请选择你选择的关卡3-16:");int opsd;scanf ("%d",&opsd);return opsd;}}if (op == 2) return 0;}void Creat_datas (int fol){int tmpDatas[80] = {0}; // 定义⼀个临时数组⽤于存放int PicNum[] = {3,4,5,1,2,7,9,6,8,44,78,12,90,33,34};int Count = 0,i, j, d = 0,Pic,tem,t;Pic = 8 * 10 / (fol + 9 );for(j=0; j < 80 ; j++){tmpDatas[j] = PicNum[d];Count++;if (Count == Pic ){d++;Count = 0;}}d = 80;for(j=1;j < HEIGHT - 1;j++)for (i = 1;i < WIDTH - 1; i++){t = rand() % d; //Fisher-Yates Shuffletem = tmpDatas[t];tmpDatas[t] = tmpDatas[d -1];tmpDatas[d - 1] = tem;datas[j][i] = tmpDatas[d -1];d--;}}bool IsHLinked(int x1,int y1,int x2,int y2) //横向是否连接{int minY,maxY;if (x1 != x2) return false;if (y1 < y2){minY = y1;maxY = y2;}else{minY = y2;maxY = y1;}if (maxY - minY == 1) return true;for ( int i = minY +1; i < maxY ; i++) //从左到右检查中间的点是不是空的 {if (datas[x1][i] != 0) return false;bool IsVLinked(int x1,int y1,int x2,int y2) //纵向是否连接{int minX,maxX;if (y1 != y2) return false;if (x1 < x2){minX = x1;maxX = x2;}else{minX = x2;maxX = x1;}if (maxX - minX == 1) return true;for ( int i = minX +1; i < maxX ; i++){if (datas[i][y1] != 0) return false;}return true;}bool IsZeroTurnLinked(int x1,int y1,int x2, int y2) //不转折时判断{if (IsHLinked(x1, y1, x2,y2)){return true ;}if (IsVLinked(x1, y1, x2, y2)){return true ;}return false;}bool IsOneTurnLinked(int x1, int y1, int x2,int y2) //转折⼀次{int tmpX[2] = { x1, x2 };int tmpY[2] = { y2, y1 };for (int i = 0; i < 2; i++){if (datas[tmpX[i]][tmpY[i]] != 0) continue;if (IsZeroTurnLinked( tmpX[i], tmpY[i], x1, y1) && IsZeroTurnLinked( tmpX[i], tmpY[i], x2,y2)){return true;}}return false;}bool IsTwoTurnLinked(int x1,int y1,int x2,int y2){int j, tmpX1,tmpY1,tmpX2,tmpY2;//纵向遍历所有点tmpX1 = x1;for ( j = 0; j < WIDTH; j++){tmpY1 = j;if (j == y1) continue;if (tmpX1 == x2 && tmpY1 == y2) continue; //重合tmpX2 = x2;tmpY2 = tmpY1;if (datas[tmpX1][tmpY1] != 0 || datas[tmpX2][tmpY2] != 0) continue;if (IsZeroTurnLinked(tmpX1, tmpY1, tmpX2, tmpY2) && IsZeroTurnLinked(tmpX1, tmpY1, x1, y1) && IsZeroTurnLinked(tmpX2, tmpY2, x2, y2)) return true;}//横向遍历所有点tmpY1 = y1;for ( j = 0; j < HEIGHT; j++)if (j == x1) continue;if (tmpY1 == y2 && tmpX1 == x2) continue; //重合tmpY2 = y2;tmpX2 = tmpX1;if (datas[tmpX1][tmpY1] != 0 || datas[tmpX2][tmpY2] != 0) continue;if (IsZeroTurnLinked(tmpX1, tmpY1, tmpX2, tmpY2) && IsZeroTurnLinked(tmpX1, tmpY1, x1, y1) && IsZeroTurnLinked(tmpX2, tmpY2, x2, y2)) {return true;}}return false;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
连连看游戏设计思想及程序详细讲解(附源码)

连连看游戏设计思想及程序详细讲解(附源码)1、连连的设计思想1)、准备好相应的大小相同的小图片若干public static final int CELL_SIZEx = 36;public static final int CELL_SIZEy = 40;public static final int CELL_COLS = 34;public static final int CELL_ROWS = 14;public static final int CELL_ZONGS = (CELL_COLS-2)*(CELL_ROWS-2);例如本程序:小图片宽:CELL_SIZEx = 36 高:CELL_SIZEy = 40摆放小图片舞台:横向:34格CELL_COLS= 34纵向:14格CELL_ROWS= 14真正要摆放图片的格数:CELL_ZONGS = (CELL_COLS-2)*(CELL_ROWS-2)即:四面的边格不放图片2)、设定34*14个图片数组,其中除四边外,全部随机存入图片,要保证每种图片各数相同(至少不要差太多),并且是偶数(奇数最后消不掉了)。
3)、在舞台上放上鼠标监听器,当点击任一图片时,做出判断,是否第一次点击(点击标记为0就是第一次点击),如果是第一次点击,就将相关信息记录到第一次内容中,比如:x1,y1,cell1,并将点击标记记为1,再次点击后,判断,点的是否同一图片,如果是,不做处理,如果不是,就认为点击了第二个图片,将相关住处记录到第二次内容中,如:x2,y2,cell2。
然后得用这个方法public boolean delkey()判断两点是否可以连通,如果可以,就消掉图片,不可以就不做处理。
整个连连看原理就是这样,其中有几个难点:1、随机图片,并且保证每种图片数相同,并且为偶数。
2、点击监听3、判断两点是否连通,这个算法是整个连连看的核心,也是最难的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要:近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,特别是Java与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言。
Java语言的学习热潮并没有因为时间的推移而消退,相反,由于计算机技术的发展所带来的新应用的出现,Java越来越流行,这种情况是以往程序设计语言在其生存周期内所不多见的。
Java语言之所以这样长盛不衰,一是因为其众多的技术特点与现今的应用十分合拍,可以覆盖大部分的需求;二是因为SUN公司不断推出新的版本,完善Java自身的功能。
有了这两点,Java语言成为程序员首选的程序设计开发工具就在情理之中了.连连看来源于街机游戏《四川麻将》和《中国龙》,是给一堆图案中的相同图案进行配对的简单游戏,在2003年,一个叫做朱俊的网友将这种形式搬到了PC上,立刻成为办公一族的新宠,并迅速传遍了世界各地。
饱受工作压力的人们没有太多的时间进行复杂的游戏,而对于这种动动鼠标就能过关的游戏情有独钟。
之后村子的连连看风靡版,阿达的连连看奥运版,连连看反恐版,还有敏敏连连看,水晶连连看等遍地开花,造就了一个连连看的新世界。
连连看游戏有多种地图样式和道具系统、大大加强了游戏的可玩性,是一款老少皆宜的休闲佳品。
关键字:发展,java,连连看,程序设计;1.课程设计介绍课题设计的目的:1) 进一步加深对Java语言的理解和掌握;将所学的JAVA知识运用于实践中。
2) 课程设计将理论与实践相结合,提供了一个既动手又动脑,独立实践的机会,锻炼我们的分析解决;实际问题的能力,提高学生适应实际,实践编程的能力。
3)熟练掌握JAVA语言中图形用户界面程序的编写;4)大体了解怎样用JAVA来编写小游戏的,增强我们实践能力和创新精神的综合培养。
课程设计的要求:由于Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。
面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承学会java程序开发的环境搭建与配置,并在实际运用中学习和掌握Java程序开发的全过程。
进一步熟悉掌握Java程序设计语言的基础内容,如用户图形界面设计、Java多线程编程、Applet程序的设计、文件和网络输入输出流编程、Java数据库编程等。
通过亲自动手写程序,一方面拓展知识面,一方面锻炼调试能力。
第一章系统设计1.1 需求分析该系统通过运用java的相关知识GUI来做界面设计,将Netbean作为辅助软件,进一步完善系统程序。
是图形化的游戏连连看界面更加美观,不至于过于单调乏味,无形中增加了游戏的观赏性,使这款小游戏给用户带来的舒适度大增。
1.2 总体设计开始初始化设置开始界面画表格初始化数值游戏NO游戏是否结束Yes显示游戏结束画面结束1.3 功能设计每次用户选择两个数字块,如果数字块满足一定条件(两个数字块的数字一样,且这两个数字块之间存在转弯少于3的路径),则两个数字块都能消掉。
给定任意具有相同数字的两个数字块,我们需要寻找这两个块之间在转弯最少的情况下,经过数字数目最少的路径。
如果这个最优路径的转弯数目少于3 ,则这两个数字块可以消去。
通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。
这个游戏是用图形界面实现的,通过编译解释后,出现一个图开界面。
界面是由若干个小方格组成的,每一个小方格里有一个数值,如果在一个边上有相同的数值,连续点击它们就会消失,同时界面上正上方的分数就会自动加分。
游戏还设有退出、重列、再来一局的功能,方便游戏操作。
第二章系统各功能模块设计该系统分为三个模块:1、再来一局游戏通过找寻数字相同的数据块来取得分数每次玩完一局时点击再来一局,游戏就会将每一局的得分累加在一起得到最终分数。
2、重列游戏玩到一定程度时可能找不到数字相同的数字块,因此需要重新排列数据块,这是该游戏的复杂度减小,最终达到娱乐的目的。
3、退出点击此按钮退出游戏。
第三章界面设计该游戏采用GUI来设计界面,程序设计了窗体,在窗体上添加面板,面板上添加按钮,可避勉后一按钮覆盖前一按钮的情况发生。
下面是该游戏的一些相关图:3-1 游戏开始3-2 游戏进行中图示3-3 继续下一局第四章课程设计总结和体会通过这次课程设计还使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
在设计的过程中遇到问题,可以说得是困难重重,并且还发现了自己的许多不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
但通过这次课程设计之后,一定把以前所学过的知识重新温故。
我完成了这次JAVA课程设计,不过这只是我学习路上的驿站。
我相信我在未来的学习中会记住从本次课程设计中所学到的东西,并将它用到未来的学习中去。
在这里谢谢老师的指导,我会更加努力的学习java。
第五章致谢经过为期一周的java课程设计,我学会了很多关于java的相关知识,巩固了所学的知识,同时加深了对这门课的认识,尤其是在刘老师的帮助下取得了很大的进步。
所以在此表示对老师深深地谢意!参考文献:[1] 刘光明.企业文化与核心竞争力[J] .经济管理, 2002, (17).[2] Cochran J K,Qual B K P.A Microcomputer System for Qualitativfe Simulation[J]. Simulation,1990,58(11)[3] 张刚.企业组织创新研究[M] .北京:科学出版社,2000[4] 张庆生.地质力学系统理论[D] .武汉:中国地质大学,2001.[5] 刘宪恩.形成学校文化的基本源点[N] .光明日报,2002-3-12(B1).附录: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 && secondButton!=firstButton){xiao(); } } }public void xiao() { //相同的情况下能不能消去。