1、 郑 州 科 技 学 院课 程 设 计 论 文基于 C#的五子棋游戏的设计与实现1 引言 .11.1 五子棋介绍 .12 软件架构 .23 五子棋设计说明 .23.1 主要成员变量说明 .23.2 回溯栈元素类 StackElement.33.3 棋子点属性类 qzdianshuxing.33.4 主要成员函数说明 .43.5 实现人机对弈的主要函数 .73.6 实现菜单功能的函数 .273.6 程序运行界面 .304 心得体会 .3111 引言1.1 五子棋介绍五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“連珠” ,英译为“Renju” ,英文称之为“Gobang”或“FI
2、R” (Five in a Row 的缩写) ,亦有“连五子” 、“五子连” 、 “串珠” 、 “五目” 、 “五目碰” 、 “五格”等多种称谓。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快” ,又有古典哲学的高深学问“阴阳易理” ;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源渊流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。2 软件架构软件的总体架构如图 2.1:人机对战人人对战主界面游戏控制 游戏模式重新开始退出声音控制
3、悔棋开始2图 2.1 软件架构3 五子棋设计说明3.1 主要成员变量说明1) 选择游戏模式标志m_renren用来表示当前玩家选择游戏的情况,当 m_renren 为 false时,表示人机对战;为 true 时,表示人人对弈。2) 游戏开始标志begin用来判断当前游戏是否开始3) 音效标志sound在下棋过程中,判断是否需要声音,当 sound 为 true 时,表示玩家需要声音,否则的话,玩家不需要声音。4) 谁先下的标志first这个标志只对人机对弈时有效。当 first 为 true 时,表示人先下,否则,电脑先下。5) 棋盘数据pointspoints 为棋盘情况数组,是用一个 1
4、5*15 的二维数组来表示的。pointsi,j=2 表示此处无子,pointsi,j=1 表示此处为黑子 pointsi,j=0 表示此处为白子。 6) 棋子颜色标志qzcolor用来表示当前棋子的颜色,qzcolor=1 时表示黑棋,qzcolor=0 时表示百棋。7) 棋子数据qz表示棋子所放的位子,是用一个 15*15 的 PictureBox 类型的二维数组来表示。它还可以用来显示当前棋子的图片。8) oldMovePoint用来记录鼠标经过后点的位置。9) backStack3用于悔棋的栈。10)backTrackStack用于回溯的栈11)结局result用枚举类型来表示结局。如
5、:public enum result : int/结局lose = -1,equal,win3.2 回溯栈元素类StackElement成员变量:1) qzColor 棋子的颜色2) bestFivePoints 最好点的位置3) pointsCount 计算最好点的数目4) pointNumber 点的数目5) Theresult 结局6) stepNumber 预测的步数3.3 棋子点属性类qzdianshuxing成员变量:1)blackConnect 黑棋子 i 个(包括活棋)的连接条数2)blackActive 黑活棋 i 个的连接条数3)whiteConnect 白棋子 i 个(
6、包括活棋)的连接条数4)whiteActive 白活棋 i 个的连接条数5)tempActive3 活棋数为 3 的连接条数3.4 主要成员函数说明1) 初始化棋盘Initializeqp初始化操作包括以下几个步骤: 设置棋子所在的位置 设置棋子的大小 初始化棋子的背景颜色 将棋子的 sizemode 设置为 CenterImage 将棋子的可见性设置为 false4 将棋子添加到 form 上。2) 绘制棋盘Form1_Paint其主要是画出以 40*40 的大小为每一小格,代码如下:for (i = 0; i 0)temp = (Point)backStack.Pop();qztemp.X
7、, temp.Y.Image = global:五子棋.Properties.Resources.nullll;backStack.Push(temp);elseqzx, y.BackgroundImage = global:五子棋.Properties.Resources.whitestone;pointsx, y = 0;qzx, y.Image = global:五子棋.Properties.Resources.lastwhitestone;if (backStack.Count 0)temp = (Point)backStack.Pop();qztemp.X, temp.Y.Image
8、 = global:五子棋.Properties.Resources.nullll;backStack.Push(temp);最后将其可见性设置为 true。5) 开始函数start当棋局开始时,就应将棋盘初始化,使棋盘上没有棋子。如果有悔棋,就要将悔棋栈清空。代码如下:7if (!begin)begin = true;for (x = 0; x 0)backStack.Pop();3.5 实现人机对弈的主要函数6) 察看两点之间的棋子数函数ConnectqpCount这个函数主要求两点之间可能形成五连子的 qzcolor 色棋的连子数(包括活期)。首先,求出两点之间总共的棋子数,并判断棋子所
9、在哪个方向。沿着这个方向每个点的坐标,并察看这几个点中有没有反色的棋子。如果有,棋子数设为 0,否则的话,棋子数自加 1。代码如下:int x, y, i, j, length, xPlus = 0, yPlus = 0, sum, maxSum = 0;length = Math.Max(Math.Abs(point1.X - point2.X), Math.Abs(point1.Y - point2.Y) + 1;if (point1.X != point2.X) xPlus = 1;if (point1.Y != point2.Y) yPlus = (point2.Y - point1.Y)/Math.Abs(point2.Y - point1.Y);for (i = 0; i length - 4; i+)x = point1.X + i * xPlus;y = point1.Y + i * yPlus;sum = 0;for (j = 0; j 5; j+)/察看两点之间当中有没有反色if (pointsx + j * xPlus, y + j * yPlus = qzcolor)