代码:
package com.hotusm.datastructure.list;
import com.hotusm.datastructure.Log;
/**
* @author luqibao
* @date 2017/3/17
*/
public class Chess {
public static final int WHITE = 1; //白棋
public static final int BLACK = 2; //黑棋
private int[][] chessboard;
private int xSize;
private int ySize;
public Chess(int size) {
chessboard = new int[size][size];
xSize = size;
ySize = size;
}
public Chess() {
chessboard = new int[16][16];
xSize = 16;
ySize = 16;
}
public void play(int x, int y, int who) {
if (x > xSize || y > ySize) {
Log.warn("超出范围!");
return;
}
if (chessboard[x][y] != 0) {
Log.warn("该位置不能下");
return;
}
chessboard[x][y] = who;
if (isSuccess()) {
Log.info("who:" + who + "已经获胜");
}
}
public boolean isSuccess() {
//x轴
for (int i = 0; i < ySize; i++) {
for (int j = 0; j < xSize; j++) {
if (xSize - j < 5) {
break;
}
if (arriSSame(chessboard[i], j, j + 5)) {
return true;
}
}
}
//y轴
for (int i = 0; i < xSize; i++) {
for (int j = 0; j < ySize; j++) {
if (ySize - j < 5) {
break;
}
if (arriSSame(copyY2X(chessboard, i), j, j + 5)) {
return true;
}
}
}
//交叉
if (isCrossSame()) {
return true;
}
return false;
}
/**
* 将数组的Y列数据拷贝到一维数组中去
*
* @param arr
* @param y
* @return
*/
private int[] copyY2X(int[][] arr, int y) {
int[] nArr = new int[ySize];
for (int i = 0; i < ySize; i++) {
nArr[i] = arr[i][y];
}
return nArr;
}
/**
* 是否有5个相同
*
* @param arr
* @param x1
* @param x2
* @return
*/
private boolean arriSSame(int[] arr, int x1, int x2) {
int sameNum = 1;
for (int i = x1; i < x2 - 1; i++) {
if (arr[i] == arr[i + 1] && arr[i] != 0) {
sameNum++;
if (sameNum == 5) {
return true;
}
} else {
sameNum = 1;
}
}
return false;
}
/**
* 交叉情况下是否有5个相同
*
* @return
*/
private boolean isCrossSame() {
if (cross(ySize, "Y")) {
return true;
}
if (cross(xSize, "X")) {
return true;
}
for (int x = 5; x < xSize; x++) {
int sameNum = 1;
for (int i = x - 1, j = 0; i > 0; i--, j++) {
if (chessboard[j][i] == chessboard[j + 1][i - 1] && chessboard[j][i] != 0) {
sameNum++;
if (sameNum == 5) {
return true;
}
} else {
sameNum = 1;
}
}
}
for (int y = ySize - 4; y > 0; y++) {
int sameNum = 1;
for (int i = y - 1, j = xSize - 1; i < ySize - 1; i++, j--) {
if (chessboard[i][j] == chessboard[i + 1][j - 1] && chessboard[i][j] != 0) {
sameNum++;
if (sameNum == 5) {
return true;
}
} else {
sameNum = 1;
}
}
}
return false;
}
/**
* @param xSize
* @param flag X 或者Y 表示X轴或者是Y轴
* @return
*/
private boolean cross(int xSize, String flag) {
for (int y = xSize - 4; y > 0; y--) {
int sameNum = 1;
//y-1 为坐标
for (int i = y - 1, j = 0; i < xSize - 1; i++, j++) {
if (flag.equals("X")) {
if (chessboard[j][i] == chessboard[j + 1][i + 1] && chessboard[j][i] != 0) {
sameNum++;
if (sameNum == 5) {
return true;
}
} else {
sameNum = 1;
}
} else {
if (chessboard[i][j] == chessboard[i + 1][j + 1] && chessboard[i][j] != 0) {
sameNum++;
if (sameNum == 5) {
return true;
}
} else {
sameNum = 1;
}
}
}
}
return false;
}
}