程序设计课程设计报告-井字棋设计.doc_第1页
程序设计课程设计报告-井字棋设计.doc_第2页
程序设计课程设计报告-井字棋设计.doc_第3页
程序设计课程设计报告-井字棋设计.doc_第4页
程序设计课程设计报告-井字棋设计.doc_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学号:201010311032 “程序设计”课程设计(报告) 设计题目:井字棋 学 院: 信息工程学院 专 业: 计算机科学与技术 班 级: 计算机 姓 名: 指导老师: 完成日期: 目录 目目 录录 1.引言.2 1.1 背景.2 1.2 动机.2 1.3 要解决的问题.3 2.系统框架.3 3.数据结构设计.4 4.关键技术.4 4.1 界面的初始化.5 4.1.1 棋子的绘制.5 4.1.2 棋盘的设置.6 4.1.3 棋盘上棋子的设置.6 4.2 判断对弈输赢.7 4.2.1 棋盘初始化.8 4.2.2 权值大小判断.9 4.2.3 特殊情况.11 4.3 对弈者的选择.12 4.4 结局的输出.12 4.4.1 电脑赢.13 4.4.2 对弈者赢.13 4.4.3 平手.14 4.5 菜单栏.14 4.6 用户登录.15 4.7 应用程序.16 5.系统运行结果.16 5.1 系统运行环境.16 5.2 系统运行结果.17 5.2.1 系统界面.17 5.2.2 棋盘界面.17 5.2.3 菜单栏界面.18 5.2.4 菜单栏.18 5.2.5 电脑胜利.19 5.2.6 平局.19 6.调试和改进.20 7.心得和结论.20 7.1 结论.20 7.2 进一步改进方向.20 主要参考文献.20 “程序设计”课程设计 1.引言 1.引言引言 井字棋,又名 TIC-TAC-TOE,是一种在 3*3 类似井字格子上进行的游戏, 然后由分别代表 O 和 X 的两个对弈者轮流在格子里留下标记。最先在任意一条 直线上成功连接三个相同标记的一方,则判定为胜利,若双方都没有连成一直 线,则判定为平局。在这里,包括玩家与电脑之间的对弈。 1.1 背景背景 玩过这个游戏的人大都会发现,这是一个界面友好、规则易懂以及玩法简单 的小游戏。为了使它能更方便的展现在游戏平台上,设计一个井字棋游戏的界 面是一个很好的选择。 1.2 动机动机 众所周知,井字棋是一个休闲类的游戏,主要在其玩法十分简便。而自身通 过对游戏开发的学习,同时在学习对界面的设置的过程中能吸收各方面知识, 有利于提高解决实际问题的能力。 如果井字棋开发成功的话,可以使同学们享受到以下乐趣: (1)友好的界面带给对弈者不同的体验。 (2)轻松、简单的玩法使同学们一玩就会,在课余时间享受简单玩法的乐 趣。 (3)可以与同学们一起动脑求得必赢的对弈方法,充满乐趣。 所以,本系统旨在开发一个简单,能体验井字棋 pc 游戏平台。 1.3 要解决的问题要解决的问题 当然,还需要解决以下问题: (1)棋盘和棋子的绘制:需要一个 3*3 的棋盘,还有两个玩家不同的“棋 子” ,O 和 X。 (2)盘初始化:要在游戏开始前设置一个登录界面,输入名称后如何显示 出棋盘界面。在一局之后如果要继续,要怎么样清空棋盘并开始下一局。 (3)设置菜单栏,其中要包括开始、退出等操作。 (3)利用权重来计算下一步落棋位置。 (4)胜负判断:给出胜负判断标准,要准确判断游戏的输赢并在最后显示 “程序设计”课程设计 2.系统框架 出来,平局的时候应该如何判断,同时也要显示出来。 2.系统框架系统框架 井字棋的运行方式很简单,具体方法如下:当对弈者选择对弈者先手并点击 开始游戏的情况下,首先判断棋盘上有无空格,如果有,则对弈者先下,然后 电脑判断下棋,继而判断有无三子连成一线,若有,则输出结果、游戏结束, 若无,先判断棋盘上有无空格,如果有,则对弈者下,再判断。直到有三点连 成一线,则输出对弈结果;如果没有三点连成一线并且棋盘上再无空格,则输 出结果为平局。游戏结束后对弈者可选择重新开始或结束游戏。 井字棋流程示意图如下图 2.1 所示: 开始 退出或重新开始 输出结果 棋盘有无空格 电脑下棋 判断有无三子连线 对弈者下棋 图 2.1 流程示意图 “程序设计”课程设计 3.数据结构设 计 3.数据结构设计数据结构设计 (1)棋盘需要初始化 private void initializeDisplay(),定义棋盘的 大小以及下棋所需的 9 个格。定义电脑判断下棋位置的权重矩阵 int , weightMatrix 以及表示每格中棋子的状态矩阵 int , statusMatrix,0 表示 棋盘上无子,1 表示电脑下子,10 表示对弈者下子。 (2)记录对弈者信息: 在游戏开始前输入玩家的姓名,在游戏 结束后输出结果 switch (gameresult), 记录输赢情况。 4.关键技术关键技术 计算下一步落子的位置,是本系统的关键。权值指这个指标在整个分析过程 中所占的重要程度,所以我们采用比较权值的大小来判断电脑的下一步落子位 置。 4.1 界面的初始化界面的初始化 在游戏中首先要定义的就是棋盘以及下子所需的棋子。 4.1.1 棋子的绘制棋子的绘制 在棋子的设置过程中,使用 Graphics 类,Graphics 类表示封装一个 GDI+绘 制图面,其中 Drawline(Pen,Point,Point)表示绘制一条连接两个 Point 结构的线, DrawEllipse(Pen,Single,Single,Single,Single)表示绘制一个由边框定义(该边框由 一对坐标、高度和宽度制定)的椭圆(此地可用作圆) 。而 Pen 类表示对象制定 绘制的图形外轮廓线宽度和颜色,即 Pen(Color color,float width)。Bitmap 表 示对象的作用是用来显示位图的。 /绘制对弈者棋子:X Bitmap userchess = new Bitmap(38, 38); /对弈者棋子所占空间大小为38*38的 格子 “程序设计”课程设计 4.关键技术 Graphics g;/定义视图类 g = Graphics.FromImage(userchess); Pen p1 = new Pen(Color.DarkRed, 4);/设置对弈者棋子颜色以及棋子宽度 g.DrawLine(p1, new Point(1, 1), new Point(37, 37);/直线表示X中的 g.DrawLine(p1, new Point(1, 37), new Point(37, 1);/直线表示X中的/ human_pic.Image = userchess; /绘制电脑棋子:O Bitmap computerchess = new Bitmap(38, 38); g = Graphics.FromImage(computerchess); Pen p2 = new Pen(Color.DarkBlue, 4);/设置电脑棋子颜色以及棋子宽度 g.DrawEllipse(p2, 1, 1, 35, 35);/绘制O compu_pic.Image = computerchess; 4.1.2 棋盘的设置棋盘的设置 设置mainGround为主要的下棋界面,设置棋盘的大小为450*450,同时设置 分割线的颜色以及宽度,形成一个友好的界面。 Bitmap mainGround = new Bitmap(450,450);/用Bitmap定义主要棋盘并设置整 个棋盘为450*450的大小 g = Graphics.FromImage(mainGround); Pen p = new Pen(Color.Gray, 4);/设置棋盘框架的颜色以及宽度 for (int i = 0; i 2; i+) /在450*450的空间里分别绘制两条横向和两条纵向的线以此勾画出九个格子 表示棋盘 g.DrawLine(p, new Point(i + 1) * 150, 0), new Point(i + 1) * 150, 450);/表示 棋盘中的| “程序设计”课程设计 4.关键技术 g.DrawLine(p, new Point( 0,(i + 1) * 150), new Point(450,(i + 1) * 150 );/表示 棋盘中的= 4.1.3 棋盘上棋子的设置棋盘上棋子的设置 棋盘上的棋子要与棋盘上九个格子的大小成比例,使得下棋过程中的美观。 在设置过程中,对弈者棋子为 X,电脑棋子为 O, 0 表示棋盘上无子,1 表示 电脑下子,10 表示对弈者下子。 Bitmap mainGround = new Bitmap(450, 450);/表示在450*450已经建成棋盘的 Panel中 Graphics g; g = Graphics.FromImage(mainGround); Pen p1 = new Pen(Color.DarkBlue, 4);/表示电脑的棋子的颜色和宽度 Pen p2=new Pen(Color.DarkRed,4);/表示人的棋子的颜色和宽度 Pen p = new Pen(Color.Gray, 4);/表示棋盘的颜色和宽度 /在棋盘上,i表示行,j表示列,用i、j表示棋子落子的位置,在对落子的确 切位置和轮到谁落子确定后通过下面的代码可以在棋盘的每个格子上准确的显 示出应该出现的棋子 for (int i = 0; i 3;i+ ) for (int j = 0; j 3; j+) if (statusMatrixi, j = 1)/如果电脑下子,只要鼠标点到的格子,就会 出现如下代码表示的O g.DrawEllipse(p1, i * 150 + 10, 450 - j * 150 - 120 - 10, 120, 120); if (statusMatrixi, j =10)/如果轮到人下子,只有鼠标点击到的格子, 就会出现如下代码所示的X “程序设计”课程设计 4.关键技术 g.DrawLine(p2, new Point(i * 150 + 10, 450 - j * 150 - 10), new Point(i * 150 + 130, 450 - j * 150 - 130); g.DrawLine(p2, new Point(i * 150 + 10, 450 - j * 150 - 130), new Point(i * 150 + 130, 450 - j * 150 - 10); 4.2 判断对弈输赢判断对弈输赢 定义判断输赢结局的函数名称为THINK,并创建两个3*3的矩阵:状态矩阵 statusMatrix和权直矩阵weightMatrix。状态矩阵表示每个格子是否已有棋落子同 时也判断谁落子了。权值矩阵是针对电脑的落子而产生的,通过比较可落子位 置的权值大小,电脑可以判断在空的格子中哪个格子更有利于游戏的胜利。 4.2.1 棋盘初始化棋盘初始化 public class THINK int, statusMatrix; int, weightMatrix; /在还没有落子前,空棋盘的状态矩阵statusMatrixi, j = 0,而由于还未有 人下子,所以权值矩阵weightMatrixi, j = -1,表示权值很小。 public THINK() statusMatrix = new int3, 3; weightMatrix = new int3, 3; for (int i = 0; i 3; i+) for (int j = 0; j 3; j+) statusMatrixi, j = 0;/这里是一个棋盘的初始化 “程序设计”课程设计 4.关键技术 weightMatrixi, j = -1; public int, getNextStep(int, inputMatrix) int maxWeight = 0; List positionPool = new List();/List是一个容器类,里面装 的都是类的对象 int positionPicked = 0; for (int i = 0; i 3; i+) for (int j = 0; j 3; j+) statusMatrixi, j = inputMatrixi, j; for (int i = 0; i CD。在考虑完各方面的因素并对相应的权重进行加减 操作后可以得到最终的权值的结果,根据权值的大小进行下棋落子位置的操作 /A表示轮到电脑下棋时,在任意一条直线上,如果有两个格子为电脑下的 子并且剩下的一个格子里为空,那么电脑下一步的落子位置将在那个剩下的格 “程序设计”课程设计 4.关键技术 子中。在这里将所有的可能性都考虑在内 if (statusMatrixi, 0 + statusMatrixi, 1 + statusMatrixi, 2 = 2) weightMatrixi, j += 10000;/表示在棋盘上横向的直线上有两个电脑 的棋子 if (statusMatrix0, j + statusMatrix1, j + statusMatrix2, j = 2) weightMatrixi, j += 10000;/表示在棋盘上纵向的直线上有两个电脑 的棋子 if (i = j /表示在棋盘上正对角线上有两个电 脑的棋子 if (i + j = 2 /表示在棋盘上另一对角线上有两个电 脑的棋子 /B表示轮到电脑下棋,并且在任意直线上,电脑没有可能获得胜利时,电 脑需要考虑到对弈者有可能获得胜利,在这里主要在于堵住对弈者可能赢得胜 利的格子 if (statusMatrixi, 0 + statusMatrixi, 1 + statusMatrixi, 2 = 20) weightMatrixi, j += 1000;/ 表示在棋盘上横向的直线上有两个 对弈者的棋子 if (statusMatrix0, j + statusMatrix1, j + statusMatrix2, j = 20) weightMatrixi, j += 1000;/ 表示在棋盘上纵向的直线上有两个 对弈者的棋 if (i = j / 表示在棋盘上正对角线上有两个对 弈者的棋子 f (i + j = 2 / 表示在棋盘上另一对角线上有两个 对弈者的棋子 /C表示当中心点为空时,电脑走中心的权重的大小。在这里默认当电 脑先手时,电脑走的必定为中心 if (i = 1 /D表示在双方都没有有利于胜利的可落子的地方时,电脑在剩下的可 落子的格子中的权值是很小的。 if (i + j = 2 /表示在非正对角线的位子上有两个电 脑下的棋子 if (i = j 4.2.3 特殊情况特殊情况 当然在下棋的过程中还包括了许多特殊情况,这样的特殊情况需要在下面的 代码中一一列出。 /当0, 0和 2, 2位置上的棋子为对弈者的棋子时,在0, 2和 2, 0位置上 的权值会相对减少 if (statusMatrix0, 0 + statusMatrix2, 2 = 20) weightMatrix0, 2 -= 500; weightMatrix2, 0 -= 500; if (statusMatrix2, 0 + statusMatrix0, 2 = 20) weightMatrix0, 0 -= 500; “程序设计”课程设计 4.关键技术 weightMatrix2, 2 -= 500; /同时我们还使用了Random,对于同样的对弈者的布局,使用Random会使 电脑下出不同的方案 private int RandomInt(int max) int result; Random rd = new Random(); result = rd.Next(max); return result; 4.3 对弈者的选择对弈者的选择 在对弈者开始下棋前要选择是对弈者先手还是电脑先手。 private void radioButton1_CheckedChanged(object sender, EventArgs e) Computerfirst = false; /对弈者先手 private void radioButton2_CheckedChanged(object sender, EventArgs e) Computerfirst = true; /电脑先手 4.4 结局的输出结局的输出 在游戏结束后,游戏会显示出游戏的输赢情况,在这里实用一个switch 结构在解决这个问题,表明了输出结果的代码。 switch (gameresult) “程序设计”课程设计 4.关键技术 case 1:/1表示第一种情况,表明电脑赢了 finished = true; label3.Text = 电脑赢了; break; case 10:/10表示第二种情况,表明对弈者赢了 finished = true; label3.Text = 对弈者赢了; break; case 100:/100表示第三种情况,表明平手 finished = true; label3.Text = 平手; break; default:/表明游戏的默认值,当没有输赢的情况下会一直显 示直到游戏结束 finished = false; label3.Text = 请下子; break; 4.4.1 电脑赢电脑赢 for (int i = 0; i 3; i+) if (statusMatrixi, 0 + statusMatrixi, 1 + statusMatrixi, 2 = 3) result = 1; for (int j = 0; j 3; j+) if (statusMatrix0, j + statusMatrix1, j + statusMatrix2, j = 3) result = 1; if (statusMatrix0, 0 + statusMatrix1, 1 + statusMatrix2, 2 = 3) result = 1; if (statusMatrix0, 2 + statusMatrix1, 1 + statusMatrix2, 0 = 3) “程序设计”课程设计 4.关键技术 result = 1; 4.4.2 对弈者赢对弈者赢 for (int i = 0; i 3; i+) if (statusMatrixi, 0 + statusMatrixi, 1 + statusMatrixi, 2 = 30) result = 10; for (int j = 0; j 3; j+) if (statusMatrix0, j + statusMatrix1, j + statusMatrix2, j = 30) result = 10; if (statusMatrix0, 0 + statusMatrix1, 1 + statusMatrix2, 2 = 30) result = 10; if (statusMatrix0, 2 + statusMatrix1, 1 + statusMatrix2, 0 = 30) result = 10; 4.4.3 平手平手 int blank = 0; for (int i = 0; i 3; i+) for (int j = 0; j 3; j+) if (statusMatrixi, j = 0) blank+; if (result = 0 return result; 4.5 菜单栏菜单栏 在菜单栏处包括游戏(新游戏,退出)和帮助(关于井字棋) 。向游戏界面 上移动一个菜单栏 MenuStrip 到合适的位置,输入文本“游戏” ,在下面分别输 “程序设计”课程设计 4.关键技术 入“开始”和“退出” ,在右边输入“帮助” ,在其下输入“关于井字棋” ,这样 就建成了一个简单的菜单栏。 /“开始”表示不论之前如何,只要点击“开始” ,界面又回到初始化,游戏 重新开始 private void 开始 ToolStripMenuItem_Click(object sender, EventArgs e) initializeGame(); if (Computerfirst)/表明如果电脑先手,那么电脑就会根据之前的 走法选择最有利于电脑本身的走法 toNextStep(); displayChess(); /设置“关于井字棋”的窗口并实现只要在游戏中点击“关于井字棋” 就能出现有关井字棋介绍的小窗口。 private void 关于井字棋 ToolStripMenuItem_Click(object sender, EventArgs e) Form2 frm = new Form2(); frm.Show();/show()函数表明制定窗口显示状态,在这里表明 Form2在窗口中显示 /点击“退出”程序自动全部退出 private void 退出 ToolStripMenuItem1_Click(object sender, EventArgs e) Application.ExitThread(); “程序设计”课程设计 4.关键技术 4.6 用户登录用户登录 井字棋游戏开始前需要一个用户的登录界面,使得游戏看起来更完整,而登 录界面需要与游戏界面连接起来,所以这里用到了继承。 public partial class Form3 : Form/继承 public Form3() InitializeComponent(); /button1设置为文本“确定”,点击确定后,显示游戏界面,继而开始游戏。 private void button1_Click(object sender, EventArgs e) Form1 frm = new Form1(); rm.Show(); 4.7 应用程序应用程序 static void Main() Application.EnableVisualStyles();/应用程序启用可视样式 Application.SetCompatibleTextRenderingDefault(false);/在应用程序 范围内设置控件显示文本的默认方式 if (new Form3().ShowDialog() = DialogResult.OK)/在确认用户登 录后才能开始游戏 Application.Run(new Form1();/用户登录之后出现游戏界面 “程序设计”课程设计 5.系统运行结 果 5.系统运行结果系统运行结果 5.1 系统运行环境系统运行环境 硬件环境: 操作系统:Windows 7 旗舰版 系统类型:32 位操作系统 处理器:Intel(R) Core (TM)2 Duo CPU T5450 1.66GHz 1.67GHz 内存:1.00GB 软件环境:

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论