1 / 19

计算机学院 0301 << 程序设计综合实验 >> 报告 题目 : 五子棋人机 , 人人对战 人员 : 肖伟 联系电话 :

计算机学院 0301 << 程序设计综合实验 >> 报告 题目 : 五子棋人机 , 人人对战 人员 : 肖伟 联系电话 : Email : 校网 :03jsjxw@st.zju.edu.cn 外网 :xiaowei6097@hotmail.com 任课老师 : 许端清 报告递交日期 : 2004 年 5 月 10 日. 功能简介. 成功 ~ 实现五子棋人机 , 人人对战 , 鼠标控制 , 实现悔棋 .

Download Presentation

计算机学院 0301 << 程序设计综合实验 >> 报告 题目 : 五子棋人机 , 人人对战 人员 : 肖伟 联系电话 :

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 计算机学院0301 <<程序设计综合实验>>报告 题目: 五子棋人机,人人对战 人员: 肖伟 联系电话: Email: 校网:03jsjxw@st.zju.edu.cn 外网:xiaowei6097@hotmail.com 任课老师: 许端清 报告递交日期: 2004年5月10日

  2. 功能简介 • 成功~ • 实现五子棋人机,人人对战,鼠标控制,实现悔棋. • 特色:有良好的人机对话模式,弹出窗口设计,可以保存和下载棋谱,可以让电脑破解你输入的棋局,可以个性话更改棋盘颜色,有较好的开机画面,中文显示,对于智能的设计,由于水平有限,采用穷举法,下棋时只考虑后两步棋.

  3. 失败~ • 没有有效加入键盘快捷键,.没有加入声音和时间限制,由于整个程序设计过程中,始终以整体设计为主,建立大概轮廓,然后细化精化细节,导致一些并非最优方法的出现.禁手函数不是写的很好(最终导致不用禁手,让电脑先下),还有一个已发现的小漏洞(等一下介绍).

  4. 已经发现的漏洞 • 运行程序的时候,有很小的概率会出现一个问题,经过调试大概是1/100左右,且如果出现一次这种情况,接下去就不会出现.在人机对战并正在按右键悔棋的时候,如果电脑发出滴的一声,就有可能只能悔一步棋,当时我设计人机对战悔棋时是同时悔两步棋的(主要原因是避免错位),但是如果电脑发出滴的声音,就只能悔一步,这样导致下面再下的时候错位.不过我想不是程序本身的问题,因为大部分情况不会出现这种情况

  5. 使用说明 • 基本上是鼠标操作,除了刚开始按键盘进入外. • 开始画面出现”五子棋”三个闪烁字,然后冒出火焰,接着你可以按任意键进入,或者10秒后自动进入. • 进入后任意点击鼠标,进入主画面并开是人人对战,点击人机对战就可以人机对战了.在比赛的任何时刻都可以改变棋盘颜色. • 右键或悔棋按钮悔棋.在比赛的任何时刻,可以按又上角退出按钮退出. • 比赛过程中,可以存储棋盘. • 比赛过程中,伴随情况的多源化,会弹出多个窗口判. • 由于设计的关系,你可以自己定义一个残局,然后储存,然后打开人机对战,然后在打开保存棋盘,这样就可以实现电脑破解棋局了(需要说明的是,在你摆下棋局是,最好最后一步别下,因为打开棋局的时候是你先走的,这时你下棋局的最后一步,电脑就可以破解棋局了)

  6. 程序 设计的基本过程 • 首先实现的是以直线为棋盘,以圆圈为棋子,用键盘控制,判断输赢,实现整体的五子棋初级模型. • 然后去掉键盘,加入鼠标控制,重写棋盘和画面,写入固态棋盘按纽.实现凹凸感. • 写入动态窗口控制画面,弹出窗口判断,并加入悔棋程序. • 实现人机对战,判断棋子优先级的算法,并写入禁手(可惜不是很全面,改写成机器先行,在源程序中保留禁手函数) • 汉化游戏. • 在每次过程中都进行大量调试,确保没错进入下一阶段编程.

  7. 在程序设计中碰到的困难 • 最大的问题是三个: • 中文显示和鼠标控制,读取棋盘 • 我写的时候发现中文(也就是文件操作)与鼠标不能共存,一开始我以为是程序的问题,调了很久.调试的方法是删一个函数调一下程序,一直调到最后一个函数,也就是把鼠标给删了,发现可以成功显示了,但是我还不知道哪里出问题了,我把两个程序分开都是对的,的出结论鼠标中运用的中断与文件操作不能同时运行.后来向老师请教,用TC3.编译,成功.

  8. 人机对战 • 人机对战我写过两遍,第一次智能太低,我把他删了;第二次,我把几个重要的棋盘存起来,然后让电脑根据我设计的规则下,我存了20几个基本点,然后每当对手下完棋后,电脑开始扫描,寻找优先级最高的点,如果出现相同,在这个点模拟下一个棋子,然后在判断,选优先级最高的.由于一开始设计时没想的很好,后来有更好的思路,但是没实现,曾试过写好后,出现一个小问题.

  9. 禁手设置 • 我根据人机对战的判断思路写了一下禁手设计,但是没成功,主要原因是没办法判断一两个特殊的禁手,和误判一个不是的禁手.本来发点时间可以改进的,但是考虑到设置禁手对大多数人来说是陌生的,会失去游戏本身的娱乐,于是放弃禁手,但作为一个函数(算法),我还是保留在源程序中,紧供参考. • 另一点是,我还不是非常清楚,哪一步是不是禁手

  10. 游戏实现 • 宏定义浏览 • #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为空;后面的操作均根据这个基本规则来的

  11. 主要函数浏览

  12. 基本函数介绍 • 图形设计函数 • 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)

  13. 基本图形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()在图形界面下显示汉字,以下是用这两个函数的到的图片.

  14. 实战函数 • 人机对战 • 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() 判断输赢函数

  15. 汉字显示和开机画面 • 汉字显示基本上是老师的汉字显示函数;经过加入坐标参数和颜色参数,实现任意位置显示;在通过上面图象窗口的画法,实现有凹凸感的字体显示; • 开机画面是利用调色板的改变出现效果,并用poke画点,并写了个画点函数,重新写了一个该模式下的汉字显示,通过扩大,改变字体. • (上述函数都有详细的注解,为了保证报告的一体化,在这里不详细叙述.)

  16. 时间控制函数 • 通过time.h中的函数,我实现时间控制,不过在程序执行中,玩家一般很难发现,除非他睡着了.主要实现过程是类似下面的结构 • time_t start,end; • start=time(NULL); • while(其他你需要的条件){ • `````` • end=time(NULL); • if(end-start>=(你规定的时间)break; • }

  17. 组合函数 • 本设计定义几个常用函数,通过组合使用减少程序的大小,使程序变的可读性更好 • 窗口设计函数,鼠标小图标判断函数,赢操作,复位函数和画棋函数等,同过自由组合实现不同功能 • void restart_p(), • Void win_com_con(); • int lit_win_con(); • Void putchess(); • `````

  18. 效果函数 • Void winshine();五子连珠闪烁函数 • Void cal(); 计数函数 • Void change_color(); 棋盘颜色自定义 • Void fire(); 开机画面 • Void end(); 结束 • 还有很多函数,这里就不一一介绍了,请看源程序(1,2,3,4)

  19. 基本介绍已经结束,个函数功能与用法在源程序中都做了说明.欢迎使用本程序基本介绍已经结束,个函数功能与用法在源程序中都做了说明.欢迎使用本程序 • 嘿嘿~~~~ 肖伟 QQ: 258103084 Emal:xiaowei6097@hotmail.com 2004.5.1

More Related