基于vc的五子棋游戏软件的设计与开发—计算机毕业设计内容摘要:
棋类知识密切相关。 通常,用来描述棋盘及其上棋子信息的是一个二维数组。 要让计算机知道棋盘局势状态,就是要它记住棋盘中哪个位置有黑子,哪个位置有白子以及哪个位置是空点。 因为五子棋的棋盘是 15行, 15 列,因此可以将棋盘状态的描述用一个 15 15 的二维数组表示。 本程序的数据将用如下所示的数据表示: int p[15][15]= {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}}; 其中,( 1)棋盘状态数据由一个 15 15 的二维数组表示。 ( 2)用数字“ 1”和“ 2”来表示不同的棋子,黑色棋子用“ 2”表示,白色棋子用“ 1”表示。 ( 3)没有棋子的格子用“ 0”表示。 棋盘中下棋的顺序表示 棋局中下棋的顺序也很重要,应该是黑白双方交替下棋。 本程序用 t 来判断黑白又方下棋顺序, t 为“ 0”时由红方下棋, t 为“ 1”时由黑方下棋,由于五子棋规则中黑棋先手,所以初始值 t=1,即玩家执黑先手。 每次落棋后,都应改变 t 的值, t 在整个对弈过程中都只能为 1 或者为 2,即在任意时刻,都有一方可以落棋 ,也只能有一方落棋。 具体算法 电脑要选择有利于它的最佳下法,就要能判断哪种形势对它最有利。 但往往对一个形势的判断是很难做到准确的,特别是一盘棋刚开始的时候,棋盘的形势不明朗,即使是专家也不能做出准确的判断。 为了判断哪种下法最有利,我们往第 8 页 共 21 页 往需要向后面计算几步,看看在走了几步棋之后,局面的形势如何。 这被称为“多算胜”,也就是说,谁看得越深远,谁就可以获胜。 这种思维方式被用到了计算机上。 向后面计算的步数越多,系统开销就越大,本系统只向后计算一步,根据威胁的优先级来选择落棋的最佳点。 轮到电脑下棋时,电 脑先向棋盘搜索合法的落棋点,即棋盘的空白点。 然后再利用下面的算法先择最佳落棋点。 在每个空白点,都有四个方向需要考虑,即 — 、 |、﹨、∕四个方向。 以下就用○表示电脑所执的黑棋,用□表示玩家所执的白棋,用表示棋盘的空白点。 在设计的时候,尽可能把所有情况全面考虑,设置为搜索一个 最佳落棋点 位置的时候,需要保证左右展开后碰壁,之间的空间距离至少要有六格 (而不是五子 ),否则就是死子。 算法流程是:顺序向下搜索,每次有符合要求的点时,视为最佳落棋点,并在该点落棋,同时将 t 赋值为1,退出搜索并判断是否有一方获胜,然后等 待玩家落棋,再重复这一过程,直到有一方获胜。 图 1 算法流程图 一,电脑搜索棋盘里红棋是否有一步获胜的棋,即在同一条线路上有连续五第 9 页 共 21 页 个位置上,有四颗为红棋,另外一颗为空,这时就不用考虑玩家的棋局,直接就可以获胜。 能直接获胜的棋型有○○○○、□○○○○,还包括通过四三来形成的活四,包括有○○○○、○○○○、○○○○。 二,电脑搜索棋盘里黑棋是否有一步获胜的棋,这时就应该让玩家的“活四”变“死四”,这是红棋威胁级别最高的,应立即做出反应。 有直接威胁的棋型有□□□□、□□□□、□□□□、□□□ □。 对于□□□□这种棋型,其实玩家已经获胜。 三,电脑搜索棋盘里红棋是否有可形成活四的棋型,进一步冲四,这时就应该主动进攻,这种棋型包括○○○、○○○、○○○。 这样的棋只需两步方可获胜,威胁级别仅次于上面两种。 四,电脑搜索棋盘里黑棋是否有可形成活四的棋型,若有,就有阻止冲四,让玩家的“活三”变死三,这时就体现了电脑的防守策略,这种棋型包括:□□□、□□□、□□□。 其中□□□在封堵后还具有威胁性,所以在电脑没有进攻机会时,也应该考虑这样的棋型的威胁性,因为可以利用这种棋型来造四三来获胜。 五,电脑搜索棋盘里红棋是否有可形成活三的棋型,这是获胜的过渡棋,在整个棋局中非常重要,这样的棋型越多,红棋造活三的机会就越多,是获胜的关键。 这种棋型包括:○○、○○,由于需要三步获胜,所以优先级比较低。 表1是获胜情况分析表,优先级是按所需步数和落棋的顺序来决定的,在获胜所需步数相同的情况下,电脑所执的红棋优先级高于黑棋。 表 1 获胜情况分析表 棋盘上的情况: 获胜所需步数 优先级 电脑 已有任意组活四或已有任意组死四 一 1 玩家 已有任意组活四或已有任意组死 四 一 2 电脑 已有任意组活三 或 已有多于一组的死三 二 3 玩家 已有一组死三和任意组的活二 三 4 玩家 已有任意组活三或已有多于一组的死三 三 5 玩家 已有一组死三和任意组的活二 三 6 5 系统流程 五子棋的规则如下:( 1)棋盘:采用 15 15 的棋盘。 ( 2)下法玩家执黑先手,电脑执白后手,轮流在棋盘上选择一个无子的交叉点落子。 无子的交叉点又被称为空点。 ( 3)输赢判断:黑、白双方有一方的 5 颗棋子在横、竖或斜方第 10 页 共 21 页 向上连接成一线即为该方赢。 ( 4)对于五子棋可分为禁手和无禁手两类,本游戏采用无禁手,这样就对执 黑方很有力,获胜的机率非常大。 可用 15 15 的二维数表示棋盘内各点状态 (空、白子、黑子 ) ; 五子棋游戏规则简单,在每次玩家或电脑落棋后,都要去判断是否游戏是否分出胜负,如没有,另一方才能继续下棋。 一局游戏结束后,可以选择再来一盘,这时将棋盘数据清空,又开始新的棋局。 系统流程如图 2所示。 图 2 系统流程图 6 系统功能实现 窗口设计 根据 Windows API 函数来编写应用程序的顺序结构:调用 WinMain 函数开始执行→定义窗口类→初始化窗口类→窗口的实例化→通过消息循环获取消息并将消息发送给消息处 理函数做出相应的操作。 我们首先应该创建一个窗口, 生成一个窗口主要有两步:定义窗口类和初始化窗口类。 首先用 InitWindowsClass 来定义一个窗口类,窗口类事实上是 struct 结第 11 页 共 21 页 构体 ,内部有 10个分量,他们是用来于初始化窗口 类对象 而用的。 根据函数里声明的各个参数来执行,它在里面定义了窗口类对象、声明了窗口的类对象名称、应用程序实例句柄、消息处理函数名、光标样式和窗口背景等,其它的都设置为初始值。 函数关键语句: BOOL InitWindowsClass(HINSTANCE hInstance) { =(HBRUSH)(CreateSolidBrush(RGB(240,240,240))); =LoadCursor(NULL,IDC_ARROW); =hInstance; =WndProc; =WinFill; return RegisterClass(amp。 WndClass); } 然后用 InitWindows 函数来初始化窗口类, 在窗口 类对象 的初始化过程中,我们定义了窗口的一些简单一般特征,比如背景颜色呀,光标等等。 但是在利用 CreateWindow 创建窗口的时候可以设置更多的细节,比如窗口标题这些。 函数主要参数: hWnd=CreateWindow(WinFill, 五子棋游戏 , WS_OVERLAPPEDWINDOW, 0, 0, 1024, 768, hInstance); 其中,定义窗口类对象名称为 WinFill,窗口标题为 五子棋游戏 ,窗口风格为 WS_OVERLAPPEDWINDOW,说明此窗口是一 个层叠式窗口 ,含 有边框、标题栏、系统菜单、最大最小化按钮 的窗口。 棋盘设计 程序的实现上,首先完成界面的设计,在界面的设计上,使用了二维数组的棋盘格式,考虑到五子棋的落子后,是不会再次移动的 ,所以采用划直线的方法模拟一个棋盘。 棋盘大小为 560 560,起始坐标为( 200, 100),每个格子大小为( 40, 40)。 首先用 GetStockObject 函数创建一个画笔和画刷,用 SelectObject 选择当前使用的画笔和画刷,画笔的作用是画棋盘的边框及格子,画刷的 作用是填充棋盘的背景色,先取画笔后我们才能用它来画棋盘。 为了增加棋盘的美观,画刷颜色选取灰色,与窗口的银白色分开。 第 12 页 共 21 页 然后用 Rectangle 函数画一个矩形,就是棋盘的边框,棋盘的左上角坐标为( 200, 100),右下角坐标为( 760, 660)。 再画棋盘的各横轴及纵轴,在画每一条直线前,需用 MoveToEx 函数指定当前画笔的位置,然后用 LineTo 函数从指定这点开始画一条到指定的另外一点的直线。 函数段为: hPen=(HPEN)GetStockObject(BLACK_PEN); SelectObject(hDC,hPen); hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH); SelectObject(hDC,hBrush); Rectangle(hDC,200,100,760,660); MoveToEx(hDC,200,140,NULL); //第一条横线 在这些都完成了之后,对界面进行最后的完善,通过添加 按钮 来使用户在和电脑对弈的同时,可以 从这些按钮中获得必要的帮助。 本系统一共设置了四个按钮:“和棋”、“再 来一盘”,“退出”和“帮助”。 它们的画法采用文本框模拟按钮,先画一个矩形,在矩形里填充提示信息,用鼠标单击事件来响应各个按钮。 因此综上所述,在 界面的 设计上,主要有 两 个模块,一个是 棋盘 模块,一个是 按钮 模块。 按钮功能的实现 本系统一共设置了四个按钮:“和棋”、“再来一盘”,“退出”和“帮助”。 它们的画法采用文本框模拟按钮,先画一个矩形,在矩形里填充提示信息,用鼠标单击事件来响应各个按钮。 这四个按钮基本满足了一般玩家的需求。 按钮的画法:先在主函数里面定义四个变量,分别存储按钮的标题,然后在棋盘外画四个矩形, 然后在四个矩形里分别显示按钮的标题。 具体实现方法: “ 退出 ” 按钮: Rectangle(hDC,770,110,820,135); TextOut(hDC,780,115,lpsz1,strlen(lpsz1)); if(i770amp。 amp。 i820amp。 amp。 j495amp。 amp。 j520) {PostQuitMessage(0); return(0)。 } 以上这几行代码就实现了退出按钮按钮的画法及实现, lpsz1 里存储的是按钮标题“退出”,在( 770, 110)到( 820, 135)这个区域画一按钮, strlen(lpsz1) 求的是字符串的长度,求出来的值就是文本显示的长度。 当鼠标单击这个区域的第 13 页 共 21 页 时候,就产生消息,并执行 PostQuitMessage(0) 这条语句,这条语句的作用是退出应用程序。 这样就模拟出了一个退出按钮,实现了程序的退出。 “再来一盘”按钮: Rectangle(hDC, 100, 325, 180, 375); TextOut(hDC, 110, 340, lpsz5, strlen(lpsz5)); if(i=100amp。 amp。 i=325amp。 amp。 j=180amp。 amp。 j=375) //再来一盘 { for(m=0; m=a; m++) {c[m]=0; d[m]=0; e[m]=0; f[m]=0; } for(m=0; m=14; m++) for(n=0; n=14; n++) {p[m][n]=0; } 在画法和退出按钮一样,都是利用矩形内填充文本的方法,在响应这个按钮时有一定条件,就是游戏已经分出胜负或者通过和棋结束了游戏。 这时才会产生再来一盘的消息,它会将所有棋盘信息置为初始值,比如将棋盘状态函数 P[][]里的数组全部清空,都赋初值为 0,表示下棋棋子数的 a 也置为 0等。 “帮助”按钮: Rectangle(hDC, 770, 110, 820, 135); TextOut(hDC, 780, 115, lpsz1, strlen(lpsz1)); if(i=770amp。 amp。 i=820amp。 amp。 j=110amp。 amp。 j=135) {MessageBox(hWnd, 需帮助 请在黑棋下棋时单击 39。 帮助 39。 \n 一方获胜后可单击 39。 退出 39。 退出程序 \n 双方僵持情况下可 39。 和棋 39。 \n 如有兴趣请 39。 再来一盘。基于vc的五子棋游戏软件的设计与开发—计算机毕业设计
相关推荐
教学资源 元数据抽取、评估、整理、入库、发布 数据库 WEB服务器 管理员 老师 学生 2.管理员栏目 公告管理:方便随时发布公告信息,这些公告信息将会在公共栏目中显示,它不同于教师栏目的公告管理,后者的公告信息是在学生栏目中显示。 ┃ 论坛管理:提供了学生和教师、学生和学生之间的交流。 资源管理:方便管理员随时对该教学平台进行修改与更新。 管理员栏目结构图: 3.学生栏目 在线学习
集的信号经过处理 后 直接送给单片机 处理 , 然后再通过 LCD1602进行显示。 方案二 光电传感器测速 基于光电传感器的 测量系统, 用 一直流的调速电机 来驱动转子 , 为了获取转速信号参数 , 需 陕西理工学院毕业设计 第 5 页 共 47 页 要在转盘 上 先 做好光 电标记,具体 实现 办法: 先 将 转盘擦干净再 涂黑, 用 黑色胶布 或者 黑漆都行 ,接着 再将一块反光材料贴在
教学资源 元数据抽取、评估、整理、入库、发布 数据库 WEB服务器 管理员 老师 学生 2.管理员栏目 公告管理:方便随时发布公告信息,这些公告信息将会在公共栏目中显示,它不同于教师栏目的公告管理,后者的公告信息是在学生栏目中显示。 ┃ 论坛管理:提供了学生和教师、学生和学生之间的交流。 资源管理:方便管理员随时对该教学平台进行修改与更新。 管理员栏目结构图: 3.学生栏目 在线学习
0 wait cycle for dataamp。 prog spaces STM 0x0000,BSCR。 set wait states for bank switch:。 64k mem bank, extra 0 cycle between。 consecutive prog/data read。 STM 0x1800,ST0。 ST0 at default setting。 STM
VSS94VDD95PC6/I2S2_MCK/TIM8_CH1/SDIO_D696PC7/I2S3_MCK/TIM8_CH2/SDIO_D797PC8/TIM8_CH3/SDIO_D098PC9/TIM8_CH4/SDIO_D199PA8/USART1_CK/TIM1_CH1/MCO100PA9/USART1_TX/TIM1_CH2101PA10/USART1_RX/TIM1_CH3102PA11
T; =htons(1088); /*将端口号转换成为网络字节顺序 */ =i_addr(“”) ;/*将 IP 地址串转换成为内部表示地址信息 */ ServerSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); /*分配服务器套接字 */ if(ServerSocket0) { perror(“Can39。 t allocate a new