




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
连连看游戏一、课程设计题目 基于C#的连连看设计2、 需求分析生活在节奏越来越快的城市里,适量的游戏可以为我们舒缓疲劳,带来愉悦的心情。不管你走到哪个游戏网站,连连看游戏总在排名的前5,休闲、趣味、益智是连连看玩不厌的精华,是一款适合大众的经典网络休闲小游戏。在讨论后我们小组最后选定做连连看这个小游戏。本系统是一款简单的单机版游戏,只要将相同花色的两张牌用三根以内的直线连在一起就可以消除,当游戏中已没有满足条件的图案时,点击重列可重新排序,规则简单容易上手。游戏速度节奏快,画面清晰可爱,老少皆宜,因此越来越受大众的欢迎。游戏规则如下:(1) 概要:玩家可以将2个相同图案的牌连接起来,连接线不多于3根直线,就可以成功将两个牌消除。(2) 操作:第一次使用鼠标点击游戏界面中的牌,该牌此时为“被选中”,以特殊方式显示;再次以鼠标点击其他牌,若该牌与被选中的牌图案相同,且把第一个牌到第二个牌连接起来,中间的直线不超过3根,则消除这一对牌,否则第一个牌回复成未被选中状态,而第二个牌变成被选中状态。(3) 胜利条件:将游戏界面上的牌全部消除掉。(4) 失败条件:到规定时间,界面上的牌仍未全部消掉。3、 概要设计1. 方案选择 在概要设计阶段,有两种方案可供选择:第一种方案是所有出现的图像的种类数和重复次数都是软件约定的,这样就在无意中降低了玩家在游戏过程中乐趣,最后致使玩家不想继续玩下去。我们参考了网络上的连连看游戏,考虑到游戏的娱乐性。所以参考网络上流行的连连看游戏,设计出第二种方案。 第二种方案:在同一区域中,图片出现的种类数和重复次数是可以由玩家选择的,时间由软件约定。不过玩家选择的种类数和重复次数必须是偶数才可以顺利完成游戏,否则游戏虽然可以正常运行,但无法完成游戏。 2. 系统设计针对上面的需求分析,我们把整个软件分成两个模块:1、整体界面的设计和图片的随机生成;2、图片路径判断函数; 以下就是系统结构图:连连看 图片路径判断函数界面设计和图片的随机生成模块模块连连看系统结构图3.基本思路3.1游戏画面问题的思路 画面,对于设计者来说,可以算是最简单的地方;但对于玩家,这却是最重要的,一般玩家不会关心你是怎么实现的,他所关心的是画面的美观,漂亮,是否能让人赏心悦目。3.2获取图片位置的思路 通过数组从图片库随即获取规定个数得到图片,随机分布在画布上。图片个数一定是偶数个。 3.3路径判断的思路 连连看所要求的是:1:两个目标是相同的 2:两个目标之间连接线的折点不超过两个。(连接线由x轴和y轴的平行线组成) 那么分析一下连接的情况可以看到,一般分三种情况1:直线相连 2:一个折点 3:两个折点:可以发现,如果有折点,每个折点必定有且至少有一个坐标(x或者y)是和其中一个目标点是相同的,也就是说,折点必定在两个目标点所在的x方向或y方向的直线上。所以设计思路就是:假设目标点 p1 , p2 ,如果有两个折点分别为z1 , z2 那么,所要进行的是 1:如果验证p1 , p2 直线连线,则连接成立 2:搜索以p1,p2的x,y方向四条直线(可能某两条直线会重合)上的有限点,每次取两点作为z1,z2 ,验证p1到z1/z1到z2/z2到p2 是否都能直线相连 ,是则连接成立。4、 详细设计4.1主界面的设计 由于这个程序的界面并不是很复杂,所以用到的控件也不多,主要核心内容还是后台的代码设计。图片的随机生成主要是用到一个random()函数将随机数赋值给flag数组中的每个元素,然后根据数组元素值,来显示图片。4.1.1 界面的设计 程序主体界面1、色彩上:总结人们的视觉习惯和色彩对眼睛的健康影响,决定对于画布采用黑色背景,神秘而大方;右边的控制区采用天蓝色,配合左边纯黑的背景,就像黑夜中的蓝天,纯洁而大气。2、功能上:背景就是窗体,右侧是一个groupbox控件,用来放置控制按钮,下方是一个progressbar控件,用来显示时间条。4.2图片的随机生成 实现这个功能要分很多个步骤: 1、程序运行时即载入游戏需要的N张图片,默认情况下图片种类数是18,重复数是4(重复数必须是偶数),并且可以选择是否重列。通过一个循环,加载随即的选择N种图片。具体载入图片的代码如下: private void IniteBmp(int maxnum) g_g = this.CreateGraphics(); for (int i = 0; i MAPWIDTH; i+) for (int j = 0; j MAPHEIGHT; j+) gmapi, j = 0; IniteRandomMap(ref gmap, maxnum); AI = new Kernal(ref gmap); for (int i = 0; i maxnum; i+) ResourceManager rm = new ResourceManager(LLK.data, Assembly.GetExecutingAssembly(); imgi= (Image)rm.GetObject(i.ToString()+.bmp); /imgi = (Image)Bitmap.FromFile(Images+(i+1).ToString()+.bmp); for (int i = 0; i 6; i+) /bombimgi = (Image)Bitmap.FromFile(ImagesB+(i+1).ToString()+.bmp); 2、当确认游戏开始时,通过画图过程完成图片生成,画图的过程代码如下 :private bool CheckWin(ref int, map) bool Win = true; for (int i = 0; i MAPWIDTH; i+) for (int j = 0; j 0) for (int i = 0; i multipic; i+) int xrandom = r.Next(19) ; int yrandom = r.Next(11) ; if (mapxrandom, yrandom = 0) mapxrandom, yrandom = num; Else i-; num-; private void FreshMap(ref int, map) Random r = new Random(); for(int i=0;iMAPWIDTH;i+) for (int j = 0; j MAPHEIGHT; j+) if (gmapi, j != 0) int x = r.Next(19); int y = r.Next(11); int temp = gmapx, y; gmapx, y = gmapi, j; gmapi, j = temp; TransportMap(ref gmap); private void TransportMap(ref int, map) for(int i=0;iMAPWIDTH;i+) for (int j = 0; j MAPHEIGHT; j+) AI.GiveMapValue(i, j, mapi, j); /在指定位置画指定图 private void Draw(Graphics g, Image scrImg, int PicX,int PicY) g.DrawImage(scrImg, new Point(PicX, PicY); private void Form1_Paint(object sender, PaintEventArgs e) g_g.DrawLine(new Pen(new SolidBrush(Color.DeepSkyBlue), 5), 0, 11 * 34 + 5, 19 * 34, 11 * 34 + 5); if (bStart) for (int i = 0; i MAPWIDTH; i+) for (int j = 0; j 209) MessageBox.Show(游戏区域内最多只有209个空,您选的数据太多,请重新选择!); textBox1.Text = 18; textBox2.Text = 4; return; IniteBmp(picnum); if (bStart) MessageBox.Show(游戏已在运行); return; else bStart = true; this.Invalidate(); music.Play(Soundsbg-03.mid); 重列实现代码如下: private void RefreshMap(ref int, map) if (bStart) for (int i = 0; i MAPWIDTH; i+) for (int j = 0; j MAPHEIGHT; j+) if (gmapi, j != 0) Draw(g_g, imggmapi, j - 1, i * PICWIDTH, j * PICHEIGHT); private void button2_Click(object sender, EventArgs e) refreshplayer.Play(); /Thread.Sleep(100); /bombplayer.Play(); FreshMap(ref gmap); this.Invalidate(); 4.4得分设置本游戏,我们小组讨论后决定采用全新计分方式,对于不同的路径会得到不同的分数,使人们在寻找相同图片的同时还要注意路径的选择,更增加了游戏的趣味性,具体规则:直连得10分,一个拐点得20,两个拐点得40。用一个Label控件存储得分。实现代码: switch (corner2.X) case 1: score += 20;/一个拐点加20; g_g.DrawLine(pen, new Point(p1.X*31+15,p1.Y*34+17), new Point(corner0.X*31+15,corner0.Y*34+17); g_g.DrawLine(pen, new Point(p2.X * 31+15, p2.Y * 34+17), new Point(corner0.X * 31+15, corner0.Y * 34+17); Thread.Sleep(100); EraseBlock(g_g, p1, p2); g_g.DrawLine(bkpen, new Point(p1.X * 31 + 15, p1.Y * 34 + 17), new Point(corner0.X * 31 + 15, corner0.Y * 34 + 17); g_g.DrawLine(bkpen, new Point(p2.X * 31 + 15, p2.Y * 34 + 17), new Point(corner0.X * 31 + 15, corner0.Y * 34 + 17); break; case 2: score += 40;/两个拐点加40; Point ps = new Point(p1.X*31+15,p1.Y*34+17),new Point( corner1.X*31+15,corner1.Y*34+17),new Point(corner0.X*31+15,corner0.Y*34+17),new Point(p2.X*31+15,p2.Y*34+17); g_g.DrawLines(pen, ps); Thread.Sleep(100); EraseBlock(g_g, p1, p2); g_g.DrawLines(bkpen,ps); /foreach (Point mp in ps) / /MessageBox.Show(+mp.X.ToString()+,+mp.Y.ToString()+);/ break; case 0: score += 10;/直连加10 g_g.DrawLine(pen, new Point(p1.X * 31 + 15, p1.Y * 34 + 17), new Point(p2.X * 31 + 15, p2.Y * 34 + 17); Thread.Sleep(100); EraseBlock(g_g, p1, p2); g_g.DrawLine(bkpen, new Point(p1.X * 31 + 15, p1.Y * 34 + 17), new Point(p2.X * 31 + 15, p2.Y * 34 + 17); break; default: break; /RefreshMap(ref gmap); label5.Text = score.ToString();4.5过关设置把界面上全部图片都消去即为通过此关,进入下一关,种类数加1. private bool CheckWin(ref int, map) bool Win = true; for (int i = 0; i MAPWIDTH; i+) for (int j = 0; j 100) pbvalue = 100; if (pbvalue = 0&starttimer) starttimer = false; pbtimer.Stop(); MessageBox.Show(Failed!); return; else progressBar1.Value = pbvalue; 5.3图片是否可消除的判断 实现的思路前面已经说了,具体实现代码如下:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using System.Media;using System.Runtime.InteropServices;namespace LLKclass Kernal private const int M = 19; private const int N = 11; private const int BLANK = 0; private static int, map = new intM, N; Point arr1 = new Point209; int arr1Len, arr2Len; Point arr2 = new Point209; static Point corner = new Point2;/用来存储两个拐点 static int co = 0;/用来标识几个拐点 public Kernal(ref int, mmap) for (int i = 0; i M; i+) for (int j = 0; j N; j+) mapi, j = mmapi, j; corner0 = new Point(0, 0); corner1 = new Point(0, 0); public Point GetPoints() Point p = new Point3; p0 = corner0; p1 = corner1; p2 = new Point(co, 0); return p; public bool IsShare(ref Point a1, int a1Len, ref Point a2, int a2Len) bool result = false; for (int i = 0; i a1Len; i+) for (int j = 0; j y2 ? y1 : y2; int smaller = y1 y2 ? y2 : y1; int miny = smaller+ 1; while (mapx1, miny = BLANK) miny+; if (miny = N) break; if (miny = bigger) return true; else return false; if (y1 = y2) int bigger = x1 x2 ? x1 : x2; int smaller = x1 x2 ? x2 : x1; int minx = smaller + 1; while (mapminx, y1 = BLANK) minx+; if (minx = M) break; if (minx = bigger) return true; else return false; return false; public int FindEmpty(int x, int y, ref Point arr) int count = 0; int pos = x - 1; while (0 = pos & pos M & mappos, y = BLANK) arrcount.X = pos; arrcount.Y = y; pos-; count+; pos = x + 1; while (0 = pos & pos M & mappos, y = BLANK) arrcount.X = pos; arrcount.Y = y; pos+; count+; pos = y - 1; while (0 = pos & pos N & mapx, pos = BLANK) arrcount.X = x; arrcount.Y = pos; pos-; count+; pos = y + 1; while (0 = pos & pos N & mapx, pos = BLANK) arrcount.X = x; arrcount.Y = pos; pos+; count+; return count; public bool IndirectLink(int x1, int y1, int x2, int y2) int pos = 0; Point ar1 = new Point209; int ar1Len = 0; Point ar2 = new Point209; int ar2Len = 0; pos = y1 - 1; while (0 = pos & pos N & mapx1,pos = BLANK) ar1Len = FindEmpty(x1, pos, ref ar1); ar2Len = FindEmpty(x2, y2, ref ar2); if (IsShare(ref ar1, ar1Len, ref ar2, ar2Len) co = 2; corner1 = new Point(x1, pos); return true; pos-; pos = y1 + 1; while (0 = pos & pos N & mapx1,pos = BLANK) ar1Len = FindEmpty(x1, pos, ref ar1); ar2Len = FindEmpty(x2, y2, ref ar2); if (IsShare(ref ar1, ar1Len, ref ar2, ar2Len) co = 2; corner1 = new Point(x1, pos); return true; pos+; /如果两点是左右且非直连关系 pos = x1 - 1; while (0 = pos & pos M & mappos,y1 = BLANK) ar1Len = FindEmpty(pos, y1, ref ar1); ar2Len = FindEmpty(x2, y2, ref ar2); if (IsShare(ref ar1, ar1Len, ref ar2, ar2Len) co = 2; corner1 = new Point(pos, y1); return true; pos-; pos = x1 + 1; while (0 = pos & pos M & mappos,y1 = BLANK) ar1Len = FindEmpty(pos, y1, ref ar1); ar2Len = FindEmpty(x2, y2, ref ar2); if (IsShare(ref ar1, ar1Len, ref ar2, ar2Len) co = 2; corner1 = new
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年酒店管理招聘面试预测题与实战指南
- 桡骨头骨折课件
- 2025年公务员考试练习题考试练习题及答案指导
- 2025年融媒体舆情分析笔试高频考点解析集
- 桌球培训课程内容
- 2025年篮球规则试题及答案
- 2025年篮球明星试题及答案
- 2025年注册验船师资格考试(A级船舶检验专业案例分析)综合试题及答案二
- 桃红葡萄酒发酵工艺
- 2025年视觉设计岗位面试常见题
- 2023砌体结构后锚固技术规程
- 子宫内膜癌医师教学查房市公开课一等奖课件省赛课获奖课件
- 膝痹中医护理方案效果总结分析报告
- 铸造基础知识及常见铸造缺陷简介演示
- 中式烹调师(高级技师考试资料)
- 仓储技术与库存理论简论
- 日地空间灾害性天气的发生发展和预报研究课件
- 西安大唐不夜城的项目整体推广的策略提案的报告课件
- 可下载打印的公司章程
- 少先队辅导员工作记录表(共7页)
- 公开课教学评价表
评论
0/150
提交评论