




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、青岛理工大学琴岛学院设计报告课题名称:基于C#的五子棋游戏开发学 院:计算机工程系 专业班级:计科(专升本) 14-21学 号: 20140371006学 生:指导教师:青岛理工大学琴岛学院教务处2015 年 12 月 18 日学生指导教师课题名称基于C#的五子棋游戏开发设计时间2015.11.23-2015.12.18设计地点动漫1设计目的课程设计的目的就是培养学生的理论联系实际的能力。通过课程设计,使得学生能够加深对讲授内容的理解、累积经验、学会独立上机调试程序; 并且逐步达到综合运用网页相关知识, 真正掌握.NET技术的精华,从而达到 熟练应用程序设计语言的目的。也为将来做较大的系统打下
2、坚实基础。通过本次课程设计,应该达到以下教学任务:巩固所学知识,培养学生的上机实践能力以及独立调试程序的能力,更 主要的是使学生了解做项目的大体流程。每一个小组制定一题,项目成员要在项目经理的带领下,完成项目的所有内容。重点掌握ASP.NET网站设计开发流程,界面要友好,功能齐全,完成一 个综合项目。指导教师评语系部教研室意见2一、需求分析1. 选题:通过学习window窗体应用程序的开发与实现,对 C卿序开发逐渐产生了浓厚的兴趣 心中有了设计游戏的想法,通过学习和查资料慢慢对游戏制作有了一定的了解,后来通过深 入学习,对五子棋游戏设计有了进一步了解,慢慢理清了其中的开发过程与原理,最终确定
3、了基于C新子棋游戏的设计与实现项目。2. 界面:(1)通过上网学习,对游戏界面风格有了一定的认知,于是决定走界面美观风。手游中 的主界面给人一种简单明了的感觉,通常有模式关卡,让玩家越玩越带感,于是决定模仿它 们,游戏主界面有四个模式,玩家可以选择不同模式进行对弈。如图1所示:图1主界面(2)游戏模式一,双人对战模式。界面右侧有悔棋、返回、排行榜、关于、重新开始等功能按钮,点击各按钮,执行各功能。如图 2所示:图2模式一界面(3)游戏模式二,人机对战模式。游戏界面中左部是棋盘,悔棋、返回、排行榜、 关于、重新开始等功能按钮,此模式实现了人和电脑的交互。如图3所示:悔棋按钮重新开始按钮返回按钮排
4、行榜按钮关于按钮图3.模式二界面(4)游戏模式三,让子挑战模式。游戏界面中左部是棋盘,右部有悔棋、返回、排行榜、 关于、重新开始功能选项按钮。和模式二不同的地方是让子,开局后棋盘中布好了让给电脑 的白子。正所谓有人的地方就会有争斗,游戏中有菜鸟就会有高手。高手喜欢挑战,于是挑战模式应运而生。此模式的界面和模式二界面相同,在此不再重画。(5)游戏模式四,收拾残局模式。游戏界面中左部是棋盘,右部有摆棋、对战、悔棋、 返回、再来一局功能选项按钮。和模式二不同的地方是开局,开局后玩家需先摆放棋子,然 后点击对战按钮开始游戏。此模式界面设计参造模式二,不再重画。3. 功能划分:通过对五子棋游戏的分析与了
5、解,可知其基本功能有开始、保存、打开、悔棋、认输、 和棋、返回、退出及聊天等功能。在这里,由于条件时间有限,仅实现悔棋、返回、重新开 始及模式选择等功能。(1)模式选择功能:在打开游戏后,出现在玩家面前的是模式选择窗口,即主窗口。玩 家可通过点击相应按钮进入相应模式进行对弈。此功能参照手游及单机小游戏主界面简约美 观的特性制作的,多模式的增加符合广大玩家的喜好。(2)悔棋功能:在每个模式中都有悔棋功能,在模式一中每次悔棋退后一子,模式二到 模式四每次悔棋退后两子,棋盘开局后就有的让子的棋子悔棋无效。人无完人,谁能不犯错, 根据玩家的棋艺高低程度难以把握,为了让玩家不至于因电脑太强对开发者产生怨
6、言,从而 有了悔棋功能,进而对五子棋菜鸟起引导作用,使其怀着开心的心情与保持兴趣走向棋圣之 路。对于高手而言,棋品也是要有的,悔棋功能形同虚设而已。(3)从新开始功能:此功能是菜鸟提升棋艺的首选功能,当玩家进行游戏到中途时,因 棋势不明,或要败时,不能接受这一现状,导致心情低落,怎么办?只需轻轻一点,一切回 归起点,也就是初始化而已。(4)返回功能:此功能的作用是退出当前模式, 回到游戏主窗口, 也就是模式选择窗口。 方便玩家在各个模式自由出入,尽情的展现自己的风采。(5)人机对弈电脑下棋功能:在模式二到模式四中,玩家的对手都是电脑,电脑棋力取 决于开发者,在某中意义上来说,玩家在和开发者对弈
7、也是正确的。此功能是程序按照一定 的算法循环扫描,算出己方和敌方最佳落子点,再判断出攻守,选出最终的落子点,落子后 等待玩家落子。( 6)让子功能:在模式三中,为了增加游戏难度,对棋艺大成者量身打造了让子功能。 开局后,一般都是黑棋先行,在这里玩家执黑,让电脑 1 子,棋盘上变成了电脑执白先行 1 子,白棋落在天元位置上,难度一般。玩家赢后,挑战难度 +1,玩家让电脑 2 子,棋盘上电 脑执白先行 2 子,白棋落在天元位置左右两侧,难度适中,适合一段棋手挑战。玩家赢两局 后,挑战难度 +1 ,玩家让电脑 3 子,棋盘上电脑执白先行 3 子,考录到一般玩家没有如此高 深棋力,因此白棋分散落在棋盘
8、交叉线上,难度相对适中,适合一段及以上棋手挑战。让 4 子和 5 子也是一样的原理,难度较高,适合二段及以上棋手挑战。对战后,会在棋盘中部上 方显示让子数目,为迎合玩家的虚荣心理而设计。(7)判断胜负功能:在每个模式中都需要对对局进行胜负判断,进而产生了胜负判断功 能。其功能原理是对玩家或电脑下的棋子进行循环扫描,对各个方向扫描黑白子双方是否形 成五子连珠,根据形成五子连珠方判断胜负,根据判断弹出对应的胜负提示框。再根据所属 模式对胜负后的对局进行参数修改,如:模式一和模式二,不论胜负只需对其进行初始化; 模式三,玩家胜出,让子加一,难度增加,需对其让子参数进行修改,反之则不进行任何处 理操作
9、;模式四,玩家胜出,对局胜出参数加一,呼应必胜模式的让子布局功能,玩家失败 则不进行参数修改操作等。(8)初始化界面功能:在每个模式中都需对窗口界面进行初始化,考录到原有界面运行 后的效果略显呆板,为增加美观性,需要对各窗口进行导入图片处理,美化界面。根据对局 情形,在棋盘中部上方显示提示文字,并在棋盘上显示存在的棋子,对各参数进行初始化处 理。4. 自定义类描述、各类方法描述及添加的命令响应。如表1所示:表1用到的类类名描述说明Form3模式一游戏窗口类,该类主要对该模式下的窗口初始化并对鼠标等事 件消息进行处理,实现悔棋功能、返回功能、排行榜功能、关于功能、 重新开始功能等。Form4模式
10、二游戏窗口类,该类主要对该模式下的窗口进行初始化并对鼠标 等事件消息进行处理,实现人机对弈功能、悔棋功能、返回功能、排 行榜功能、关于功能、重新开始功能、提示胜败功能等。Form5模式三游戏窗口类,该类主要对该模式下的窗口进行初始化并对鼠标 等事件消息进行处理,实现让子功能、人机对弈功能、悔棋功能、返 回功能、排行榜功能、关于功能、重新开始功能、提示胜败功能等。Form6模式四游戏窗口类,该类主要对该模式下的窗口进行初始化并对鼠标 等事件消息进行处理,实现摆棋功能、人机对弈功能、悔棋功能、返 回功能、排行榜功能、关于功能、重新开始功能、提示胜败功能等。二、总体设计1. 游戏功能概述打开程序,游
11、戏开始运行,登录进入模式窗口,选择游戏模式窗口弹出,窗口中有四个 模式选择按钮,点击按钮,分别弹出对应的模式一、二、三、四窗口,完成具体模式的跳转。对于模式一,玩家点击鼠标进行下棋操作,判断点击点在棋盘内且无子时,在点击点画 出棋子;如果点击点在棋盘外或有子时,则不处理,返回等待鼠标命令。然后判断是否存在 五子连珠,如果不存在五子连珠,则返回等待鼠标命令;如果存在五子连珠,则进行判断胜 负并提示胜负信息,再调用 On Start ()函数初始化模式一窗口,重新开始游戏。玩家点击悔棋按钮,调用悔棋功能函数 OnHuiqi(),在窗口中重画棋盘,去掉最后下的一 个棋子,把悔棋后存在的棋子重新画在棋
12、盘上。玩家点击重新开始按钮,程序调用 On Start ()函数,初始化模式一窗口,重新开始游戏。对于模式二、三、四,玩家点击鼠标进行下棋操作,首先调用MouseMove函数。此函数的作用是判断点击点在棋盘内且无子时, 在点击点画出棋子,如果点击点在棋盘外或有子时, 则不处理,返回等待鼠标命令。然后调用 gameOver()函数判断是否存在五子连珠,如果存在14五子连珠,则进行判断胜负并提示胜负信息,再调用On Start()函数初始化这一模式窗口,重新开始游戏;如果不存在五子连珠,则调用AiGo()函数,进行电脑扫描最佳落子点完成电脑下棋操作。再调用Over()函数判断是否存在五子连珠,如果
13、不存在五子连珠,则返回等待鼠 标命令;如果存在五子连珠,则进行胜负判断并提示胜负信息,再调用On Start()函数初始化这一模式窗口,重新开始游戏。玩家点击悔棋按钮,程序调用悔棋功能函数OnHuiqi(),在窗口中重画棋盘,去掉最后下的两个棋子,把悔棋后存在的棋子重新画在棋盘上。玩家点击重新开始按钮,程序调用OnStart()函数,初始化模式一窗口,重新开始游戏。1.绘制游戏进程图,如图4所示:开 始模式选择窗口模式四选择按钮模式二选择按钮模式三选择按钮K 7模式一窗口模式二窗口模式三窗口模式四窗口LU 模式一选择按钮退出排行榜悔棋等待鼠标命令等待鼠标命令鼠标点击弹起关于从新开始鼠标点击弹起
14、判断点击点在棋盘内且无子在点击点画出棋子判断点击点在棋盘内且无子判断是否存在五子连珠在点击点画出棋子弹出胜负提示框判断是否存在五子连珠*电脑扫描最佳落子点弹出胜负提示框判断是否存在五子连珠图4流程图三、详细设计与实现1.悔棋功能的实现:为悔棋按钮添加类向导,再添加 int 变量 bushu、qi400 、wzq1919 ,用于记录先后下 棋的具体坐标,以便于悔棋功能的实现。bushu用于记录下棋的落子数,qi400用于记录棋子 的具体坐标, wzq1919 用于记录棋盘上各点存在棋子的黑白及有无情况。悔棋功能的实现 原理是重新画出棋盘及悔棋后存在棋子。先判断是否刚刚开局,bushu不为0,就执
15、行悔棋命令,把最后落下的第 bushu 个棋子的信息初始化,再画出棋盘,重画悔棋后存在的棋子。模 式一与模式二、三、四的悔棋不同之处在于悔棋棋子数。具体代码如下:private void OnHuiqi()if(bushu0&star=true)if(colorwhite)colorwhite=false;elseb = new SolidBrush(Color.White);g.FillEllipse(b, 20 * i + 20, 20 * j + 30, 20, 20);b.Dispose();g.Dispose();else if (wzqi, j = -1)Graphics g =
16、this.pictureBox1.CreateGraphics();Brush b;b = new SolidBrush(Color.Black);g.FillEllipse(b, 20*i+20, 20*j+30, 20, 20);b.Dispose();g.Dispose();悔棋功能的具体实现过程是先判断是否刚开局,有无可悔棋的棋子,如果有,就在窗口 中重新画出棋盘,根据模式不同将最后落下的 1 个或 2 个棋子的信息初始化,再重新把悔棋 后存在的棋子画在棋盘上。2. 鼠标点击落子功能的实现:添加鼠标事件处理函数MouseDown(),先获取点击点位置坐标,再判断出点击点是否在 棋盘内且
17、无子,当点击点可落子时,就在棋盘上画出棋子,让wzq1919记录该点棋子信息, 把该手棋的具体坐标交给 qibushu ,用于悔棋操作,后检查游戏是否形成五子连珠,完成本 次落子任务。具体代码如下:private void pictureBox1_MouseDown(object sender, MouseEventArgs e)int x, y;x =(e.X - 20) / 20;y =(e.Y - 30) / 20;if(star=true&x=0&x=0&y19)if (wzqx, y = 0)Graphics g = this.pictureBox1.CreateGraphics()
18、;Brush b;bushu+;if (colorwhite)b = new SolidBrush(Color.White);wzqx, y = 1;colorwhite = false;elseb = new SolidBrush(Color.Black);wzqx, y = -1;colorwhite = true;g.FillEllipse(b, 20*x+20, 20*y+30, 20, 20);b.Dispose();g.Dispose();gameOver(x, y);qibushu = x * 100 + y;鼠标点击落子功能的运行过程是,获取点击点坐标并进行提取处理,方便棋子画
19、在交叉 线上判断点击点是否在棋盘内,如果在棋盘内。再判断点击点是否有棋子,如果没有,就根 据上一手棋的颜色在点击点画上相反颜色的棋子。调用gameOver(x, y)方法,判断是否形成五 子连珠,把落子点记录到qibushu数组中。3. 检查游戏是否形成五子连珠,判断游戏是否结束功能:新建gameOver()函数,进行循环扫描横竖撇捺四方向上有无黑子或白子形成五子连珠棋 形,判断游戏是否结束,是否弹出胜负提示框。具体代码如下:private void gameOver(int x,int y)int xx, yy; if (x 4)xx = 0;elsexx = x - 4; if (y 4)
20、yy = 0;elseyy = y - 4;int i, j, a;for (i = xx; i 15; i+) a = 0;for (j = i; j i + 5; j+)a = a + wzqj,y; if (a = 5) MessageBox.Show(白棋胜!); star = false;return; if (a = -5) MessageBox.Show(嘿棋胜!); star = false;return; 先获取下棋点的坐标并转化为棋盘上对应的棋子坐标,判断棋子在棋盘上的位子是否在棋盘边缘。如果是,就从棋盘(0,0)位置开始向后扫描;不是,则从点击点棋子坐标向左上方移动四个交
21、叉位,开始向后扫描。进行循环扫描横竖撇捺四方向上有无嘿子或白子形成五子 连珠棋形,进而判断游戏是否结束,根据情况决定是否弹出胜负提示框。4. 让子功能实现: 在模式三中,为了增加游戏难度,开发者首创让子功能。开局后,先进行让子布局。一 般都是嘿棋先行,在这里玩家执嘿,让电脑 1 子,棋盘上变成了电脑执白先行 1 子,白棋落 在天元位置上,难度一般。玩家赢后,挑战难度 +1,玩家让电脑 2 子,棋盘上电脑执白先行 2 子,白棋落在天元位置左右两侧,难度适中,适合一段棋手挑战。玩家赢两局后,挑战难度 +1,玩家让电脑 3 子,棋盘上电脑执白先行 3 子,考录到一般玩家没有如此高深棋力,因此 白棋分
22、散落在棋盘交叉线上,难度相对适中,适合一段及以上棋手挑战。让 4 子和 5 子也是 一样的原理,难度较高,适合二段及以上棋手挑战。具体代码如下:private void pictureBox1_MouseMove(object sender, MouseEventArgs e)if (jushu = 1 & wzq9, 9 = 0&star = true) Graphics g = this.pictureBox1.CreateGraphics();Brush b;b = new SolidBrush(Color.White);wzq9, 9 = 1;colorwhite = false;g.
23、FillEllipse(b, 20 * 9 + 20, 20 * 9 + 30, 20, 20);b.Dispose();g.Dispose(); 鼠标移动让子功能的运行过程是,判断是否刚刚开局,如果刚开局,就根据赢棋局数进行让子布局,把让电脑先下的棋子在棋盘上画出来。如果不是刚开局,说明已经对让子布局 处理过,则跳过不再处理。5. 模式选择窗口到各模式的跳转功能实现:新建四个 window 窗体,各自添加按钮控件,为模式选择窗口添加四个模式跳转按钮并 对其建立点击事件,完成模式窗口到各模式的跳转。具体函数代码如下: private void button1_Click(object send
24、er, EventArgs e)Form3 f3 = new Form3();this.Hide();DialogResult dr = f3.ShowDialog();if (dr = DialogResult.OK)this.Visible = true; 调用此函数后,会弹出模式一游戏窗口。其余跳转按钮代码处理与此相似,只是弹出的 窗体不同,进入的模式窗口也就不同,也就实现了模式窗口的跳转功能。6. 人机对战电脑下棋功能:添加电脑下棋方法 AiGo(), 循环扫描棋盘上的棋形,算出最优下棋点坐标,处理代码如下:private void AiGo() for (i = 0; i 19; i
25、+)for (j = 0; j 19; j+) if (a1x1, y1 a1i, j) y1 = j; x1 = i;for (i = 0; i 19; i+)for (j = 0; j 19; j+)if (a2x2, y2 = a1x1, y1) px = x2; py = y2;else px = x1; py = y1;该算法先对棋盘上的棋子进行循环扫描,分析横竖撇捺四方向上的棋子分布情况,算出 黑白棋子在棋盘上各点的棋形得分情况,分数越高,该点越重要,此部分为函数中省略部分, 由于代码量庞大,不再阐述。接下来对是循环比较,分别找出黑白棋子在棋盘上的最高得分 点坐标,进而比较出二者中
26、的得分最高点坐标,即最优下棋点坐标。7. 初始化功能的实现:private void OnStart() for (int i = 0; i 19; i+)for (int j = 0; j 19; j+)wzqi,j = 0;colorwhite = false;star = true;bushu = 0;pictureBox1.Refresh();在每个模式中都需对窗口界面进行初始化,对各参数进行初始化处理。8. 返回功能的实现:private void button1_Click(object sender, EventArgs e)this.DialogResult = DialogR
27、esult.OK;this.Close();关闭子窗体,恢复隐藏的父窗体四、 遇到的问题及解决方案问题 1:窗口间的跳转,实现不了。解决方法:查找资料,上网学习,百度知道,当然搜索到的答案不一定正确且不全面, 需要反复尝试,于是经过慢慢尝试,解决了窗口跳转问题。问题 2:在窗口中的棋盘上画棋子,棋子有时不会落在交叉线上。 解决方法:经过仔细观察,总结规律,发现画棋子用的方法不对,画在棋盘上的棋子坐 标与棋盘上的交叉点有出入。经过尝试,找到了方法,于是改变了画棋盘的方法,让每一个 交叉点都有具体的坐标,这样,不管鼠标点在哪里,想办法在交叉点坐标画棋子就可以了。问题 3:实现悔棋功能时,想着把最后
28、下的棋子去掉,却实现不了。解决方法:静下心来,仔细看自己编写的代码,模拟电脑运行调用程序的先后顺序看代 码,想象运行的结果,于是发现悔棋的棋子信息是初始化了,但没有在棋盘上表现出来,没 想到好办法,只好麻烦电脑再重新画出棋盘,循环画出悔棋后存在的棋子。问题 4:判断游戏是否结束,扫描是否产生五子连珠,老是判断出错误。 解决方法:经过请教度娘后,借鉴了前辈们的方法,完成了游戏结果分析函数。问题 5:加载自己处理的图片作为游戏棋盘背景,却加载不进去或图片不管用。 解决方法:直接在属性中设置背景图片。问题 6:人机对战,机器下棋功能的实现,算法写不出来,没有头绪,不知道从何处下 手。解决方法:经过多
29、次尝试失败后,决定借鉴前辈们的算法,于是搜索到了不少算法,心 中的贪念让人无法取舍,不知道用哪个好,看着这些算法不知道怎么用,更不清楚原理。几 经波折终于意识到了自己的当务之急是先理解,于是选了一个注释全面的算法,深入理解, 经过尝试学会了调用这个算法的工作过程,也实现了机器下棋的功能。问题 7:让子对战模式中让电脑先下的棋子,怎样画在棋盘上,出现了问题。解决方法:首先把这些棋子放在了 OnPaint()函数中来绘制,结果有偏差,也没弄懂原因, 于是尝试着在 OnLButtonDown() 函数中来绘制,运行界面后棋盘上无棋子,结果鼠标点击的 一瞬间出现了 3 颗棋子,这才意识到鼠标事件产生了冲突,也想到了在点击鼠标时,鼠标的 移动事件先触发, 然后点击事件才被触发。 想到做到,马上把这些棋子放在了 OnMouseMove()
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 路面工程勘察设计合同4篇
- 《中华人民共和国食品安全法》试题及答案
- 九月份工作计划怎么写(5篇)
- 警示教育心得体会怎么写(例文10篇)
- 执纪执法面试题目及答案
- 中小企业数字营销策略研究与实施
- 农业绿色发展2025政策导向:节水灌溉与水资源管理技术创新报告
- 农产品无损检测技术在农产品生产过程中的应用报告
- 2025年电气原理试题及答案
- 色彩构成试题及答案
- 配电作业专业技能实操-登杆更换台架边相跌落式熔断器
- 影片备案报告范文
- Unit 2 We are family Section A 1a-1d 课件【人教新目标(2024)七年级上册】-1
- (完整版)国际疾病分类ICD-10-培训
- 全运会转播制作标准
- 2024年新人教版8年级上册物理全册课件
- 2024年11月-矿山隐蔽致灾因素普查
- 上海市建设工程施工图设计文件勘察设计质量疑难问题汇编(2024 版)
- 《电力线路安规培训》课件
- 安宁疗护临床实践
- 陶瓷柔性化制备工艺-洞察分析
评论
0/150
提交评论