C语言实验连连看
连连看c课程设计
连连看 c课程设计。
一、课程目标知识目标:1. 学生能理解并掌握连连看游戏的基本规则和策略。
2. 学生能运用所学知识,分析并解决连连看游戏中遇到的问题。
3. 学生了解连连看游戏背后的数学原理,如排列组合、概率等。
技能目标:1. 学生能运用计算机操作,熟练玩转连连看游戏。
2. 学生通过连连看游戏,培养逻辑思维能力和问题解决能力。
3. 学生学会与他人合作,进行游戏策略的交流与分享。
情感态度价值观目标:1. 学生在游戏中培养积极的学习态度,主动探索和发现新知识。
2. 学生树立正确的竞争意识,学会尊重对手,敢于面对挑战。
3. 学生通过团队合作,培养集体荣誉感,增强团队协作能力。
本课程旨在通过连连看游戏,将学科知识与实际操作相结合,提高学生的逻辑思维能力、问题解决能力和团队合作能力。
针对学生的年级特点,课程设计注重知识性、趣味性和实践性,使学生学以致用,激发学习兴趣,培养良好的学习习惯和价值观。
二、教学内容1. 连连看游戏规则与策略:介绍连连看游戏的基本规则,分析游戏策略,如消除顺序、路径选择等。
- 教材章节:第三章第二节“游戏的规则与策略”2. 连连看游戏中的数学原理:讲解排列组合、概率等数学知识在连连看游戏中的应用。
- 教材章节:第四章第一节“排列组合与概率”3. 计算机操作与连连看游戏:教授如何使用计算机进行连连看游戏,包括游戏界面的认识、操作方法等。
- 教材章节:第二章第二节“计算机游戏操作基础”4. 逻辑思维与问题解决:通过连连看游戏,培养学生逻辑思维能力和问题解决能力。
- 教材章节:第五章第三节“逻辑思维与问题解决方法”5. 团队合作与交流分享:组织学生进行连连看游戏比赛,培养团队合作精神,并进行游戏策略的交流与分享。
- 教材章节:第六章第一节“团队合作与交流”教学内容按照教学大纲进行安排,共计5个课时。
第一、二课时讲解连连看游戏规则与策略,第三课时介绍数学原理在游戏中的应用,第四课时教授计算机操作,第五课时进行团队合作与交流分享。
(完整版)连连看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语⾔演⽰(⾃动连连看)(图⽚是游戏的⽰意图,来⾃互联⽹,与本⽂程序⽆关)看题⽬就知道是写给初学者的,没需要的就别看了,⾃⼰都觉得怪⽆聊的。
很多游戏的耐玩性都来⾃精巧的算法,特别是⼈⼯智能的⽔平。
⽐如前⼏天看了著名的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语言源代码
/* 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语言源代码
*/
连连看算法及实现原理详解(C++源码)
void FunctionalModule::m_ColorToNum(HWND hwnd) //把像素转换为数组格式
{
HDC hdc=GetDC(hwnd);
break;
default:
break;
}
}
}
}
}
}
}
}
}
}
////////////////////////////////////////////////////////////////////////
int icolor=0;
COLORREF ccolor1,ccolor2;
for (int n1=0,nx=10;n1<5;n1++,nx-=5)
{
for (int m1=0,my=10;m1<5;m1++,my-=5)
int m_LeftTop(int ax,int ay,int bx,int by); //左上 11
int m_YLeft(int ax,int ay,int bx,int by); //y左 12
int m_LeftBottom(int ax,int ay,int bx,int by); //左下 13
{
ptLineOne.x=0;ptLineOne.y=0;//转折点的两个坐标设为0
ptLineTwo.x=0;ptLineTwo.y=0;
numTotal=(xLast+1)*(yLast+1);//图案总的个数
C 课程设计_连连看1
课程设计报告课程名称:面向对象程序设计C++设计题目:连连看专业:计算机科学与技术姓名:学号:指导教师:李晓虹2015 年 12 月 10 日摘要在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活不可或缺的一部分,越来越多的人使用计算机办公、娱乐、购物等等。
游戏行业发展一日千里,该行业极大的影响和改变了人们的生活和娱乐方式,游戏为消费者提供丰富多彩的虚拟空间,使消费者可以自由自在的享受虚拟世界的乐趣,实现自己在现实生活着那个可能永远不能实现的梦想,满足了消费者的心理和精神需求。
连连看游戏是一款很流行的小游戏,有的是连水果图片,有的是连麻将牌,有的是连各种小图片的等等。
各种图片让人看得眼花缭乱,这也可以锻炼人的反应能力和眼力,所以这款小游戏受到了越来越多人的喜爱,尤其是小孩子的喜爱。
连连看游戏也是比较经典的一款小游戏,实现它的方法很多,可以用很多不同算法设计和语言实现,如C,C#,C++,VB,JAVA等。
在本课程设计中我是利用C++语言编写,开发平台是Microsoft Visual Studio 2010,功能较为简单,寓学于乐。
程序的功能是通过找出游戏中两个相同图案的小方块,然后分别点击两个小方块将其消除;可通过倒计时的方式控制游戏时间,游戏时间到或者没有匹配的图案时则游戏结束,需要重新开局,每一局开始倒计时都重新开始;能够响应鼠标事件。
论文首先介绍了进行该游戏课程设计的目的,然后是任务描述和设计的相关要求,最后是最重要的需求分析和设计方案。
重点介绍了在游戏过程中各种事件的处理,其中又以鼠标事件的处理最为最要,鼠标事件是利用鼠标所发出的信息了解用户的意图,进而做出相对应的动作,消除需要消除的小方块。
关键词:连连看游戏;算法设计;事件;C++,Microsoft Visual Studio 2010第一章系统需求分析1.1 功能分析每次用户选择两个相同的小方块,如果小方块满足一定条件(这两个小方块之间存在转弯少于3的路径),则两个小方块可以消掉,给定任意具有相同图案的两个小方块,用户需要寻找这两个小方块之间在转弯最少的情况下,如果这个最优路径的转弯数目小于3,则这两个小方块可以消掉。
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++设计题目:连连看游戏专业:计算机科学与技术姓名:学号:指导教师:李晓虹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语⾔实现数字连连看的具体代码,供⼤家参考,具体内容如下要求连连看⼩游戏开发,使⽤⼆维数组来保存游戏地图的数据,实现连连看的核⼼功能。
欢乐连连看的功能有:主界⾯、开始游戏、消⼦、判断胜负、提⽰、重排、计时、游戏模式。
主界⾯游戏主界⾯就是进⾏各项操作的⼊⼝。
开始游戏玩家选择开始游戏模式,进⼊游戏后,选择开始游戏,系统根据设置随机⽣成数字,以供玩家点击消除。
消⼦对玩家选中的两张图⽚进⾏判断,判断是否符合消除规则。
只有符合以下规则的图⽚对才能被消除:⼀条直线连通两条直线连通三条直线连通如果可以消除,两个数字变为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课程设计一、教学目标本课程的教学目标是使学生掌握连连看游戏的设计与实现,包括算法分析、界面设计、编程实现等。
知识目标要求学生了解连连看游戏的规则,掌握常用的算法,如深度优先搜索、广度优先搜索等。
技能目标要求学生能够使用编程语言实现连连看游戏,提高编程能力和问题解决能力。
情感态度价值观目标在于培养学生的团队合作意识和创新精神,通过小组合作完成游戏设计,提高沟通协作能力。
二、教学内容本课程的教学内容主要包括连连看游戏规则介绍、算法分析、界面设计、编程实现和团队协作。
具体包括以下几个部分:1.连连看游戏规则介绍:介绍连连看游戏的规则,让学生了解游戏的基本玩法。
2.算法分析:讲解如何使用深度优先搜索、广度优先搜索等算法解决连连看游戏中的问题。
3.界面设计:教授如何设计连连看游戏的界面,包括游戏区域、提示框、菜单等。
4.编程实现:指导学生使用编程语言实现连连看游戏,包括算法实现、界面绘制等。
5.团队协作:讲解如何进行小组合作,分工完成游戏设计,提高团队合作能力。
三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性。
包括:1.讲授法:讲解连连看游戏规则、算法分析、界面设计等理论知识。
2.案例分析法:分析经典连连看游戏案例,引导学生思考并解决问题。
3.实验法:让学生动手实践,编写代码实现连连看游戏。
4.讨论法:学生进行小组讨论,分享设计思路,互相学习。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将提供以下教学资源:1.教材:提供专门的教材,介绍连连看游戏的设计与实现方法。
2.参考书:推荐学生阅读相关编程书籍,加深对编程语言和算法的理解。
3.多媒体资料:制作PPT、视频等多媒体资料,帮助学生更好地理解课程内容。
4.实验设备:提供计算机、编程环境等实验设备,让学生能够动手实践。
五、教学评估本课程的评估方式包括平时表现、作业和考试三个部分,以全面反映学生的学习成果。
平时表现占30%,主要评估学生在课堂上的参与度、提问回答和小组讨论等;作业占30%,主要评估学生的编程实践能力;考试占40%,包括理论知识考试和实际编程考试,以评估学生对课程内容的掌握程度。
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; }}。
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++实现连连看游戏
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;//⽤于标记是否已经获胜。
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语言进行简单的程序设计。
具体目标如下: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语言源代码#include <stdio.h>#include <graphics.h>#include <stdlib.h>#include <math.h>#include <dos.h>#define true 1#define false 0/* ---------------------全局变量------------------------------------ */int BkGndColor=BLACK;int BorderColor=LIGHTGRAY;int LineColor=LIGHTBLUE;/* 消除一对方块时时候的连线颜色*/ /* Pb - ProgressBar */int PbColor=LIGHTGREEN;int PbY=4;int PbHeight=4;int PbValue; /* 进度条百分比,初始值为100.*/ long StartTime; /* 开始时间的秒数,只统计分钟,秒*/ long TotalTime; /* 游戏总共的最大秒数!,*//* BoardDatas: a small-size board *//* Board[x][y][0] - 0:empty, 1:filled *//* Board[x][y][1] - cell's key; */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 *//* 用于存储逻辑坐标(索引)*/typedef struct _tagCELL{char x;char y;} CELL;CELL selCell,curCell;/*缓存前一个被选中的位置以及当前所处位置!*//*Scan Codes Define*/enum KEYCODES{K_ESC =0x011b,K_UP =0x4800, /* upward arrow */K_LEFT =0x4b00,K_DOWN =0x5000,K_RIGHT =0x4d00,K_SPACE =0x3920,K_P =0x1970,K_RETURN =0x1c0d, /* Enter */};/* ---------------------函数列表------------------------------------ */void InitGame(char *bgiPath);void PlayGame();void QuitGame();void InitProgressBar();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);void DrawGameOver(char* info);int GetKeyCode();int FindPath(CELL *c1,CELL *c2);/*绘制消除方块时候的连接路径!,用指定颜色!*/void DrawPath(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4,int color);/* ----------------------函数实现----------------------------------- *//* ----------------------[ 核心算法]---------------------------------* 先进行水平方向判断,找出两点所在的水平直线活动范围,* 算出这两条线段在垂直方向的共同区域,* 遍历该区域判断能否在两线段间架起公垂线,能则两点连接上;* 接着进行垂直方向判断,类同。
C 课程设计_连连看游戏1
课程设计报告课程名称:面向对象程序设计C++设计题目:连连看游戏专业:计算机科学与技术姓名:学号:指导教师:李晓虹2016 年 1 月7 日第一章系统需求分析相信大多数玩过QQ游戏的人对这款游戏都不陌生。
这款游戏不止操作简单,规则也不难,再加上游戏速度的控制机制得宜,让整个游戏在操作过程中充满了快乐与紧张的气氛。
除了游乐当中能带给使用者快乐之外,游戏的设计内容无形中也不断训练使用者的逻辑思考能力,对于依靠高度脑力工作的现代人,都可以通过这个游戏,不时的检验一下自己,所以我们不难发现,在各种可携带的电子产品上都有这款游戏的踪影。
第二章总体设计本游戏主要给用户提供的是游戏的娱乐功能,所以怎么提高游戏的娱乐性成为问题的关键,那么娱乐性主要体现在那些方面呢?1,用户界面,具有良好的用户界面能吸引人去玩;2,游戏的娱乐功能,具有良好的娱乐功能是游戏具有持久魅力的基础,需要设计游戏的不同级别以充分调动用户积极性;3,具有友好的提示功能,满足不同游戏级别的人的不同需要,增加必要的音乐效果,使用户玩起来不觉得单调乏味。
鉴于上面分析,本次设计设置不同的游戏级别主要是缩短时间的进行速度,因为图标是随机列换的,所以通过控制产生随机数的难度显得不现实。
通过菜单和快捷键的操作可以适时做出游戏的提示功能,满足提示要求,如果用户对某次产生的图标分布效果不满意可以对现在有的图表资源进行有限次的重排,以满足用户的需要。
关于算法问题,这是游戏设计的核心问题,算法的选择好坏涉及到游戏的质量,采用的产生的二维随机数索引分别和对应图标对应形成游戏界面。
算法需要计算两个相同图标的连通性,计算连通性需要分别判断多次,所以算法的根本在于如何判断区域连通。
第三章详细设计3.1 连连看的要求1,要连接的两点上的图形是相同的。
2,两点间存在一条没有“障碍”的并且折点不超过两个的路线。
那么分析一下可以看到,一般分为三种情况。
图例说明:假设以一个2维数组来表示一张连连看的地图,数组中元素值为0的代表游戏界面中的空格子,值大于0的代表游戏中的各种连接对象。
连连看c语言课程设计
连连看c语言课程设计一、课程目标知识目标:1. 学生能理解C语言中结构体的概念和使用方法,掌握结构体数组的相关操作。
2. 学生能运用指针和结构体相关知识实现连连看游戏的逻辑设计。
3. 学生了解并掌握C语言中的文件操作,实现对连连看游戏数据的保存和读取。
技能目标:1. 学生能独立设计并编写C语言程序,完成连连看游戏的框架和基本功能。
2. 学生通过课程学习,培养逻辑思维能力和问题解决能力,学会运用所学知识解决实际问题。
3. 学生能运用调试工具对程序进行调试和优化,提高程序性能。
情感态度价值观目标:1. 学生通过参与课程学习,培养对编程的兴趣和热情,提高主动学习的积极性。
2. 学生在团队协作中,学会沟通与交流,培养合作精神和团队意识。
3. 学生在课程实践中,体验编程的乐趣,增强自信心和成就感,培养克服困难的意志。
本课程针对高年级学生,结合C语言学科特点,注重理论知识与实践操作的结合。
课程以连连看游戏为载体,引导学生运用所学知识,培养编程能力和逻辑思维能力。
同时,关注学生的情感态度,激发学习兴趣,提高合作意识,为学生的终身发展奠定基础。
通过本课程的学习,期望学生能够达到以上所述的具体学习成果。
二、教学内容1. 结构体和结构体数组:讲解结构体的定义和用法,结构体数组的创建与初始化,以及结构体变量的访问和操作。
2. 指针与结构体:介绍指针与结构体的结合使用,包括结构体指针的定义、访问结构体成员,以及结构体指针数组的应用。
3. 文件操作:讲解C语言中文件的基本操作,包括文件的打开、关闭、读取和写入,重点掌握文件读写结构体数据的方法。
4. 游戏逻辑设计:分析连连看游戏的规则和逻辑,引导学生运用结构体、指针和文件操作等知识,设计游戏的数据结构和算法。
5. 编程实践:结合教材实例,指导学生编写连连看游戏的代码,实现游戏的基本功能,包括游戏界面的显示、数据的保存与读取、游戏逻辑判断等。
教学内容参照教材相关章节,按照以下进度安排:第一课时:结构体和结构体数组;第二课时:指针与结构体;第三课时:文件操作;第四课时:游戏逻辑设计;第五课时:编程实践与调试优化。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<stdio.h>#include<stdlib.h>#include<time.h>typedef struct Player{int Rank;int score;int time;}player;//定义一个玩家信息结构体typedef struct Point{int x;int y;}point;//连连看地图坐标结构体player py[5];player p={4,0,0};int record=5;//记录个数int flag=0;//判断是否开始过游戏int restarttime=1;char a[9]={' ','A','B','C','D','E','F','G','H'};int **ch;void Produce(int n);//随机产生地图int OneLink(point p1,point p2);//判断两点能否直接相连void HV(point p1,point *hp,point *vp,int *n1,int *n2);//连连看算法,计算两点横向和纵向的共同部分int ExtendSearch(point p1,point p2);//通过调用OneLink(),HV(),判断两点能否消除void Judge();//调用ExtendSearch(),判断能否消除void Show(int n);//显示连连看地图void Free(int n);//释放内存void Menu();//主菜单void Menu2();//2级菜单void Sort();//排序函数,用于玩家排名void RankSelect();//游戏难度等级选择int IfWin(int n);//判断是游戏是否赢void Record();//显示记录void Start();//void GameOver();//void PlayGame();//int ReadFile();//读取文件void SaveFile();//保存文件void CreateFile();//用于刚开始的创建文件void Restart();//重置模式void Menu(){printf("************************************************************ *****\n");printf("* 1.开始游戏*\n");printf("* 2.难度选择*\n");printf("* 3.查看记录*\n");printf("* 0.退出*\n");printf("************************************************************ *****\n");}void Menu2(){printf("************************************************************ *****\n");printf("* 1.4*4 *\n");printf("* 2.6*6 *\n");printf("* 0.返回上级*\n");printf("************************************************************ *****\n");}void Produce(int n){int i,j,k,m1,m2;srand(time(NULL));ch=(int **)malloc((n+2)*sizeof(int*));for(i=0;i<n+2;i++){ch[i]=(int *)malloc((n+2)*sizeof(ch));for(j=0;j<n+2;j++){ch[i][j]=0;}}for(i=1;i<=n;i++)for(j=1;j<=n;j++){k=rand()%n+1;if(ch[i][j]==0){ch[i][j]=k;do{m1=1+rand()%n;m2=1+rand()%n;}while(ch[m1][m2]!=0);ch[m1][m2]=k;}}flag=1;}int OneLink(point p1,point p2){point max,min;int i;if(p1.x==p2.x&&p1.y==p2.y) return 1;if(p1.x==p2.x){if(p1.y>p2.y){max=p1;min=p2;}else{max=p2;min=p1;}if((max.y-1)==min.y) return 1;for(i=min.y+1;i<max.y;i++){if(ch[p1.x][i]!=0)return 0;}return 1;}if(p1.y==p2.y){if(p1.x>p2.x){max=p1;min=p2;}else{max=p2;min=p1;}if((max.x-1)==min.x) return 1;for(i=min.x+1;i<max.x;i++){if(ch[i][p1.y]!=0)return 0;}return 1;}return 0;}//横向,纵向void HV(point p1,point *hp,point *vp,int *n1,int *n2){ int i=0,j=0;point Hp,Vp;hp[j++]=p1;for(i=p1.y-1;i>=0;i--){if(ch[p1.x][i]==0){Hp.x=p1.x;Hp.y=i;hp[j++]=Hp;}else break;}for(i=p1.y+1;i<p.Rank+2;i++){if(ch[p1.x][i]==0){Hp.x=p1.x;Hp.y=i;hp[j++]=Hp;}else break;}(*n1)=j;j=0;//纵向vp[j++]=p1;for(i=p1.x-1;i>=0;i--){if(ch[i][p1.y]==0){Vp.x=i;Vp.y=p1.y;vp[j++]=Vp;}else break;}for(i=p1.x+1;i<p.Rank+2;i++){if(ch[i][p1.y]==0){Vp.x=i;Vp.y=p1.y;vp[j++]=Vp;}else break;}(*n2)=j;}int ExtendSearch(point p1,point p2){int i,j,n1=0,n2=0,n3=0,n4=0;point Hpoint1[10],Hpoint2[10],Vpoint1[10],Vpoint2[10];HV(p1,Hpoint1,Vpoint1,&n1,&n2);HV(p2,Hpoint2,Vpoint2,&n3,&n4);//公共部分//横向for(i=0;i<n1;i++){for(j=0;j<n3;j++){if(Hpoint1[i].y==Hpoint2[j].y){if(OneLink(Hpoint1[i],Hpoint2[j]))return 1;}}}//纵向for(i=0;i<n2;i++){for(j=0;j<n4;j++){if(Vpoint1[i].x==Vpoint2[j].x){if(OneLink(Vpoint1[i],Vpoint2[j]))return 1;}}}return 0;}void Restart(){int i,m1,n1,m2,n2;char tmp;srand(time(NULL));for(i=0;i<5;i++){m1=1+rand()%p.Rank;n1=1+rand()%p.Rank;m2=1+rand()%p.Rank;n2=1+rand()%p.Rank;tmp=ch[m1][n1];ch[m1][n1]=ch[m2][n2];ch[m2][n2]=tmp;}}void Judge(){int x1,x2,y1,y2;char restart;point p1,p2;printf("是否重置(y|n)?");getchar();scanf("%c",&restart);if(restart=='y'){Restart();restarttime++;}else{printf("\nPlease input the point(example:(2,3),(4,4) )\n");//清除回车getchar();scanf("(%d,%d),(%d,%d)",&x1,&y1,&x2,&y2);p1.x=x1;p1.y=y1;p2.x=x2;p2.y=y2;if(x1==x2&&y1==y2);else if(ch[x1][y1]==ch[x2][y2]&&ExtendSearch(p1,p2)){ch[x1][y1]=ch[x2][y2]=0;}}}void Show(int n){int i,j;for(i=0;i<n;i++)printf(" %3d",i+1);printf("\n");for(i=1;i<=n;i++)for(j=1;j<=n;j++){printf("%4c",a[ch[i][j]]);if((j)%n==0)printf("%3d\n",i);}}void Free(int n){ int i;if(flag){for(i=0; i<n; i++)free(ch[i]);free(ch);}}int IfWin(int n){int i,j;for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(ch[i][j]!=0)return 0;}return 1;}void Sort(){int i,j;for(i=0;(i<record)&&(py[i].score>p.score);i++);if(i<record){for(j=record-1;j>i;j--){py[j]=py[j-1];}py[i].Rank=p.Rank;py[i].score=p.score;py[i].time=p.time;return ;}return ;}void Record(){int i;system("CLS");printf("*****************************************************\n");printf("* 排名等级分数时间*\n");for(i=0;i<record;i++){if(py[i].score>0){printf("*%10d%10d%10d%10d*\n",i+1,py[i].Rank,py[i].score,py[i].time);}}printf("*****************************************************\n");do{printf("输入0退出:");scanf("%d",&i);}while(i!=0);}void RunningGame(){int n=p.Rank;time_t start,end;Produce(n);start=time(NULL);do{system("CLS");Show(n);Judge();// scanf("%d",&n);// Show(n);}while(!IfWin(n));end=time(NULL);p.time=(int)difftime(end,start);p.score=(int)((p.Rank*1000*120/p.time)/restarttime);printf(" you win!\n");printf(" costing time:%d\n",p.time);printf(" your final score:%d\n",p.score);Sort();SaveFile();printf("任意键退出\n");scanf("%d",&n);}void RankSelect(){int choice;do{system("CLS");Menu2();printf("Please input your choice:");scanf("%d",&choice);switch(choice){case 1:p.Rank=4;break;case 2:p.Rank=6;break;case 0:break;}}while(choice>3);}void Start(){int choice;int i;if(ReadFile()==0){CreateFile();i=ReadFile();}do{system("CLS");Menu();printf("Please input your choice:");scanf("%d",&choice);switch(choice){case 1:RunningGame();break;case 2:RankSelect();break;case 3:Record();break;case 0:break;}}while(choice);}void CreateFile(){FILE *file;file=fopen("./record.txt","wb");if(!file){printf("cannot create!\n");exit(1);}fclose(file);}int ReadFile(){FILE *file;int i=0,j=0,last=0;player pl;file=fopen("./record.txt","rb");if(!file){return 0;}while(fread(&py[i],sizeof(py[i]),1,file)==1) i++;for(;i<record;i++){py[i].Rank=4;py[i].score=0;py[i].time=0;}for(i=0;i<record-1;i++){for(j=0;j<record-i;j++){if(py[j].score<py[j+1].score){pl=py[j+1];py[j+1]=py[j];py[j]=pl;last=1;}}if(last==0)break;last=0;}fclose(file);return 1;}void SaveFile(){FILE *file;int i=record-1;file=fopen("./record.txt","wb");if(!file){printf("cannot open!\n");exit(1);}while(i>=0){fwrite(&py[i],sizeof(py[i]),1,file);i--;}fclose(file);}void GameOver(){Free(p.Rank);}void PlayGame(){Start();GameOver();}int main(){PlayGame();return 0;}。