五子棋实验报告(含代码)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
实验一五子棋游戏
北方工业大学 2013级计算机技术米鹏一、实验原理及方法
五子棋游戏开发借用Visual Studio 2012软件开发平台,选用C#语言进行编写。整体程序主要分为三部分:界面操作部分、AI逻辑部分和棋子定点分析部分。
1、界面操作部分
界面操作部分代码主要针对图像呈现、对应矩阵存储、下棋过程控制等可见的操作环节进编写。同时负责整个程序的初始化工作。
图像呈现采用C#中Graphics进行绘制。棋盘被划分为15行15列,每个划分出的小方格均为30*30的正方形,棋盘可操作的范围规定在(20,20)、(460,460)两点的确定的正方形区域内。通过鼠标左击来确定下子地点。程序会根据鼠标鼠标点击的位置进行计算,计算得到时对应矩阵的行列,之后再改变对应矩阵的内容后,在通过行列值乘以小方格边长计算得到在显示区域中的具体位置,再稍加变动后画到显示区域中。以X点坐标为例,下面是计算X(Column)的流程图:
在对应矩阵存储方面,后面AI逻辑和棋子分析所用到的矩阵都是来源这里。同时AI 逻辑和棋子分析不能去修改对应矩阵内容。图像呈现点的位置、重绘的根据都是来源这里。
在下棋过程控制方面采用信号亮的机制,当操作者下过后,根据信号AI会立即计算将要下点的位置同时改变信号亮变量。当AI下过棋子后,由于信号亮的的限制就等待操作者去下棋,同时改变信号亮变量内容。AI和操作者的所有下子、修改矩阵、显示棋子的过程都是统一的。
在每一盘游戏开始时程序会对一些重要的变量进行初始化这里包括矩阵、信号亮、第一步棋子颜色、呈现图像等内容进行初始化。同时AI会在棋盘中央下第一子。
2、AI逻辑部分
AI逻辑部分算是整个程序策略的灵魂。其中的一些关键性判别的前后关系将影响AI 的下棋的结果。同时加大和降低AI的难度也是这里。下面是我设计的策略过程:
从下棋者的考虑角度进行考虑,尽可能保证每一次下子都是有必要的、都是在情理当中的。我所设计的策略并不是完整,漏洞在与没有考虑三棋子连续的情况。
3、棋子定点分析部分
棋子定点分析部分是这个程序策略的支撑。分析的正确与否直接影响AI下子是否真的有意义、是否真的可以达到所需目的。这里的代码也是最复杂。这里包括了检测是否输赢的五棋子连续的状态、四子状态(再补一子,五子连续)存在与否、每个棋子的上到下、左到右、左上到右下、右上到左下,四个方向上棋子排列情况和可落子情况,同时分析出落子情况的优先级。对于优先级较高额在AI逻辑部分会优先选择下子。下面列举在从左到右这个方向上可下子的区域情况流程图:
二、源程序清单:
1、界面操作部分代码:
public partial class Form1 : Form
{
bool isBlack = true;
bool IsAI = true;
int[,] bg = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }; int change = 0;
public Form1(){
InitializeComponent();
this.Width = 497;
}
private void InitPanel(){
int index = 60;
Graphics gs = panel1.CreateGraphics();
Pen myPen = new Pen(Color.Black, 2);
gs.DrawLine(myPen, new Point(30, 30), new Point(30, 450));
gs.DrawLine(myPen, new Point(30, 30), new
Point(450, 30));
gs.DrawLine(myPen, new Point(450, 30), new
Point(450, 450));
gs.DrawLine(myPen, new Point(30, 450), new
Point(450, 450));
myPen.Width = 1;
while (index <= 420){
gs.DrawLine(myPen, new Point(30, index), new