190 likes | 373 Views
计算机学院 0301 << 程序设计综合实验 >> 报告 题目 : 五子棋人机 , 人人对战 人员 : 肖伟 联系电话 : Email : 校网 :03jsjxw@st.zju.edu.cn 外网 :xiaowei6097@hotmail.com 任课老师 : 许端清 报告递交日期 : 2004 年 5 月 10 日. 功能简介. 成功 ~ 实现五子棋人机 , 人人对战 , 鼠标控制 , 实现悔棋 .
E N D
计算机学院0301 <<程序设计综合实验>>报告 题目: 五子棋人机,人人对战 人员: 肖伟 联系电话: Email: 校网:03jsjxw@st.zju.edu.cn 外网:xiaowei6097@hotmail.com 任课老师: 许端清 报告递交日期: 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}; /* 储存棋盘信息 */ • int tempx=0,tempy=0; /* 当前落子在数组chess的坐标 */ • Int bi=1; /* 当前下棋的颜色 */ • 在chess[][]中,1表是白棋,-1表示黑棋,0为空;后面的操作均根据这个基本规则来的
基本函数介绍 • 图形设计函数 • void blast(void); • void picture(void); • 窗口设计函数 • void void start_picture(void) • void re_picture(void) • void save_picture(void) • void download_picture(void) • void computer_picture(void) • void color_chess(void) • void common_picture(void)
基本图形3D(DRAW_3D())描绘函数与基本汉字输出函数(put_text())基本图形3D(DRAW_3D())描绘函数与基本汉字输出函数(put_text()) • void DRAW_3D(int x0,int y0,int x1,int y1,int width, int Shadow_color, int Light_color, int F_color)利用都次话图和颜色调节时图象有明暗效果和凹凸感觉. • void put_text(int x0, int y0, char *s1,int color1, int color2, int color3)利用跟DRAW_3D相同原理显示出艺术字效果,利用自定义在”hz.h”文件里面的hzmain()在图形界面下显示汉字,以下是用这两个函数的到的图片.
实战函数 • 人机对战 • void computer(); /* 主打函数,人机对战 */ • int com_search(); /* 判断棋子所在位置优先级的问题 */ • void direct_search(); /* 保存棋子8个方向棋子信息*/ • 悔棋函数 • Void getpicture() • Void putpicture() • 用一个链表记录棋子信息,用堆栽的原理,后进先出. • 下载,保存棋盘函数 • Void save_chess() • Void download_chess() • 考虑下一步 • int totlechess(int x_sit,int y_sit,int tempb) • Win() 判断输赢函数
汉字显示和开机画面 • 汉字显示基本上是老师的汉字显示函数;经过加入坐标参数和颜色参数,实现任意位置显示;在通过上面图象窗口的画法,实现有凹凸感的字体显示; • 开机画面是利用调色板的改变出现效果,并用poke画点,并写了个画点函数,重新写了一个该模式下的汉字显示,通过扩大,改变字体. • (上述函数都有详细的注解,为了保证报告的一体化,在这里不详细叙述.)
时间控制函数 • 通过time.h中的函数,我实现时间控制,不过在程序执行中,玩家一般很难发现,除非他睡着了.主要实现过程是类似下面的结构 • time_t start,end; • start=time(NULL); • while(其他你需要的条件){ • `````` • end=time(NULL); • if(end-start>=(你规定的时间)break; • }
组合函数 • 本设计定义几个常用函数,通过组合使用减少程序的大小,使程序变的可读性更好 • 窗口设计函数,鼠标小图标判断函数,赢操作,复位函数和画棋函数等,同过自由组合实现不同功能 • void restart_p(), • Void win_com_con(); • int lit_win_con(); • Void putchess(); • `````
效果函数 • Void winshine();五子连珠闪烁函数 • Void cal(); 计数函数 • Void change_color(); 棋盘颜色自定义 • Void fire(); 开机画面 • Void end(); 结束 • 还有很多函数,这里就不一一介绍了,请看源程序(1,2,3,4)
基本介绍已经结束,个函数功能与用法在源程序中都做了说明.欢迎使用本程序基本介绍已经结束,个函数功能与用法在源程序中都做了说明.欢迎使用本程序 • 嘿嘿~~~~ 肖伟 QQ: 258103084 Emal:xiaowei6097@hotmail.com 2004.5.1