五子棋源码实验报告及人机对战说明讲解

上传人:最**** 文档编号:114813061 上传时间:2019-11-12 格式:DOC 页数:25 大小:239.50KB
返回 下载 相关 举报
五子棋源码实验报告及人机对战说明讲解_第1页
第1页 / 共25页
五子棋源码实验报告及人机对战说明讲解_第2页
第2页 / 共25页
五子棋源码实验报告及人机对战说明讲解_第3页
第3页 / 共25页
五子棋源码实验报告及人机对战说明讲解_第4页
第4页 / 共25页
五子棋源码实验报告及人机对战说明讲解_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《五子棋源码实验报告及人机对战说明讲解》由会员分享,可在线阅读,更多相关《五子棋源码实验报告及人机对战说明讲解(25页珍藏版)》请在金锄头文库上搜索。

1、1. 五子棋对战说明2. 实验报告3. 源代码 五 子 棋作品特点:C语言程序 五子棋作品功能:五子棋人机对战,人人对战。目录:1 五子棋介绍。2 五子棋棋型介绍。3 人人对战的实现。4 电脑下子的实现。5 棋型价值的计算。6 胜利及棋型的判断。7 补充说明1 五子棋介绍。 五子棋是一种两人对弈的纯策略型棋类游戏。只要任意一方在棋盘上且同一个回合上连为五子为胜。还有禁手规则,在本程序中不作讨论。2 五子棋棋型介绍。 本程序中的棋型均为本人自定义。本程序总共设计35种棋型。表示玩家的棋子,表示电脑的棋子。以下称电脑方为己方,玩家方为对方。从一空点向某一方向判断该方向的棋型。某一方向指1-8方向

2、从右顺时针开始数。(1) 空棋型。从一空点向一方向看连续2个为空的棋型。空棋型共1种。 如图,从左端的空点向右看会发现有连续2个空点。(2) 活棋型。2端无挡的棋型为活棋型。活棋型共8种:己方4种,对方4种。 左图为 己活3 。从左端的空点向右看会发现己方有连续的3个子,且右端无挡。故该点的1方向为己活3。 左图为 对活2(3) 冲棋型。1端无挡的棋型为冲棋型。冲棋型共9种:己方4种,对方4种,边界1种。左图为边界冲棋型。空点的右端为边界。 或 左图为 己冲2。从左端的空点向右看会发现己方有连续的2个子,且右端有挡(此处有挡表示有对方的子或为边界)。故该点的1方向为己冲2。左图为 对冲4。(4

3、) 空活棋型。从一空点向一方向看有1个空点,继续看有己方或对方的活棋型。空活棋型共8种:己方4种,对方4种。左图为 己空活2。从左端的空点向右看有1个空点,继续看会发现己方有连续的2个子,且右端无挡。故该点的1方向为己空活2。左图为 对空活1。(5) 空冲棋型。从一空点向一方向看有1个空点,继续看有己方或对方或边界冲棋型。空冲棋型共9种:己方4种,对方4种,边界1种。 左图为边界空冲棋型。空点的右端为空点再右看为边界。 或左图为 己空冲2。从左端的空点向右看有1个空点,继续看会发现己方有连续的2个子,且右端有挡。故该点的1方向为己空冲2。3 人人对战的实现。 双方玩家轮流下子,直到一方形成五连

4、即判为胜方。下子时输入棋盘上显示的对应坐标。如果某方需要悔棋,则输入 15 15 即可。悔棋只能悔一步。在人机对战中亦可悔棋。 4 电脑下子的实现。 人机对战中电脑下子是通过AI(int *p,int *q)这个函数实现的。用p 、q返回下子的坐标。先历遍棋盘上所有点,如发现一个空点则调用函数value(int p,int q)计算该空点的价值。每个点又由8个方向的棋型组成。调用函数qixing(int n,int p,int q)判断空点p q在n方向上的棋型号。对每种棋型进行赋值,然后对各个方向的棋型进行分析。最后计算出该空点的价值。如此找到棋盘上价值最大的空点,则电脑在该处下子。5 棋型

5、价值的计算。 棋型价值的计算是通过函数value(int p,int q)实现的。先调用函数qixing(int n,int p,int q) 判断空点p q在n方向上的棋型号。n为1-8方向 从右顺时针开始数。对8个方向的棋型进行分析后给出该点的价值。各种棋型的价值存在数组a244中。本程序将两相反方向的棋型进行合在一起进行分析。本程序分为六类进行讨论。 空棋型and其他。 边界冲棋型and其他。 边界空冲棋型and其他。 己活己活 己活己冲 对活对活 对活对冲。 己活对活 己活对冲 己冲对活 己冲对冲。 其他棋型。6 胜利及棋型的判断。 胜利及棋型的判断都调用了函数yiwei(int n,

6、int *i,int *j)。在n方向上对坐标 i j 移位。 n为1-8方向 从右顺时针开始数。胜利的判断:每下一次子从该点向1方向移位,移位后判断新点是否与下的子相同。如相同则继续移位判断,否则转向判断即n+=4;如转向后仍然没五连,则换下一个方向判断即n-=3;直到出现五连则胜利,如果8个方向判断完都没有五连则返回0,表示还未胜利。棋型的判断:棋型的判断主要运用switch语句。在某一方向移位后判断该点的状态。最后得出该方向上的棋型号。7 补充说明1.在WIN7环境下用VC+运行棋盘之间有空隙,影响美观。建议在XP操作系统下运行。2.程序经过多次修改。各次修改如下:V1.1 修改了胜负判

7、断函数win的算法。V1.2 加上了人人对战的功能,并加上了开始界面。V1.3 增加了一些注释,并对棋型值数组做了更改。V1.4 修正了2个BUG,进一步对棋型值数组做了更改。V1.5 修改了画棋盘draw的算法,改变了主函数main,增加函数start,并增加了赢棋之后是否继续的功能,还完善了各棋型的赋值,进一步对棋型值数组做了更改。 实验报告 2014 2015 学年第 一 学期 任课老师: 课程名称结构化程序综合设计班级学号姓名实验题目设计一个简单五子棋游戏程序实验时间实验开始日期: 报告提交日期: 实验目的、要求实验题目 设计一个简单五子棋游戏程序,能够实现人机对战!实验要求(1)、输

8、出游戏规则并由用户决定是否遵守并开局。(2)、要求动态画出棋盘大小。(3)、画棋子并确定其颜色。(4)、玩家轮流下棋。(5)、判断键盘输入哪个键按规则执行操作(6)、判断谁先落棋。(7)、判断赢家实验步骤与内容1、 主要设计思想;有使用光标移动函数,进行光标的移动,将光标跟存下棋子的数组结合一起运用,其中人下棋子只需一个光标位置移动函数即可,对于电脑下棋,这就需要一个函数找出在棋盘中所有没有落子的位置进行判断,找出其中价值最大的一点并将光标移过去,判断是否胜利就是一个判断函数,每次下棋子都要判断,主要判断方法就是在这一点上、下、左、右、左斜上、右斜上、左斜下、右斜下,八个方向判断一下即可。2、

9、程序框图3、核心代码解释void gotoxy(int x, int y) ;/建立坐标函数void drawqipan(); /绘制棋盘及数据初始化void jilu(); /人机记录落子情况int cluozi(int x,int y); /由电脑落子时调用void luozi(); /人机玩家落子int checkWin(); /检查游戏是否有输赢void Keypress(char n); /人机光标位置移动void Keypress1(char n); /人人光标位置移动void yiwei(int n,int *i,int *j); /* 在n方向上对坐标 i j 移位 n为1-8

10、方向 从右顺时针开始数 */int qixing(int n,int p,int q) ; /*checkWin 返回空点p q在n方向上的棋型号 n为1-8方向 从右顺时针开始数 */int value(int p,int q); /* 计算空点p q的价值 以k返回 */void AI();/* 电脑下子*/void luozi1(); /人人玩家落子void jilu1(); /人人记录落子情况/光标函数void gotoxy(int x, int y) /建立坐标函数 COORD c; c.X=2*x; c.Y=y; SetConsoleCursorPosition (GetStdHa

11、ndle(STD_OUTPUT_HANDLE), c); /修改当前光标的位置/光标位置移动void Keypress(char n) switch(n) case up:weizhi.y-;gotoxy(weizhi.x,weizhi.y);break; /向上移动光标 case left:weizhi.x-;gotoxy(weizhi.x,weizhi.y);break; /向左移动光标 case right: weizhi.x+;gotoxy(weizhi.x,weizhi.y);break; /向右移动光标 case down: weizhi.y+;gotoxy(weizhi.x,we

12、izhi.y);break; /向下移动光标 case lz:luozi();break; /开始落子操作 / 电脑下子void AI() /* 电脑下子 *p *q返回下子坐标 */ int i,j,k,max=0,I,J; /* I J为下点坐标 */ for(j=0; j15; j+) for(i=0; i=max) I=i;J=j;max=k; cluozi(I,J);/找到价值最大的点电脑下子实验结果记录以及与预期结果比较以及分析1、 程序调试过程中遇到的困难期间遇到了一个致命的错误,找了好久好久才发现,就是光标函数的i,j 跟储存棋盘情况的i,j正好相反,这个错误找出来感觉真是不容

13、易,还有一个麻烦就是在人机对战的时候刚刚开始执行的人下完棋子就判断结果,所以每次判断都有延迟,最后才发现,不管是人跟电脑下棋子后都应该判断。其他还是七七八八的小错误,现在想想要想把一个程序不出错的编写确实不容易啊!2、 程序结果 结果:人人对战总结以及心得体会 经过本次试验,我c语言的应用了,以前只是编写一些小小的程序,现在可以利用简单的c程序可以做出稍微大型一点的程序,像五子棋这种游戏想想我们玩的时候感觉很奇妙,但是经过我的深思熟虑我也可以在计算机用简单的c语言给搞定了,我们有时感觉一个小小的游戏玩的时候感觉很简单,但是在用代码实现的时候却发现考虑的东西很多,不然那个游戏的bug就会很多,得经过好多实例的检验。 只有这样我们才能让程序按照我们的意愿去实现它的功能!指导老师评阅意见指导老师: 年 月 日源码:#include windows.h#include stdio.h#include conio.h#define up w#define left a#define down s#define right d#define lz p#define cls m# define SPA 0# define MAN 1# define COM 2 /* 空位置设为0 ,玩家下的位置设为1

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号