五子棋的开发文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
五子棋开发文档
1、开发工具
核心算法——应用c++开发,并生成dll文件供界面程序调用。
棋盘界面——应用c#.net开发,完成下棋时的人机交互。
2、核心算法程序
用于实现下棋过程中的“胜负判断”和“下棋决策”。
程序中,各函数功能如下:
void restart()——开局函数。
实现核心算法中的棋盘落子记录数组flag[15][15]清零,用于标志新的一局游戏开
始。每次开始新游戏时调用。
int judge()——判断游戏胜负函数。
返回值:0 ——未分胜负;1 ——人胜; 2 ——计算机胜。
int donext(int x,int y,int *nx,int *ny) ——计算机落子决策算法I。
参数说明:
x ——人落子的竖轴坐标。
y ——人落子的横轴坐标。
nx ——计算机决策的落子的竖轴坐标。
ny ——计算机决策的落子的横轴坐标。
算法说明:
该算法分四个方向扫描,分别是左——右、上——下、左上——右下、右上——左下。每次扫描根据可落棋子处在该方向上的两侧的已有棋子情况,判断该落棋点的防御价值和进攻价值。四个方向扫描完成后,如果所有可落棋点均不构成威胁,则选择最有利的进攻方式落棋;若可构成威胁,但有可致胜进攻位置,则按可致胜的进攻位置落棋;落构成威胁且无更佳的进攻位置,则落棋至威胁最大的位置。
int donext2(int x,int y,int*nx,int*ny) ——计算机落子决策算法II。
x ——人落子的竖轴坐标。
y ——人落子的横轴坐标。
nx ——计算机决策的落子的竖轴坐标。
ny ——计算机决策的落子的横轴坐标。
算法说明:
该算法按从左到右,从上到下的方式扫描整个棋盘,并分别决策每个可落棋点的防御价值和进攻价值。每次扫描根据可落棋子处在左——右、上——下、左上——右下、右上——左下四个方向,共8侧的已有棋子情况,判断该落棋点的防御价值和进攻价值时,根据所判方向的两侧落子情况进行。决策时还需考虑连续棋子的长度因素,共同评估该处落子的危险程度(对方)和取胜程度(己方)。落棋后,无连续棋子,赋值为1;连续棋子长度为2,半死-2,全死-0,活棋-9;连续长度为3,全死-0,半死-3,活-37;长度4:半死-4,全死-0,活-149;长度为5:600。
整个棋盘扫描完成后,如果所有可落棋点均不构成威胁,则选择最有利的进攻方式落棋;若可构成威胁,但有可致胜进攻位置,则按可致胜的进攻位置落棋;落构成威胁且无更佳的进攻位置,则落棋至威胁最大的位置。
int setvalue(int lflag,int llength,int lb,int rflag,int rlength,int rb,int f)——用于评价每落棋点的威胁程度和进攻价值。
参数意义:
Lflag——左侧已有棋子性质。
Llength——左侧已有棋子的连续长度
Lb——左侧连续棋子的左侧是否是活棋
Rflag——右侧已有棋子性质。
Rlength——右侧已有棋子的连续长度
Rb——右侧连续棋子的左侧是否是活棋
f——计算的是威胁程度还是进攻价值的标记。若为Flag_person,则计算的是威胁程度;若为flag_computer,则计算的是进攻价值。
void initsetvalue()——用于初始化评价数组的函数,每次决策下一步步骤时调用。
int getvalue(int x,int y,int* pv,int* cv)——得到每一位置的威胁程度和进攻价值的数值。调试时用。
3、棋盘界面程序
游戏时界面如下:
图1 设置游戏中的先手
图2 游戏过程中的画面
3.1 功能介绍
每次开始新游戏时,需点击“开始游戏”菜单,然后弹出设置先手关系的界面,如图1所示。游戏过程中画面,如图2所示。
3.2 函数介绍
void DrawChessbord(Graphics gp)——绘制棋盘。在onpaint时间处理重载函数中调用。
void DrawChess(Graphics gp)——绘制棋子。在onpaint时间处理重载函数中和每次落子(包括人和计算机)后调用。
private int[] findposition(int x,int y)——根据鼠标位置,映射落子的棋盘位置。
private void Form1_Click(object sender, EventArgs e)——鼠标单击事件处理函数。处理落子后的显示和计算机决策函数的调用,用于完成人机交互的主要功能。