【连连看】小游戏初始源代码

合集下载

连连看源代码

连连看源代码
panel1.add(b4); panel1.add(b5); panel1.add(b6);
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); }
});

连连看源代码

连连看源代码

摘要:近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,特别是Java与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言。

Java语言的学习热潮并没有因为时间的推移而消退,相反,由于计算机技术的发展所带来的新应用的出现,Java越来越流行,这种情况是以往程序设计语言在其生存周期内所不多见的。

Java语言之所以这样长盛不衰,一是因为其众多的技术特点与现今的应用十分合拍,可以覆盖大部分的需求;二是因为SUN公司不断推出新的版本,完善Java自身的功能。

有了这两点,Java语言成为程序员首选的程序设计开发工具就在情理之中了.连连看来源于街机游戏《四川麻将》和《中国龙》,是给一堆图案中的相同图案进行配对的简单游戏,在2003年,一个叫做朱俊的网友将这种形式搬到了PC上,立刻成为办公一族的新宠,并迅速传遍了世界各地。

饱受工作压力的人们没有太多的时间进行复杂的游戏,而对于这种动动鼠标就能过关的游戏情有独钟。

之后村子的连连看风靡版,阿达的连连看奥运版,连连看反恐版,还有敏敏连连看,水晶连连看等遍地开花,造就了一个连连看的新世界。

连连看游戏有多种地图样式和道具系统、大大加强了游戏的可玩性,是一款老少皆宜的休闲佳品。

关键字:发展,java,连连看,程序设计;1.课程设计介绍课题设计的目的:1) 进一步加深对Java语言的理解和掌握;将所学的JAVA知识运用于实践中。

2) 课程设计将理论与实践相结合,提供了一个既动手又动脑,独立实践的机会,锻炼我们的分析解决;实际问题的能力,提高学生适应实际,实践编程的能力。

3)熟练掌握JAVA语言中图形用户界面程序的编写;4)大体了解怎样用JAVA来编写小游戏的,增强我们实践能力和创新精神的综合培养。

课程设计的要求:由于Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。

面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承学会java程序开发的环境搭建与配置,并在实际运用中学习和掌握Java程序开发的全过程。

C语言实现连连看

C语言实现连连看

南京航空航天大学计算机专业专业:运算机科学与技术学院姓名:杨万学号:161310224“mymai”文件中代码#include <iostream>using namespace std;#include <stdio.h>#include <fstream>#include <windo>#include <>#include <stdli>#include <strin>#include "lianlianka"int main(){Game mygame;int selection;while(true){mygamenu();cout<<"请输入:"<<endl<<"数字1进入游戏;"<<"数字2继续游戏;"<<"数字3选择游戏难度;"<<"数字4选择游戏模式;"<<"数字5查看排行榜;"<<"数字0退出游戏."<<endl;cin>>selection;if(selection<0||selection>5){cout<<"输入错误"<<endl;system("cls");continue;}DWORD game_start, game_end;switch(selection){case 1:{char myname[20];cout<<"请输入您的用户名(不超过20个字符):"; cin>>myname;mygamme(myname);char ch;bool is_complete = true;DWORD load_start, load_end;load_start = GetTickCount();cout<<"游戏地图加载中,请稍后..................."<<endl;do{mygamMap();load_end = GetTickCount()-load_start;if(load_end > 2000) 简单"<<endl;cout<<"▉ 2. 普通"<<endl;cout<<"▉ 3. 困难"<<endl;do{cout<<"请按相应的数字键选择您需要的游戏难度"<<endl;cin>>difficulty_grade;mygammeDifficuties(difficulty_grade);}while(!(difficulty_grade==1||difficulty_grade==2||difficulty_grade==3)); system("cls");break;}case 4:{int model; 时模式"<<endl;cout<<"▉ 2.无穷时模式"<<endl;do{cout<<"请按相应的数字选择您需要的游戏模式"<<endl;cin>>model;mygammeModel(model);}while(!(model==1||model==2));break;}case 5:{mygamng();break;}case 0:exit(0);}}return 0;}“lianlianka"文件中代码#inclu de <iostream>using namespace std;#include <stdio.h>#include <fstream>#include <windo>#include <>#include <>#include <stdli>#include <strin>#include "lianlianka"/******************************************************************************************** *******//******************************************************************************************** *******//******************************************************************************************** *******/Game::Game() ametime = gametime;strcpy(,name);gamer.model = difficuties/4;saveg((char*)&gamer,sizeof(gamer));saveg();}/******************************************************************************************** *******//******************************************************************************************** *******//******************************************************************************************** *******/void Game::SetName(char *myname){strcpy(name,myname);}/******************************************************************************************** *******//******************************************************************************************** *******//******************************************************************************************** *******/bool Game::IsTEiminate1(int i1,int j1,int i2,int j2){bool flag1 = true; 进入游戏"<<endl;cout<<"●2. 继续游戏"<<endl;cout<<"●3. 设置难度"<<endl;cout<<"●4. 设置模式"<<endl;cout<<"●5. 排行榜"<<endl;cout<<"●0.退出游戏"<<endl;}/******************************************************************************************** *******//******************************************************************************************** *******//******************************************************************************************** *******/void Equal(Gamer &mygamer,Gamer gamertemp){mygamime = gamerime;mygam = gamer;strcpy(mygam,gamer;}void InitGamer(Gamer &mygamer){mygamime = ;mygam = 0;}void SortingGamer(Gamer *gamerarray,int num){Gamer temp;for(int i=0;i<num-1;i++)for(int j=i+1;j<num;j++){if(gamerarray[i].gametime > gamerarray[j].gametime) {Equal(temp,gamerarray[i]);Equal(gamerarray[i],gamerarray[j]);Equal(gamerarray[j],temp);}}}void Game::Ranking(){int k=0;Gamer gamertemp;int i1 = 0;int i2 = 0;int i3 = 0;Gamer esaygame[5];Gamer ordinarygame[5];Gamer difficultgame[5];fstream gamerfile;gamer("gamerinformatio",ios::in|ios::binary);if(!gamerfile){cout<<"打开文件gamerinformation.dat失败"<<endl; return;}while(!gamer()){gamer((char*)&gamertemp,sizeof(Gamer)); if(gamer())break;if(gamer == 1){if(i1<5){Equal(esaygame[i1++],gamertemp);SortingGamer(esaygame,i1);}else{if(gamerime < esaygame[4].gametime) {Equal(esaygame[4],gamertemp);SortingGamer(esaygame,5);}}}if(gamer == 2){if(i2<5){Equal(ordinarygame[i2++],gamertemp);SortingGamer(ordinarygame,i2);}else{if(gamerime < ordinarygame[4].gametime) {Equal(ordinarygame[4],gamertemp);SortingGamer(ordinarygame,5);}}}if(gamer == 3){if(i3<5){Equal(difficultgame[i3++],gamertemp);SortingGamer(difficultgame,i3);}else{if(gamerime < difficultgame[4].gametime) {Equal(difficultgame[4],gamertemp);SortingGamer(difficultgame,5);}}}}gamer();cout<<endl<<"简单模式★:"<<endl;cout<<" 玩家游戏历时(秒) 排名"<<endl<<endl;if(i1 == 0)cout<<endl<<"没有玩家记录,快来创建新记录吧!"<<endl;for(;k<i1;k++){cout<<" "<<esayg ame[k].name<<" "<<esayg ame[k].gamet ime<<" "<<k+1<<endl;}cout<<endl<<"一般模式★★★:"<<endl<<endl;if(i2 == 0)cout<<endl<<"没有玩家记录,快来创建新记录吧!"<<endl;for(;k<i2;k++){cout<<" "<<ordin aryga me[k].name<<" "<<ordin aryga me[k].gamet ime<<" "<<k+1<<endl;}cout<<endl<<"困难模式★★★★★:"<<endl<<endl;if(i3 == 0)cout<<endl<<"没有玩家记录,快来创建新记录吧!"<<endl;for(;k<i3;k++){cout<<" "<<diffi cultg ame[k].name<<" "<<diffi cultg ame[k].gamet ime<<" "<<k+1<<endl;}}”lianlianka"头文件中代码typedef struct gamer{int model; //游戏困难度char name[20]; //游戏者名字double gametime; //游戏时刻}Gamer;class Game{private:int gamemodel; //游戏模式int endtime; //限时模式下游戏的终止时刻char name[21]; //游戏者用户名int score; //游戏得分double gametime; //游戏时刻int difficuties; //游戏难度,那个地址概念了三个难度,简单,一般,困难char gamemap[14][14];public:Game(); //构造函数void BuildMap(); //构造游戏地图void SetName(char *myname); //设置用户姓名bool MapIsRight(); //检查构造的地图是不是正确void Reset(); //切换游戏地图void NewReset();void PaintMap(); //绘制地图void RepaintMap(); //从头绘制地图void SetGameDifficuties(int diff); //设置游戏的难度void SetGameModel(int mymodel); //设置游戏bool LoadMap();//从文件ma中加载地图void SaveMap(char *map); //因为随机产生数组的时间较长,因此选择将产生的地图数组存入文件中,以便下次使用bool IsGEiminate(int i1,int j1,int i2,int j2); //判定是不是可以拐弯排除bool IsVEiminate(int i,int j1,int j2); //是不是能够直线排除bool IsTEiminate2(int j1,int i1,int j2,int i2);//判定是不是可以转折排除(前后通排除)bool IsTEiminate1(int i1,int j1,int i2,int j2); //判定是不是可以转折排除(左右通排除)bool IsEliminate(int i1,int j1,int i2,int j2); //判定是不是成对排除void DoEiminate();//排除操作bool IsComplete(); //是不是完成了所有的排除,假设是是返回true,不然否会falsebool SaveFile();void GameMenu(); //输出游戏菜单void SaveGamer(); //向文件中存储用户完成游戏后的时间和用户名int GetFileMapNum(); //取得文件中地图个数void SetGameTime(double mygametime); //设置用户完成游戏的时间 double GetGameTime(){return gametime;} //获取用户完成游戏的时间 int GetGameEndtime(){return endtime;}int GetGameModel(){return gamemodel;}void Ranking(); //排行榜int GetNoSpaceNum();bool IsGEiminate_sub2(int i1,int j1,int i2,int j2);bool IsGEiminate_sub1(int i1,int j1,int i2,int j2);};。

连连看c语言代码,连连看C语言代码.doc

连连看c语言代码,连连看C语言代码.doc

连连看c语⾔代码,连连看C语⾔代码.doc #include void initialize(); //初始化void near1(int a,int b,int a1,int b1); //算法void print_chess(); //打印棋盘int exit_chess(); //判断是否结束//全局变量char chessman[10][10]; //编译系统初始化每个元素为0void main(){int row,line; //row是⾏号,line是列号int row2,line2; //row是⾏号,line是列号printf("\t\t\t按任意键开始\n");fflush(stdin);getch();initialize(); //初始化棋盘内容do{print_chess();printf("输⼊第⼀个:");fflush(stdin);scanf("%d.%d",&line,&row);printf("输⼊第⼆个:");fflush(stdin);scanf("%d.%d",&line2,&row2);if(chessman[line][row]!=chessman[line2][row2]){printf("两数不相同!\n"); //两数不同}else if(line==line2&&row==row2){printf("错误输⼊\n"); //输⼊相同的坐标,提⽰⽤户错误}else if(line<=line2){near1(line,row,line2,row2); //使⽤函数处理,第⼀个点⼀定在第⼆个点上⽅}else{near1(line2,row2,line,row); //使⽤函数处理}system("pause");}while(exit_chess());system("pause");printf("\n\n\n\t\t恭喜您,您胜利了!\n");printf("\n\t\t制作⼈:蒋睿⽴\n");printf("\n\t博客:http:\\");}void initialize() //初始化棋盘{int i,j; //⽤于循环计数int a[8]={0}; //记录哪些字符出现次数不是偶数srand(time(NULL));for(i=1;i<8;i++) //这⾥只随机前8⾏,留最后⼀⾏不打印for(j=1;j<9;j++){chessman[i][j]=rand()%8+65; //棋盘内容为⼤写字母A到Hif(chessman[i][j]==65) a[0]++; //记录A的个数if(chessman[i][j]==66) a[1]++; //记录B的个数if(chessman[i][j]==67) a[2]++; //记录C的个数if(chessman[i][j]==68) a[3]++; //记录D的个数if(chessman[i][j]==69) a[4]++; //记录E的个数if(chessman[i][j]==70) a[5]++; //记录F的个数if(chessman[i][j]==71) a[6]++; //记录G的个数if(chessman[i][j]==72) a[7]++; //记录H的个数}for(i=0;i<8;i++){if(a[i]%2!=0) //如果字符的个数是奇数就还需要打印⼀个chessman[8][i+1]=i+65;else //如果前⾯7⾏随机的A到H字符恰好是偶数,最后⼀⾏全是I字符chessman[8][i+1]=73;}}void print_chess() //打印棋盘内容{int i,j;system("cls");printf("\t 1 2 3 4 5 6 7 8 \n");for(i=0;i<10;i++){printf("\t\n\t");for(j=0;j<10;j++){printf("%4c",chessman[i][j]);if(j==9&&i!=0&&i!=9)printf("\t%d",i);}}printf("\n\n\n\n");}int exit_chess() //判断是否满⾜退出{int i,j;for(i=0;i<10;i++){for(j=0;j<10;j++)if(chessman[i][j]!=0)return 1; //只要有1个棋⼦不为0,就返回1}return 0;}void near1(int a,int b,int a1,int b1)int arow[2];int aline[2];int brow[2];int bline[2];int start=0,end=0; //临时两个点int i,j,n; //⽤于循环for(i=0;i<2;i++) //初始化数组{arow[i]=a;brow[i]=a1;aline[i]=b;bline[i]=b1;}(a,b) a⾏中有哪些列for(i=a+1;i<10;i++){if(chessman[i][b]==0)arow[1]=i; //arow[1]是A点a⾏向下向量elsebreak;}for(i=a-1;i>=0;i--){if(chessman[i][b]==0) //arow[0]是A点a⾏向上向量arow[0]=i;elsebreak;}(a1,b1) a1⾏中有哪些列for(i=a1+1;i<10;i++){if(chessman[i][b1]==0) //brow[1]是B点a1⾏向下向量brow[1]=i;break;}for(i=a1-1;i>=0;i--){if(chessman[i][b1]==0) //brow[0]是B点a1⾏向上向量{brow[0]=i;}else{break;}}//(a,b) b列中有哪些⾏for(i=b+1;i<10;i++){if(chessman[a][i]==0) //aline[1]是A点b列向右向量{aline[1]=i;}else{break;}}for(i=b-1;i>=0;i--){if(chessman[a][i]==0) //aline[0]是A点b列向左向量{aline[0]=i;}else{break;}}//(a1,b1) b1列中有哪些⾏for(i=b1+1;i<10;i++){if(chessman[a1][i]==0) //bline[1]是B点b1列向右向量{bline[1]=i;}else{break;}}for(i=b1-1;i>=0;i--)if(chessman[a1][i]==0) //bline[0]是B点b1列向左向量{bline[0]=i;}else{break;}}//关键算法////********************************情况⼀·(a,b)·(a1,b1)*********************************//*********************************情况⼆·(a,b)·(a1,b1)**********************************//*考虑上下向量*/if(brow[0]>=arow[0]) //向上⽅向向量 有共同的列向量start=brow[0]; //取⼤的elsestart=arow[0];if(brow[1]<=arow[1]) //向下⽅向向量 有共同的列向量end=brow[1]; //取⼩的elseend=arow[1];for(;start<=end;start++) //列向量上共同点start到end {/** b1要⼤于b,否则就交换如果不交换将使下⾯的循环出错*/if(b0)) //因为b与b1⼤⼩不能确定,所有有2个if chessman[a][b]=chessman[a1][b1]=0;if((n==b1-b)&&(n>0))chessman[a][b]=chessman[a1][b1]=0;}/*考虑左右向量*/if(aline[0]>=bline[0]) //向左的向量 有共同的⾏向量start=aline[0]; //取⼤的elsestart=bline[0];if(aline[1]0) //a1始终⼤于a{chessman[a][b]=chessman[a1][b1]=0;break;}}/********************************************************************************* * 同⾏ 或者 同列 ·(a,b)** · · 或者* (a,b) (a1,b1) ·(a1,b1) **********************************************************************************/ if(a==a1) //同⾏{if((aline[1]>=b1)||(aline[0]<=b1))chessman[a][b]=chessman[a1][b1]=0;}if(b==b1) //同列{if(arow[1]>=a1)chessman[a][b]=chessman[a1][b1]=0;}}。

《连连看》算法c语言演示(自动连连看)

《连连看》算法c语言演示(自动连连看)

《连连看》算法c语⾔演⽰(⾃动连连看)(图⽚是游戏的⽰意图,来⾃互联⽹,与本⽂程序⽆关)看题⽬就知道是写给初学者的,没需要的就别看了,⾃⼰都觉得怪⽆聊的。

很多游戏的耐玩性都来⾃精巧的算法,特别是⼈⼯智能的⽔平。

⽐如前⼏天看了著名的Alpha GO的算法,⽤了复杂的⼈⼯智能⽹络。

⽽最简单的,可能就是连连看了,所以很多⽼师留作业,直接就是实现连连看。

连连看游戏的规则⾮常简单:1. 两个图⽚相同。

2. 两个图⽚之间,沿着相邻的格⼦画线,中间不能有障碍物。

3. 画线中间最多允许2个转折。

所以算法主要是这样⼏部分:1. ⽤数据结构描述图板。

很简单,⼀个2维的整数数组,数组的值就是图⽚的标志,相同的数字表⽰相同的图⽚。

有⼀个⼩的重点就是,有些连连看的地图中,允许在边界的两个图⽚,从地图外连线消除。

这种情况⼀般需要建⽴的图板尺⼨,⽐实际显⽰的图板,周边⼤⼀个格⼦,从⽽描述可以连线的空⽩外边界。

本例中只是简单的使⽤完整的图板,不允许利⽤边界外连线。

2. ⽣成图板。

通常⽤随机数产⽣图⽚ID来填充图板就好。

⽐较复杂的游戏,会有多种的布局⽅式,例如两个三⾓形。

这种⼀般要⼿⼯编辑图板模板,在允许填充的区域事先⽤某个特定的整数值来标注,随后的随机数填充只填充允许填充的区域。

本例中只是简单的随机填充。

3. 检查连线中的障碍物。

确定有障碍物的关键在于确定什么样的格⼦是空。

通常定义格⼦的值为0就算空。

要求所有的图⽚ID从1开始顺序编码。

复杂的游戏还会定义负数作为特定的标志,⽐如允许填充区之类的。

4. 检查直接连接:两张图⽚的坐标,必然x轴或者y轴有⼀项相同,表⽰两张图⽚在x轴或者y轴的同⼀条线上才可能出现直接连接。

随后循环检查两者之间是否有障碍物即可确定。

5. 检查⼀折连接:与检查直接连接相反,两个图⽚必须不在⼀条直线上,才可能出现⼀折连接,也就是x/y必须都不相同。

随后以两张图⽚坐标,可以形成⼀个矩阵,矩阵的⼀对对⾓是两张图⽚,假设是A/B两点。

C# WPF新手入门之连连看小游戏

C# WPF新手入门之连连看小游戏

C# WPF新手入门之连连看小游戏选择10张图片,生成10*10的网格,共100张,每张图片出现10次。

界面包含“游戏开始”,“游戏结束”,“游戏失败”。

1.界面设计:实际效果如下:剩余时间显示10种图片,每种出现10次,共100个格子以下为xaml代码:<Window x:Class="连连看.MainWindow"xmlns="/winfx/2006/xaml/presentation"xmlns:x="/winfx/2006/xaml"xmlns:d="/expression/blend/2008"xmlns:mc="/markup-compatibility/2006"xmlns:local="clr-namespace:连连看"mc:Ignorable="d"Title="连连看" Height="450" Width="624.5" Background="#FFF1A8A8" Loaded="Window_Load" WindowStartupLocation="CenterScreen"ResizeMode="CanMinimize" Visibility="Visible" BorderBrush="#FF61B917"Icon="Image/1.JPG"><Grid Background="#FFEEE6E6"><Grid.RowDefinitions><RowDefinition Height="30" ></RowDefinition><RowDefinition ></RowDefinition></Grid.RowDefinitions><Label Grid.Row="0" x:Name="Label1" Content="00:00" HorizontalAlignment="Center" VerticalAlignment="Top" FontSize="16" RenderTransformOrigin="8.573,4.41"/><Grid Grid.Row="1" Name="GridName" Background="#FFC9C9BA"Margin="0,2,0,0"/><Menu Grid.Row="0" Height="29" Margin="0" HorizontalAlignment="Left" VerticalAlignment="Top"><MenuItem Header="菜单" Background="#FFD1D4C5"BorderBrush="#FF65E69A" VerticalAlignment="Top"VerticalContentAlignment="Center" Height="28" HorizontalAlignment="Left"><MenuItem x:Name="Start_Btn" Header="开始游戏"Click="StartBtn_Click" /><MenuItem x:Name="End_Btn" Header="结束游戏"Click="EndBtn_Click" /></MenuItem><MenuItem x:Name="About_Btn" Header="关于" Background="#FFD1D4C5" BorderBrush="#FF65E69A" Margin="2,0,0,0" Click="AboutBtn_Click"/></Menu></Grid></Window>2.程序设计:首先,在项目路径下需要一些图片:背景音乐,需要WAV格式:在代码中生成Grid方法:for (int i = 0; i < 10; i++)//生成10*10的格子{ColumnDefinition column = new ColumnDefinition(); GridName.ColumnDefinitions.Add(column);RowDefinition row = new RowDefinition();GridName.RowDefinitions.Add(row);}界面上各个按键:About_BtnStart_BtnEnd_Btn图片加载方法:private void Create_Image()//加载图片{int[,] arr1 = new int[10, 10];Random random = new Random();//取随机数for (int i = 1; i < 11; i++)//把数组arr1[0,0]~arr1[9,9]填满随机的1~10数字,并且每个数字出现10次{int ImageCount = 0;while (ImageCount < 10){int x = random.Next(0, 10);int y = random.Next(0, 10);if (arr1[x, y] == 0) //随机数占位,放入空位,否则不放{arr1[x, y] = i;ImageCount++;}}}for (int i = 0; i < 10; i++)//把图片加载到10*10的格子里{for (int j = 0; j < 10; j++){image = new Image{Source = new BitmapImage(new Uri("image/" + arr1[i, j].ToString() + ".JPG", UriKind.Relative)),Name = "image" + arr1[i, j].ToString()};Grid.SetRow(image, i);Grid.SetColumn(image, j);GridName.Children.Add(image);GridName.RegisterName("Cimage" + ImageNo.ToString(), image); //注册图片名字,游戏结束的时候需要注销ImageNo++;image.MouseDown += Image_MouseDown; //图片点击事件}}}消除图片事件:默认count为0,当点击一个图片count+1,然后再次点击的时候count赋值0,且判断此次点击的图片与上次是不是同一种图片,是的话触发消除,否则不消除。

Java课程设计连连看游戏(含代码)

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.摘要当今社会,休闲型游戏越来越得到人们的喜爱,我所做的毕业设计实例“连连看游戏的设计与实现”是近几年来网络上非常流行的一种二维休闲游戏,它对电脑配置要求不高,娱乐性强,易于上手。

连连看游戏编程实现

连连看游戏编程实现

连连看游戏编程实现连连看游戏是一种益智类游戏,通过消除相同的图标来获得分数。

在这个游戏中,玩家需要将相同的图标以条直线连接起来,连接路径不超过两个拐弯。

一旦成功连线后,这些图标就会被消除,玩家获得相应得分。

本文将介绍如何使用编程语言来实现连连看游戏。

1. 游戏的基本要求在实现连连看游戏之前,我们需要先明确游戏的基本要求。

一般来说,连连看游戏应该具备以下几个要素:- 游戏棋盘:棋盘用于摆放游戏图标,一般为矩形的格子。

玩家通过点击格子来选择图标。

- 游戏图标:游戏图标是棋盘上的元素,每个图标应该对应一个唯一的标识,并且能够与其他相同的图标连接。

- 连接规则:玩家只能选择相邻且能够连线的图标进行连接,连接路径不能超过两个拐弯。

2. 游戏的实现思路实现连连看游戏的基本思路如下:- 创建游戏棋盘,并在每个格子中随机放置游戏图标。

- 监听玩家的点击事件,记录玩家选择的图标。

- 判断玩家选择的图标是否符合连接规则,如果符合则消除图标,否则取消选择。

- 判断棋盘上是否还有可连接的图标,如果没有则游戏结束。

3. 游戏的代码实现下面是一个简单的连连看游戏的代码实现示例(使用Python语言):```python# 导入需要的模块import pygameimport random# 游戏棋盘大小board_width = 8board_height = 8# 游戏图标种类数icon_types = 4# 创建游戏棋盘board = []for i in range(board_height):row = []for j in range(board_width):# 随机选择一个图标放置在棋盘上icon = random.randint(0, icon_types-1) row.append(icon)board.append(row)# 初始化Pygame库pygame.init()# 创建游戏窗口screen = pygame.display.set_mode((800, 600)) pygame.display.set_caption("连连看游戏")# 游戏主循环running = Truewhile running:# 处理事件for event in pygame.event.get():if event.type == pygame.QUIT:running = False# 绘制游戏界面screen.fill((255, 255, 255))for i in range(board_height):for j in range(board_width):# 绘制棋盘上的图标pygame.draw.rect(screen, (0, 0, 0), (i*50, j*50, 50, 50))icon = board[i][j]# 绘制图标pygame.draw.circle(screen, (255, 0, 0), (i*50+25, j*50+25), 20)# 更新屏幕显示pygame.display.flip()# 游戏结束,退出Pygame库pygame.quit()```4. 总结通过上述示例代码,我们可以初步实现连连看游戏的编程实现。

C++实现连连看游戏

C++实现连连看游戏

C++实现连连看游戏本⽂实例为⼤家分享了C++实现连连看游戏的具体代码,供⼤家参考,具体内容如下这个项⽬还是挺不错的,运⾏后也⽐较有意思,可以看看。

#include<iostream>#include<conio.h>#include<time.h>#include<stdlib.h>#include<math.h>#include<string.h>using namespace std;void Initial(int a[8][8]);/*初始化*/int Output(int a[8][8]);/*输出*/void Sort(int a[8][8]);/*重排*/void Change(int a[8][8],int x,int y,int x1,int y1);/*交换数组内两坐标对的符号值*/void Judge(int a[8][8],int b[4]);/*判断是否能够消除*/void Zero(int a[8][8],int b[4]);/*设置为零,即:消除*/int Two(int a[8][8],int b[4]);/*两条线*/void Check(int a[8][8],int x,int y,char c[5]);/*返回某点上下左右的情况*/int UpDown(int a[8][8],int b[4],int g);int LeftRight(int a[8][8],int b[4],int g);int main(){int flag=1,flag1=1;//flag⽤于标记是否已经初始化,flag=1表⽰未初始化;flag1标记⽤户是否选择了退出,flag1=1表⽰未选择。

int a[8][8]={0};//0 表⽰空格。

使⽤数组a[8][8]存放符号值,其中仅⽤了下标1-6.int b[4];/*接收坐标*/char ch;do{int o;//⽤于标记是否已经获胜。

原生javascript实现连连看游戏

原生javascript实现连连看游戏

原⽣javascript实现连连看游戏本⽂实例为⼤家分享了js实现连连看游戏的具体代码,供⼤家参考,具体内容如下<!DOCTYPE html><html><head><title>连连看</title><meta charset="gbk"><style type="text/css">body {text-align: center;}.text {text-align: center; margin-top: 60px; color: #fff;}.agin {text-align: center; margin-top: 60px; color: #fff;}#game-box {margin: 60px auto;position: relative;}#game-box img {float: left;width: 59px;height: 59px;border: 1px solid #000000;}#game-box img.hover {border: 1px solid #ffffff;}#game-box img.active {border: 1px solid #7fff00;}#game-box div {background-color: #7fff00;position: absolute;}</style><script type="text/javascript">var byId = function (id) {return document.getElementById(id);}var boxWidth = 61; //格⼦宽度var gameBox;var mapid = 'game-box';//地图 id//22张图⽚var arr = '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22'.split(',');var h = 8; //图⽚共8⾏var w = 11; //图⽚共11列var boxsLength = h*w;var boxArr = {}; //map对象var startBox = ''; //开始的格⼦var endBox = ''; //结束的格⼦window.onload = init;//初始化function init() {byId('agin').style.display = 'none';//隐藏再来⼀把按钮boxsLength = h*w;//图⽚⽅框的个数boxArr = {};startBox = '';endBox = '';var str = '';gameBox = byId(mapid);for (var i = 0; i < h; i++) {for (var j = 0; j < w; j++) {str += '<img class="" onclick="choose(this);" id="t' + i + '_l'+ j + '" src="img/blank.gif">'// alert(str);}//id="t0_l0,t0_l1,t0_l2,t0_l3..."}gameBox.innerHTML = str;gameBox.style.width = w * boxWidth + 'px';pushBoxArr();toHTML();}// 随机获取坐标function getPosition() {var t, f;(function () {t = parseInt(Math.random() * h);l = parseInt(Math.random() * w);if (('t' + t + '_l' + l) in boxArr) {arguments.callee();}})();return {t:t, l:l}}// 创建随机坐标的格⼦function CearteBox(name) {var p = getPosition(); = name;//图⽚名this.t = p.t;//⾏this.l = p.l;//列this.position = 't' + p.t + '_l' + p.l;//位置this.love = 0;//这个⽤于特殊,某些图⽚不同也可以连接switch (name) {case '100':case '200':this.love = 1;break;case '300':case '400':case '500':this.love = 2;break;case '600':case '700':this.love = 3;break;case '800':case '900':this.love = 4;break;}}// 产⽣88个格⼦(图⽚框)function pushBoxArr() {var index = 0;var last = arr.length - 1;for (var i=0; i< h;i++) {for (var j=0;j< w;j++) {var a = new CearteBox(arr[index]);//⽤图⽚名创建,每张图⽚四次 boxArr['t' + a.t + '_l' + a.l] = a;//格⼦的位置(也是每张图⽚的id) if (index === last) {index = 0;} else {index += 1;}}}}// 初始化htmlfunction toHTML() {for (var i in boxArr) {//遍历所有图⽚的idbyId(i).src = 'img/' + boxArr[i].name + '.png';}}// choosefunction choose(el) {if (el.src.indexOf('blank') >= 0) {//⿏标点击了空⽩图⽚return false;}else{el.className = 'active';//更改点击图⽚的样式//第⼀次点击或点击了同⼀张图⽚if (startBox == '' || startBox == el.id) {startBox = el.id;} else {//点击了第⼆张图⽚endBox = el.id;test(boxArr[startBox], boxArr[endBox]);}}}// 判断是不是可连接格⼦function test(a, b) {var can = function (a, b) {if ( == ) {//图⽚名相同就可以连接return true;} else {if (a.love != 0 && b.love != 0) {if (a.love == b.love) {return true;} else {return false;}} else {return false;}}}(a, b);//⽴即执⾏if (can) {//可以连接go(a, b);} else {//不能连接byId(startBox).className = '';startBox = endBox;//指向第⼆张图⽚endBox = '';}}// 判断是否连通function go(a, b) {var _ap = a.position, _bp = b.position;var a = a, b = b, temp, isKill = false;// 建⽴四个点,判断是否两两相通var pt1, pt2, pt3, pt4;// 上到下扫描if (isKill == false) {//交换位置if (a.t > b.t) {temp = a;a = b;b = temp;}for (var i = -1, len = h; i <= len; i++) {pt1 = a;pt2 = {t:i, l:a.l};pt3 = {t:i, l:b.l};pt4 = b;if( (!isNull(pt2) && (pt2.t != a.t) ) || ( !isNull(pt3) && (pt3.t != b.t) ) ){ continue;}else if (link4pt(pt1, pt2, pt3, pt4)){isKill = true;kill(a, b);showLine(pt1, pt2, pt3, pt4);break;return;}}}// 左到右扫描if (isKill == false) {//交换位置if (a.l > b.l) {temp = a;a = b;b = temp;}for (var i = -1, len = w; i <= len; i++) {pt1 = a;pt2 = {t:a.t, l:i};pt3 = {t:b.t, l:i};pt4 = b;if( (!isNull(pt2) && (pt2.l != a.l) ) || ( !isNull(pt3) && (pt3.l != b.l) ) ){ continue;}else if (link4pt(pt1, pt2, pt3, pt4)){isKill = true;kill(a, b);showLine(pt1, pt2, pt3, pt4);break;return;}}}//扫描完毕if(isKill == false){endBox = '';byId(_ap).className = '';startBox = _bp;}}//⼲掉格⼦,删除boxArr中相应格⼦function kill(a, b) {boxArr[a.position] = null;boxArr[b.position] = null;boxsLength -= 2;startBox = '';endBox = '';}// 显⽰链接路径function showLine(a, b, c, d) {var line1 =show2pt(a,b);var line2 = show2pt(b,c);var line3 = show2pt(c,d);var hideLine = function () {gameBox.removeChild(line1);gameBox.removeChild(line2);gameBox.removeChild(line3);byId(a.position).src = byId(d.position).src ='img/blank.gif';byId(a.position).className = byId(d.position).className = '';if (boxsLength<=0) {alert('亲,你赢了!好腻害啊。

【连连看】小游戏初始源代码

【连连看】小游戏初始源代码
northPan el.add(fractio nLable);
mai nFrame.setBou nds(280,100,500,450);
mai nFrame.setVisible(true);
}
p ublic void ran domBuild() {
int ran doms,cols,rows;
thisCo ntai ner.add( north Pan el,"North");
cen terPa nel.setLayout (new GridLayout(6,5));
for(i nt cols = 0;cols < 6;cols++){
for(i nt rows = 0;rows < 5;rows++ ){
JButton diamo ndsButt on叩=new JButt on[ 6][5];//游戏按钮数组
JButton exitButto n,resetButt on,n ewlyButto n; //退出,重列,重新开始按钮
JLabel fractionLable=new JLabel("0"); //分数标签
while(grid[cols][rows]!=0) {
cols=(i nt)(Math.ra ndom()*6+1);
rows=(i nt)(Math.ra ndom()*5+1);
}
this.grid[cols][rows]=ra ndoms;
}
}
}
p ublic void fraction(){
centerPanel=new JPan el();

连连看游戏课程设计+源代码

连连看游戏课程设计+源代码

课程设计课程名称:程序设计课程设计课题名称:网络连连看游戏班级:xxx学号:xxx姓名:xxx指导教师:计算机学院一、课程设计目的本课程设计的目的最主要是掌握linux系统下C++编程思想,以及关于QT软件编程,设计出连连看图形界面,实现连连看各项功能,提高编程和解决问题的能力。

二、课程设计内容设计一个连连看游戏项目,实现如下功能:1、设计连连看游戏界面,能让用户在该界面上进行相关操作。

2、为游戏添加功能:聊天对话,逻辑层相消,游戏级别,时间限制等。

三、课程设计要求1、课程设计的程序必须用C++语言完成。

2、课程设计必须在linux系统下进行。

3、要求写出需求分析报告。

分析部分包括功能需求和界面需求。

4、本项目要求分团队完成,连连看游戏五人一组共同合作,培养学生团队合作的能力。

四、系统的需求分析和模块设计1、需求分析本项目需完成两大模块设计:一为游戏界面设计,二为游戏功能设计。

2、模块分解系统功能层次模块图:五、系统的程序设计与实现程序的运行环境:Linux终端开发环境:QT、C++程序的详细设计:连连看消去算法实现在检验两个方块能否消掉的时候,我们要让两个方块同时满足两个条件才行,就是两者配对并且连线成功。

分3种情况:(从下面的这三种情况,我们可以知道,需要三个检测,这三个检测分别检测一条直路经。

这样就会有三条路经。

若这三条路经上都是空按钮,那么就刚好是三种直线(两个转弯点)把两个按钮连接起来了)* 1.相邻* 2. 若不相邻的先在第一个按钮的同行找一个空按钮。

1).找到后看第二个按钮横向到这个空按钮所在的列是否有按钮。

2).没有的话再看第一个按钮到与它同行的那个空按钮之间是否有按钮。

3).没有的话,再从与第一个按钮同行的那个空按钮竖向到与第二个按钮的同行看是否有按钮。

没有的话路经就通了,可以消了.* 3.若2失败后,再在第一个按钮的同列找一个空按钮。

1).找到后看第二个按钮竖向到这个空按钮所在的行是否有按钮2).没有的话,再看第一个按钮到与它同列的那个空按钮之间是否有按钮。

Android连连看源代码

Android连连看源代码

运行出来效果如下:MainActivity:package games.llk;import android.app.Activity;import android.os.Bundle;public class Main extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);//setContentView(yout.main);setContentView(new GameView(this));}}GameView:package games.llk;import java.util.Random;import android.content.Context;import android.content.res.Resources; import android.graphics.Bitmap;import android.graphics.BitmapFactory; import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.Point;import android.graphics.Rect;import android.graphics.Bitmap.Config; import android.os.Handler;import android.view.MotionEvent; import android.view.View;public class GameView extends View {private int m_w;private int m_h;private int top_client;private int right_client;private int bottom_client;private int left_client;private Rect client_r;private Paint p_client_r;private boolean display_moreInfo;private boolean isInited;private Paint p;private Paint p_line;private Paint p_line_2;private Paint p_text;private Paint p_pross_b;private Paint p_pross;private int point_w;private int point_h;private Rect btn_r_1;private Rect btn_r_2;private Rect btn_r_close;private Bitmap bmp_btn;private Rect pross_r;private Rect pross_r_2;private Rect t_r;private Rect t_r_2;private boolean ispause=false;private boolean isstart=false;private String s_pause="暂停中。

python连连看游戏辅助脚本

python连连看游戏辅助脚本

python连连看游戏辅助脚本 1# -*- coding:utf-8 -*-23 import win32gui4 import time5 from PIL import ImageGrab, Image6 import numpy as np7 import operator8 from pymouse import PyMouse91011 class GameAssist:1213 def __init__(self, wdname):14 """初始化"""1516 # 取得窗⼝句柄17 self.hwnd = win32gui.FindWindow(0, wdname)18 if not self.hwnd:19 print("窗⼝找不到,请确认窗⼝句柄名称:【%s】" % wdname )20 exit()2122 # 窗⼝显⽰最前⾯23 win32gui.SetForegroundWindow(self.hwnd)2425 # ⼩图标编号矩阵26 self.im2num_arr = []2728 # 主截图的左上⾓坐标和右下⾓坐标29 self.scree_left_and_right_point = (299, 251, 768, 564)30 # ⼩图标宽⾼31 self.im_width = 393233 # PyMouse对象,⿏标点击34 self.mouse = PyMouse()3536 def screenshot(self):37 """屏幕截图"""3839 # 1、⽤grab函数截图,参数为左上⾓和右下⾓左标40 # image = ImageGrab.grab((417, 257, 885, 569))41 image = ImageGrab.grab(self.scree_left_and_right_point)4243 # 2、分切⼩图44 # exit()45 image_list = {}46 offset = self.im_width # 394748 # 8⾏12列49 for x in range(8):50 image_list[x] = {}51 for y in range(12):52 # print("show",x, y)53 # exit()54 top = x * offset55 left = y * offset56 right = (y + 1) * offset57 bottom = (x + 1) * offset5859 # ⽤crop函数切割成⼩图标,参数为图标的左上⾓和右下⾓左边60 im = image.crop((left, top, right, bottom))61 # 将切割好的图标存⼊对应的位置62 image_list[x][y] = im6364 return image_list6566 def image2num(self, image_list):67 """将图标矩阵转换成数字矩阵"""6869 # 1、创建全零矩阵和空的⼀维数组70 arr = np.zeros((10, 14), dtype=np.int32) # 以数字代替图⽚71 image_type_list = []7273 # 2、识别出不同的图⽚,将图⽚矩阵转换成数字矩阵74 for i in range(len(image_list)):75 for j in range(len(image_list[0])):76 im = image_list[i][j]7778 # 验证当前图标是否已存⼊79 index = self.getIndex(im, image_type_list)8081 # 不存在image_type_list82 if index < 0:83 image_type_list.append(im)84 arr[i + 1][j + 1] = len(image_type_list)85 else:86 arr[i + 1][j + 1] = index + 18788 print("图标数:", len(image_type_list))8990 self.im2num_arr = arr91 return arr9293 # 检查数组中是否有图标,如果有则返回索引下表94 def getIndex(self,im, im_list):95 for i in range(len(im_list)):96 if self.isMatch(im, im_list[i]):97 return i9899 return -1100101 # 汉明距离判断两个图标是否⼀样102 def isMatch(self, im1, im2):103104 # 缩⼩图标,转成灰度105 image1 = im1.resize((20, 20), Image.ANTIALIAS).convert("L")106 image2 = im2.resize((20, 20), Image.ANTIALIAS).convert("L")107108 # 将灰度图标转成01串,即系⼆进制数据109 pixels1 = list(image1.getdata())110 pixels2 = list(image2.getdata())111112 avg1 = sum(pixels1) / len(pixels1)113 avg2 = sum(pixels2) / len(pixels2)114 hash1 = "".join(map(lambda p: "1" if p > avg1 else "0", pixels1))115 hash2 = "".join(map(lambda p: "1" if p > avg2 else "0", pixels2))116117 # 统计两个01串不同数字的个数118 match = sum(map(operator.ne, hash1, hash2))119120 # 阀值设为10121 return match < 10122123 # 判断矩阵是否全为0124 def isAllZero(self, arr):125 for i in range(1, 9):126 for j in range(1, 13):127 if arr[i][j] != 0:128 return False129 return True130131 # 是否为同⾏或同列且可连132 def isReachable(self, x1, y1, x2, y2):133 # 1、先判断值是否相同134 if self.im2num_arr[x1][y1] != self.im2num_arr[x2][y2]:135 return False136137 # 1、分别获取两个坐标同⾏或同列可连的坐标数组138 list1 = self.getDirectConnectList(x1, y1)139 list2 = self.getDirectConnectList(x2, y2)140 # print(x1, y1, list1)141 # print(x2, y2, list2)142143 # exit()144145 # 2、⽐较坐标数组中是否可连146 for x1, y1 in list1:147 for x2, y2 in list2:148 if self.isDirectConnect(x1, y1, x2, y2):149 return True150 return False151152 # 获取同⾏或同列可连的坐标数组153 def getDirectConnectList(self, x, y):154155 plist = []156 for px in range(0, 10):157 for py in range(0, 14):158 # 获取同⾏或同列且为0的坐标159 if self.im2num_arr[px][py] == 0 and self.isDirectConnect(x, y, px, py): 160 plist.append([px, py])161162 return plist163164 # 是否为同⾏或同列且可连165 def isDirectConnect(self, x1, y1, x2, y2):166 # 1、位置完全相同167 if x1 == x2 and y1 == y2:168 return False169170 # 2、⾏列都不同的171 if x1 != x2 and y1 != y2:172 return False173174 # 3、同⾏175 if x1 == x2 and self.isRowConnect(x1, y1, y2):176 return True177178 # 4、同列179 if y1 == y2 and self.isColConnect(y1, x1, x2):180 return True181182 return False183184 # 判断同⾏是否可连185 def isRowConnect(self, x, y1, y2):186 minY = min(y1, y2)187 maxY = max(y1, y2)188189 # 相邻直接可连190 if maxY - minY == 1:191 return True192193 # 判断两个坐标之间是否全为0194 for y0 in range(minY + 1, maxY):195 if self.im2num_arr[x][y0] != 0:196 return False197 return True198199 # 判断同列是否可连200 def isColConnect(self, y, x1, x2):201 minX = min(x1, x2)202 maxX = max(x1, x2)203204 # 相邻直接可连205 if maxX - minX == 1:206 return True207208 # 判断两个坐标之间是否全为0209 for x0 in range(minX + 1, maxX):210 if self.im2num_arr[x0][y] != 0:211 return False212 return True213214 # 点击事件并设置数组为0215 def clickAndSetZero(self, x1, y1, x2, y2):216 # print("click", x1, y1, x2, y2)217218 # (299, 251, 768, 564)219 # 原理:左上⾓图标中点 + 偏移量220 p1_x = int(self.scree_left_and_right_point[0] + (y1 - 1)*self.im_width + (self.im_width / 2)) 221 p1_y = int(self.scree_left_and_right_point[1] + (x1 - 1)*self.im_width + (self.im_width / 2)) 222223 p2_x = int(self.scree_left_and_right_point[0] + (y2 - 1)*self.im_width + (self.im_width / 2)) 224 p2_y = int(self.scree_left_and_right_point[1] + (x2 - 1)*self.im_width + (self.im_width / 2)) 225226 time.sleep(0.2)227 self.mouse.click(p1_x, p1_y)228 time.sleep(0.2)229 self.mouse.click(p2_x, p2_y)230231 # 设置矩阵值为0232 self.im2num_arr[x1][y1] = 0233 self.im2num_arr[x2][y2] = 0234235 print("消除:(%d, %d) (%d, %d)" % (x1, y1, x2, y2))236 # exit()237238 # 程序⼊⼝、控制中⼼239 def start(self):240241 # 1、先截取游戏区域⼤图,然后分切每个⼩图242 image_list = self.screenshot()243244 # 2、识别⼩图标,收集编号245 self.image2num(image_list)246247 print(self.im2num_arr)248249 # 3、遍历查找可以相连的坐标250 while not self.isAllZero(self.im2num_arr):251 for x1 in range(1, 9):252 for y1 in range(1, 13):253 if self.im2num_arr[x1][y1] == 0:254 continue255256 for x2 in range(1, 9):257 for y2 in range(1, 13):258 # 跳过为0 或者同⼀个259 if self.im2num_arr[x2][y2] == 0 or (x1 == x2 and y1 == y2):260 continue261 if self.isReachable(x1, y1, x2, y2):262 self.clickAndSetZero(x1, y1, x2, y2)263264265 if __name__ == "__main__":266 # wdname 为连连看窗⼝的名称,必须写完整267 wdname = u'宠物连连看经典版2,宠物连连看经典版2⼩游戏,4399⼩游戏 - Google Chrome' 268269 demo = GameAssist(wdname)270 demo.start()271 GameAssist.py代码仅供参考以上代码仅供参考https:///s/gTw8hY9RxFRNK_zaKjZ05。

C 课程设计_连连看游戏1

C  课程设计_连连看游戏1

课程设计报告课程名称:面向对象程序设计C++设计题目:连连看游戏专业:计算机科学与技术姓名:学号:指导教师:李晓虹2016 年 1 月7 日第一章系统需求分析相信大多数玩过QQ游戏的人对这款游戏都不陌生。

这款游戏不止操作简单,规则也不难,再加上游戏速度的控制机制得宜,让整个游戏在操作过程中充满了快乐与紧张的气氛。

除了游乐当中能带给使用者快乐之外,游戏的设计内容无形中也不断训练使用者的逻辑思考能力,对于依靠高度脑力工作的现代人,都可以通过这个游戏,不时的检验一下自己,所以我们不难发现,在各种可携带的电子产品上都有这款游戏的踪影。

第二章总体设计本游戏主要给用户提供的是游戏的娱乐功能,所以怎么提高游戏的娱乐性成为问题的关键,那么娱乐性主要体现在那些方面呢?1,用户界面,具有良好的用户界面能吸引人去玩;2,游戏的娱乐功能,具有良好的娱乐功能是游戏具有持久魅力的基础,需要设计游戏的不同级别以充分调动用户积极性;3,具有友好的提示功能,满足不同游戏级别的人的不同需要,增加必要的音乐效果,使用户玩起来不觉得单调乏味。

鉴于上面分析,本次设计设置不同的游戏级别主要是缩短时间的进行速度,因为图标是随机列换的,所以通过控制产生随机数的难度显得不现实。

通过菜单和快捷键的操作可以适时做出游戏的提示功能,满足提示要求,如果用户对某次产生的图标分布效果不满意可以对现在有的图表资源进行有限次的重排,以满足用户的需要。

关于算法问题,这是游戏设计的核心问题,算法的选择好坏涉及到游戏的质量,采用的产生的二维随机数索引分别和对应图标对应形成游戏界面。

算法需要计算两个相同图标的连通性,计算连通性需要分别判断多次,所以算法的根本在于如何判断区域连通。

第三章详细设计3.1 连连看的要求1,要连接的两点上的图形是相同的。

2,两点间存在一条没有“障碍”的并且折点不超过两个的路线。

那么分析一下可以看到,一般分为三种情况。

图例说明:假设以一个2维数组来表示一张连连看的地图,数组中元素值为0的代表游戏界面中的空格子,值大于0的代表游戏中的各种连接对象。

连连看游戏源代码C#

连连看游戏源代码C#

连连看using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Collections; //ArrayList命名空间namespace 连连看{public partial class Form1 : Form{private Bitmap Source; //所有动物图案的图片private int W = 50; //动物方块图案的宽度private int GameSize=10; //布局大小即行列数private bool Select_first = false; //是否已经选中第一块private int x1, y1; //被选中第一块的地图坐标private int x2, y2; //被选中第二块的地图坐标Point z1, z2; //折点棋盘坐标private int m_nCol = 10;private int m_nRow = 10;private int[] m_map = new int[10*10];private int BLANK_STATE = -1;public enum LinkType {LineType,OneCornerType,TwoCornerType};LinkType LType; //连通方式public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){Source = (Bitmap)Image.FromFile("..\\..\\res\\animal.bmp");this.pictureBox1.Height = W * (m_nRow + 2);this.pictureBox1.Width = W * (m_nCol+2);this.pictureBox1.Top = 0;this.pictureBox1.Left = 0;//当前窗体标题栏高度int d = (this.Height - this.ClientRectangle.Height);this.Height = this.pictureBox1.Height + this.pictureBox1.Top+ d;this.Width = this.pictureBox1.Width + this.pictureBox1.Left ;//for (int i = 0; i < 10 * 10; i++)//{// m_map[i] = i % 6;//}StartNewGame();Init_Graphic();}private void StartNewGame(){//初始化地图,将地图中所有方块区域位置置为空方块状态for(int iNum=0;iNum<(m_nCol*m_nRow);iNum++){m_map[iNum] = BLANK_STA TE;}Random r = new Random();//生成随机地图//将所有的动物物种放进一个临时的地图tmpMap中ArrayList tmpMap=new ArrayList ();for(int i=0;i<(m_nCol*m_nRow)/4;i++)for(int j=0;j<4;j++)tmpMap.Add(i);//每次从上面的临时地图tmpMap中取走(获取后并在临时地图删除) //一个动物放到地图的空方块上for (int i = 0; i < m_nRow * m_nCol; i++){//随机挑选一个位置int nIndex = r.Next() % tmpMap.Count ;//获取该选定物件放到地图的空方块m_map[i]=(int)tmpMap[nIndex];//在临时地图tmpMap除去该动物tmpMap.RemoveAt(nIndex);}}private void Init_Graphic(){Graphics g = get_Graphic(); //生成Graphics对象for (int i = 0; i< 10 * 10; i++){g.DrawImage(create_image(m_map[i]), W * (i % GameSize)+W,W * (i / GameSize)+W, W, W);}}private Graphics get_Graphic(){if (pictureBox1.Image == null){Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);pictureBox1.Image = bmp;}Graphics g = Graphics.FromImage(pictureBox1.Image);return g;}public Graphics GetGraphicsObject(ref PictureBox pic){System.Drawing.Graphics g;Bitmap bmp = new Bitmap(pic.Width, pic.Height);pic.Image = bmp;g = Graphics.FromImage(bmp);return g;}//create_image()方法实现按标号n从所有动物图案的图片中截图。

C++实现连连看游戏核心代码

C++实现连连看游戏核心代码

C++实现连连看游戏核⼼代码这两天研究了⼀下连连看游戏的源代码,感觉它挺简单的,主要就是判断选中的两张图⽚能否消去。

我参考了⽹上的源代码(抱歉的是,不记得当时下载的⽹址了,在此对原作者表⽰深深的歉意!),然后⾃⼰把核⼼代码整理如下,与⼤家共享。

需要说明的是,这只是核⼼算法的代码,界⾯设计和操作的代码均已略去。

#include <stdlib.h>#include <time.h>//图⽚类class picture{public:int type;//图⽚的编号,共有n种,从0到n-1bool visible;//图⽚是否可见int x;//图⽚位置的横坐标int y;//图⽚位置的综坐标};//整个图由8⾏10列组成,每个单元格是⼀张⼩图⽚const int pNum = 10;const int pType = 8;static picture p[pType][pNum];//进⼊新⼀关void newStage(){srand(time(0));int i,j;for(i = 0;i < pType;++i)for(j = 0;j < pNum;j++)p[i][j].visible = false;int x,y;for (i = 0;i < pType - 1;++i)for(j = 0;j < pNum;++j){bool re = true;while (re){x = rand() % pType;y = rand() % pNum;if (p[x][y].visible == false){p[x][y].type = i;p[x][y].visible = true;p[x][y].x = x;p[x][y].y = y;re = false;}}}//处理剩余的最后⼀种图⽚for (i = 0;i < pType;++i)for(j = 0;j < pNum;++j){if (p[i][j].visible == false){p[i][j].type = pType - 1;p[i][j].visible = true;p[i][j].x = i;p[i][j].y = j;}}}//在a、b两点之间画线void drawLine(picture a,picture b){}//判断图⽚a和b之间能否通过⼀条直线相连(a和b之间有0个转⾓)bool matchDirect(picture a,picture b){if(!(a.x == b.x || a.y == b.y))return false;//a、b的横坐标相同时bool yMatch = true;if(a.x == b.x){if(a.y > b.y){for(int i = b.y + 1;i < a.y;++i){if(p[a.x][i].visible == true)yMatch = false;}}if(b.y > a.y){for(int i = a.y + 1;i < b.y;++i){if(p[a.x][i].visible == true)yMatch = false;}}}//a、b的纵坐标相同时bool xMatch = true;if(a.y == b.y){if(a.x > b.x){for(int i = b.x + 1;i < a.x;++i){if(p[i][a.y].visible == true)xMatch = false;}}if(b.x > a.x){for(int i = a.x + 1;i < b.x;++i){if(p[i][a.y].visible == true)xMatch = false;}}}return (xMatch && yMatch);}//判断图⽚a和b之间是否可以通过⼀个转⾓的折线相连bool matchOneCorner(picture a,picture b){if (p[a.x][b.y].visible == false && matchDirect(a,p[a.x][b.y]) && matchDirect(p[a.x][b.y],b)) {drawLine(a,p[a.x][b.y]);drawLine(p[a.x][b.y],b);return true;}if (p[b.x][a.y].visible == false && matchDirect(a,p[b.x][a.y]) && matchDirect(p[b.x][a.y],b)) {drawLine(a,p[b.x][a.y]);drawLine(p[b.x][a.y],b);return true;}return false;}//判断图⽚a和b之间是否可以通过两个转⾓的折线相连bool matchTwoCorner(picture a,picture b){int i,j;for(i = a.x - 1,j = a.y;i >= 0;--i){if(p[i][j].visible == true)break;else if(matchOneCorner(b,p[i][j])){drawLine(a,p[i][j]);return true;}}for (i = a.x + 1,j = a.y;i < pNum;++i){if(p[i][j].visible == true)break;else if(matchOneCorner(b,p[i][j])){drawLine(a,p[i][j]);return true;}}for(i = a.x,j = a.y - 1;j >= 0;--j){if(p[i][j].visible == true)break;else if(matchOneCorner(b,p[i][j])){drawLine(a,p[i][j]);return true;}}for(i = b.x,j = b.y + 1;j < pType;++j){if(p[i][j].visible == true)break;else if(matchOneCorner(b,p[i][j])){drawLine(a,p[i][j]);return true;}}return false;}//判断a和b能否相连,条件是a和b的类型相同,且a和b之间的连线拐⾓数<=2个bool match(picture a,picture b){if(a.type != b.type)return false;if(matchDirect(a,b)){drawLine(a,b);return true;}else if(matchOneCorner(a,b))return true;else if(matchTwoCorner(a,b))return true;return false;}关于C++⼩游戏的更多精彩内容请点击专题:学习了解以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
thisContainer.add(southPanel,"South");
thisContainer.add(northPanel,"North");
centerPanel.setLayout(new GridLayout(6,5));
for(int cols = 0;cols < 6;cols++){
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);
secondMsg=grid[x][y];
secondButton=bz;
if(fristMsg==secondMsg && secondButton!=firstButton){
xiao();
}
}
}
public void xiao() { //相同的情况下能不能消去。仔细分析,不一条条注释
if((x0==x &&(y0==y+1||y0==y-1)) || ((x0==x+1||x0==x-1)&&(y0==y))){ //判断是否相邻
package Lianliankan;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class lianliankan implements ActionListener
{
JFrame mainFrame; //主面板
if (grid[x][i]!=0) {
k=0;
break;
}
else{ k=1; } //K=1说明通过了第一次验证
}
if (k==1) {
linePassOne();
}
}
if (y<j){ //如果第二个按钮的Y坐标小于空按钮的Y坐标说明第一按钮在第二按钮右边
for (i=y+1;i<=j ;i++ ){ //判断第二按钮左侧直到第一按钮中间有没有按钮
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);
【连连看】简单小游戏初始源代码
使用说明:进入Java开发工具eclipse中,在左面建立一个任意名的java project,然后在工程下建立一个名字为Lianliankan的package,最后建立一个名字为lianliankan的class类。
将以下程序代码复制入class内容面板中,点击运行。
}
}
if (x<i) {
for (j=x+1;j<=i;j++ ) {
if (grid[j][y]!=0) {
k=0;
break;
}
else { k=1; }
}
if (k==1) {
rowPassOne();
}
}
if (x==i) {
rowPassOne();
}
}
if (k==2){
if (y0==y) {
remove();
}
if (y0<y) {
for (n=y0;n<=y-1 ;n++ ) {
if (grid[i][n]!=0) {
k=0;
break;
}
if(grid[i][n]==0 && n==y-1) {
remove();
}
}
}
if (y0>y) {
for (n=y0;n>=y+1 ;n--) {
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;
Container thisContainer;
JPanel centerPanel,southPanel,northPanel; //子面板
JButton diamondsButton[][] = new JButton[6][5];//游戏按钮数组
JButton exitButton,resetButton,newlyButton; //退出,重列,重新开始按钮
if (grid[x][i]!=0){
k=0;
break;
}
else { k=1; }
}
if (k==1){
linePassOne();
}
}
if (y==j ) {
linePassOne();
}
}
if (k==2) {
if (x0==x) {
remove();
}
if (x0<x) {
for (n=x0;n<=x-1;n++ ) {
thisContainer.setLayout(new BorderLayout());
centerPanel=new JPanel();
southPanel=new JPanel();
northPanel=new JPanel();
thisContainer.add(centerPanel,"Center");
}
}
}
public void fraction(){
fractionLable.setText(String.valueOf(Integer.parseInt(fractionLable.getText())+100));
}
public void reload() {
int save[] = new int[30];
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();
if (grid[i][n]!=0) {
k=0;
break;
}
if(grid[i][n]==0 && n==y+1) {
remove();
}
}
}
}
}
}
}
public void linePassOne(){
if (y0>j){ //第一按钮同行空按钮在左边
for (i=y0-1;i>=j ;i-- ){ //判断第一按钮同左侧空按钮之间有没按钮
if (grid[n][j]!=0) {
k=0;
break;
}
if(grid[n][j]==0 && n==x-1) {
remove();
}
}
}
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) {
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;
remove();
}
else{
相关文档
最新文档