连连看C语言源代码
连连看源码(C++)
![连连看源码(C++)](https://img.taocdn.com/s3/m/a4f0b964011ca300a6c390ca.png)
{ 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语言程序设计连连看
![C语言程序设计连连看](https://img.taocdn.com/s3/m/22be2b06e2bd960590c67778.png)
#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;} }。
《连连看》算法c语言演示(自动连连看)
![《连连看》算法c语言演示(自动连连看)](https://img.taocdn.com/s3/m/6624b82b590216fc700abb68a98271fe910eafe6.png)
《连连看》算法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新手入门之连连看小游戏](https://img.taocdn.com/s3/m/7322c48714791711cc7917c4.png)
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,且判断此次点击的图片与上次是不是同一种图片,是的话触发消除,否则不消除。
连连看算法及实现原理详解(C++源码)
![连连看算法及实现原理详解(C++源码)](https://img.taocdn.com/s3/m/d707bb6c783e0912a2162a33.png)
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语言实现连连看
![C语言实现连连看](https://img.taocdn.com/s3/m/bcf71a3810661ed9ad51f3ed.png)
南京航空航天大学计算机专业专业:计算机科学与技术学院姓名:杨万学号: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;}。
连连看源码
![连连看源码](https://img.taocdn.com/s3/m/bb69e95733687e21af45a933.png)
stop();//fscommand("showmenu", "false");the_change_nm = 6;the_pass_nm = 1;the_test_nm = 0;the_good = 0;tmp_start = 0;tmp_end = 0;esc_bz = 0;function dongzuo(clickkey){if (startkey == 0 && all192[clickkey] != 50){startkey = clickkey;} // end ifif (startkey != 0 && startkey != clickkey && all192[clickkey] != all192[startkey] && all192[clickkey] != 50){tellTarget("g" + startkey){gotoAndStop(1);} // End of TellTargetstartkey = clickkey;} // end ifif (startkey != 0 && startkey != clickkey && all192[clickkey] == all192[startkey]){tellTarget("g" + startkey){gotoAndStop(1);} // End of TellTargetendkey = clickkey;tempstart = all192[startkey];tempend = all192[endkey];thestring = startkey;all192[startkey] = 50;all192[endkey] = 50;findlu(startkey, endkey);all192[startkey] = tempstart;all192[endkey] = tempend;startkey = 0;endkey = 0;if (thestring != startkey){thelu = thestring.split(",");tellTarget("cont"){gotoAndPlay(2);} // End of TellTarget} // end if} // end ifif (startkey != 0){tellTarget("g" + startkey){gotoAndStop(2);} // End of TellTarget} // end if} // End of the functionfunction findlu(x, y)//找路径函数,{thestartx = (x - 1) % 16 + 1;thestarty = (x - thestartx) / 16 + 1;theendx = (y - 1) % 16 + 1;theendy = (y - theendx) / 16 + 1;for (ii = thestartx; ii >= 1; ii--){thenext = 88;k = (thestarty - 1) * 16 + ii;x_lt(k, x); //判断起始点击图标左边是否通路k1 = (theendy - 1) * 16 + ii;x_lt(k1, y); //判断终止点击图标的左边是否通路y_lt(k, k1); //判断点击有两个图标之间是否通路if (thenext != 0) //如果均不通,则依次调整两个图标研水平方向的位置//并调整两个图标沿水平方向的位置{tmps = x;for (i = 1; i < math.abs(thestartx - ii) + 1; i++){tmps = tmps - 1; //依次向左找本行中可能的通路位置thestring = thestring + "," + tmps;} // end of forif (thestarty < theendy){for (i = 1; i < theendy - thestarty + 1; i++){tmps = tmps + 16;thestring = thestring + "," + tmps;} // end of for}else{for (i = 1; i < thestarty - theendy + 1; i++){tmps = tmps - 16;thestring = thestring + "," + tmps;} // end of for} // end iffor (i = 1; i < math.abs(theendx - ii) + 1; i++){if (k1 < y){tmps = tmps + 1;}else{tmps = tmps - 1;} // end ifthestring = thestring + "," + tmps;} // end of forreturn(undefined);} // end if} // end of forfor (ii = thestartx + 1; ii <= 16; ii++){thenext = 88;k = (thestarty - 1) * 16 + ii;x_lt(k, x);k1 = (theendy - 1) * 16 + ii;x_lt(k1, y);y_lt(k, k1);if (thenext != 0){tmps = x;for (i = 1; i < math.abs(thestartx - ii) + 1; i++){tmps = tmps + 1;thestring = thestring + "," + tmps;} // end of forif (thestarty < theendy){for (i = 1; i < theendy - thestarty + 1; i++){tmps = tmps + 16;thestring = thestring + "," + tmps;} // end of for}else{for (i = 1; i < thestarty - theendy + 1; i++){tmps = tmps - 16;thestring = thestring + "," + tmps;} // end of for} // end iffor (i = 1; i < math.abs(theendx - ii) + 1; i++){if (k1 < y){tmps = tmps + 1;}else{tmps = tmps - 1;} // end ifthestring = thestring + "," + tmps;} // end of forreturn(undefined);} // end if} // end of forfor (ii = thestarty; ii >= 1; ii--){thenext = 88;k = (ii - 1) * 16 + thestartx;y_lt(k, x);k1 = (ii - 1) * 16 + theendx;y_lt(k1, y);x_lt(k, k1);if (thenext != 0){tmps = x;for (i = 1; i < math.abs(thestarty - ii) + 1; i++){tmps = tmps - 16;thestring = thestring + "," + tmps;} // end of forif (thestartx < theendx){for (i = 1; i < theendx - thestartx + 1; i++){tmps = tmps + 1;thestring = thestring + "," + tmps;} // end of for}else{for (i = 1; i < thestartx - theendx + 1; i++){tmps = tmps - 1;thestring = thestring + "," + tmps;} // end of for} // end iffor (i = 1; i < math.abs(theendy - ii) + 1; i++){if (k1 < y){tmps = tmps + 16;}else{tmps = tmps - 16;} // end ifthestring = thestring + "," + tmps;} // end of forreturn(undefined);} // end if} // end of forfor (ii = thestarty + 1; ii <= 16; ii++){thenext = 88;k = (ii - 1) * 16 + thestartx;y_lt(k, x);k1 = (ii - 1) * 16 + theendx;y_lt(k1, y);x_lt(k, k1);if (thenext != 0){tmps = x;for (i = 1; i < math.abs(thestarty - ii) + 1; i++){tmps = tmps + 16;thestring = thestring + "," + tmps;} // end of forif (thestartx < theendx){for (i = 1; i < theendx - thestartx + 1; i++){tmps = tmps + 1;thestring = thestring + "," + tmps;} // end of for}else{for (i = 1; i < thestartx - theendx + 1; i++){tmps = tmps - 1;thestring = thestring + "," + tmps;} // end of for} // end iffor (i = 1; i < math.abs(theendy - ii) + 1; i++){if (k1 < y){tmps = tmps + 16;}else{tmps = tmps - 16;} // end ifthestring = thestring + "," + tmps;} // end of forreturn(undefined);} // end if} // end of forif (thenext == 0){thestring = 0;} // end if} // End of the functionfunction x_lt(xx, yy){for (kk = 0; kk < math.abs(yy - xx) + 1; kk++){thetest = math.min(xx, yy) + kk;if (all192[thetest] < 50){thenext = 0;} // end if} // end of for} // End of the functionfunction y_lt(xx, yy){for (kk = 0; kk < math.abs(yy - xx) / 16 + 1; kk++){thetest = math.min(xx, yy) + kk * 16;if (all192[thetest] < 50){thenext = 0;} // end if} // end of for} // End of the functionall144 = new Array();all192 = new Array();thelu = new Array();thestring = 0;startkey = 0;endkey = 0;for (i = 1; i < 141; i++){if (i < 31){all144[i] = i;} // end ifif (i > 30 && i < 71){x = random(30) + 1;//随机从0~30产生一个数并加1赋给xall144[i] = x;} // end ifif (i > 70){all144[i] = all144[i - 70];} // end if} // end of forfor (i = 0; i < 100; i++){x = random(140) + 1;y = random(140) + 1;z = all144[x];all144[x] = all144[y];all144[y] = z;} // end of forfor (i = 1; i < 141; i++){tellTarget("a" + i){gotoAndStop(_level0.all144[_level0.i]);} // End of TellTarget} // end of forj = 1;for (i = 1; i < 193; i++){x = (i - 1) % 16 + 1;y = (i - x) / 16 + 1;if (x == 1 || x == 16 || y == 1 || y == 12){all192[i] = 50;continue;} // end ifall192[i] = all144[j];j = j + 1;} // end of for。
C语言实现数字连连看
![C语言实现数字连连看](https://img.taocdn.com/s3/m/8cd76757a9956bec0975f46527d3240c8447a115.png)
C语⾔实现数字连连看本⽂实例为⼤家分享了C语⾔实现数字连连看的具体代码,供⼤家参考,具体内容如下要求连连看⼩游戏开发,使⽤⼆维数组来保存游戏地图的数据,实现连连看的核⼼功能。
欢乐连连看的功能有:主界⾯、开始游戏、消⼦、判断胜负、提⽰、重排、计时、游戏模式。
主界⾯游戏主界⾯就是进⾏各项操作的⼊⼝。
开始游戏玩家选择开始游戏模式,进⼊游戏后,选择开始游戏,系统根据设置随机⽣成数字,以供玩家点击消除。
消⼦对玩家选中的两张图⽚进⾏判断,判断是否符合消除规则。
只有符合以下规则的图⽚对才能被消除:⼀条直线连通两条直线连通三条直线连通如果可以消除,两个数字变为0。
如果不能消除,则保持原来的游戏地图。
判断胜负当游戏完成后,需要判断游戏胜负。
不同模式下判断胜负的规则不同。
基本模式时,如果在五分钟内将游戏地图的所有图⽚都消除,则提⽰玩家胜利。
休闲模式时,如果游戏地图中所有图⽚都被消除,则提⽰玩家获胜。
提⽰可以提⽰界⾯上能够消除的⼀对图⽚。
计时设定⼀定时间来辅助游戏是否结束。
游戏模式游戏模式有:基本模式、休闲模式和关卡模式三种,可以根据是否定时等规则进⾏设置。
代码#include <stdio.h>#include <stdlib.h>#include <time.h>#define WIDTH 10#define HEIGHT 12int datas[HEIGHT][WIDTH] = {0};int Choose_type ();void Creat_datas (int fol);bool IsHLinked(int x1,int y1,int x2,int y2);bool IsVLinked(int x1,int y1,int x2,int y2);bool IsZeroTurnLinked(int x1,int y1,int x2, int y2); //⼀条线bool IsOneTurnLinked(int x1, int y1, int x2,int y2); //⼆条线bool IsTwoTurnLinked(int x1,int y1,int x2,int y2); //三条线bool Judge_Answer (int x1,int y1,int x2,int y2); //判断是否可消去void Print_datas ();bool Play_Game (int Flo);bool Relax_Play ();//休闲bool Win_Play ();//闯关int main(){int Flo;Flo = Choose_type (); // choose the typeif (Flo == 0) return 0;srand(unsigned(time(NULL)));Creat_datas(Flo); //creat the graphPrint_datas ();bool ov;ov = Play_Game (Flo);if (ov == true){printf ("VICTORY");}else{printf ("FAILED");}return 0;}bool Basic_Play (){long int t1 ,t2 = 0 ;int op = 1;int x1,y1,x2,y2;bool ANS;printf ("五分钟计时开始\n");t1 = clock();while (t2 < 300000 && !Isblank() && op != 0 ){if (op == 1){Print_datas ();printf("请输⼊两者的坐标[x1 y1 x2 y2]:"); //从上到下,从左到右,先⾏后列 scanf("%d %d %d %d",&x1,&y1,&x2,&y2);if (Judge_Answer (x1, y1, x2,y2)){datas[x1][y1] = datas[x2][y2] = 0;Print_datas ();}else{printf("错误");}}if (op == 2){ANS = Help_ans ();Print_datas ();if (ANS == false){printf ("已没有可以消去的\n");return true;}}printf("是否继续游戏 1、YES 0、NO 2、HELP:");scanf ("%d",&op);t2 = clock() - t1;}if (t2 > 299){printf ("超时\n");return false;}if (Isblank()) return true;else return false;}bool Help_ans (){int k;for (int i = 1; i < 11;i++){if (datas[i][j] != 0){k = j+1;for (int m = i; m < 11;m++){for (int n = k; n < 9;n++){if (datas[i][j] == datas[m][n]){if (Judge_Answer(i,j,m,n)){printf ("(%d,%d) (%d,%d)\n",i,j,m,n);datas[i][j] = datas[m][n] = 0;return true;}}}k = 1;}}}}return false;}bool Relax_Play (){int op = 1;int x1,y1,x2,y2;bool ANS;while (!Isblank() && op != 0) //G isn't blank{if (op == 1){Print_datas ();printf("请输⼊两者的坐标[x1 y1 x2 y2]:");scanf("%d %d %d %d",&x1,&y1,&x2,&y2);if (Judge_Answer (x1, y1, x2,y2)){datas[x1][y1] = datas[x2][y2] = 0;Print_datas ();}else{printf("错误");}}if (op == 2){ANS = Help_ans ();Print_datas ();if (ANS == false){printf ("已没有可以消去的\n");return true;}}printf("是否继续游戏 1、YES 0、NO 2、HELP:"); scanf ("%d",&op);}if (!Isblank()) return false;else return true;}bool Win_Play (){int op = 1;int x1,y1,x2,y2;bool ANS;while (!Isblank() && op != 0) //G isn't blank{if (op == 1){Print_datas ();if (Judge_Answer (x1, y1, x2,y2)){datas[x1][y1] = datas[x2][y2] = 0;Print_datas ();}else{printf("错误");}}printf("是否继续游戏 1、YES 0、NO :");scanf ("%d",&op);}if (!Isblank() && Help_ans) return false;elsereturn true ;}bool Isblank (){for(int j=1; j < 10 ; j++){for (int i= 1; i< 8 ; i++){if (datas[j][i] != 0) return false;}}return true;}bool Play_Game (int Flo){bool Ans;if (Flo == 1) //the basic type{printf ("基本模式:\n");Ans = Basic_Play ();return Ans;}if (Flo == 2) //the relax type{printf ("休闲模式:\n");Ans = Relax_Play ();return Ans;}else //the win type{printf ("第%d关游戏:\n",Flo - 2);Ans = Win_Play ();return Ans;}}void Print_datas (){for(int j=1; j < 11 ; j++){printf("\t\t");for (int i= 1; i< 9 ; i++){printf("%d\t",datas[j][i]);}printf("\n");}}bool Judge_Answer (int x1,int y1,int x2,int y2){if (datas [x1][y1] != datas[x2][y2] || datas [x1][y1] == 0 || datas [x2][y2] == 0 ) return false; if (x1 == x2 && y1 == y2) return false;if (x1 > 11 || x2 > 11 || y1> 9 || y2 > 9) return false;if (x1 == x2 || y1 == y2){if (IsZeroTurnLinked(x1,y1,x2,y2) || IsTwoTurnLinked(x1,y1,x2,y2)) return true;}return false;}int Choose_type (){printf("请选择你要进⾏的操作:1,开始游戏 2,结束游戏\n");int op;scanf("%d",&op);if (op == 1){printf("\n请选择游戏模式:1、基本模式 2、休闲模式 3、关卡模式\n"); int ops;scanf ("%d",&ops);if (ops == 1) return 1;if (ops == 2) return 2;if (ops == 3){printf("\n请选择你选择的关卡3-16:");int opsd;scanf ("%d",&opsd);return opsd;}}if (op == 2) return 0;}void Creat_datas (int fol){int tmpDatas[80] = {0}; // 定义⼀个临时数组⽤于存放int PicNum[] = {3,4,5,1,2,7,9,6,8,44,78,12,90,33,34};int Count = 0,i, j, d = 0,Pic,tem,t;Pic = 8 * 10 / (fol + 9 );for(j=0; j < 80 ; j++){tmpDatas[j] = PicNum[d];Count++;if (Count == Pic ){d++;Count = 0;}}d = 80;for(j=1;j < HEIGHT - 1;j++)for (i = 1;i < WIDTH - 1; i++){t = rand() % d; //Fisher-Yates Shuffletem = tmpDatas[t];tmpDatas[t] = tmpDatas[d -1];tmpDatas[d - 1] = tem;datas[j][i] = tmpDatas[d -1];d--;}}bool IsHLinked(int x1,int y1,int x2,int y2) //横向是否连接{int minY,maxY;if (x1 != x2) return false;if (y1 < y2){minY = y1;maxY = y2;}else{minY = y2;maxY = y1;}if (maxY - minY == 1) return true;for ( int i = minY +1; i < maxY ; i++) //从左到右检查中间的点是不是空的 {if (datas[x1][i] != 0) return false;bool IsVLinked(int x1,int y1,int x2,int y2) //纵向是否连接{int minX,maxX;if (y1 != y2) return false;if (x1 < x2){minX = x1;maxX = x2;}else{minX = x2;maxX = x1;}if (maxX - minX == 1) return true;for ( int i = minX +1; i < maxX ; i++){if (datas[i][y1] != 0) return false;}return true;}bool IsZeroTurnLinked(int x1,int y1,int x2, int y2) //不转折时判断{if (IsHLinked(x1, y1, x2,y2)){return true ;}if (IsVLinked(x1, y1, x2, y2)){return true ;}return false;}bool IsOneTurnLinked(int x1, int y1, int x2,int y2) //转折⼀次{int tmpX[2] = { x1, x2 };int tmpY[2] = { y2, y1 };for (int i = 0; i < 2; i++){if (datas[tmpX[i]][tmpY[i]] != 0) continue;if (IsZeroTurnLinked( tmpX[i], tmpY[i], x1, y1) && IsZeroTurnLinked( tmpX[i], tmpY[i], x2,y2)){return true;}}return false;}bool IsTwoTurnLinked(int x1,int y1,int x2,int y2){int j, tmpX1,tmpY1,tmpX2,tmpY2;//纵向遍历所有点tmpX1 = x1;for ( j = 0; j < WIDTH; j++){tmpY1 = j;if (j == y1) continue;if (tmpX1 == x2 && tmpY1 == y2) continue; //重合tmpX2 = x2;tmpY2 = tmpY1;if (datas[tmpX1][tmpY1] != 0 || datas[tmpX2][tmpY2] != 0) continue;if (IsZeroTurnLinked(tmpX1, tmpY1, tmpX2, tmpY2) && IsZeroTurnLinked(tmpX1, tmpY1, x1, y1) && IsZeroTurnLinked(tmpX2, tmpY2, x2, y2)) return true;}//横向遍历所有点tmpY1 = y1;for ( j = 0; j < HEIGHT; j++)if (j == x1) continue;if (tmpY1 == y2 && tmpX1 == x2) continue; //重合tmpY2 = y2;tmpX2 = tmpX1;if (datas[tmpX1][tmpY1] != 0 || datas[tmpX2][tmpY2] != 0) continue;if (IsZeroTurnLinked(tmpX1, tmpY1, tmpX2, tmpY2) && IsZeroTurnLinked(tmpX1, tmpY1, x1, y1) && IsZeroTurnLinked(tmpX2, tmpY2, x2, y2)) {return true;}}return false;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
C# 连连看 游戏 连线 代码
![C# 连连看 游戏 连线 代码](https://img.taocdn.com/s3/m/7e08bfc208a1284ac85043e1.png)
using System;using System.Collections.Generic;using System.Text;using System.Drawing;using System.Timers;namespace LLKAN{class Game{/// <summary>/// 游戏是否正在进行/// </summary>public bool Playflag;public bool CanPlay;public bool PlayWin;public const int Row = 12;public const int Column = 17;public GamePic[,] GamePicList = new GamePic[Row, Column];private GamePath MyPath = new GamePath();public Game(){this.CanPlay =false;this.PlayWin = false;}/// <summary>/// 游戏开始/// </summary>public void GameStart(int pn){// 游戏开始,产生随机图片stdFunc PubstdFunc = new stdFunc();int[] PicNumber = new int[Row * Column];//int pn;PicNumber = PubstdFunc.GetRandomPic(pn, (Row - 2) * (Column - 2));for (int i = 1; i<=Row-2; i++){for (int j = 1; j <= Column-2; j++){GamePic MyPic = new GamePic(j * 45, i * 41, PicNumber[(i-1) * (Column-2) + (j-1)], 1);GamePicList[i, j] = MyPic;}//产生第一行for (int i = 0; i < Column; i++){GamePic MyPic = new GamePic(i * 45, 0,0, 2);GamePicList[0, i] = MyPic;}//最后一行for (int i = 0; i < Column; i++){GamePic MyPic = new GamePic(i * 45, (Row-1)*41, 0, 2);GamePicList[Row-1, i] = MyPic;}//第一列for (int i = 0; i < Row; i++){GamePic MyPic = new GamePic(0, i * 41, 0, 2);GamePicList[i, 0] = MyPic;}//最一列for (int i = 0; i < Row; i++){GamePic MyPic = new GamePic((Column-1)*45, i * 41, 0, 2);GamePicList[i, Column-1] = MyPic;}Playflag = true;CanPlay = true;}/// <summary>/// 检查游戏状况/// </summary>public void CheckPlay(){if (GameWin()){PlayWin = true;return;}}/// <summary>/// 得到两点之间的交叉点/// </summary>public GamePath GetGamePath{{return MyPath;}}public void DrawLine(Graphics g, Color DrawColor){Point PL,PH;stdFunc MystdFunc = new stdFunc();for (int i = 0; i < MyPath.GetPathList.Count; i+=2){PL = new Point(GamePicList[MyPath.GetPathList[i].X,MyPath.GetPathList[i].Y].X,GamePicList[MyPath.GetPathList[i].X,MyPath.GetPathList[i].Y].Y);PH = new Point(GamePicList[MyPath.GetPathList[i + 1].X, MyPath.GetPathList[i + 1].Y].X,GamePicList[MyPath.GetPathList[i + 1].X, MyPath.GetPathList[i + 1].Y].Y);MystdFunc.DrawLine(g, PL, PH, 5, DrawColor);}}/// <summary>/// 检查两个图标是否可以消/// </summary>/// <param name="P1">第一个图标的座标</param>/// <param name="P2">第二个图标的座标</param>/// <returns>是否可以消除</returns>public bool CheckPath(Point P1, Point P2,bool AddPath){MyPath.Clear();if (P1 == P2) return false;// 开始搜索路径// 1 检查水平if (P1.X == P2.X){if (CheckHorizontal(P1, P2, AddPath))return true;}MyPath.Clear();// 2 检查垂直if (P1.Y == P2.Y){if (CheckV ertical(P1, P2, AddPath))return true;}MyPath.Clear();// 3 检查一折if (CheckOneCorner(P1, P2, AddPath,true))return true;MyPath.Clear();// 4 检查二折if (CheckTwoCorner(P1, P2, AddPath))return true;return false;}/// <summary>/// 检查二折/// </summary>/// <param name="P1">第一个点</param>/// <param name="P2">第二个点</param>/// <param name="isAddPath">是否要保存路径</param>/// <returns></returns>private bool CheckTwoCorner(Point P1, Point P2, bool isAddPath) {Point MinRow, MaxRow;MinRow = P1.X < P2.X ? P1 : P2;MaxRow = P1.X < P2.X ? P2 : P1;if (CheckTwoCornerUP(P1, P2, isAddPath)){return true;}MyPath.Clear();if (CheckTwoCornerDown(P1, P2, isAddPath)){return true;}MyPath.Clear();if (CheckTwoCornerLeft(P1, P2, isAddPath)){return true;}MyPath.Clear();if (CheckTwoCornerRight(P1, P2, isAddPath)){return true;}return false;}private bool CheckTwoCornerUP(Point P1, Point P2, bool isAddPath) {for (int i = P1.X - 1; i > -1; i--){Point StartPoint = new Point(i, P1.Y);if (GamePicList[StartPoint.X, StartPoint.Y].State == 2){if (isAddPath){MyPath.Clear();CPath xPath = new CPath(P1);MyPath.Push(xPath);CPath yPath = new CPath(StartPoint);MyPath.Push(yPath);}if (CheckOneCorner(StartPoint, P2, isAddPath, false)){return true;}}else{return false;}}return false;}private bool CheckTwoCornerRight(Point P1, Point P2, bool isAddPath) {for (int i = P1.Y + 1; i < Game.Column; i++){Point StartPoint = new Point(P1.X, i);if (GamePicList[StartPoint.X, StartPoint.Y].State == 2){if (isAddPath){MyPath.Clear();CPath xPath = new CPath(P1);MyPath.Push(xPath);CPath yPath = new CPath(StartPoint);MyPath.Push(yPath);}if (CheckOneCorner(StartPoint, P2, isAddPath,false)){return true;}}else{return false;}}return false;}private bool CheckTwoCornerLeft(Point P1, Point P2, bool isAddPath) {for (int i = P1.Y - 1; i > -1; i--){Point StartPoint = new Point(P1.X, i);if (GamePicList[StartPoint.X, StartPoint.Y].State == 2){if (isAddPath){MyPath.Clear();CPath xPath = new CPath(P1);MyPath.Push(xPath);CPath yPath = new CPath(StartPoint);MyPath.Push(yPath);}if (CheckOneCorner(StartPoint, P2, isAddPath,false)){return true;}}else{return false;}}return false;}private bool CheckTwoCornerDown(Point P1, Point P2, bool isAddPath) {for (int i = P1.X + 1; i < Game.Row; i++){Point StartPoint = new Point(i, P1.Y);if (GamePicList[StartPoint.X, StartPoint.Y].State == 2){if (isAddPath){MyPath.Clear();CPath xPath = new CPath(P1);MyPath.Push(xPath);CPath yPath = new CPath(StartPoint);MyPath.Push(yPath);}if (CheckOneCorner(StartPoint, P2, isAddPath,false)){return true;}}else{return false;}}return false;}// 3 检查一折private bool CheckOneCorner(Point P1, Point P2, bool isAddPath,bool ClearPath) {Point MinRow, MaxRow; //小行,大行Point CrossX, CrossY; //交叉点MinRow = P1.X < P2.X ? P1 : P2;MaxRow = P1.X < P2.X ? P2 : P1;if (MinRow.Y < MaxRow.Y){CrossX = new Point(MinRow.X,MaxRow.Y);CrossY = new Point(MaxRow.X,MinRow.Y);}else{CrossX = new Point(MinRow.X,MaxRow.Y);CrossY = new Point(MaxRow.X,MinRow.Y);}//搜索MinRow ---> CrossX--->MaxRowif (GamePicList[CrossX.X, CrossX.Y].State == 2){if (CheckHorizontal(MinRow, CrossX, false)){if (CheckV ertical(CrossX, MaxRow, false)){if (isAddPath){CPath xPath = new CPath(MinRow);MyPath.Push(xPath);CPath yPath = new CPath(CrossX);//---- 增加两次------MyPath.Push(yPath);MyPath.Push(yPath);CPath zPath = new CPath(MaxRow);MyPath.Push(zPath);}return true;}}}if (isAddPath && ClearPath){MyPath.Clear();}//搜索MinRow ---> CrossY--->MaxRowif (GamePicList[CrossY.X, CrossY.Y].State == 2){if (CheckV ertical(MinRow, CrossY,false)){if (CheckHorizontal(CrossY, MaxRow,false)){if (isAddPath){CPath xPath = new CPath(MinRow);MyPath.Push(xPath);CPath yPath = new CPath(CrossY);MyPath.Push(yPath);MyPath.Push(yPath);CPath zPath = new CPath(MaxRow);MyPath.Push(zPath);}return true;}}}return false;}private bool CheckV ertical(Point P1, Point P2, bool AddPath) {Point Px, Py;Px = P1.X < P2.X ? P1 : P2;Py = P1.X < P2.X ? P2 : P1;for (int i = Px.X + 1; i < Py.X; i++){if (GamePicList[i, Px.Y].State != 2){return false;}}if (AddPath){CPath PA = new CPath(Px);CPath PB = new CPath(Py);MyPath.Push(PA);MyPath.Push(PB);}return true;}private bool CheckHorizontal(Point P1, Point P2,bool AddPath) {Point Px, Py;Px = P1.Y < P2.Y ? P1 : P2;Py = P1.Y < P2.Y ? P2 : P1;for (int i = Px.Y + 1; i < Py.Y; i++){if (GamePicList[Px.X, i].State != 2){return false;}}if (AddPath){CPath PA = new CPath(Px);CPath PB = new CPath(Py);MyPath.Push(PA);MyPath.Push(PB);}return true;}private bool GameWin(){for (int i = 1; i < Game.Row - 1;i++ ){for (int j = 1; j < Game.Column - 1; j++){if (GamePicList[i,j].State==1)return false;}}return true;}}}。
C语言实现简易连连看游戏
![C语言实现简易连连看游戏](https://img.taocdn.com/s3/m/50968fbddc3383c4bb4cf7ec4afe04a1b171b059.png)
C语⾔实现简易连连看游戏本⽂为⼤家分享了C语⾔实现连连看游戏位的具体代码,供⼤家参考,具体内容如下题⽬给定⼀个2N×2N的⽅阵⽹格游戏盘⾯,每个格⼦中放置⼀些符号。
这些符号⼀定是成对出现的,同⼀个符号可能不⽌⼀对。
程序读⼊玩家给出的⼀对位置(x1,y1)、(x2,y2),判断这两个位置上的符号是否匹配。
如果匹配成功,则将两个符号消为“*”并输出消去后的盘⾯;否则输出“Uh-oh”。
若匹配错误达到3次,则输出“Game Over”并结束游戏。
或者当全部符号匹配成功,则输出“Congratulations!”,然后结束游戏。
输⼊格式及样例格式输⼊在⼀⾏中给⼀个正整数N(<5)。
随后2N⾏,每⾏2N个⼤写英⽂字母(其间以1个空格分隔),表⽰游戏盘⾯。
盘⾯之后给出⼀个正整数K,随后K⾏,每⾏按照格式“x1y1x2y2”给出⼀个玩家的输⼊。
注意格⼦的⾏、列编号是从1到2N。
样例2I T I TA B A BA A A AC D C D91 1 1 31 2 1 42 1 2 32 2 2 43 1 3 23 3 3 44 1 4 34 2 4 34 2 4 4输出格式及样例格式根据玩家的每⼀步输⼊,输出相应的结果。
输出盘⾯时注意,每⾏字符间以1个空格分隔,⾏末不得有多余空格。
样例参考代码#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>void Print(int n,char**arr);int main() {int n,i,j;int fail = 0,secc=0;scanf("%d", &n);char** arr = (char**)malloc(sizeof(char*) * 2 * n);for (i = 1; i <= 2 * n; i++)arr[i] = (char*)malloc(sizeof(char) * 2 * n);for (i = 1; i <= 2 * n; i++)for (j = 1; j <= 2 * n; j++) {scanf("%c", &arr[i][j]);if (arr[i][j] == ' ' || arr[i][j] == '\n')j--;}int k;scanf("%d", &k);int** brr = (int**)malloc(sizeof(int*) * k);for (i = 1; i <= k; i++)brr[i] = (int*)malloc(sizeof(int) * 4);for (i = 1; i <= k; i++)for (j = 1; j <= 4; j++)scanf("%d", &brr[i][j]);for (i = 1; i <= k; i++) {char x, y;int x1, y1, x2, y2;x1 = brr[i][1];y1 = brr[i][2];x2 = brr[i][3];y2 = brr[i][4];x = arr[x1][y1];y = arr[x2][y2];//printf("%c %c\n",x ,y);if (x == y) {arr[x1][y1] = '*';arr[x2][y2] = '*';secc++;int m = (2*n * 2*n) / 2;if (secc == m&& n * n % 2 == 0) {printf("Congratulation!\n");exit(0);}Print(n,arr);//printf("\n");}else {printf("Uh-oh\n");fail++;if (fail == 3) {printf("Game Over\n");exit(0);}}//printf("%c %c\n", x, y);/*if (arr[(brr[i][1])][(brr[i][2])] == arr[(brr[i][3])][(brr[i][4])]) {arr[(brr[i][1])][(brr[i][2])] = '*';arr[(brr[i][3])][(brr[i][4])] = '*';}*/}return 0;}//-----------functionvoid Print(int n,char**arr) {/*char** arr = (char**)malloc(sizeof(char*) * 2 * n);for (int i = 1; i < 2 * n; i++)arr[i] = (char*)malloc(sizeof(char) * 2 * n);*/for (int i = 1; i <= 2 * n; i++) {printf("%c", arr[i][1]);for (int j = 2; j <= 2 * n; j++) {printf(" %c", arr[i][j]);}printf("\n");}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
C++实现连连看游戏
![C++实现连连看游戏](https://img.taocdn.com/s3/m/eaba601f854769eae009581b6bd97f192279bf2c.png)
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;//⽤于标记是否已经获胜。
【连连看】小游戏初始源代码
![【连连看】小游戏初始源代码](https://img.taocdn.com/s3/m/34a4f59977232f60dccca190.png)
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();
连连看游戏课程设计+源代码
![连连看游戏课程设计+源代码](https://img.taocdn.com/s3/m/661bc777a417866fb84a8e3c.png)
课程设计课程名称:程序设计课程设计课题名称:网络连连看游戏班级: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).没有的话,再看第一个按钮到与它同列的那个空按钮之间是否有按钮。
连连看游戏源代码C#
![连连看游戏源代码C#](https://img.taocdn.com/s3/m/451e4de6aeaad1f346933fd0.png)
连连看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从所有动物图案的图片中截图。
VC_实现连连看游戏
![VC_实现连连看游戏](https://img.taocdn.com/s3/m/f6bf1ce9b8f67c1cfad6b850.png)
的图片, 或者程序判断出无可消的图片时, 可以重新排序, 以 便游戏可以继续进行。
为了游戏的美观, 当点击每个图片时, 应该有类似按钮点 击的效果。 要实现这一点, 最简单的就是把每个图片都做成一 个 按 钮 , 这 可 以 利 用 MFC 的 CButton 类 , 编 写 CLLKanButton 类 , 使 其 继 承 于 Cbutton 类 , 使 每 个 Button 都 有 自 己 的 ID 号 , 用来存储图片类型, 还应该有一个 CPoint 类型的成员变量, 用 来 存 储 每 个 Button 的 位 置 信 息 , 最 后 在 创 建 时 , 将 和 ID 号 对 应的图片贴到相应的位置上即可。
for(j=1; j<=MAXY-2; j++) {
p.x = i; p.y = j; m_btnGroup.Add(new CLLKanButton(map[i][j], p)); } //显 示 按 钮 for(i=0; i<(MAXX-2)*(MAXY-2); i++) { CLLKanButton *btn = (CLLKanButton *)m_btnGroup. GetAt(i); btn->Create(str, WS_CHILD|BS_BITMAP, CRect(130+(i%(MAXY-2))*40, 70+(i/(MAXY-2))*40, 170 +(i% (MAXY -2))*40, 110 +(i/(MAXY -2))*40), this, IDC_BLOCK+i); if(btn->m_id)//如果为 0 则不显示 { str.Format("res\\%d.bmp", btn->m_id); HBITMAP m_fkBmp = (HBITMAP)::LoadImage (AfxGetInstanceHandle(), str, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION|LR_LOADFROMFILE); //加 载 图 片 if(m_fkBmp == NULL)
C++实现连连看游戏核心代码
![C++实现连连看游戏核心代码](https://img.taocdn.com/s3/m/bd73be5aff4733687e21af45b307e87101f6f8d0.png)
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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/* BoardDatas: a small-size board */
/* Board[x][y][0] - 0:empty, 1:filled */
/* Board[x][y][1] - cell's key; */
while(min2-1>=0 && Board[c2->x][min2-1][0]==0) min2--;
top=max(min1,min2);
while(max1+1<BoardHeight && Board[c1->x][max1+1][0]==0) max1++;
/* Pb - ProgressBar */
int PbColor=LIGHTGREEN;
int PbY=4;
int PbHeight=4;
int PbValue; /* 进度条百分比,初始值为100.*/
long StartTime; /* 开始时间的秒数,只统计分钟,秒 */
int FindPath(CELL *c1,CELL *c2)
{
int i,j,path,min1,max1,min2,max2,left,right,top,bottom;
/*---------------(0)判断是否点中相同块! ------------*/
if(Board[c1->x][c1->y][1] != Board[c2->x][c2->y][1])
/*
* 连连看游戏C语言源代码
*/
#include <stdio.h>
#include <graphics.h>
#include <stdlib.h>
#include <math.h>
#include <dos.h>
#define true 1
#define false 0
for(j=top;j<=bottom;j++)
return true;
}
if(right==(BoardWidth-1))
பைடு நூலகம்
DrawPath(c1->x,c1->y, BoardWidth,c1->y, BoardWidth,c2->y, c2->x,c2->y, LineColor);
K_RIGHT =0x4d00,
K_SPACE =0x3920,
K_P =0x1970,
K_RETURN =0x1c0d, /* Enter */
};
while(min2-1>=0 && Board[min2-1][c2->y][0]==0) min2--;
left=max(min1,min2); /* 左边界 */
while(max1+1<BoardWidth && Board[max1+1][c1->y][0]==0) max1++;
void UpdateProgressBar(int percent);
void DrawCell(int key,int x,int y,int color);
void EraseCell(int x,int y);
void DrawBorderRect(CELL *c,int color);
while(max2+1<BoardHeight && Board[c2->x][max2+1][0]==0) max2++;
bottom=min(max1,max2);
/* 检查两条垂直线之间是否有公垂线连通!*/
/* 可以在边缘连通 */
if(top==0)
/* ---------------------全局变量------------------------------------ */
int BkGndColor=BLACK;
int BorderColor=LIGHTGRAY;
int LineColor=LIGHTBLUE;/* 消除一对方块时时候的连线颜色 */
while(max2+1<BoardWidth && Board[max2+1][c2->y][0]==0) max2++;
right=min(max1,max2); /* 右边界 */
/* 检查两条水平线之间是否有公垂线连通!*/
/* 可以在边缘连通 */
* 算出这两条线段在垂直方向的共同区域!!!,
* 遍历该区域判断能否在两线段间架起公垂线,能则两点连接上;
* 接着进行垂直方向判断,类同。无论两点在不在一条直线上,
* 都能使用该算法,因为两点同线只是两点作为矩形对角点的特例而已。
*/
/* 找到两个CELL之间的路径,成功返回true */
unsigned char Board[10][10][2];
int CellSize=30;
int BoardX=20;
int BoardY=60;
int BoardWidth=10;
int BoardHeight=10;
int CellColor=WHITE;
int SelColor=BLUE; /* selCell's border rect color */
int CurColor=RED; /* curCell's border rect color */
int EraColor=CYAN; /* 用于擦除cell的颜色!*/
int PairsCount; /* how much pairs we have put on board */
}
/*---------------(2)查找垂直方向公共区域!-----------*/
min1=max1=c1->y;
min2=max2=c2->y;
while(min1-1>=0 && Board[c1->x][min1-1][0]==0) min1--;
/* 用于存储逻辑坐标(索引) */
typedef struct _tagCELL
{
char x;
char y;
} CELL;
CELL selCell,curCell;/*缓存前一个被选中的位置以及当前所处位置!*/
/*Scan Codes Define*/
enum KEYCODES
for(i=left;i<=right;i++)
{
path=0;/*统计垂直的公垂线长度!*/
for(j=min(c1->y,c2->y)+1;j<max(c1->y,c2->y);j++)
{
path+=Board[i][j][0];
return true;
}
if(bottom==(BoardHeight-1))
{
DrawPath(c1->x,c1->y, c1->x,BoardHeight, c2->x,BoardHeight, c2->x,c2->y, LineColor);
{
K_ESC =0x011b,
K_UP =0x4800, /* upward arrow */
K_LEFT =0x4b00,
K_DOWN =0x5000,
delay(6000);
DrawPath(c1->x,c1->y, i,c1->y, i,c2->y, c2->x,c2->y, BkGndColor);/*插除线条!*/
return true;
}
if(left==0)
{
/* 左边缘连通 */
DrawPath(c1->x,c1->y, -1,c1->y, -1,c2->y, c2->x,c2->y, LineColor);
delay(6000);
DrawPath(c1->x,c1->y, -1,c1->y, -1,c2->y, c2->x,c2->y, BkGndColor);/*插除线条!*/
/* ----------------------函数实现----------------------------------- */
/* ----------------------[ 核心算法 ]---------------------------------
* 先进行水平方向判断,找出两点所在的水平直线活动范围,
return false;
/*---------------(1)查找水平方向公共区域!-----------*/
min1=max1=c1->x;
min2=max2=c2->x;
while(min1-1>=0 && Board[min1-1][c1->y][0]==0) min1--;
void DrawGameOver(char* info);
int GetKeyCode();