连连看C++程序设计

合集下载

连连看c课程设计

连连看c课程设计

连连看 c课程设计。

一、课程目标知识目标:1. 学生能理解并掌握连连看游戏的基本规则和策略。

2. 学生能运用所学知识,分析并解决连连看游戏中遇到的问题。

3. 学生了解连连看游戏背后的数学原理,如排列组合、概率等。

技能目标:1. 学生能运用计算机操作,熟练玩转连连看游戏。

2. 学生通过连连看游戏,培养逻辑思维能力和问题解决能力。

3. 学生学会与他人合作,进行游戏策略的交流与分享。

情感态度价值观目标:1. 学生在游戏中培养积极的学习态度,主动探索和发现新知识。

2. 学生树立正确的竞争意识,学会尊重对手,敢于面对挑战。

3. 学生通过团队合作,培养集体荣誉感,增强团队协作能力。

本课程旨在通过连连看游戏,将学科知识与实际操作相结合,提高学生的逻辑思维能力、问题解决能力和团队合作能力。

针对学生的年级特点,课程设计注重知识性、趣味性和实践性,使学生学以致用,激发学习兴趣,培养良好的学习习惯和价值观。

二、教学内容1. 连连看游戏规则与策略:介绍连连看游戏的基本规则,分析游戏策略,如消除顺序、路径选择等。

- 教材章节:第三章第二节“游戏的规则与策略”2. 连连看游戏中的数学原理:讲解排列组合、概率等数学知识在连连看游戏中的应用。

- 教材章节:第四章第一节“排列组合与概率”3. 计算机操作与连连看游戏:教授如何使用计算机进行连连看游戏,包括游戏界面的认识、操作方法等。

- 教材章节:第二章第二节“计算机游戏操作基础”4. 逻辑思维与问题解决:通过连连看游戏,培养学生逻辑思维能力和问题解决能力。

- 教材章节:第五章第三节“逻辑思维与问题解决方法”5. 团队合作与交流分享:组织学生进行连连看游戏比赛,培养团队合作精神,并进行游戏策略的交流与分享。

- 教材章节:第六章第一节“团队合作与交流”教学内容按照教学大纲进行安排,共计5个课时。

第一、二课时讲解连连看游戏规则与策略,第三课时介绍数学原理在游戏中的应用,第四课时教授计算机操作,第五课时进行团队合作与交流分享。

(完整版)连连看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两点。

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

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语言课程设计连连看

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语言源代码#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);/* ----------------------函数实现----------------------------------- *//* ----------------------[ 核心算法]---------------------------------* 先进行水平方向判断,找出两点所在的水平直线活动范围,* 算出这两条线段在垂直方向的共同区域,* 遍历该区域判断能否在两线段间架起公垂线,能则两点连接上;* 接着进行垂直方向判断,类同。

连连看小游戏编程实现

连连看小游戏编程实现

连连看小游戏编程实现连连看是一种非常经典的益智游戏,通过连接相同图案的方块来消除它们,最终目标是将所有方块都消除完毕。

本文将介绍如何使用编程语言实现一个简单的连连看小游戏。

1. 游戏规则连连看游戏的规则非常简单,玩家需要找到两个相同图案的方块,且它们之间的连线不能超过两个弯角。

当玩家成功连接一对相同的方块时,这对方块将会消失,同时玩家获得一定的分数。

玩家需要尽可能快地消除所有方块,以获取更高的分数。

2. 游戏界面设计在编程实现连连看游戏时,我们需要设计一个美观且易于操作的游戏界面。

可以使用图形库来实现游戏界面的绘制,比如Python的Tkinter库或者C++的SFML库。

游戏界面需要包括以下几个组件:a. 方块区域:用于显示游戏的方块布局,可以使用矩阵形式表示,每个元素表示一个方块。

b. 分数显示区域:用于显示玩家当前的得分情况。

c. 时间显示区域:显示剩余的游戏时间。

d. 游戏操作按钮:如开始游戏按钮、重新开始按钮等。

3. 方块生成在游戏开始时,需要生成一定数量的方块,并将它们随机地分布在方块区域内。

可以使用随机数生成算法来实现方块的随机生成,同时需要保证每种方块的数量相等。

4. 连接算法玩家通过点击两个相邻且相同的方块来进行消除。

为了判断两个方块是否可以相连,我们需要实现一个连线算法。

一种简单的实现方法是使用深度优先搜索算法(DFS)来寻找两个方块之间的路径。

通过遍历方块区域,查找与当前选中方块相同的邻居方块,然后递归搜索相邻方块的邻居,直到找到目标方块或者无法继续搜索为止。

5. 方块消除当玩家成功连接一对相同的方块时,需要将它们从方块区域中移除,并更新玩家的得分。

可以使用图形库提供的绘制函数来实现方块的消除效果,比如渐渐消失或者爆炸效果等。

6. 游戏结束当所有方块都被消除或者游戏时间结束时,游戏结束。

此时可以显示玩家的最终得分,并提供重新开始或退出游戏的选项。

通过以上步骤,我们可以使用编程语言实现一个简单的连连看小游戏。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

源程序代码//main.cpp#include<iostream>using namespace std;#include <time.h>#include <windows.h>#include"class.h"void main(){GridInfor g;initgraph(M,N);mciSendString("play game_begin.mp3 repeat", NULL, 0, NULL);g.InitFace();while(1){mouse = GetMouseMsg();switch(mouse.uMsg){case WM_MOUSEMOVE:g.Mousemove(mouse.x,mouse.y); break;case WM_LBUTTONDOWN:if(Single_click_judge(mouse.x,mouse.y)){g.Leftbottondown(mouse);} break;default: break;}}closegraph();}void GridInfor::RandGrid() //产生图片的标记{for(int iCount = 0, x = 1; x <= ROW; ++x ){for( int y = 1; y <= COL; ++y ){::GridID[x][y] = iCount++ % GridNum + 1;} } }void GridInfor::Shuffle( ) //打乱棋盘int ix, iy, jx, jy, grid;for( int k = 0; k < 84; ++k ){ix = rand() % ROW + 1; // 产生1 - COL 的随机数iy = rand() % COL + 1; // 产生1 - ROW 的随机数jx = rand() % ROW + 1; // 产生1 - COL 的随机数jy = rand() % COL + 1; // 产生1 - ROW 的随机数if( ::GridID[ix][iy] != ::GridID[jx][jy] ) //如果不相等就交换数据{grid = ::GridID[ix][iy];::GridID[ix][iy] = ::GridID[jx][jy];::GridID[jx][jy] = grid;} } }////////////////////////////////初始化界面///////////////////////////////////////void GridInfor::InitFace(){srand((unsigned)time(NULL));a.Load_picture();a.RandGrid();IMAGE image3;loadimage(&image3,"res\\bg.bmp");putimage(0,0,&image3);getimage(&image2,3 * 42,2 * 48,42, 48);a.Shuffle();a.ShowGrid();}void GridInfor::Load_picture() //加载图片{IMAGE image1,background;loadimage(&image1,"IMAGE","grids");SetWorkingImage(&image1);for(int i = 1 ;i < GridNum + 1 ;i ++)for(int j = 0;j < 2;j++)getimage(&image[i][j],j * 42,i * 48,42, 48);loadimage(&background,"IMAGE","bg");SetWorkingImage(&background);getimage(&image2,3 * 42,2 * 48,42, 48);SetWorkingImage();putimage(0,0,&background);}void GridInfor::ShowGrid(){int idx,idy;for(int i = 0 ;i < ROW; i ++)for(int j = 0 ;j < COL ; j++){idy = i * 48 + topedge ,idx = j * 42 + leftedge;putimage(idx,idy,&image[::GridID[i + 1][j + 1]][0]);} }/////////////////////////////////鼠标操作////////////////////////////////////////void GridInfor::Mousemove (int leftx,int lefty) //鼠标移动时的变化{static int prex,prey,preidx,preidy, curidx,curidy;if(Judg_val(leftx,lefty)){TranstoDracoor(leftx,lefty,&curidx,&curidy); //转化为图纸坐标if(::GridID[curidy][curidx] != 0){GridPhy_coor(leftx,lefty);if(pre.idx == preidx && pre.idy == preidy)putimage(prex,prey,&image[::GridID[preidy][preidx]][1]);elseputimage(prex,prey,&image[::GridID[preidy][preidx]][0]);prex = leftx, prey = lefty;preidx = curidx, preidy = curidy;Draw_frame(leftx,lefty); //绘制边框} } }void GridInfor::Leftbottondown (MOUSEMSG mouse) //左击时的变化{static int click = 0, idx,idy;click++;SeleReact (mouse.x,mouse.y); //显示选中效果if(click == 1) RecordInfor(mouse.x,mouse.y,pre);if(click == 2){TranstoDracoor (mouse.x,mouse.y,&idx,&idy);if(idx != pre.idx || idy != pre.idy){RecordInfor (mouse.x,mouse.y,cur);if(pre.GridID == cur.GridID && DesGrid(pre,cur)){::GridID[pre.idy][pre.idx] = ::GridID[cur.idy][cur.idx] =0;Link (); pn = 0;putimage(pre.leftx,pre.lefty,&image2);putimage(cur.leftx,cur.lefty,&image2);Init_Grid(pre); Init_Grid(cur); click = 0;}else{ExchaVal(dur,pre); ExchaVal(pre,cur);Init_Grid(cur); click = 1;putimage(dur.leftx,dur.lefty,&image[::GridID[dur.idy][dur.idx]][0]);} }else click = 1;} }void SeleReact (int leftx,int lefty) //选中时效果{if(Judg_val(leftx,lefty)){int idx,idy;TranstoDracoor (leftx,lefty,&idx,&idy);GridPhy_coor (leftx,lefty);putimage(leftx,lefty,&image[GridID[idy][idx]][1]);} }bool Judg_val(int leftx,int lefty) //判断鼠标是否在游戏区{return leftx > leftedge && leftx < leftedge + GridW * COL &&lefty > topedge && lefty < topedge + GridH * ROW;}void TranstoDracoor (int mousex,int mousey ,int *idx,int *idy) //鼠标坐标转化为图纸坐标{if(Judg_val(mousex,mousey)){*idx = (mousex - leftedge) / 42 + 1;*idy = (mousey - topedge) / 48 + 1 ;} }void GridInfor::RecordInfor(int leftx,int lefty,GridInfor &grid) //记录选中的信息{TranstoDracoor(leftx,lefty,&grid.idx,&grid.idy);grid.leftx = (grid.idx - 1) * 42 + leftedge;grid.lefty = (grid.idy - 1) * 48 + topedge;grid.GridID = ::GridID[grid.idy][grid.idx];}bool Single_click_judge (int mousex,int mousey) //判断单击是否有效{int idx,idy;TranstoDracoor (mousex,mousey,&idx,&idy); //转化为图纸坐标if(Judg_val(mouse.x,mouse.y) && GridID[idy][idx] != 0)return true;return false;}void Draw_frame(int leftx,int lefty) //绘制方框{setcolor(RGB(126,91,68));setlinestyle(PS_SOLID);rectangle(leftx,lefty,leftx+41,lefty+47);rectangle(leftx + 2,lefty + 2,leftx+39,lefty+45);setcolor(RGB(250,230,169));rectangle(leftx + 1,lefty + 1,leftx+40,lefty+46);}////////////////////////////////判断消除操作/////////////////////////////////////bool GridInfor::DesGrid (GridInfor pre,GridInfor cur) //判断两者是否能相消{bool match = false; POINT ppre,pcur;ppre.x = pre.idx; ppre.y = pre.idy;pcur.x = cur.idx; pcur.y = cur.idy;if(Match_direct(ppre,pcur)) match = true;else if(Match_one_corner(ppre,pcur)) match = true;else if(Match_two_corner(ppre,pcur)) match =true;return match;}bool Match_direct(POINT ppre,POINT pcur) //判断两者是否能够直接相消{int k,t;if(ppre.x == pcur.x){k = ppre.y > pcur.y ? ppre.y : pcur.y;t = ppre.y < pcur.y ? ppre.y : pcur.y;if(t + 1 == k) goto FIND;for(int i = t + 1;i < k ;i++)if(GridID[i][ppre.x] != 0) return false;if(i == k) goto FIND;}elseif(ppre.y == pcur.y){k = ppre.x > pcur.x ? ppre.x : pcur.x;t = ppre.x < pcur.x ? ppre.x : pcur.x;if(t + 1 == k) goto FIND;for(int i = t + 1;i < k ;i++)if(GridID[ppre.y][i] != 0) return false;if(i == k) goto FIND;}return false;FIND: point[pn].x = pcur.x, point[pn].y = pcur.y; pn++;point[pn].x = ppre.x, point[pn].y = ppre.y; pn++;return true;}bool Match_one_corner(POINT ppre,POINT pcur) //判断两者是否能一折相消{int left,right,top,bottel,x = ppre.x,y = ppre.y;Explot(ppre,&left,&right,&top,&bottel);ppre.y = top - 1;RESEARCHX: if(ppre.y < bottel) ppre.y++;else goto BACK;if(Match_direct(ppre,pcur)) goto FIND;else goto RESEARCHX;BACK: ppre.y = y; ppre.x = left - 1;RESEARCHY: if(ppre.x < right) ppre.x++;else goto REBACK;if(Match_direct(ppre,pcur)) goto FIND;else goto RESEARCHY;REBACK: pn = 0; return false;FIND: point[pn].x = x,point[pn].y = y,pn++;return true;}bool Match_two_corner(POINT ppre,POINT pcur) //判断两者是否能两折相消{int left,right,top,bottel,x = ppre.x,y = ppre.y;Explot(ppre,&left,&right,&top,&bottel);ppre.y = top - 1;RESEARCHX: if(ppre.y < bottel) ppre.y++;else goto BACK;if(Match_one_corner(ppre,pcur)) goto FIND;else goto RESEARCHX;BACK: ppre.y = y; ppre.x = left - 1;RESEARCHY: if(ppre.x < right) ppre.x++;else goto REBACK;if(Match_one_corner(ppre,pcur)) goto FIND;else goto RESEARCHY;REBACK: pn = 0;return false;FIND: point[pn].x = x,point[pn].y = y,pn++;return true;}void Explot(POINT point,int *left,int *right,int *top,int *bottel){int x = point.x,y = point.y; x++;while(x <= COL + 1 && GridID[y][x] == 0) x++; *right = x - 1; x = point.x; x--;while(x >= 0 && GridID[y][x] == 0) x--; *left = x + 1; x = point.x; y++;while(y <= ROW + 1 && GridID[y][x] == 0) y++; *bottel= y - 1; y = point.y; y--;while(y >= 0 && GridID[y][x] == 0) y--; *top = y + 1;}/////////////////////////////////消除操作////////////////////////////////////////void GridInfor::Link (){switch(pn){case 2:a.Des_direct(); break;case 3:a.Des_one_corner(); break;case 4:a.Des_two_corner(); break;default : break;} }void GridInfor::Des_direct (){TranstoPhycoor(&point[0].x,&point[0].y);TranstoPhycoor(&point[1].x,&point[1].y);DrawLine(point[0].x,point[0].y,point[1].x,point[1].y);Sleep(250);iPaint(point[0].x,point[0].y,point[1].x,point[1].y);}void GridInfor::Des_one_corner(){TranstoPhycoor(&point[0].x,&point[0].y);TranstoPhycoor(&point[1].x,&point[1].y);TranstoPhycoor(&point[2].x,&point[2].y);DrawLine(point[0].x,point[0].y,point[1].x,point[1].y);DrawLine(point[1].x,point[1].y,point[2].x,point[2].y);Sleep(250);iPaint(point[0].x,point[0].y,point[1].x,point[1].y);iPaint(point[1].x,point[1].y,point[2].x,point[2].y);}void GridInfor::Des_two_corner(){TranstoPhycoor(&point[0].x,&point[0].y);TranstoPhycoor(&point[1].x,&point[1].y);TranstoPhycoor(&point[2].x,&point[2].y);TranstoPhycoor(&point[3].x,&point[3].y);DrawLine(point[0].x,point[0].y,point[1].x,point[1].y);DrawLine(point[1].x,point[1].y,point[2].x,point[2].y);DrawLine(point[2].x,point[2].y,point[3].x,point[3].y);Sleep(250);iPaint(point[0].x,point[0].y,point[1].x,point[1].y);iPaint(point[1].x,point[1].y,point[2].x,point[2].y);iPaint(point[2].x,point[2].y,point[3].x,point[3].y);}void DrawLine (int x1,int y1,int x2,int y2){setlinestyle(PS_SOLID);setcolor(RGB(90,43,9));line(x1 + 21,y1 + 24,x2 + 21,y2 + 24);}void iPaint (long x1,long y1,long x2,long y2){int minx,miny,maxx,maxy;if(x1 == x2){maxy = y1 > y2? y1:y2;miny = y1 < y2? y1:y2;for(int i = miny; i <= maxy;i += 48)putimage(x1,i,&image2);}else if(y1 == y2){maxx = x1 > x2? x1:x2;minx = x1 < x2? x1:x2;for(int j = minx; j <= maxx;j += 42 )putimage(j,y1,&image2);} }/////////////////////////////////////////////////////////////////////////////////void GridPhy_coor(int& leftx,int& lefty) //转化为标准物理坐标{leftx = ((leftx - leftedge) / 42) * 42 + leftedge;lefty = ((lefty - topedge) / 48) * 48 + topedge;}void GridInfor::ExchaVal(GridInfor& pre,GridInfor& cur) //交换格子信息{pre.GridID = cur.GridID;pre.idx = cur.idx;pre.idy = cur.idy;pre.leftx = cur.leftx;pre.lefty = cur.lefty;}void GridInfor::Init_Grid(GridInfor& grid) //初始化格子{grid.GridID = 0;grid.idx = 0; grid.idy = 0;grid.leftx = 0; grid.lefty = 0;}void TranstoPhycoor (int* idx,int* idy) //图纸坐标转变为屏幕坐标{int x ,y;x =*idx,y = *idy;*idy = (y - 1) * 48 + leftedge;*idx = (x - 1) * 42 + topedge;}///////////////////////////////////end////////////////////////////////////////////class.h#include <graphics.h>#include <conio.h>#include <time.h>#include <iostream>using namespace std;#include <windows.h>#pragma comment(lib,"winmm.lib")//150 150 12 7 21 易//60 100 16 9 32 中//100 120 14 8 28 难#define leftedge 150 //游戏区距左边框距离#define topedge 150 //游戏区距上边框距离#define COL 12 //游戏区列数#define ROW 7 //游戏区行数#define GridNum 21 //游戏图片数目#define GridW 42 //游戏图片的长#define GridH 48 //游戏图片的宽#define N 555 //开屏大小(宽)#define M 785 //开屏大小(长)IMAGE image[GridNum + 1][2]; //图片库IMAGE image2; //填充图片int GridID[ROW + 2][COL + 2]; //游戏图纸MOUSEMSG mouse; //记录鼠标信息class GridInfor //记入击中图片信息{public:void InitFace (); //初始化界面void Shuffle (); //随即打乱图片void ShowGrid (); //显示图片void RandGrid (); //绘制地图void Link (); //连接两图void Des_direct (); //直接相消void Des_one_corner(); //一折相消void Des_two_corner(); //两折相消void Load_picture (); //加载图片void Mousemove(int,int);void Leftbottondown (MOUSEMSG mouse); //实现鼠标左击效果void RecordInfor(int,int,GridInfor &grid); //记录选中的信息bool DesGrid (GridInfor,GridInfor); //判断两者是否能相消void ExchaV al(GridInfor& pre,GridInfor& cur); //交换图片信息void Init_Grid(GridInfor& grid) ; //初始化格子信息private:int idx,idy; //图纸坐标int leftx,lefty; //屏幕坐标int GridID; //图片类型}pre,cur,dur;GridInfor a;class //记录连线点{public:int x;int y;}point[4];static int pn; //记录连线点个数void Draw_frame (int leftx,int lefty); //绘制边框bool Judg_val (int leftx,int lefty); //判断鼠标是否在游戏区void SeleReact (int leftx,int lefty); //显示选中效果void TranstoPhycoor (int* idx,int* idy); //图纸坐标转变为屏幕坐标void GridPhy_coor (int& leftx,int& lefty); //规范物理坐标void iPaint (long x1,long y1,long x2,long y2); //将直线销毁void DrawLine (int x1,int y1,int x2,int y2) ; //用直线连接两图bool Match_direct (POINT ppre,POINT pcur); //判断两者是否能够直接相消bool Match_one_corner (POINT ppre,POINT pcur); //判断两者是否能一折相消bool Match_two_corner (POINT ppre,POINT pcur); //判断两者是否能两折相消bool Single_click_judge (int mousex,int mousey); //判断单击是否有效void TranstoDracoor (int mousex,int mousey,int *idx,int *idy); //鼠标坐标转化为图纸坐标void Explot (POINT point,int *left,int *right,int *top,int *bottel);//探索point点附近的空位置//Resourse.h//{{NO_DEPENDENCIES}}// Microsoft Developer Studio generated include file.// Used by test.rc//#define LLK 103// Next default values for new objects//#ifdef APSTUDIO_INVOKED#ifndef APSTUDIO_READONLY_SYMBOLS#define _APS_NEXT_RESOURCE_V ALUE 104#define _APS_NEXT_COMMAND_V ALUE 40001 #define _APS_NEXT_CONTROL_V ALUE 1000 #define _APS_NEXT_SYMED_V ALUE 101#endif#endif。

相关文档
最新文档