五子棋算法判断输赢

来源:互联网 发布:可米小子诅咒 知乎 编辑:程序博客网 时间:2024/05/01 02:26

五子棋相信大部分人都玩过,至少应该听说过。

简述一下规则:当在棋盘的横行或竖行或斜行(左斜与右斜)有五个及以上连续的棋子的时候,则为赢。

分析一下五子棋的算法,当下一个棋子的时候(对应相应的棋盘应该有一个坐标),应该判断下的棋子的横行,横行或竖行或斜行(左斜与右斜)是否满足连续棋子的个数大于等于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];                                                if ((a[tempXIndex][tempYIndex] == a[xIndex][yIndex])) {count++;System.out.println(count);} elseflag = false;}                                tempXIndex = xIndex;tempYIndex = yIndex;}if (count >= 5) {max = 1;break;} elsemax = 0;}                   if (max == 1)return true;elsereturn false;}









0 0