五子棋相信大部分人都玩过,至少应该听说过。(五子棋源码)
简述一下规则:当在棋盘的横行或竖行或斜行(左斜与右斜)有五个及以上连续的棋子的时候,则为赢。
分析一下五子棋的算法,当下一个棋子的时候(对应相应的棋盘应该有一个坐标),应该判断下的棋子的横行,横行或竖行或斜行(左斜与右斜)是否满足连续棋子的个数大于等于5个,每次下一个棋子的时候都应该有所判断,每次都应该对4个大的方向(横行,竖行,左斜,右斜)进行遍历算法。
如下图 :
图中黑棋已经有3颗连续的,加上右边一颗(中间有一个还没下,为了陈诉方便,我把它命名为s),显然如果现在归黑棋下的话,s为最佳位置。人很好判断,只是对应计算机的话,我们应该怎么使用算法让计算机明白放在s位置能够赢。
放入S位置后,应该设置一个记数标志count判断某一个方向的的棋子数是否大于等5,即count>=5是否成立。图中的四个大的方向,每次遍历每个方向前,应该将count置1;
而且对应米一个具体的方向,比如横行,严谨的来说遍历的时候还是应该遍历两个方向的,一个是s位置的左边,遍历一遍,记录下连续棋的个数,然后回到S点,再进行右边的遍历,左右的count值相加,判断是否大于等于5;这样说来,细一点的话应该为8个方向,两个相对。
初始的时候
黑棋的坐标位置的值我们默认为1
白棋的坐标位置的值默认为2;
还没有下棋子的位置我们默认为0;
public boolean CheckWin(int xIndex, int yIndex) {
int max = 0;
int tempXIndex = xIndex;
int tempYIndex = yIndex;
// 三维数组记录横向,纵向,左斜,右斜的移动
int[][][] dir = new int[][][] {
// 横向
{ { -1, 0 }, { 1, 0 } },
// 竖着
{ { 0, -1 }, { 0, 1 } },
// 左斜
{ { -1, -1 }, { 1, 1 } },
// 右斜
{ { 1, -1 }, { -1, 1 } } };
for (int i = 0; i < 4; i++) {
count = 1;
//j为0,1分别为棋子的两边方向,比如对于横向的时候,j=0,表示下棋位子的左边,j=1的时候表示右边
for (int j = 0; j < 2; j++) {
flag = true;
/**
while语句中为一直向某一个方向遍历
有相同颜色的棋子的时候,Count++
否则置flag为false,结束该该方向的遍历
**/
while (flag) {
tempXIndex = tempXIndex + dir[i][j][0];
tempYIndex = tempYIndex + dir[i][j][1];
//这里加上棋盘大小的判断,这里我设置的棋盘大小为20 具体可根据实际情况设置 防止越界
if (tempXIndex >= 0 && tempXIndex <= 20 && tempYIndex >= 0 && tempYIndex <= 20) {
if ((a[tempXIndex][tempYIndex] == a[xIndex][yIndex])) {
count++;
System.out.println(count);
}
else
flag = false;
}else{
flag = false;
}
}
tempXIndex = xIndex;
tempYIndex = yIndex;
}
if (count >= 5) {
max = 1;
break;
} else
max = 0;
}
if (max == 1)
return true;
else
return false;
}