计算机学院0301程序设计综合实验报告题目五子棋人.ppt
文本预览下载声明
计算机学院0301 程序设计综合实验报告 题目: 五子棋人机,人人对战 人员: 肖伟 联系电话: Email: 校网:03jsjxw@ 外网:xiaowei6097@ 任课老师: 许端清 报告递交日期: 2004年5月10日 功能简介 成功~ 实现五子棋人机,人人对战,鼠标控制,实现悔棋. 特色:有良好的人机对话模式,弹出窗口设计,可以保存和下载棋谱,可以让电脑破解你输入的棋局,可以个性话更改棋盘颜色,有较好的开机画面,中文显示,对于智能的设计,由于水平有限,采用穷举法,下棋时只考虑后两步棋. 失败~ 没有有效加入键盘快捷键,.没有加入声音和时间限制,由于整个程序设计过程中,始终以整体设计为主,建立大概轮廓,然后细化精化细节,导致一些并非最优方法的出现.禁手函数不是写的很好(最终导致不用禁手,让电脑先下),还有一个已发现的小漏洞(等一下介绍). 已经发现的漏洞 运行程序的时候,有很小的概率会出现一个问题,经过调试大概是1/100左右,且如果出现一次这种情况,接下去就不会出现.在人机对战并正在按右键悔棋的时候,如果电脑发出滴的一声,就有可能只能悔一步棋,当时我设计人机对战悔棋时是同时悔两步棋的(主要原因是避免错位),但是如果电脑发出滴的声音,就只能悔一步,这样导致下面再下的时候错位.不过我想不是程序本身的问题,因为大部分情况不会出现这种情况 使用说明 基本上是鼠标操作,除了刚开始按键盘进入外. 开始画面出现”五子棋”三个闪烁字,然后冒出火焰,接着你可以按任意键进入,或者10秒后自动进入. 进入后任意点击鼠标,进入主画面并开是人人对战,点击人机对战就可以人机对战了.在比赛的任何时刻都可以改变棋盘颜色. 右键或悔棋按钮悔棋.在比赛的任何时刻,可以按又上角退出按钮退出. 比赛过程中,可以存储棋盘. 比赛过程中,伴随情况的多源化,会弹出多个窗口判. 由于设计的关系,你可以自己定义一个残局,然后储存,然后打开人机对战,然后在打开保存棋盘,这样就可以实现电脑破解棋局了(需要说明的是,在你摆下棋局是,最好最后一步别下,因为打开棋局的时候是你先走的,这时你下棋局的最后一步,电脑就可以破解棋局了) 程序 设计的基本过程 首先实现的是以直线为棋盘,以圆圈为棋子,用键盘控制,判断输赢,实现整体的五子棋初级模型. 然后去掉键盘,加入鼠标控制,重写棋盘和画面,写入固态棋盘按纽.实现凹凸感. 写入动态窗口控制画面,弹出窗口判断,并加入悔棋程序. 实现人机对战,判断棋子优先级的算法,并写入禁手(可惜不是很全面,改写成机器先行,在源程序中保留禁手函数) 汉化游戏. 在每次过程中都进行大量调试,确保没错进入下一阶段编程. 在程序设计中碰到的困难 最大的问题是三个: 中文显示和鼠标控制,读取棋盘 我写的时候发现中文(也就是文件操作)与鼠标不能共存,一开始我以为是程序的问题,调了很久.调试的方法是删一个函数调一下程序,一直调到最后一个函数,也就是把鼠标给删了,发现可以成功显示了,但是我还不知道哪里出问题了,我把两个程序分开都是对的,的出结论鼠标中运用的中断与文件操作不能同时运行.后来向老师请教,用TC3.编译,成功. 人机对战 人机对战我写过两遍,第一次智能太低,我把他删了;第二次,我把几个重要的棋盘存起来,然后让电脑根据我设计的规则下,我存了20几个基本点,然后每当对手下完棋后,电脑开始扫描,寻找优先级最高的点,如果出现相同,在这个点模拟下一个棋子,然后在判断,选优先级最高的.由于一开始设计时没想的很好,后来有更好的思路,但是没实现,曾试过写好后,出现一个小问题. 禁手设置 我根据人机对战的判断思路写了一下禁手设计,但是没成功,主要原因是没办法判断一两个特殊的禁手,和误判一个不是的禁手.本来发点时间可以改进的,但是考虑到设置禁手对大多数人来说是陌生的,会失去游戏本身的娱乐,于是放弃禁手,但作为一个函数(算法),我还是保留在源程序中,紧供参考. 另一点是,我还不是非常清楚,哪一步是不是禁手 游戏实现 宏定义浏览 #define DIM 16 /* 定义棋盘格子个数*/ #define UPX 40 /* 定义棋盘大小 */ #define UPY 40 #define DOWNX 440 #define DOWNY 440 #define TEMP ((DOWNX-UPX)/DIM) /* 单位格子大小*/ #define RADIUS (TEMP/2-2) /* 棋子大小*/ int chess[DIM+1][DIM+1]={0}; /
显示全部