C语言程序设计连连看

合集下载

连连看源码(C++)

连连看源码(C++)
int main()
{ 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语言毕业课程设计报告

(完整版)连连看C语言毕业课程设计报告目录问题描述连连看是一款简单有趣的小游戏,曾经风靡一时,玩家要将相同的两张牌用三根以内的直线连在一起就可以消除,规则简单容易上手,游戏速度节奏快,画面清晰可爱,适合细心的玩家。

游戏胜利条件的判定:将棋盘上面的格子全部消除掉;失败的判定:规定的时间内格子没有消除。

问题分析连连看需要解决的问题包括:(1)整个游戏界面和各种图案的图形显示;(2)如何判断鼠标所点的两个图像能否相消;(3)如何判断是否消除完全;(4)如何判断游戏的结束及如何终止游戏;(5)游戏难度的设计和得分规则游戏总的流程可以描述如下:首先出现游戏界面,一幅由10*6的小图片的构成的画面,玩家需要点击2 个相同图案的对子,其连接线不多于3 根直线,也就是说连接相同图案时,直线只能有两个折点,就可以成功将对子消除。

此外,需要重点考虑的是游戏面板和各种形状的方块的数据结构表示。

格子面板可以用一个二维数组来表示。

1、开发工具的介绍【VS2008 】VS2008引入了250多个新特性,整合了对象、关系型数据、XML的访问方式,语言更加简洁。

使用Visual Studio 2008可以高效开发Windows应用程序。

设计器中可以实时反映变更,XAML中智能感知功能可以提高开发效率。

同时Visual Studio 2008支持项目模板、调试器和部署程序。

Visual Studio 2008可以高效开发Web应用,集成了AJAX 1.0,包含AJAX项目模板,它还可以高效开发Office应用和Mobile应用。

VS的开发界面分为两个版本:整合模式和孤立模式,分别对基于语言的开发和基于特别工具的开发作了优化。

【EasyX 】EasyX 是针对C++ 的图形库,可以帮助C 语言初学者快速上手图形和游戏编程。

许多学编程的都是从C 语言开始入门的,而目前的现状是:1. 有些学校以Turbo C 为环境讲C 语言,只是Turbo C 的环境实在太老了,复制粘贴都很不方便。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

2. ⽣成图板。

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

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

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

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

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

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

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

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

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

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

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

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

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

游戏程序设计(2)--“连连看”设计

游戏程序设计(2)--“连连看”设计

2、 按钮事件 、
ActionListener接口: 接口: 接口 (1)注册监听器 ) 按钮.addActionListener(this); 按钮 (2)触发事件 ) actionPerformed(ActionEvent e) { …….. }
3、 产生随机数 、
随机函数: 随机函数: Math.random() 产生0-1之间的随机数 产生 之间的随机数 若要产生100以内的随机整数: 以内的随机整数: 若要产生 以内的随机整数
• 2、“连连看”游戏的几种可以消去情况 • (1)要消去的两个图案相邻,如图15.2(a)所示。 • (2)要消去的两个图案在同一直线上,如图 15.2(b)所示。 • (3)要消去的两个图案不在同一直线上,如图 15.2(c)、(d)所示。
3、“连连看”游戏连接算法思 、 连连看” 路 • 1、什么是连接折点?如图15.3所示 、什么是连接折点?
• 2、建立一个8×7的二维数组存放 ×5个随机数 、建立一个 × 的二维数组存放 的二维数组存放6× 个随机数
• int d[ ][ ] = { • {0, 0, 0, 0, 0, 0, 0}, • {0, 0, 0, 0, 0, 0, 0}, • {0, 0, 0, 0, 0, 0, 0}, • {0, 0, 0, 0, 0, 0, 0}, • {0, 0, 0, 0, 0, 0, 0}, • {0, 0, 0, 0, 0, 0, 0}, • {0, 0, 0, 0, 0, 0, 0}, • {0, 0, 0, 0, 0, 0, 0} };
• 2、连接折点算法基本概念 如图15.3所示 、 • 3、连接折点算法分析 、
• (1)判断选取的两个点(P1, P2)的内容是否一样。 • (2)判断P1、P2的位置关系。 • (3)如果P1、P2相邻,如图15.4(a)所示,直接消去该两点,即把 这两点的内容消去(把该两点内容设为不可见)。 • (4)如果P1、P2 在同一直线上,但不相邻,如图15.4(b)所示。 先判断两个点P1,P2之间是否能直接建立连接(连线之间无折点), 如果可以的话消去该两点,如果不可以的话就在其它三个方向上的空 点按照折点法基本概念开始取折点Z1, Z2, 然后判断 P1 — Z1, Z1—Z2,Z2—P2 是否能连通,如果都可以连通就消去P1, P2两点。 要消去的两个点不在同一直线上也不相邻。 • (5)在P1, P2四个方向上的空点按照连接折点的基本概念开始取 折点Z1, Z2, 然后判断 P1—Z1,Z1—Z2,Z2—P2 是否能连通, 如果都可以连通就消去P1, P2两点。如图15.3所示。

C语言实现连连看

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  课程设计_连连看游戏

课程设计报告课程名称:面向对象程序设计C++设计题目:连连看游戏专业:计算机科学与技术姓名:学号:指导教师:李晓虹2016 年 1 月 1 日1、系统需求分析本程序是一款连连看游戏,该程序应该具备以下功能:(1)该游戏界面为黑色背景加方格图片类型,不同的图片上有不同的图案,位置为随机打乱。

(2)游戏规则为将相同图案的图片进行连接,但需满足只能至少单边无阻呈直线连接,否则无效。

一旦成功连接两个相同的图案,则这两个图案消失,如此反复直到所有的图片消失,游戏通关。

(3)图片的位置具有随机性,但要求都是必须成对出现。

1.1 功能需求(1)主界面需求显示玩家当前关卡数及得分数提供“新游戏”按钮,单击后可以重新开始游戏提供“退出”按钮,单击后可以退出程序提供“帮助”按钮,单击后可以弹出制作人信息,联系方式等(2)消除需求玩家点击图案,图案会变色以提示被选中;此时再点击另一个图案,如果图案相同,则这两个图案消失;此外,两个图案中间必须无其他图片阻碍才有效,消除规则如下:一条直线相连:图1-1两条直线相连:图1-2图1-3(3)新游戏需求当玩家点击新游戏按钮时,游戏将重新生成新的图案并重排,且重排的方式是随机的。

(4)帮助当玩家点击帮助时,将弹出制作者信息以及秘籍。

(5)退出点击退出按钮,将退出程序。

1.2时间性能需求响应速度:3秒以内客户端:可执行文件,点开即可运行,方便快捷。

1.3界面友好需求系统提供统一的界面操作方式。

要求界面操作方式美观大方,布局合理,功能完善,整个操作简单,对于初级用户容易上手。

良好的操作界面可以给游戏玩家带来更好地游戏体验和愉悦的心情。

复杂的游戏界面会造成玩家的负担,所以在设计程序时,功能以及各种操作都应当尽量简单明了。

1.4系统可用性需求系统操作快捷,内容完整是保证用户进行使用的基础。

因此,应准确而详细的理解各用户区的特征,任务和使用环境,在“有效性”、“效率”等各个方面满足各类用户对系统的需要。

连连看游戏(C#)

连连看游戏(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>///必要なデザイナ変数です。

C语言实现数字连连看

C语言实现数字连连看

C语⾔实现数字连连看本⽂实例为⼤家分享了C语⾔实现数字连连看的具体代码,供⼤家参考,具体内容如下要求连连看⼩游戏开发,使⽤⼆维数组来保存游戏地图的数据,实现连连看的核⼼功能。

欢乐连连看的功能有:主界⾯、开始游戏、消⼦、判断胜负、提⽰、重排、计时、游戏模式。

主界⾯游戏主界⾯就是进⾏各项操作的⼊⼝。

开始游戏玩家选择开始游戏模式,进⼊游戏后,选择开始游戏,系统根据设置随机⽣成数字,以供玩家点击消除。

消⼦对玩家选中的两张图⽚进⾏判断,判断是否符合消除规则。

只有符合以下规则的图⽚对才能被消除:⼀条直线连通两条直线连通三条直线连通如果可以消除,两个数字变为0。

如果不能消除,则保持原来的游戏地图。

判断胜负当游戏完成后,需要判断游戏胜负。

不同模式下判断胜负的规则不同。

基本模式时,如果在五分钟内将游戏地图的所有图⽚都消除,则提⽰玩家胜利。

休闲模式时,如果游戏地图中所有图⽚都被消除,则提⽰玩家获胜。

提⽰可以提⽰界⾯上能够消除的⼀对图⽚。

计时设定⼀定时间来辅助游戏是否结束。

游戏模式游戏模式有:基本模式、休闲模式和关卡模式三种,可以根据是否定时等规则进⾏设置。

代码#include <stdio.h>#include <stdlib.h>#include <time.h>#define WIDTH 10#define HEIGHT 12int datas[HEIGHT][WIDTH] = {0};int Choose_type ();void Creat_datas (int fol);bool IsHLinked(int x1,int y1,int x2,int y2);bool IsVLinked(int x1,int y1,int x2,int y2);bool IsZeroTurnLinked(int x1,int y1,int x2, int y2); //⼀条线bool IsOneTurnLinked(int x1, int y1, int x2,int y2); //⼆条线bool IsTwoTurnLinked(int x1,int y1,int x2,int y2); //三条线bool Judge_Answer (int x1,int y1,int x2,int y2); //判断是否可消去void Print_datas ();bool Play_Game (int Flo);bool Relax_Play ();//休闲bool Win_Play ();//闯关int main(){int Flo;Flo = Choose_type (); // choose the typeif (Flo == 0) return 0;srand(unsigned(time(NULL)));Creat_datas(Flo); //creat the graphPrint_datas ();bool ov;ov = Play_Game (Flo);if (ov == true){printf ("VICTORY");}else{printf ("FAILED");}return 0;}bool Basic_Play (){long int t1 ,t2 = 0 ;int op = 1;int x1,y1,x2,y2;bool ANS;printf ("五分钟计时开始\n");t1 = clock();while (t2 < 300000 && !Isblank() && op != 0 ){if (op == 1){Print_datas ();printf("请输⼊两者的坐标[x1 y1 x2 y2]:"); //从上到下,从左到右,先⾏后列 scanf("%d %d %d %d",&x1,&y1,&x2,&y2);if (Judge_Answer (x1, y1, x2,y2)){datas[x1][y1] = datas[x2][y2] = 0;Print_datas ();}else{printf("错误");}}if (op == 2){ANS = Help_ans ();Print_datas ();if (ANS == false){printf ("已没有可以消去的\n");return true;}}printf("是否继续游戏 1、YES 0、NO 2、HELP:");scanf ("%d",&op);t2 = clock() - t1;}if (t2 > 299){printf ("超时\n");return false;}if (Isblank()) return true;else return false;}bool Help_ans (){int k;for (int i = 1; i < 11;i++){if (datas[i][j] != 0){k = j+1;for (int m = i; m < 11;m++){for (int n = k; n < 9;n++){if (datas[i][j] == datas[m][n]){if (Judge_Answer(i,j,m,n)){printf ("(%d,%d) (%d,%d)\n",i,j,m,n);datas[i][j] = datas[m][n] = 0;return true;}}}k = 1;}}}}return false;}bool Relax_Play (){int op = 1;int x1,y1,x2,y2;bool ANS;while (!Isblank() && op != 0) //G isn't blank{if (op == 1){Print_datas ();printf("请输⼊两者的坐标[x1 y1 x2 y2]:");scanf("%d %d %d %d",&x1,&y1,&x2,&y2);if (Judge_Answer (x1, y1, x2,y2)){datas[x1][y1] = datas[x2][y2] = 0;Print_datas ();}else{printf("错误");}}if (op == 2){ANS = Help_ans ();Print_datas ();if (ANS == false){printf ("已没有可以消去的\n");return true;}}printf("是否继续游戏 1、YES 0、NO 2、HELP:"); scanf ("%d",&op);}if (!Isblank()) return false;else return true;}bool Win_Play (){int op = 1;int x1,y1,x2,y2;bool ANS;while (!Isblank() && op != 0) //G isn't blank{if (op == 1){Print_datas ();if (Judge_Answer (x1, y1, x2,y2)){datas[x1][y1] = datas[x2][y2] = 0;Print_datas ();}else{printf("错误");}}printf("是否继续游戏 1、YES 0、NO :");scanf ("%d",&op);}if (!Isblank() && Help_ans) return false;elsereturn true ;}bool Isblank (){for(int j=1; j < 10 ; j++){for (int i= 1; i< 8 ; i++){if (datas[j][i] != 0) return false;}}return true;}bool Play_Game (int Flo){bool Ans;if (Flo == 1) //the basic type{printf ("基本模式:\n");Ans = Basic_Play ();return Ans;}if (Flo == 2) //the relax type{printf ("休闲模式:\n");Ans = Relax_Play ();return Ans;}else //the win type{printf ("第%d关游戏:\n",Flo - 2);Ans = Win_Play ();return Ans;}}void Print_datas (){for(int j=1; j < 11 ; j++){printf("\t\t");for (int i= 1; i< 9 ; i++){printf("%d\t",datas[j][i]);}printf("\n");}}bool Judge_Answer (int x1,int y1,int x2,int y2){if (datas [x1][y1] != datas[x2][y2] || datas [x1][y1] == 0 || datas [x2][y2] == 0 ) return false; if (x1 == x2 && y1 == y2) return false;if (x1 > 11 || x2 > 11 || y1> 9 || y2 > 9) return false;if (x1 == x2 || y1 == y2){if (IsZeroTurnLinked(x1,y1,x2,y2) || IsTwoTurnLinked(x1,y1,x2,y2)) return true;}return false;}int Choose_type (){printf("请选择你要进⾏的操作:1,开始游戏 2,结束游戏\n");int op;scanf("%d",&op);if (op == 1){printf("\n请选择游戏模式:1、基本模式 2、休闲模式 3、关卡模式\n"); int ops;scanf ("%d",&ops);if (ops == 1) return 1;if (ops == 2) return 2;if (ops == 3){printf("\n请选择你选择的关卡3-16:");int opsd;scanf ("%d",&opsd);return opsd;}}if (op == 2) return 0;}void Creat_datas (int fol){int tmpDatas[80] = {0}; // 定义⼀个临时数组⽤于存放int PicNum[] = {3,4,5,1,2,7,9,6,8,44,78,12,90,33,34};int Count = 0,i, j, d = 0,Pic,tem,t;Pic = 8 * 10 / (fol + 9 );for(j=0; j < 80 ; j++){tmpDatas[j] = PicNum[d];Count++;if (Count == Pic ){d++;Count = 0;}}d = 80;for(j=1;j < HEIGHT - 1;j++)for (i = 1;i < WIDTH - 1; i++){t = rand() % d; //Fisher-Yates Shuffletem = tmpDatas[t];tmpDatas[t] = tmpDatas[d -1];tmpDatas[d - 1] = tem;datas[j][i] = tmpDatas[d -1];d--;}}bool IsHLinked(int x1,int y1,int x2,int y2) //横向是否连接{int minY,maxY;if (x1 != x2) return false;if (y1 < y2){minY = y1;maxY = y2;}else{minY = y2;maxY = y1;}if (maxY - minY == 1) return true;for ( int i = minY +1; i < maxY ; i++) //从左到右检查中间的点是不是空的 {if (datas[x1][i] != 0) return false;bool IsVLinked(int x1,int y1,int x2,int y2) //纵向是否连接{int minX,maxX;if (y1 != y2) return false;if (x1 < x2){minX = x1;maxX = x2;}else{minX = x2;maxX = x1;}if (maxX - minX == 1) return true;for ( int i = minX +1; i < maxX ; i++){if (datas[i][y1] != 0) return false;}return true;}bool IsZeroTurnLinked(int x1,int y1,int x2, int y2) //不转折时判断{if (IsHLinked(x1, y1, x2,y2)){return true ;}if (IsVLinked(x1, y1, x2, y2)){return true ;}return false;}bool IsOneTurnLinked(int x1, int y1, int x2,int y2) //转折⼀次{int tmpX[2] = { x1, x2 };int tmpY[2] = { y2, y1 };for (int i = 0; i < 2; i++){if (datas[tmpX[i]][tmpY[i]] != 0) continue;if (IsZeroTurnLinked( tmpX[i], tmpY[i], x1, y1) && IsZeroTurnLinked( tmpX[i], tmpY[i], x2,y2)){return true;}}return false;}bool IsTwoTurnLinked(int x1,int y1,int x2,int y2){int j, tmpX1,tmpY1,tmpX2,tmpY2;//纵向遍历所有点tmpX1 = x1;for ( j = 0; j < WIDTH; j++){tmpY1 = j;if (j == y1) continue;if (tmpX1 == x2 && tmpY1 == y2) continue; //重合tmpX2 = x2;tmpY2 = tmpY1;if (datas[tmpX1][tmpY1] != 0 || datas[tmpX2][tmpY2] != 0) continue;if (IsZeroTurnLinked(tmpX1, tmpY1, tmpX2, tmpY2) && IsZeroTurnLinked(tmpX1, tmpY1, x1, y1) && IsZeroTurnLinked(tmpX2, tmpY2, x2, y2)) return true;}//横向遍历所有点tmpY1 = y1;for ( j = 0; j < HEIGHT; j++)if (j == x1) continue;if (tmpY1 == y2 && tmpX1 == x2) continue; //重合tmpY2 = y2;tmpX2 = tmpX1;if (datas[tmpX1][tmpY1] != 0 || datas[tmpX2][tmpY2] != 0) continue;if (IsZeroTurnLinked(tmpX1, tmpY1, tmpX2, tmpY2) && IsZeroTurnLinked(tmpX1, tmpY1, x1, y1) && IsZeroTurnLinked(tmpX2, tmpY2, x2, y2)) {return true;}}return false;}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

连连看c课程设计

连连看c课程设计

连连看 c课程设计一、教学目标本课程的教学目标是使学生掌握连连看游戏的设计与实现,包括算法分析、界面设计、编程实现等。

知识目标要求学生了解连连看游戏的规则,掌握常用的算法,如深度优先搜索、广度优先搜索等。

技能目标要求学生能够使用编程语言实现连连看游戏,提高编程能力和问题解决能力。

情感态度价值观目标在于培养学生的团队合作意识和创新精神,通过小组合作完成游戏设计,提高沟通协作能力。

二、教学内容本课程的教学内容主要包括连连看游戏规则介绍、算法分析、界面设计、编程实现和团队协作。

具体包括以下几个部分:1.连连看游戏规则介绍:介绍连连看游戏的规则,让学生了解游戏的基本玩法。

2.算法分析:讲解如何使用深度优先搜索、广度优先搜索等算法解决连连看游戏中的问题。

3.界面设计:教授如何设计连连看游戏的界面,包括游戏区域、提示框、菜单等。

4.编程实现:指导学生使用编程语言实现连连看游戏,包括算法实现、界面绘制等。

5.团队协作:讲解如何进行小组合作,分工完成游戏设计,提高团队合作能力。

三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性。

包括:1.讲授法:讲解连连看游戏规则、算法分析、界面设计等理论知识。

2.案例分析法:分析经典连连看游戏案例,引导学生思考并解决问题。

3.实验法:让学生动手实践,编写代码实现连连看游戏。

4.讨论法:学生进行小组讨论,分享设计思路,互相学习。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将提供以下教学资源:1.教材:提供专门的教材,介绍连连看游戏的设计与实现方法。

2.参考书:推荐学生阅读相关编程书籍,加深对编程语言和算法的理解。

3.多媒体资料:制作PPT、视频等多媒体资料,帮助学生更好地理解课程内容。

4.实验设备:提供计算机、编程环境等实验设备,让学生能够动手实践。

五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,以全面反映学生的学习成果。

平时表现占30%,主要评估学生在课堂上的参与度、提问回答和小组讨论等;作业占30%,主要评估学生的编程实践能力;考试占40%,包括理论知识考试和实际编程考试,以评估学生对课程内容的掌握程度。

C语言实现简易连连看游戏

C语言实现简易连连看游戏

C语⾔实现简易连连看游戏本⽂为⼤家分享了C语⾔实现连连看游戏位的具体代码,供⼤家参考,具体内容如下题⽬给定⼀个2N×2N的⽅阵⽹格游戏盘⾯,每个格⼦中放置⼀些符号。

这些符号⼀定是成对出现的,同⼀个符号可能不⽌⼀对。

程序读⼊玩家给出的⼀对位置(x1,y1)、(x2,y2),判断这两个位置上的符号是否匹配。

如果匹配成功,则将两个符号消为“*”并输出消去后的盘⾯;否则输出“Uh-oh”。

若匹配错误达到3次,则输出“Game Over”并结束游戏。

或者当全部符号匹配成功,则输出“Congratulations!”,然后结束游戏。

输⼊格式及样例格式输⼊在⼀⾏中给⼀个正整数N(<5)。

随后2N⾏,每⾏2N个⼤写英⽂字母(其间以1个空格分隔),表⽰游戏盘⾯。

盘⾯之后给出⼀个正整数K,随后K⾏,每⾏按照格式“x1y1x2y2”给出⼀个玩家的输⼊。

注意格⼦的⾏、列编号是从1到2N。

样例2I T I TA B A BA A A AC D C D91 1 1 31 2 1 42 1 2 32 2 2 43 1 3 23 3 3 44 1 4 34 2 4 34 2 4 4输出格式及样例格式根据玩家的每⼀步输⼊,输出相应的结果。

输出盘⾯时注意,每⾏字符间以1个空格分隔,⾏末不得有多余空格。

样例参考代码#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>void Print(int n,char**arr);int main() {int n,i,j;int fail = 0,secc=0;scanf("%d", &n);char** arr = (char**)malloc(sizeof(char*) * 2 * n);for (i = 1; i <= 2 * n; i++)arr[i] = (char*)malloc(sizeof(char) * 2 * n);for (i = 1; i <= 2 * n; i++)for (j = 1; j <= 2 * n; j++) {scanf("%c", &arr[i][j]);if (arr[i][j] == ' ' || arr[i][j] == '\n')j--;}int k;scanf("%d", &k);int** brr = (int**)malloc(sizeof(int*) * k);for (i = 1; i <= k; i++)brr[i] = (int*)malloc(sizeof(int) * 4);for (i = 1; i <= k; i++)for (j = 1; j <= 4; j++)scanf("%d", &brr[i][j]);for (i = 1; i <= k; i++) {char x, y;int x1, y1, x2, y2;x1 = brr[i][1];y1 = brr[i][2];x2 = brr[i][3];y2 = brr[i][4];x = arr[x1][y1];y = arr[x2][y2];//printf("%c %c\n",x ,y);if (x == y) {arr[x1][y1] = '*';arr[x2][y2] = '*';secc++;int m = (2*n * 2*n) / 2;if (secc == m&& n * n % 2 == 0) {printf("Congratulation!\n");exit(0);}Print(n,arr);//printf("\n");}else {printf("Uh-oh\n");fail++;if (fail == 3) {printf("Game Over\n");exit(0);}}//printf("%c %c\n", x, y);/*if (arr[(brr[i][1])][(brr[i][2])] == arr[(brr[i][3])][(brr[i][4])]) {arr[(brr[i][1])][(brr[i][2])] = '*';arr[(brr[i][3])][(brr[i][4])] = '*';}*/}return 0;}//-----------functionvoid Print(int n,char**arr) {/*char** arr = (char**)malloc(sizeof(char*) * 2 * n);for (int i = 1; i < 2 * n; i++)arr[i] = (char*)malloc(sizeof(char) * 2 * n);*/for (int i = 1; i <= 2 * n; i++) {printf("%c", arr[i][1]);for (int j = 2; j <= 2 * n; j++) {printf(" %c", arr[i][j]);}printf("\n");}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

毕业设计_c 连连看游戏1

毕业设计_c  连连看游戏1

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

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

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

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

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

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

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

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

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

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

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

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

连连看游戏设计思想及程序详细讲解(附源码)

连连看游戏设计思想及程序详细讲解(附源码)

连连看游戏设计思想及程序详细讲解(附源码)1、连连的设计思想1)、准备好相应的大小相同的小图片若干public static final int CELL_SIZEx = 36;public static final int CELL_SIZEy = 40;public static final int CELL_COLS = 34;public static final int CELL_ROWS = 14;public static final int CELL_ZONGS = (CELL_COLS-2)*(CELL_ROWS-2);例如本程序:小图片宽:CELL_SIZEx = 36 高:CELL_SIZEy = 40摆放小图片舞台:横向:34格CELL_COLS= 34纵向:14格CELL_ROWS= 14真正要摆放图片的格数:CELL_ZONGS = (CELL_COLS-2)*(CELL_ROWS-2)即:四面的边格不放图片2)、设定34*14个图片数组,其中除四边外,全部随机存入图片,要保证每种图片各数相同(至少不要差太多),并且是偶数(奇数最后消不掉了)。

3)、在舞台上放上鼠标监听器,当点击任一图片时,做出判断,是否第一次点击(点击标记为0就是第一次点击),如果是第一次点击,就将相关信息记录到第一次内容中,比如:x1,y1,cell1,并将点击标记记为1,再次点击后,判断,点的是否同一图片,如果是,不做处理,如果不是,就认为点击了第二个图片,将相关住处记录到第二次内容中,如:x2,y2,cell2。

然后得用这个方法public boolean delkey()判断两点是否可以连通,如果可以,就消掉图片,不可以就不做处理。

整个连连看原理就是这样,其中有几个难点:1、随机图片,并且保证每种图片数相同,并且为偶数。

2、点击监听3、判断两点是否连通,这个算法是整个连连看的核心,也是最难的。

c语言课程设计连连看

c语言课程设计连连看

c语言课程设计连连看一、教学目标本课程旨在通过C语言编程的教学,使学生掌握C语言的基本语法、数据类型、运算符、控制结构、函数等基本知识,培养学生具备基本的编程能力和逻辑思维能力。

同时,通过编程实践,使学生能够运用C语言解决实际问题,提高学生的创新能力和实践能力。

此外,通过课程的学习,培养学生对计算机科学的兴趣和热情,培养学生良好的编程习惯和团队协作精神。

二、教学内容教学内容主要包括C语言的基本语法、数据类型、运算符、控制结构、函数等基本知识,以及简单的编程实践。

具体包括以下几个方面:1.C语言的基本语法和规则;2.数据类型、变量和常量的定义与使用;3.运算符和表达式的使用;4.控制结构:条件语句、循环语句;5.函数的定义和调用;6.数组、指针和字符串的基本操作;7.结构体和文件操作等高级知识。

三、教学方法为了提高学生的学习兴趣和主动性,将采用多种教学方法相结合的方式进行教学。

具体包括:1.讲授法:讲解C语言的基本语法、数据类型、运算符、控制结构、函数等基本知识;2.案例分析法:通过分析实际案例,使学生掌握C语言编程的方法和技巧;3.实验法:安排上机实验,让学生亲自动手编写程序,巩固所学知识;4.讨论法:学生进行小组讨论,分享学习心得和编程经验,互相学习和进步。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,将选择和准备以下教学资源:1.教材:《C程序设计语言》(K&R);2.参考书:《C Primer Plus》、《C和指针》;3.多媒体资料:教学PPT、视频教程、在线编程练习题;4.实验设备:计算机、网络环境、编程环境(如Code::Blocks、VisualStudio等)。

五、教学评估教学评估是检验学生学习成果和教学效果的重要手段。

本课程的评估方式将包括以下几个方面:1.平时表现:通过课堂参与、提问、讨论等环节,评估学生的学习态度和参与程度;2.作业:布置课后编程作业,评估学生的编程能力和应用能力;3.实验报告:评估学生在实验环节的操作能力和解决问题的能力;4.考试成绩:包括期中和期末考试,全面测试学生的C语言编程知识和技能。

连连看c语言课程设计

连连看c语言课程设计

连连看c语言课程设计一、教学目标本课程旨在通过学习C语言的基础知识,使学生能够理解并运用C语言进行简单的程序设计。

具体目标如下:1.理解C语言的基本语法和数据类型。

2.掌握C语言的运算符和表达式。

3.学会使用C语言进行控制流程的编写。

4.能够使用C语言编写简单的程序。

5.能够阅读并理解简单的C语言程序。

6.能够对简单的C语言程序进行调试和修改。

情感态度价值观目标:1.培养学生对计算机科学的兴趣和热情。

2.培养学生解决问题的能力和创新思维。

二、教学内容本课程的教学内容主要包括C语言的基本语法、数据类型、运算符、表达式和控制流程。

具体安排如下:1.C语言的基本语法和数据类型。

2.C语言的运算符和表达式。

3.C语言的控制流程,包括条件语句和循环语句。

三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法。

具体方法如下:1.讲授法:通过讲解C语言的基本语法、数据类型、运算符和表达式,使学生理解并掌握相关知识。

2.案例分析法:通过分析具体的C语言程序案例,使学生学会运用C语言进行程序设计。

3.实验法:通过上机实验,使学生能够实际操作C语言进行程序编写和调试。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:《C语言程序设计》。

2.参考书:提供相关的C语言参考书籍,供学生自主学习。

3.多媒体资料:制作相关的教学PPT和视频资料,以便学生更好地理解教学内容。

4.实验设备:提供计算机实验室,供学生进行上机实验和实践。

五、教学评估为了全面反映学生的学习成果,本课程将采用以下评估方式:1.平时表现:通过学生在课堂上的参与度、提问和回答问题的情况,以及小组讨论的表现来评估。

2.作业:布置适量的作业,通过学生的作业完成情况来评估其对知识的掌握程度。

3.考试:进行期中考试和期末考试,通过考试的成绩来评估学生的学习成果。

以上评估方式将客观、公正地评价学生的学习情况,同时也将鼓励学生的自主学习和积极参与。

连连看c语言课程设计

连连看c语言课程设计

连连看c语言课程设计一、课程目标知识目标:1. 学生能理解C语言中结构体的概念和使用方法,掌握结构体数组的相关操作。

2. 学生能运用指针和结构体相关知识实现连连看游戏的逻辑设计。

3. 学生了解并掌握C语言中的文件操作,实现对连连看游戏数据的保存和读取。

技能目标:1. 学生能独立设计并编写C语言程序,完成连连看游戏的框架和基本功能。

2. 学生通过课程学习,培养逻辑思维能力和问题解决能力,学会运用所学知识解决实际问题。

3. 学生能运用调试工具对程序进行调试和优化,提高程序性能。

情感态度价值观目标:1. 学生通过参与课程学习,培养对编程的兴趣和热情,提高主动学习的积极性。

2. 学生在团队协作中,学会沟通与交流,培养合作精神和团队意识。

3. 学生在课程实践中,体验编程的乐趣,增强自信心和成就感,培养克服困难的意志。

本课程针对高年级学生,结合C语言学科特点,注重理论知识与实践操作的结合。

课程以连连看游戏为载体,引导学生运用所学知识,培养编程能力和逻辑思维能力。

同时,关注学生的情感态度,激发学习兴趣,提高合作意识,为学生的终身发展奠定基础。

通过本课程的学习,期望学生能够达到以上所述的具体学习成果。

二、教学内容1. 结构体和结构体数组:讲解结构体的定义和用法,结构体数组的创建与初始化,以及结构体变量的访问和操作。

2. 指针与结构体:介绍指针与结构体的结合使用,包括结构体指针的定义、访问结构体成员,以及结构体指针数组的应用。

3. 文件操作:讲解C语言中文件的基本操作,包括文件的打开、关闭、读取和写入,重点掌握文件读写结构体数据的方法。

4. 游戏逻辑设计:分析连连看游戏的规则和逻辑,引导学生运用结构体、指针和文件操作等知识,设计游戏的数据结构和算法。

5. 编程实践:结合教材实例,指导学生编写连连看游戏的代码,实现游戏的基本功能,包括游戏界面的显示、数据的保存与读取、游戏逻辑判断等。

教学内容参照教材相关章节,按照以下进度安排:第一课时:结构体和结构体数组;第二课时:指针与结构体;第三课时:文件操作;第四课时:游戏逻辑设计;第五课时:编程实践与调试优化。

c课课程设计(连连看)

c课课程设计(连连看)

c 课课程设计(连连看)一、教学目标本课程的教学目标是使学生掌握XX学科的基本概念、原理和方法,提高学生的XX能力。

具体来说,知识目标包括:掌握XX学科的基本知识、概念和原理,了解XX学科的发展趋势;技能目标包括:能够运用XX方法分析问题和解决问题,具备XX技能;情感态度价值观目标包括:培养学生的创新意识、科学精神和合作精神。

二、教学内容根据课程目标,本课程的教学内容主要包括XX学科的基本概念、原理和方法。

教学大纲如下:第1章:XX学科概述1.1 XX学科的定义和发展历程1.2 XX学科的应用领域和意义第2章:XX基本概念2.1 XX概念的定义和内涵2.2 XX概念的应用和举例第3章:XX原理3.1 XX原理的表述和解释3.2 XX原理的应用和案例第4章:XX方法4.1 XX方法的原理和步骤4.2 XX方法的实践应用三、教学方法为了实现课程目标,本课程将采用多种教学方法,包括讲授法、讨论法、案例分析法和实验法等。

通过多样化的教学方法,激发学生的学习兴趣和主动性,提高学生的参与度和实践能力。

四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备等。

教材和参考书将用于引导学生掌握基本知识和概念;多媒体资料将用于辅助讲解和展示;实验设备将用于实践操作和验证。

教学资源的选择和准备将充分支持教学内容和教学方法的实施,丰富学生的学习体验。

五、教学评估本课程的评估方式包括平时表现、作业和考试等。

平时表现主要评估学生的课堂参与度、提问和回答问题的积极性等;作业主要评估学生的理解和应用能力;考试主要评估学生对知识的掌握和运用能力。

评估方式应客观、公正,能够全面反映学生的学习成果。

具体的评估标准和权重分配将在课程开始时明确告知学生。

六、教学安排本课程的教学安排如下:共计XX课时,每周安排XX时间段进行课堂教学,教学地点为XX教室。

教学进度将根据课程内容和学生的实际情况进行调整,确保在有限的时间内完成教学任务。

C语言程序设计连连看

C语言程序设计连连看

#include <>#include <>#include <>#include <>#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("\\n");printf("\\n");printf("\\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)*********************************情况二()(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;}}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言程序设计连连看 Prepared on 24 November 2020#include<>#include<>#include<>#include<>#include<iostream>usingnamespacestd;#include<ctime>intmai()//倒计时{for(inti=3;i>=0;i--){longt=time(NULL);for(;;){longn=time(NULL);if(n!=t)break;}system("cls");cout<<""<<endl;cout<<""<<endl;cout<<"离史上最卡哇依的游戏开始还有**"<<i<<"**秒哦!!!"<<endl; }return0;}voidinit1();voidprint1();intexit1();voidinit2();voidprint2();intexit2();voidinit3();voidprint3();intexit3();voidnear1(inta,intb,inta1,intb1);charchessman[10][10];voidmain()//主函数{time_tstart,end,time;start=clock();mai();intd;cout<<""<<endl;cout<<""<<endl;cout<<""<<endl;cout<<"****************************************************************" <<endl;cout<<"****************************************************************"<<e ndl;cout<<"**亲,请选择适合您智商的级别:[1]低级[2]中级[3]登峰造极**"<<endl;cout<<"****************************************************************" <<endl;cout<<"****************************************************************"<<e ndl;cout<<""<<endl;cout<<""<<endl;cout<<"研发小组:QYQ"<<endl;cout<<"请选择:***-";cin>>d;cout<<"-***"<<endl;system("pause");switch(d){case1:init1();break;case2:init2();break;case3:init3();break;default:cout<<"你个逗比";}intop;introw,line;introw2,line2;do{if(d==1)print1();elseif(d==2)print2();elseif(d==3)print3();printf("options:\n");printf("\\n");printf("\\n");printf("\\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");}elseif(line==line2&&row==row2){printf("有搞错哦,亲!!!\n");system("pause"); }elseif(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");}voidinit1()//4乘4矩阵{inti,j;inta[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;}}voidprint1(){inti,j;system("cls");printf("\t1234\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");}intexit1(){inti,j;for(i=0;i<6;i++){for(j=0;j<6;j++)if(chessman[i][j]!=0)return1;}return0;}voidinit2()//6乘6矩阵{inti,j;inta[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;}}voidprint2(){inti,j;system("cls");printf("\t123456\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");}intexit2(){inti,j;for(i=0;i<8;i++){for(j=0;j<8;j++)if(chessman[i][j]!=0)return1;}return0;}voidinit3()//8乘8矩阵{inti,j;inta[8]={0};srand(time(NULL));for(i=1;i<8;i++)for(j=1;j<9;j++){chessman[i][j]=rand()%8+65;//棋盘内容为A到H if(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;}}voidprint3(){inti,j;system("cls");printf("\t\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");}intexit3(){inti,j;for(i=0;i<10;i++){for(j=0;j<10;j++)if(chessman[i][j]!=0)return1;}return0;}voidnear1(inta,intb,inta1,intb1)//三种路径{intarow[2];intaline[2];intbrow[2];intbline[2];intstart=0,end=0;//临时两个点inti,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)*********************************情况二()(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大小不能确定,所以有两个if chessman[a][b]=chessman[a1][b1]=0;if((n==b1-b)&&(n>0))chessman[a][b]=chessman[a1][b1]=0;}//考虑左右向量//if(aline[0]>=bline[0])//向左的向量有共同的列向量start=aline[0];//取大的elsestart=bline[0];if(aline[1]<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;}}。

相关文档
最新文档