五子棋是一款休闲益智类的游戏,老少皆宜。游戏的玩法很简单,即在棋盘的一条线上连成颜色相同的五子及获胜,可你知道在游戏的制作的内部,是怎么判定五子棋获胜的吗?
我们先来看一张图 ,该图是五子棋的棋盘,五子棋的棋盘是 x为(0,14),y为(0,14)既 x, y各为15行
以该图的中心棋子为例,我们知道要五子连珠,无非就是四种可能 ,如图所示红线,绿线,蓝线,黑线,连成5子
这就有了四种扫描棋子的方式,(1,0)红线方向 1是扫描一颗棋子的偏移量
(0,1)绿线方向
(1,1)蓝线方向
(1,-1)黑线方向
这些是扫描棋子的偏移量offset
在开始可以定义数组来存储棋子的位置//生成棋子的位置 int[] pos = new int[2];
int [,]grid = new int [15,15];//记录棋子的信息
int linkNum //记录同色棋子连在一起的数量
我们假定下黑子 grid[pos[0],pos[1]] =1;白子为grid[pos[0],pos[1]] =2;
假设从中间的棋子开始扫描,从红线这条线开始扫描可以分为左边和右边,右边是(1,0),左边则是(-1,0)
,那么AI(电脑)是怎么判定的呢?
首先走红线的话,如果往右边走,扫描如果是黑子则linkNum++;如果是空子则返回方法;如果是白子也返回该方法
同样的道理走完左边也是一样的原理
以中心棋子为例,扫描四个方向 当linkNum>4,即五子的时候,就会判定游戏的胜利
具体代码实现如下
public ChessType turn = ChessType.Black; //当前轮到黑字下棋
//turn 是该谁下棋了,(int)turn 代表棋子的颜色
//扫描一行棋子的方法
public bool CheckOneLine(int[] pos, int[] offset)//判定是否嬴
public bool CheckWinner(int[] pos)
{
if (CheckOneLine(pos, new int[2] { 1, 0 })) return true;
if (CheckOneLine(pos, new int[2] { 0, 1 })) return true;
if (CheckOneLine(pos, new int[2] { 1, 1 })) return true;
if (CheckOneLine(pos, new int[2] { 1, -1 })) return true;
return false;
}