简单的连连看代码
连连看源代码

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); }
});
连连看源码(C++)

{ int i,j; InitMap(); //map[38]=map[0]=0; //memcpy(map,in_map,MAP_SIZE*sizeof(int)); for (i=0;i<MAP_SIZE;i++){ printf("%2d",map[i]); if(i%MAP_WIDTH==MAP_WIDTH-1) printf("\n"); } printf("\n"); for (i=0;i<TYPE;i++){ for(j=0;j<16;j++){ printf("%-3d ",pic[i][j]); } printf("\n"); } printf("%d %d\n",Match(20,23),Match(24,27)); printf("%d %d\n",Match(57,94),Match(155,159)); int sq[2],type; type=Prompt(sq); while(type!=-1){ printf("%-2d:%-3d,%-3d:%3d\n",type,sq[0],sq[1],totpic); DelPic(sq[0]);DelPic(sq[1]); type=Prompt(sq); } printf("totpic:%d\n",totpic); return 0;
int i,j; int td,tid; for (i=0;i<n-1;i++){
for (j=i;j<n;j++){ if (data[i]>data[j]){ td=data[i];data[i]=data[j];data[j]=td; tid=id[i];id[i]=id[j];id[j]=tid; }
C语言程序设计连连看

#include <stdio.h>#include <stdlib.h>#include <time.h>#include <conio.h>#include <iostream>using namespace std;#include <ctime>int mai() //倒计时{for (int i=3; i>=0; i--){ long t = time(NULL);for(;;){long n = time(NULL);if(n != t)break; }system("cls");cout<<""<<endl;cout<<""<<endl;cout<<" 离史上最卡哇依的游戏开始还有** " << i << " **秒哦!!!"<<endl;}return 0;}void init1();void print1();int exit1();void init2();void print2();int exit2();void init3();void print3();int exit3();void near1(int a,int b,int a1,int b1);char chessman[10][10];void main() //主函数{ time_t start,end,time;start=clock();mai();int d;cout<<""<<endl;cout<<""<<endl;cout<<""<<endl;cout<<" ****************************************************************"<<endl;cout<<" ****************************************************************"<<endl;cout<<" **亲,请选择适合您智商的级别:[1]低级[2]中级[3]登峰造极**"<<endl;cout<<" ****************************************************************"<<endl;cout<<" ****************************************************************"<<endl;cout<<""<<endl;cout<<""<<endl;cout<<" 研发小组:Q Y Q"<<endl;cout<<"请选择:***- ";cin>>d;cout<<" -*** "<<endl;system("pause");switch(d){case 1:init1();break;case 2:init2();break;case 3:init3();break; default :cout<<"你个逗比"; }int op;int row,line;int row2,line2;do{ if(d==1)print1();else if(d==2)print2();else if(d==3)print3();printf("options:\n");printf("\t1.select\n");printf("\t2.restart\n");printf("\t3.sort\n");scanf("%d",&op);if(op==1){printf("不造亲第一个相中了谁呢:");scanf("%d %d",&line,&row);printf("再给他找个伴儿吧,亲:");scanf("%d %d",&line2,&row2);if(chessman[line][row]!=chessman[line2][row2]){printf("有缘无分呐!\n");system("pause");}else if(line==line2&&row==row2){printf("有搞错哦,亲!!!\n");system("pause");}else if(line<=line2){near1(line,row,line2,row2);}else{near1(line2,row2,line,row);}}if(op==2){}if(op==3){ main();}}while(exit1(),exit2(),exit3());system("pause");printf("\n\n\n\t\t哇呀!你好厉害!\n");end=clock();time=end-start; //这里的时间是计算机内部时间cout << endl << "time:" << time << endl;system("pause");cout<<"本次得分:98分! 继续保持哦!"<<endl;system("pause");}void init1() //4乘4矩阵{int i,j;int a[4]={0};srand(time(NULL));for(i=1;i<4;i++)for(j=1;j<5;j++){chessman[i][j]=rand()%4+65;if(chessman[i][j]==65) a[0]++;if(chessman[i][j]==66) a[1]++;if(chessman[i][j]==67) a[2]++;if(chessman[i][j]==68) a[3]++;}for(i=0;i<4;i++){if(a[i]%2!=0)chessman[4][i+1]=i+65;elsechessman[4][i+1]=69;}}void print1(){int i,j;system("cls");printf("\t 1 2 3 4\n");for(i=0;i<5;i++){printf("\t\n\t");for(j=0;j<5;j++){printf("%4c",chessman[i][j]);if(j==4&&i!=0&&i!=5)printf("\t%d",i);}}printf("\n\n\n\n");}int exit1(){int i,j;for(i=0;i<6;i++){for(j=0;j<6;j++)if(chessman[i][j]!=0)return 1;}return 0;}void init2() //6乘6矩阵{int i,j;int a[6]={0};srand(time(NULL));for(i=1;i<6;i++)for(j=1;j<7;j++){chessman[i][j]=rand()%6+65;if(chessman[i][j]==65) a[0]++;if(chessman[i][j]==66) a[1]++;if(chessman[i][j]==67) a[2]++;if(chessman[i][j]==68) a[3]++;if(chessman[i][j]==69) a[4]++;if(chessman[i][j]==70) a[5]++;}for(i=0;i<6;i++){if(a[i]%2!=0)chessman[6][i+1]=i+65;elsechessman[6][i+1]=71;}}void print2(){int i,j;system("cls");printf("\t 1 2 3 4 5 6\n");for(i=0;i<8;i++){printf("\t\n\t");for(j=0;j<8;j++){printf("%4c",chessman[i][j]);if(j==6&&i!=0&&i!=7)printf("\t%d",i);}}printf("\n\n\n\n");}int exit2(){int i,j;for(i=0;i<8;i++){for(j=0;j<8;j++)if(chessman[i][j]!=0)return 1;}return 0;}void init3() //8乘8矩阵{int i,j;int a[8]={0};srand(time(NULL));for(i=1;i<8;i++)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]++;if(chessman[i][j]==67) a[2]++;if(chessman[i][j]==68) a[3]++;if(chessman[i][j]==69) a[4]++;if(chessman[i][j]==70) a[5]++;if(chessman[i][j]==71) a[6]++;if(chessman[i][j]==72) a[7]++;}for(i=0;i<8;i++){if(a[i]%2!=0)chessman[8][i+1]=i+65;elsechessman[8][i+1]=73;}}void print3(){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 exit3(){int i,j;for(i=0;i<10;i++){for(j=0;j<10;j++)if(chessman[i][j]!=0)return 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)a行中有哪些列for(i=a1+1;i<10;i++){if(chessman[i][b1]==0) //brow[1]B点a1行向下向量brow[1]=i;elsebreak;}for(i=a1-1;i>=0;i--){if(chessman[i][b1]==0) //brow[1]B点a1行向上向量brow[0]=i;elsebreak;}//////////////////////////////////////(a,b)b行有哪些列for(i=b+1;i<10;i++){if(chessman[a][i]==0) //aline[1]A点b列向右向量aline[1]=i;elsebreak;}for(i=b-1;i>=0;i--){if(chessman[a][i]==0) //aline[0]A点b列向左向量aline[0]=i;elsebreak;}/////////////////////////////(a1,b1)中b1列中有哪些行for(i=b1+1;i<10;i++){if(chessman[a1][i]==0) //bline[1]B点b1列向左向量bline[1]=i;elsebreak;}for(i=b1-1;i>=0;i--){if(chessman[a1][i]==0) //bline[1]B点b1列向右向量bline[0]=i;elsebreak;}///////////////////////////////////////关键算法////////////////////////////////////**********************情况一(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++) //列向量上共同sart到end{//b1要大于b,否则就交换如果不交换将使下面的循环出错、//if(b<b1){j=b; //小的赋值到ji=b1; //大的赋值到i.}else{j=b1;i=b;}///这里节约一个变量for(n=0;j<i;j++) //同一行上,从列j到i{if(chessman[start][j]==0) //同一行上,所有列都是0n++;elsebreak;}if((n==b-b1)&&(n>0)) //因为b和b1大小不能确定,所以有两个ifchessman[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]<bline[1])end=aline[1];elseend=bline[1];for(i=start;i<=end;i++){for(j=a,n=0;j<a1;j++){if(chessman[j][i]==0) //同一列上所有行都是0n++;elsebreak;}if(n==a1-a&&n>0){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;} }。
连连看通用脚本

FindColor L,T,x1+xbuju*j,B,GetColor,intX,intY
If intX > 0 And intY > 0 Then
MoveTo intX,intY
FindColor x1+xbuju*j,T,x2+xbuju*j,y1+i*ybuju,GetColor,intX,intY
If intX > 0 And intY > 0 Then
MoveTo intX,intY
FindColor x1+xbuju*j,y2+i*ybuju,x2+xbuju*j,B,GetColor,intX,intY
If intX > 0 And intY > 0 Then
MoveTo intX,intY
UserVar lie=0 "几列"
UserVar beijing1="000000" "背景色1(一定要加双引号!)"
UserVar beijing2="000000" "背景色2(一定要加双引号!如果只有一种背景色,那么可以与背景色1相同或忽视)"
Dim Hwnd
Hwnd = Plugin.Window.MousePoint()
LeftClick 1
MoveTo zhongxinx+xbuju*j,zhongxiny+i*ybuju
LeftClick 1
End If
While 1
i=0
j = 0
While i<=hang-1
《连连看》算法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两点。
连连看游戏编程教程

连连看游戏编程教程连连看游戏是一款经典的益智类游戏,其独特的游戏规则让玩家们在娱乐的同时提高了思维能力和反应速度。
本篇文章将为大家介绍如何使用Python语言编写一个简单的连连看游戏。
一、游戏规则的设计在开始编写代码之前,我们需要先设计游戏规则。
连连看游戏的目标是通过消除相同图标的配对来清空游戏界面上的所有方块。
具体的游戏规则如下:1. 游戏界面是一个矩阵,每个方块上都有一个图标。
2. 玩家需要通过连接相同图标的路径来消除方块。
路径只能在水平和垂直方向上进行连接,不能有其他方块阻挡。
3. 每次消除相同图标的方块会得到一定的分数,随着游戏的进行,剩余方块的数量会减少。
4. 游戏会根据玩家的分数和剩余方块数量进行评分和排名。
二、游戏界面的设计在编写代码之前,我们需要使用Python中的图形库创建游戏界面。
这里我们推荐使用Pygame库,它是一款功能强大且易于上手的游戏开发库。
首先,我们需要创建一个窗口以及游戏界面的矩阵。
可以使用Pygame库提供的Surface对象来创建窗口,并使用二维列表来表示游戏界面的矩阵。
接下来,我们需要在窗口中绘制游戏界面的方块和图标。
可以使用Pygame库提供的绘制函数来实现,通过循环遍历游戏界面的矩阵,根据方块的状态来选择绘制的图标。
可以使用不同的颜色或者图片来表示不同的图标。
三、游戏逻辑的设计游戏逻辑是编写连连看游戏的核心部分。
主要包括方块的生成、方块的选择和判断是否可以连接的函数。
首先,在游戏开始时,需要生成随机的方块,并将其放置在游戏界面的矩阵中。
然后,需要实现方块的选择函数,玩家可以通过鼠标点击方块来选择两个需要连接的方块。
可以使用Pygame库提供的事件监听函数来实现。
接下来,需要实现判断两个方块是否可以连接的函数。
主要通过判断两个方块之间是否有可连通的路径来判断它们是否可以连接。
可以使用BFS或DFS等搜索算法来实现。
最后,在两个方块成功连接后,需要将它们从游戏界面的矩阵中移除,并计算玩家得分。
连连看算法及实现原理详解(C++源码)
void FunctionalModule::m_ColorToNum(HWND hwnd) //把像素转换为数组格式
{
HDC hdc=GetDC(hwnd);
break;
default:
break;
}
}
}
}
}
}
}
}
}
}
////////////////////////////////////////////////////////////////////////
int icolor=0;
COLORREF ccolor1,ccolor2;
for (int n1=0,nx=10;n1<5;n1++,nx-=5)
{
for (int m1=0,my=10;m1<5;m1++,my-=5)
int m_LeftTop(int ax,int ay,int bx,int by); //左上 11
int m_YLeft(int ax,int ay,int bx,int by); //y左 12
int m_LeftBottom(int ax,int ay,int bx,int by); //左下 13
{
ptLineOne.x=0;ptLineOne.y=0;//转折点的两个坐标设为0
ptLineTwo.x=0;ptLineTwo.y=0;
numTotal=(xLast+1)*(yLast+1);//图案总的个数
C语言实现连连看
南京航空航天大学计算机专业专业:计算机科学与技术学院姓名:杨万学号:161310224“mymain.cpp”文件中代码#include <iostream>using namespace std;#include <stdio.h>#include <fstream>#include <windows.h>#include <math.h>#include <stdlib.h>#include <string.h>#include "lianliankan.h"int main(){Game mygame;int selection;while(true){mygame.GameMenu();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;mygame.SetName(myname);char ch;bool is_complete = true;DWORD load_start, load_end;load_start = GetTickCount();cout<<"游戏地图加载中,请稍后..................."<<endl;do{mygame.BuildMap();load_end = GetTickCount()-load_start;if(load_end > 2000) //如果系统随机产生地图时间大于4s,则直接从map.dat文件中加载地图{mygame.LoadMap();break;}}while(mygame.MapIsRight());game_start = GetTickCount();while(!mygame.IsComplete()){if(mygame.GetGameModel() == 1&&mygame.GetGameTime()*1000 > mygame.GetGameEndtime()) {is_complete = false;cout<<"时间到,游戏结束"<<endl;break;}mygame.PaintMap();do{cout<<"是否需要变换地图,输入‘Y’或‘y’切换地图,按‘N’或<<"任意字符键继续,回车、空格、TAB键无效"<<endl;cin.ignore();cin>>ch;if( ch == 'Y'||ch == 'y'){mygame.Reset();mygame.PaintMap();}if(ch == 'N'||ch == 'n'){is_complete = false;system("cls");break;}}while(ch == 'Y'||ch == 'y');if(ch == 'N'||ch == 'n')break;mygame.DoEiminate();game_end = GetTickCount()-game_start;mygame.SetGameTime(game_end/1000.0);}if(is_complete){game_end = GetTickCount()-game_start;mygame.SetGameTime(game_end/1000.0);mygame.SaveGamer();//将完成游戏的玩家用时,和一些游戏信息存入文件中cout<<game_end<<endl;}break;}case 2:{char ch;DWORD game_start, game_end;bool is_complete = true;game_start = GetTickCount();while(!mygame.IsComplete()){mygame.PaintMap();do{cout<<"是否需要变换地图,输入‘Y’或‘y’切换地图,按‘N’或<<"任意字符键继续,回车、空格、TAB键无效"<<endl;cin.ignore();cin>>ch;if( ch == 'Y'||ch == 'y')mygame.Reset();if(ch == 'N'||ch == 'n'){is_complete = false;system("cls");break;}}while(ch == 'Y'||ch == 'y');if(ch == 'N'||ch == 'n')break;mygame.DoEiminate();}if(is_complete){game_end = GetTickCount()-game_start;mygame.SetGameTime(game_end/1000.0);cout<<game_end<<endl;}break;}case 3:{int difficulty_grade = 2; //默认难度普通cout<<"▉ 1. 简单"<<endl;cout<<"▉ 2. 普通"<<endl;cout<<"▉ 3. 困难"<<endl;do{cout<<"请按相应的数字键选择您需要的游戏难度"<<endl;cin>>difficulty_grade;mygame.SetGameDifficuties(difficulty_grade);}while(!(difficulty_grade==1||difficulty_grade==2||difficulty _grade==3));system("cls");break;}case 4:{int model; //游戏模式cout<<"▉ 1.限时模式"<<endl;cout<<"▉ 2.无限时模式"<<endl;do{cout<<"请按相应的数字选择您需要的游戏模式"<<endl;cin>>model;mygame.SetGameModel(model);}while(!(model==1||model==2));break;}case 5:{mygame.Ranking();break;}case 0:exit(0);}}return 0;}“lianliankan.cpp"文件中代码#include <iostream>using namespace std;#include <stdio.h>#include <fstream>#include <windows.h>#include <math.h>#include <time.h>#include <stdlib.h>#include <string.h>#include "lianliankan.h"/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/Game::Game() //构造函数中随机初始化地图{difficuties = 8; //默认难道为普通strcpy(name,"");gametime = 0.0;endtime = 0;gamemodel = 2;//游戏模式默认设置为无限时模式score = 0;for(int i=0;i<14;i++)for(int j=0;j<14;j++)gamemap[i][j] = ' ';}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/void Game::BuildMap(){int jie = difficuties; //随机创建jie阶随机字符矩阵,构造地图srand((unsigned)time(NULL));int m=(14-jie)/2;int n=(14+jie)/2;for(int i=m;i<n;i++){for(int j=m;j<n;j++){gamemap[i][j] = 'A'+rand()%8; //用rand()%8+'A'随机产生8个字母元素}}}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/bool Game::IsTEiminate2(int j1,int i1,int j2,int i2){int jie = difficuties;bool flag1 = true; //是否能够前通消除bool flag2 = true; //是否能够后通消除int m =0;int n=0;//是否能够左通消除for(m=(14-jie)/2;m<i1;m++){if(gamemap[m][j1] != ' '){flag1 = false;break;}}for(m=(14-jie)/2;m<i2;m++){if(gamemap[m][j2] != ' '){flag1 = false;break;}}for(m=i1+1;m<(14+jie)/2;m++){if(gamemap[m][j1] != ' '){flag2 = false;break;}}for(m=i2+1;m<(14+jie)/2;m++){if(gamemap[m][j2] != ' '){flag2 = false;break;}}if(flag1||flag2)return true;return false;}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/void Game::SetGameDifficuties(int diff) //设置游戏的难度{if(diff == 1)difficuties = 4;else if(diff == 2)difficuties = 8;else if(diff == 3)difficuties = 12;}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/void Game::SaveGamer(){Gamer gamer;fstream savegamer;savegamer.open("gamerinformation.dat",ios::out|ios::app|ios::binary );if(savegamer.fail()){//cout<<"打开gamerinformation.data文件失败"<<endl;return;}gamer.gametime = gametime;strcpy(,name);gamer.model = difficuties/4;savegamer.write((char*)&gamer,sizeof(gamer));savegamer.close();}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/void Game::SetName(char *myname){strcpy(name,myname);}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/bool Game::IsTEiminate1(int i1,int j1,int i2,int j2){bool flag1 = true; //是否能够左通消除bool flag2 = true; //是否能够右通消除int m =0;int n=0;int jie = difficuties;//是否能够左通消除for(m=(14-jie)/2;m<j1;m++){if(gamemap[i1][m] != ' '){flag1 = false;break;}}for(m=(14-jie)/2;m<j2;m++){if(gamemap[i2][m] != ' '){flag1 = false;break;}}for(m=j1+1;m<(14+jie)/2;m++){if(gamemap[i1][m] != ' '){flag2 = false;break;}}for(m=j2+1;m<(14+jie)/2;m++){if(gamemap[i2][m] != ' '){flag2 = false;break;}}if(flag1||flag2)return true;return false;}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/void Game::SetGameModel(int mymodel){gamemodel = mymodel;if(gamemodel == 1){if(difficuties == 4)endtime =120*1000; //简单限时模式下2分钟内如果没有完成游戏,游戏自动结束if(difficuties == 8)endtime = 360*1000; //普通限时模式下6分钟如果没有完成游戏,游戏自动结束if(difficuties == 4)endtime = 600*1000; //困难模式下10分钟如果没有完成游戏,游戏自动结束}}bool Game::IsVEiminate(int i,int j1,int j2) //判断是否能够垂直水平消除{bool flag = true;int m=0;int n=0;for(m=j1+1;m<j2;m++){if(gamemap[i][m] != ' '){flag = false;break;}}for(m=j2+1;m<j1;m++){if(gamemap[i][m] != ' '){flag = false;break;}}return flag;}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/void Game::DoEiminate(){int jie = difficuties;char ch;int xi1,i1;int xi2,i2;int xj1,j1;int xj2,j2;cout<<"请输入你要消除的两个元素的下标,输入格式为(i,j)"<<endl; cin>>ch>>xi1>>ch;cin>>xj1>>ch;cin>>ch>>xi2>>ch;cin>>xj2>>ch;i1 = xi1+(14-jie)/2-1;i2 = xi2+(14-jie)/2-1;j1 = xj1+(14-jie)/2-1;j2 = xj2+(14-jie)/2-1; //进行坐标系的转化,因为屏幕输出数组和计算机中存储的字符数组下标不同if(IsEliminate(i1,j1,i2,j2)){gamemap[i1][j1] = ' ';gamemap[i2][j2] = ' ';score += 10;cout<<"*******消除成功*******得分:"<<score<<"******"<<endl;}elsecout<<"★★★★★★★★★★★★★★不能消除★★★★★★★★★★★★★★"<<endl;}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/{int jie = difficuties;int i=1;int j=1;int m=0;int n=0;int x1[11] = {i1,0,0,0,0,0,0,0,0,0,0};int x2[11] = {i2,0,0,0,0,0,0,0,0,0,0};for(m=i1+1;m<(14+jie)/2;m++){if(gamemap[m][j1] == ' '){x1[i] = m;i++;}}for(n=i2-1;n>(14-jie)/2;n--){if(gamemap[n][j2] == ' '){x2[j] = n;j++;}}if(i*j == 0)return false;for(int p=0;p<i;p++){for(int q=0;q<j;q++){if(x1[q] == x2[p])if(IsVEiminate(x1[q],j1,j2))return true;}}return false;}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/消除{int jie = difficuties;int i=1;int j=1;int m=0;int n=0;int x1[11] = {i1,0,0,0,0,0,0,0,0,0,0};int x2[11] = {j2,0,0,0,0,0,0,0,0,0,0};for(m=i1+1;m<(14+jie)/2;m++){if(gamemap[m][j1] == ' '){x1[i] = m;i++;}}for(n=j2-1;n>(14-jie)/2;n--){if(gamemap[i2][n] == ' '){x2[j] = n;j++;}}if(i*j == 0)return false;for(int p=0;p<i;p++){for(int q=0;q<j;q++){if(x1[q] == i2)if(IsVEiminate(x1[q],j1,x2[j]))return true;}}return false;}bool Game::IsGEiminate_sub2(int i1,int j1,int i2,int j2)//是否可以拐弯消除{int jie = difficuties;int i=1;int j=1;int m=0;int n=0;int x1[11] = {i1,0,0,0,0,0,0,0,0,0,0};int x2[11] = {j2,0,0,0,0,0,0,0,0,0,0};for(m=i1-1;m<(14-jie)/2;m--){if(gamemap[m][j1] == ' '){x1[i] = m;i++;}}for(n=j2+1;n>(14+jie)/2;n++){if(gamemap[i2][n] == ' '){x2[j] = n;j++;}}if(i*j == 0)return false;for(int p=0;p<i;p++){for(int q=0;q<j;q++){if(x2[j] == j1)if(IsVEiminate(j1,x1[i],i2))return true;}}return false;}//连连看的消除应该包括直通消除,前后消除,左右消除,和拐角消除bool Game::IsEliminate(int i1,int j1,int i2,int j2){int m=0;int n=0;if(gamemap[i1][j1] != gamemap[i2][j2])return false;if(i1 == i2) //判断是否能够水平消除{if(IsVEiminate(i1,j1,j2))return true;}if(j1 == j2) //判断是否能垂直消除{if(IsVEiminate(j1,i1,i2))return true;}if(IsTEiminate1(i1,j1,i2,j2)) //判断是否能过左右通消除return true;if(IsTEiminate2(i1,j1,i2,j2)) //判断是否能够前后通消除return true;if(IsTEiminate1(j1,i1,j2,i2)) //判断是否能过左右通消除return true;if(IsTEiminate2(j1,i1,j2,i2)) //判断是否能够前后通消除return true;if(IsGEiminate(i1,j1,i2,j2))return true;if(IsGEiminate(i2,j2,i1,j1))return true;if(IsGEiminate(j1,i1,j2,i2))return true;if(IsGEiminate(j2,i2,j1,i1))return true;if(IsGEiminate_sub1(i1,j1,i2,j2))return true;if(IsGEiminate_sub2(i1,j1,i2,j2))return true;if(IsGEiminate_sub1(i2,j2,i1,j1))return true;if(IsGEiminate_sub2(i2,j2,i1,j1))return true;return false;}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/int Game::GetFileMapNum(){int num=0;fstream mapnum;if(difficuties == 4)mapnum.open("esaymap.dat",ios::in|ios::binary);if(difficuties == 8)mapnum.open("ordinarymap.dat",ios::in|ios::binary);if(difficuties == 12)mapnum.open("difficultmap.dat",ios::in|ios::binary);if(!mapnum){// printf("打开文件失败\n");return -1;}mapnum.seekg(0,ios::end);num = mapnum.tellg();return num/16;}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/bool Game::MapIsRight() //判断地图中个元素的个数是否为偶数,如果为奇数,重新绘制地图{int jie = difficuties;int elenum[8];//记录6个元素在地图中的个数for(int k=0;k<8;k++)elenum[k] = 0;for(int i=(14-jie)/2;i<(14+jie)/2;i++){for(int j=(14-jie)/2;j<(14+jie)/2;j++){if(gamemap[i][j] == 'A')elenum[0]++;if(gamemap[i][j] == 'B')elenum[1]++;if(gamemap[i][j] == 'C')elenum[2]++;if(gamemap[i][j] == 'D')elenum[3]++;if(gamemap[i][j] == 'E')elenum[4]++;if(gamemap[i][j] == 'F')elenum[5]++;if(gamemap[i][j] == 'G')elenum[6]++;if(gamemap[i][j] == 'H')elenum[7]++;}}for(int x=0;x<8;x++){if(elenum[x]%2 != 0)break;}if(x != 8) //如果有元素的个数不是偶数,就返回false,表示地图构造不正确;return false;SaveMap(*gamemap);return true;}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/bool Game::LoadMap(){int num=0;int offset=0;offset = GetFileMapNum();srand(unsigned(time(NULL)));num = rand()%offset;fstream loadmap;if(difficuties == 4)loadmap.open("easymap.dat",ios::in|ios::binary);if(difficuties == 8)loadmap.open("ordinarymap.dat",ios::in|ios::binary);if(difficuties == 12)loadmap.open("difficultmap.dat",ios::in|ios::binary);if(!loadmap){//printf("打开文件失败!");return false;}loadmap.seekg(num,ios::beg);loadmap.read((char*)*gamemap,14*14);loadmap.close();return true;}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/void Game::SaveMap(char *map){fstream savemap;if(difficuties == 4)savemap.open("easymap.dat",ios::out|ios::app|ios::binary);if(difficuties == 8)savemap.open("ordinarymap.dat",ios::out|ios::app|ios::binary); if(difficuties == 12)savemap.open("difficultmap.dat",ios::out|ios::app|ios::binary); if(!savemap){//cout<<"打开文件失败"<<endl;return;}savemap.write((char*)map,14*14);savemap.close();}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/void Game::PaintMap(){int k=0;int jie = difficuties;cout<<" ";for(;k<jie;k++)cout<<"@"<<k+1<<" ";cout<<endl;cout<<"____________________________________________________________ ________"<<endl;for(int i=(14-jie)/2;i<(14+jie)/2;i++){cout<<" | ";for(int l=1;l<=jie;l++)cout<<" ";cout<<"|"<<endl;if((i-(14-jie)/2+1)<10)cout<<"@ "<<i-(14-jie)/2+1<<"| ";elsecout<<"@"<<i-(14-jie)/2+1<<"| ";for(int j=(14-jie)/2;j<(14+jie)/2;j++){cout<<gamemap[i][j]<<" ";}cout<<"| "<<"@"<<i-(14-jie)/2+1<<endl;}cout<<" | ";for(int l=1;l<=jie;l++)cout<<" ";cout<<"|"<<endl;cout<<"---------------------------------------------------------------------";cout<<endl<<" ";for(k=0;k<jie;k++)cout<<"@"<<k+1<<" ";}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/bool Game::IsComplete()//判断是否完成所有的消除{int jie = difficuties;for(int i=(14-jie)/2;i<(14+jie)/2;i++)for(int j=(14-jie)/2;j<(14+jie)/2;j++)if(gamemap[i][j] != ' ')return false;return true;}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/int Game::GetNoSpaceNum(){int nospacenum = 0;for(int i =1;i<14;i++){for(int j=1;j<14;j++){if(gamemap[i][j] != ' ')nospacenum++;}}return nospacenum;}void Game::NewReset(){char *p[4];int k=0;int jie = difficuties;int m = (14-jie)/2;int n = (14+jie)/2;for(int i=m;i<n;i++){for(int j=m;j<n;j++){if(gamemap[i][j] != ' ')p[k++] = &gamemap[i][j];}}srand(unsigned (time(NULL)));for(m=0;m<k;m+=2){*p[m+1]= *p[m] = 'A'+rand()%8;}}void Game::Reset() //如果找不出消除方法,则重新绘制地图{if(GetNoSpaceNum() <= 4){NewReset();return;}int jie = difficuties;srand(unsigned (time(NULL)));int m = (14-jie)/2;int n = (14+jie)/2;int num = 100;while(num--){for(int i=m;i<n;i++)for(int j=m;j<n;j++){if(gamemap[i][j] != ' ')gamemap[i][j] = 'A'+rand()%8;}}}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/void Game::SetGameTime(double mygametime){gametime = mygametime;}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/void Game::GameMenu(){cout<<"★★★欢迎进入连连看游戏★★★"<<endl<<endl;cout<<"●1. 进入游戏"<<endl;cout<<"●2. 继续游戏"<<endl;cout<<"●3. 设置难度"<<endl;cout<<"●4. 设置模式"<<endl;cout<<"●5. 排行榜"<<endl;cout<<"●0. 退出游戏"<<endl;}/******************************************************************** *******************************//******************************************************************** *******************************//******************************************************************** *******************************/void Equal(Gamer &mygamer,Gamer gamertemp){mygamer.gametime = gamertemp.gametime;mygamer.model = gamertemp.model;strcpy(,);}void InitGamer(Gamer &mygamer){mygamer.gametime = 0.0;mygamer.model = 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;gamerfile.open("gamerinformation.dat",ios::in|ios::binary);if(!gamerfile){cout<<"打开文件gamerinformation.dat失败"<<endl;return;}while(!gamerfile.eof()){gamerfile.read((char*)&gamertemp,sizeof(Gamer));if(gamerfile.fail())break;if(gamertemp.model == 1){if(i1<5){Equal(esaygame[i1++],gamertemp);SortingGamer(esaygame,i1);}else{if(gamertemp.gametime < esaygame[4].gametime){Equal(esaygame[4],gamertemp);SortingGamer(esaygame,5);}}}if(gamertemp.model == 2){if(i2<5){Equal(ordinarygame[i2++],gamertemp);SortingGamer(ordinarygame,i2);}else{if(gamertemp.gametime < ordinarygame[4].gametime){Equal(ordinarygame[4],gamertemp);SortingGamer(ordinarygame,5);}}}if(gamertemp.model == 3){if(i3<5){Equal(difficultgame[i3++],gamertemp);SortingGamer(difficultgame,i3);}else{if(gamertemp.gametime < difficultgame[4].gametime){Equal(difficultgame[4],gamertemp);SortingGamer(difficultgame,5);}}}}gamerfile.close();cout<<endl<<"简单模式★:"<<endl;cout<<" 玩家游戏用时(秒) 排名"<<endl<<endl; if(i1 == 0)cout<<endl<<"没有玩家记录,快来创建新记录吧!"<<endl;for(;k<i1;k++){cout<<" "<<esaygame[k].name<<" "<<esaygame[k].gametim e<<" "<<k+1<<endl;}cout<<endl<<"普通模式★★★:"<<endl<<endl;if(i2 == 0)cout<<endl<<"没有玩家记录,快来创建新记录吧!"<<endl;for(;k<i2;k++){cout<<" "<<ordinarygame[k].name<<" "<<ordinarygame[k] .gametime<<" "<<k+1<<endl;}cout<<endl<<"困难模式★★★★★:"<<endl<<endl;if(i3 == 0)cout<<endl<<"没有玩家记录,快来创建新记录吧!"<<endl;for(;k<i3;k++){cout<<" "<<difficultgame[k].name<<" "<<difficultgame[ k].gametime<<" "<<k+1<<endl;}}”lianliankan.h"头文件中代码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();//从文件map.dat中加载地图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;}。
连连看游戏(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>///必要なデザイナ変数です。
连连看游戏编程实现
连连看游戏编程实现连连看游戏是一种益智类游戏,通过消除相同的图标来获得分数。
在这个游戏中,玩家需要将相同的图标以条直线连接起来,连接路径不超过两个拐弯。
一旦成功连线后,这些图标就会被消除,玩家获得相应得分。
本文将介绍如何使用编程语言来实现连连看游戏。
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. 总结通过上述示例代码,我们可以初步实现连连看游戏的编程实现。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
randoms = (int) (Math.random() * 25 + 1);
for (int alike = 1; alike <= 2; alike++) {
cols = (int) (Math.random() * 6 + 1);
int i, j, k, n;//消除方法控制
public void init() {
mainFrame = new JFrame("连连看");
thisContainer = mainFrame.getContentPane();
thisContainer.setLayout(new BorderLayout());
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];
break;
}
if (grid[i][n] == 0 && n == y + 1) {
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] !=i][j];
thisContainer.add(northPanel, "North");
centerPanel.setLayout(new GridLayout(6, 5));
for (int cols = 0; cols < 6; cols++) {
for (int rows = 0; rows < 5; rows++) {
JButton exitButton, resetButton, newlyButton; //退出,重列,重新开始按钮
JLabel fractionLable = new JLabel("0"); //分数标签
JButton firstButton, secondButton; //分别记录两次被选中的按钮
for (n = x0; n <= x - 1; n++) {
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--) {
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) {
firstButton = secondButton;
x = placeX;
y = placeY;
secondMsg = grid[x][y];
secondButton = bz;
if (fristMsg == secondMsg && secondButton != firstButton) {
xiao();
}
}
exitButton = new JButton("退出");
exitButton.addActionListener(this);
resetButton = new JButton("重列");
resetButton.addActionListener(this);
newlyButton = new JButton("再来一局");
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) {
JFrame mainFrame; //主面板
Container thisContainer;
JPanel centerPanel, southPanel, northPanel; //子面板
JButton diamondsButton[][] = new JButton[6][5];//游戏按钮数组
int grid[][] = new int[8][7];//储存游戏按钮位置
static boolean pressInformation = false; //判断是否有按钮被选中
int x0 = 0, y0 = 0, x = 0, y = 0, fristMsg = 0, secondMsg = 0, validateLV; //游戏按钮的位置坐标
diamondsButton[cols][rows] = new JButton(String
.valueOf(grid[cols + 1][rows + 1]));
diamondsButton[cols][rows].addActionListener(this);
centerPanel.add(diamondsButton[cols][rows]);
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) {
} 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++) {
.getText())));
northPanel.add(fractionLable);
mainFrame.setBounds(280, 100, 500, 450);
mainFrame.setVisible(true);
}
public void randomBuild() {
int randoms, cols, rows;
newlyButton.addActionListener(this);
southPanel.add(exitButton);
southPanel.add(resetButton);
southPanel.add(newlyButton);
fractionLable.setText(String.valueOf(Integer.parseInt(fractionLable
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class LianLianKan implements ActionListener {
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++) { //判断第二按钮左侧直到第一按钮中间有没有按钮