




免费预览已结束,剩余20页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#程序设计课程设计题 目: 五子棋人机大战 专 业: 计算机科学与技术 学 号: 111096142 姓 名: 岳文佩 指导老师: 李 向 完成日期: 2012年4月12日 3目 录1 前言22 课题介绍22.1功能要求22.2主要任务22.3运行环境22.4开发语言23 概要设计与详细设计23.1系统流程23.2详细设计34.1关键代码54.2特色功能的实现225 课程设计总结23参考文献23评语及成绩241 前言编写一个程序用以实现简单的单击游戏五子棋。通过一个二维数组来绘制棋盘,然后绘制五个特定的标志性位置,再对所下棋子进行规范,判断,并记录所下棋子的历史,并最后判断出胜负,将结果显示在屏幕上。2 课题介绍2.1功能要求(1)用C#语言实现程序设计;(2)利用结构体进行相关信息处理;(3)良好的人机互交,程序有注释。2.2主要任务 (1)定义一个结构体类型数组,用于绘制棋盘; (2)编辑棋盘中的五个特殊位置,(中心。以及局部的四个对称角)。 (3)定义一个栈用于记录之前所下的棋子,并随着玩家每下一棋子便更新该栈; (4)编写代码; (5)程序分析与调试。2.3运行环境(1)Win7系统;(2)Visual Studio 2008开发环境;2.4开发语言 C#语言3 概要设计与详细设计3.1系统流程 3.2详细设计(1) 功能绘制棋盘的详细设计根据一定算法,设计棋盘的横竖线所在位置,用(X,Y)来表示出来,代码如下:public void DrawBoard(PaintEventArgs e) Graphics g = e.Graphics; Pen pen1 = new Pen(Color.Black, 2.0f); Pen pen2 = new Pen(Color.Black, 1.0f); int x1 = 20, y1 = 20, x2 = 496, y2 = 20; for (int i = 0; i 15; i+) if (i = 0 | i = 14) g.DrawLine(pen1, x1, y1, x2, y2); y1 += 34; y2 += 34; else g.DrawLine(pen2, x1, y1, x2, y2); y1 += 34; y2 += 34; x1 = 20; y1 = 20; x2 = 20; y2 = 496; for (int j = 0; j 15; j+) if (j = 0 | j = 14) g.DrawLine(pen1, x1, y1, x2, y2); x1 += 34; x2 += 34; else g.DrawLine(pen2, x1, y1, x2, y2); x1 += 34; x2 += 34; 我在棋盘的中心以及另外四个特定的点设置五个标记: public void DrawBoardMark(PaintEventArgs e) /画棋盘上的5个标记 SolidBrush brush = new SolidBrush(Color.DimGray); Graphics g = e.Graphics; Rectangle rect_centre = new Rectangle(256, 255, 6, 7); Rectangle rect1 = new Rectangle(119, 119, 7, 7); Rectangle rect2 = new Rectangle(391, 119, 7, 7); Rectangle rect3 = new Rectangle(119, 391, 7, 7); Rectangle rect4 = new Rectangle(391, 391, 7, 7); g.FillRectangle(brush, rect_centre); g.FillRectangle(brush, rect1); g.FillRectangle(brush, rect2); g.FillRectangle(brush, rect3); g.FillRectangle(brush, rect4); (2) 功能判断“是否五子连线”的详细设计如下:public void isWin(int m, int n) string row = ; /横线 string col = ; /竖直线 string slash135 = ; /左斜线 string slash45 = ; /右斜线 for (int j = 0; j 15; j+) row += Tablem, j; for (int i = 0; i = 0 & j = 0; i-, j-) slash135 += Tablei, j; /倒置slash135 string ReallySlash135 = ; for (int k = slash135.Length - 1; k = 0; k-) ReallySlash135 += slash135k; for (int i = m + 1, j = n + 1; i 15 & j 15; i+, j+) ReallySlash135 += Tablei, j; /以上是部分判断是否形成最后的五子连线。4 关键代码与特色功能的实现4.1关键代码 在Form1.cs设计窗口,我先放置了一个背景图片,然后在一定位置放了两个文本框textBox1和textBox2,用来存放游戏过程状态,然后在Form1.cs中开始写代码。首先我定义了几个公有变量数组和其他类型变量用以存放游戏中棋子chess信息、人Player信息、电脑Computer信息,游戏最初的状态,以及双方棋子的颜色,定义棋盘等。如下:/数组中定义值为15是由于我在设计棋盘时采用14个方格,那么棋子可下的位置自然有15个。public string, Table = new string15, 15; /记录棋子信息,S空位,B黑棋,W白public int, , Computer = new int15, 15, 4; public int, , Player = new int15, 15, 4;public bool isManTurn = true;public string ManChessColor;public string ComputerChessColor;public bool Win=false;private Stack History;DrawChessArea dr = new DrawChessArea();接下来绘制棋盘,关键是在对的位置画线:该步骤在3.2.1的详细设计中给出。设置Player和Computer的棋子颜色:public void ChessColor() if (isManTurn = true) ManChessColor = Black; ComputerChessColor = White; else ManChessColor = Black; ComputerChessColor = White; 定义一个结构类型的数组,用于存放放置棋子的坐标及颜色: StructPoint, structPoint = new StructPoint15, 15; /创建结构类型的数组 public struct StructPoint /定义结构,用于保存每个棋子的绘制坐标和棋子颜色 public Nullable chessPoint; public string color; public StructPoint(Point chessPoint, string color) this.chessPoint = chessPoint; this.color = color; 对Player所下棋子部分进行记录:private void Form1_MouseClick(object sender, MouseEventArgs e) if (isManTurn = true) bool isInBoard = true; if (e.X 516 | e.Y 516) isInBoard = false; if (e.Button = MouseButtons.Left & isInBoard) Point MouseClickPoint = new Point(e.X, e.Y); Point drawPoint = MouseClickPointToDrawChessPoint(MouseClickPoint); DrawChess(drawPoint, ManChessColor); isManTurn = false; /下完后交给控制中心 ControlCentre(); 由上述Form1_MouseClick函数中所使用的控制中心为以下定义: public void ControlCentre() Engine engine = new Engine(); if (isManTurn = false) if (History.Count = 1) int m = 0, n = 0; for (int i = 0; i 15; i+) for (int j = 0; j 15; j+) if (Tablei, j = B) m = i; n = j; Point p = new Point(m, n); Point pp = engine.ComputerStep1(p); Point drawPoint = new Point(); drawPoint.X = 3 + 34 * pp.X + 2; drawPoint.Y = 3 + 34 * pp.Y + 2; DrawChess(drawPoint, ComputerChessColor); else Array.Clear(Computer, 0, Computer.Length); engine.analyseComputer(Table, W, Computer); Array.Clear(engine.Board, 0, engine.Board.Length); Array.Clear(Player, 0, Player.Length); engine.analysePlayer(Table, B, Player); engine.analyseComputerFinally(Table, Computer, Player, W); engine.analysePlayerFinally(Table, Computer, Player, B); Point drawPoint = new Point(); drawPoint=GetMaxMark(); DrawChess(drawPoint, ComputerChessColor); 对于Player下每一步棋子绘制到棋盘上对应的位置设置如下:/若Player点击到方格内,使其自动设定到方格所在的右上角:public Point MouseClickPointToDrawChessPoint(Point p) /鼠标点击的坐标转换为要画棋子的矩形左上顶点坐标- int m = (p.X - 3) / 34; int n = (p.Y - 3) / 34; Point drawPoint = new Point(); drawPoint.X = 3 + 34 * m + 2; drawPoint.Y = 3 + 34 * n + 2; return drawPoint; 将Player和Computer所下的正确棋子均记录到History栈中,(下到画格外面的棋子当做无效棋子),即更新历史栈: public void DrawChess(Point p, string color) Engine engine = new Engine(); if (Win) return; int m = (p.X - 5) / 34; int n = (p.Y - 5) / 34; if (m 14 | n 14) /点击超过棋盘范围时 return; Rectangle r = new Rectangle(p.X, p.Y, 32, 32); LinearGradientBrushbrush= newLinearGradientBrush(r,Color.DarkGray,Color.Black,LinearGradientMode.ForwardDiagonal); if (color = Black) brush=newLinearGradientBrush(r,Color.DarkGray,Color.Black,LinearGradientMode.ForwardDiagonal); Tablem, n = B; structPointm, n.chessPoint = p; structPointm, n.color = Black; isManTurn = false; else if (color = White) brush=newLinearGradientBrush(r,Color.Salmon,Color.Salmon,LinearGradientMode.ForwardDiagonal); Tablem, n = W; structPointm, n.chessPoint = p; structPointm, n.color = White; isManTurn = true; Graphics g = this.CreateGraphics(); g.SmoothingMode = SmoothingMode.AntiAlias; g.FillEllipse(brush, r); g.Dispose(); History.Push(new Point(p.X, p.Y); /添加历史纪录 Array.Clear(Computer, 0, Computer.Length); engine.analyseComputer(Table, W, Computer); Array.Clear(engine.Board, 0, engine.Board.Length); Array.Clear(Player, 0, Player.Length); engine.analysePlayer(Table, B, Player); engine.analyseComputerFinally(Table, Computer, Player, W); engine.analysePlayerFinally(Table, Computer, Player, B); isWin(m, n); 对于下到棋盘外面的棋子,进行重新下,同样调用上述DrawChess函数: public void ReDrawChess(StructPoint, structPoint) for (int i = 0; i structPoint.GetLength(0); i+) for (int j = 0; j structPoint.GetLength(1); j+) if (structPointi, j.chessPoint != null) DrawChess(Point)(structPointi, j.chessPoint), structPointi, j.color); 游戏进行中,同时需要程序对每下一个棋子后所在的状态进行判断,以及到最后游戏结束时胜负情况的判断的记录:/游戏的结束时:若存在横、竖、斜方向,任意方向,有相同颜色的棋子正好五个连成一条线,则该方胜出:(白棋五个连成线,则Computer胜;相反,Player胜出!)此处设计在3.1.3详细设计中特别给出。以下是对计算机在下棋子的时候进行规范,找最接近五子连线的点下棋,防止游戏过于简单(此处我在写的时候借鉴了一些五子棋游戏中的专业术语): public Point GetMaxMark() /选最优点 int max1 = Computer0, 0, 0; int max2 = Player0, 0, 0; int m1=0, n1=0, p1=0; int m2=0, n2=0, p2=0; int m, n, p; int max = 0; ; int point_x, point_y; for (int i = 0; i Computer.GetLength(0); i+) for (int j = 0; j Computer.GetLength(1); j+) for (int l = 0; l max1) max1 = Computeri, j, l; m1 = i; n1 = j; p1 = l; for (int i = 0; i Player.GetLength(0); i+) for (int j = 0; j Player.GetLength(1); j+) for (int l = 0; l max2) max2 = Playeri, j, l; m2 = i; n2 = j; p2 = l; if (max1 max2) max = max1; m = m1; n = n1; p = p1; point_x = 3 + 34 * m + 2; point_y = 3 + 34 * n + 2; else max = max2; m = m2; n = n2; p = p2; point_x = 3 + 34 * m + 2; point_y = 3 + 34 * n + 2; if (max2 = 60) max = max1; m = m1; n = n1; point_x = 3 + 34 * m + 2; point_y = 3 + 34 * n + 2; Point drawPoint = new Point(point_x, point_y); this.textBox1.Text = 位置+m.ToString() + + n.ToString()+; if (max = 100) if (max = max1) textBox2.Text =得分 + max.ToString() + + 白棋 成五; else textBox2.Text =得分 + max.ToString() + + 黑棋 成五; else if (max = 90) if (max = max1) textBox2.Text = 得分 + max.ToString() + + 白棋 双死四; else textBox2.Text = 得分 + max.ToString() + + 黑棋 双死四; else if (max = 85) if (max = max1) textBox2.Text = 得分 + max.ToString() + + 白棋 成活四; else textBox2.Text = 得分 + max.ToString() + + 黑棋 成活四; else if (max = 80) if (max = max1) textBox2.Text = 得分 + max.ToString() + + 白棋 四三胜; else textBox2.Text = 得分 + max.ToString() + + 黑棋 四三胜; else if (max = 75) if (max = max1) textBox2.Text = 得分 + max.ToString() + + 白棋 双活三; else textBox2.Text = 得分 + max.ToString() + + 黑棋 双活三; else if (max = 60) if (max = max1) textBox2.Text = 得分 + max.ToString() + + 白棋 单活三; else textBox2.Text = 得分 + max.ToString() + + 黑棋 单活三; else if (max = 70) if (max = max1) textBox2.Text = 得分 + max.ToString() + + 白棋 活三堵对方活三; else textBox2.Text = 得分 + max.ToString() + + 黑棋 活三堵对方活三; else if (max = 40) if (max = max1) textBox2.Text = 得分 + max.ToString() + + 白棋 成死四; else textBox2.Text = 得分 + max.ToString() + + 黑棋 成死四; else if (max = 25) if (max = max1) textBox2.Text = 得分 + max.ToString() + + 白棋 双活二; else textBox2.Text = 得分 + max.ToString() + + 黑棋 双活二; else if (max = 20) if (max = max1) textBox2.Text = 得分 + max.ToString() + + 白棋 活二且堵对方活二; else textBox2.Text = 得分 + max.ToString() + + 黑棋 活二且堵对方活二; else if (max = 15) if (max = max1) textBox2.Text = 得分 + max.ToString() + + 白棋 活二且堵住对方双活一; else textBox2.Text = 得分 + max.ToString() + + 活二 且堵住对方双活一; return drawPoint; Reset函数是用于对棋盘的重置:(但是我没用到,因为没有设置重玩按钮) public void ReSet() /初始化 History.Clear(); for (int i = 0; i 15; i+) fo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030年中国工厂园区护栏项目投资可行性研究分析报告
- 2025年中国草酸镁行业市场前景预测及投资价值评估分析报告
- 中国1-哌嗪甲醛行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- 2025年中国无线射频识别行业投资潜力分析及行业发展趋势报告
- 中国汽车转向机总成行业全景评估及投资规划建议报告
- 内勤培训课件
- 辐条线项目投资可行性研究分析报告(2024-2030版)
- 2025年中国高渗农药行业市场发展前景及发展趋势与投资战略研究报告
- 2021-2026年中国轮圈市场调查研究及行业投资潜力预测报告
- 矿山风险评估报告-范本模板
- 《谷歌企业文化》课件
- 建筑工程标准课件
- 石油化工安装工程概算指标说明(2019版)
- 急诊突发事件应急预案和处理流程
- 医学知识 避雷器带电检测方法与异常诊断 学习课件
- 深圳市光明区智慧城市专项规划
- 国家教育考试保密安全培训
- 罐车卸车安全操作规程
- 招牌字施工合同
- 投资借款协议书模板
- 云南大学《内部控制与风险管理》2023-2024学年第一学期期末试卷
评论
0/150
提交评论