当前位置:文档之家› 编程-C语言-课程设计-黑白棋

编程-C语言-课程设计-黑白棋

界面特色:
按照人人对弈、机机对弈、人机对弈的逻辑要求,从显示上提示玩家颜色、AI1策略、AI2策略的有意义与否并若无意义,则无法对该量进行更改。
界面三:下棋界面
功能简介:主要包括以下几个方面。
A.下棋:
a.人人对弈
b.人机对弈(在玩家被欠手时,会Sleep3000ms)
c.机机对弈(在任一方被欠手时,会Sleep3000ms)
{
int a[9][9][65];//储存全部棋盘的状态(0为空,1为黑,2为白,3为空但目前可让黑棋下,4为空但目前可让白棋下。)
int n;//为目前已走的步数,确切的说为目前棋盘上的棋子总数再减去4。
int c[65];//第i部到底是谁走的?1为黑,2为白。
int x[65];//第i步所走位置的x坐标
voidmousecontrol ()
//绘图,定义鼠标状态结构体,判断走棋点
//根据游戏模式获取玩家鼠标操作内容或ai返回数据
/*根据不同的点击位置,调用函数:
musiccontrol();
remindercontrol();
huiqicaozuo();
savecasechange
界面与控制相关函数:
voidmenuload0 ()
//这个是在系统检测到你上一次没有正常退出时跳出的菜单
voidmenu0 ()
//这是执行最初的那个选择菜单.在这个选择菜单中,通过一系列鼠标操作对一些控制游戏模式的全局参量进行修改。
//并且,在这个菜单中还可以选择读取。
voidcountandchangestyle ()
读取记录
(从三个记录中选取一个进行读取,若该记录为空,则会在本界面中有文字提示。)
进入条件:
A.在保存或下完后从下棋界面点击restart时。B.上次是正常退出,这次打开程序时
跳出方向:
点击确定则按照选取的模式开始新的游戏,进入下棋界面。
点击确定读取且读取成功,则按照读取文件的信息继续游戏,进入下棋界面。
int y[65];//第i步所走位置的y坐标
};
structyy
{
intleft;
intright;
intupper;
intunder;
intupperleft;
intunderleft;
intupperright;
intunderright;
intsum;
};
structAI
{
intx;
inty;
int ifrestart;//标记现在是否急切地需要进行restart的操作,如果真的需要的话,为1,否则为0。
int ifneedautoload=1;//标记是否需要启动自动读取。0为需要,1为不需要。
int ifload=0;//是否进行了自动读取,0为否;1为是。
int savecase=1;//标记储存量,0为不需要执行储存操作,1、2、3分别为需要对文件1、2、3进行储存操作
};
xx chucun;//用结构体xx定义储存量,但这个东西其实也就只能算是历史量了~。我拒绝在初始状态下进行储存!
yy zhuangtai[9][9];//用结构体yy定义棋子状态,有8个参量表示8个方向能吃到的子的数目。一个参量表示这八个量的总和。
在后面有越序调用的函数的声明。
(略)
储存相关函数:
voidsavex (wchar_t *place)
//这个函数是对于存档进行转存,将save.txt中的全部内容存到*place中,并将save.txt清空
voidsavexx ()
//这个函数是根据全局变量savecase进行转存,1、2、3分别对应save1.txt、save2.txt、save3.txt,然后对savecase进行归1。
//用于判断能否走棋以及怎么走棋。
voidjudgement (int a)
//a为要判断的子的颜色,1为黑,2为白。
//对棋盘上的所有位置调用jszhuangtai进行调用,并计入到全局参数YY zhuangtai中。
voiddrawscreen1 ()
//初始化棋盘上的那四个子
voiddrawscreen2 (int qz[10][10])
黑白棋实验报告
一、功能说明:
主要由三个界面实现。现以界面为序进行逐一介绍。
界面一:自动恢复:
功能简介:恢复棋局。
进入条件:
当上次从下棋界面进行了非正常跳出时,跳出。如果这个非正常跳出是关闭窗口,则在下次打开程序时跳出。
(定义:下棋界面的非正常跳出指的是在一局棋没有下完并且也没有储存的状态下,点击restart按钮或者关闭窗口。)
F.背景音乐:选取古筝曲《春江花月夜》循环播放。且在这个界面可以执行暂停、继续操作。
G.储存:选择储存的目标文件与确定储存按钮。
H.Restart按钮
(在悔棋和保存时,会有情况判断。拒绝开局和游戏结束时的保存和悔棋,并在界面中有文字提示说明。(结束时悔棋太赖了~而保存功能主要是为了以后接着下的,结束时保存无意义,想留一下棋局的话直接按prt sc吧~))
char black1,black2,white1,white2;//不能直接输出数据,于是将black与white存在这两组字符数中。
int couldmoveblack,couldmovewhite;//记录截止到现在最后一次该黑/白走时,它所能走的不同步数。
int ifjieshu;//标记游戏是否已经结束,0为未结束,1为结束。
voidloadx (wchar_t *place)
//这个函数是将*place转存到save.txt中,再将save读到内存
voidloadxx ()
//这个函数是根据loadcase进行读取,1、2、3分别对应save1.txt、save2.txt、save3.txt,然后对loadcase进行归1。
//计数black与white并将其转存到black1、2与white1、2中。然后再画出来。
voiddrawscreen0 ()
//绘制图像,所有与棋盘状态无关的部分。
yyjszhuangtai (int qz[10][10],int m,int n,int a)
//a为要判断的子的颜色,1为黑,2为白。返回的是对于一个输入的棋盘状态,计算m,n位的子,在八个方向能吃到的子数。
//2为3步贪吃AI
//3为复合ai1
//4为搜索(一)AI014
//5为搜索(二)
//6为搜索(三)
int kindofai_=1;//这个量标记了现在AI的状态。
//1为随机AI
//2为3步贪吃AI
//3为复合ai1
//4为搜索(一)AI014
//5为搜索(二)
//6为搜索(三)
structxx
int music;//音乐状态:1为开,0为关。
int reminder;//提示状态:1为开,0为关。
int wanjiayanse;//玩家颜色:1为黑(后手),2为白(先手)。
int mode;//游戏模式:1为人人对弈,2为人机对弈,3为机机对弈。
int black,white;//当前状态下某种颜色棋子的数目,分别为白色和黑色。
int loadcase=1;//标记读取量,0为不需要执行读取操作,1、2、3分别为需要对文件1、2、3进行读取操作
int ifcouldload=0;//这个量是针对手动读取的,如果为1,则认为这个量不可读,否则,则认为可读。
int kindofai=1; //这个量标记了现在AI的状态。
//1为随机AI
AI功能说明:(六个AI基本依强弱序,搜索一与搜索二强弱差异不大)
随机策略:
从所有能走的点中随机选取一个点落子。(为1所写)
贪吃策略:
考虑5步,选择所有五步后的情况中,己方子数最多的一种情况进行走子。
复合估价:
针对一个随输入棋盘情况的不同而动态调整估价值的估值函数进行直接估价,走子。
这个动态估价函数会在一个比较复杂的估价列表的基础上,对于十二种不同的特定边角情况进行判断然后进行估价调整。
跳出方向:
有询问是否进行自动回复的按钮。如果选择是,则回到下棋界面,并恢复上次未下完的棋局。如果选择否,对上次未下完的棋局进行清空并进入游戏模式选择界面。
界面二:游戏模式选择
功能简介:游戏模式选择。主要有一下几种模式:
人人对弈
人机对弈,玩家先手
人机对弈,玩家后手
机机对弈
(其中,每种有AI参与的模式中的每个AI均可以有6种选择)
进入条件:
A.在模式选择界面选择玩游戏模式并按确定键时B.在模式选择界面选择读取时C.在自动恢复界面选择“是”(自动回复)时。
跳出方向:
在按restart按钮时,会根据是否是正常跳出,跳到自动恢复界面或游戏模式选择界面。
其它特色:
鼠标操作手动截流。(graphics.h的获取鼠标信息函数不截流,会导致明明只按了一下却响应多下的情况,于是手动对次进行了一下调整。)
并且:首先,它会判断一下有没有点能走完之后使得对手欠手。如果有,直接走。其次,在临终局12步时,进入残局搜索,一搜到底。
搜索(二):
针对一个静态估价值的估价函数进行5步搜索估价,走子。
这个估价函数的主要原理就是角、边、其它地方的价格不再同一个数量级上,其他地方的价格之间有细微差距。
并且:首先,它会判断一下有没有点能走完之后使得对手欠手。如果有,直接走。其次,在临终局12步时,进入残局搜索,一搜到底。
搜索(三):
针对一个随输入棋盘情况的不同而动态调整估价值的估价函数进行5步搜索估价,走子。
这个估价函数就是复合估价的估价函数。
并且:首先,它会判断一下有没有点能走完之后使得对手欠手。如果有,直接走。其次,在临终局12步时,进入残局搜索,一搜到底。
相关主题