/**
* file name : BlankAndWhite.java
* created at : 9:16:59 PM May 27, 2015
* created by 970655147
*/
package com.hx.blankAndWhite;
public class BlankAndWhite {
private int[][] pieces; // 每个"下子"的逻辑数据
// 初始化
public BlankAndWhite() {
pieces = new int[Tools.ROWLINESNUM][Tools.COLLINENUM];
}
// 判断(row, col)是否可落子
public boolean isBlank(int row, int col) {
return pieces[row][col] == Tools.BLANK;
}
// 设置某一个坐标的棋子
public void setGrid(int row, int col, int val) {
pieces[row][col] = val;
updatePieces(row, col, val);
}
// 更新可更新的棋子
// 依次更新 下方, 上方, 右方, 左方的棋子
// 依次更新 右上方, 左上方, 右下方, 左下的棋子
private void updatePieces(int row, int col, int val) {
if(val != Tools.BLANK) {
// -----------split-------------
// TT -> TF -> FT -> FF
boolean isRow = true, isInc = true;
int tmp = moveToAnotherSamePiece(row, col, isRow, isInc, val);
if(pieces[tmp][col] == val) {
setPieces(row, col, tmp, col, val);
}
isInc = !isInc;
tmp = moveToAnotherSamePiece(row, col, isRow, isInc, val);
if(pieces[tmp][col] == val) {
setPieces(row, col, tmp, col, val);
}
isRow = !isRow;
isInc = !isInc;
tmp = moveToAnotherSamePiece(row, col, isRow, isInc, val);
if(pieces[row][tmp] == val) {
setPieces(row, col, row, tmp, val);
}
isInc = !isInc;
tmp = moveToAnotherSamePiece(row, col, isRow, isInc, val);
if(pieces[row][tmp] == val) {
setPieces(row, col, row, tmp, val);
}
// -----------split-------------
// TT -> TF -> FT -> FF
boolean isUp = true, isRight = true;
int rowTmp = -1, colTmp = -1;
tmp = moveToAnotherSamePieceSidely(row, col, isUp, isRight, val);
rowTmp = getRow(row, isUp, tmp);
colTmp = getCol(col, isRight, tmp);
if(pieces[rowTmp][colTmp] == val) {
setPiecesSidely(row, col, isUp, isRight, tmp, val);
}
isRight = !isRight;
tmp = moveToAnotherSamePieceSidely(row, col, isUp, isRight, val);
rowTmp = getRow(row, isUp, tmp);
colTmp = getCol(col, isRight, tmp);
if(pieces[rowTmp][colTmp] == val) {
setPiecesSidely(row, col, isUp, isRight, tmp, val);
}
isUp = !isUp;
isRight = !isRight;
tmp = moveToAnotherSamePieceSidely(row, col, isUp, isRight, val);
rowTmp = getRow(row, isUp, tmp);
colTmp = getCol(col, isRight, tmp);
if(pieces[rowTmp][colTmp] == val) {
setPiecesSidely(row, col, isUp, isRight, tmp, val);
}
isRight = !isRight;
tmp = moveToAnotherSamePieceSidely(row, col, isUp, isRight, val);
rowTmp = getRow(row, isUp, tmp);
colTmp = getCol(col, isRight, tmp);
if(pieces[rowTmp][colTmp] == val) {
setPiecesSidely(row, col, isUp, isRight, tmp, val);
}
}
}
// 移动到下一个非opposite的位置[水平, 垂直方向均可]
// isRow 表示是否是垂直方向
// isInc 表示是否递增
private int moveToAnotherSamePiece(int row, int col, boolean isRow, boolean isInc, int val) {
int tmp = row + 1;
if(!isRow ) {
tmp = col + 1;
}
if(!isInc) {
tmp -= 2;
}
if(isInc ) {
if(isRow ) {
while(tmp < pieces.length && pieces[tmp][col] == getOppositeForPiece(val)) {
tmp ++;
}
} else {
while(tmp < pieces[0].length && pieces[row][tmp] == getOppositeForPiece(val)) {
tmp ++;
}
}
} else {
if(isRow ) {
while(tmp >= 0 && pieces[tmp][col] == getOppositeForPiece(val)) {
tmp --;
}
} else {
while(tmp >= 0 && pieces[row][tmp] == getOppositeForPiece(val)) {
tmp --;
}
}
}
return tmp;
}
// 返回斜着走的步数
// isUp 表示是否是垂直方向
// isRight 表示是否是水平方向
private int moveToAnotherSamePieceSidely(int row, int col, boolean isUp, boolean isRight, int val) {
int tmp01 = row + 1;
int tmp02 = col - 1;
if(isUp ) {
tmp01 -= 2;
}
if(isRight ) {
tmp02 += 2;
}
if(isUp ) {
if(isRight ) {
while(tmp01 >= 0 && tmp02 < pieces[0].length && pieces[tmp01][tmp02] == getOppositeForPiece(val)) {
tmp01 --;
tmp02 ++;
}
} else {
while(tmp01 >= 0 && tmp02 >= 0 && pieces[tmp01][tmp02] == getOppositeForPiece(val)) {
tmp01 --;
tmp02 --;
}
}
} else {
if(isRight ) {
while(tmp01 < pieces.length && tmp02 < pieces[0].length && pieces[tmp01][tmp02] == getOppositeForPiece(val)) {
tmp01 ++;
tmp02 ++;
}
} else {
while(tmp01 < pieces.length && tmp02 >= 0 && pieces[tmp01][tmp02] == getOppositeForPiece(val)) {
tmp01 ++;
tmp02 --;
}
}
}
return Math.abs(tmp01 - row);
}
// 设置(startRow, startCol) 到(endRow, endCol)区域的棋子为val
private void setPieces(int startRow, int startCol, int endRow, int endCol, int val) {
if(startRow > endRow) {
int tmp = startRow;
startRow = endRow;
endRow = tmp;
}
if(startCol > endCol) {
int tmp = startCol;
startCol = endCol;
endCol = tmp;
}
for(int i=startRow; i<=endRow; i++ ) {
for(int j=startCol; j<=endCol; j++) {
pieces[i][j] = val;
}
}
}
// 从(startRow, startCol) 开始斜着设置cnt个坐标
// isUp 表示是否向上移动
// isRight 表示是否向右移动
private void setPiecesSidely(int startRow, int startCol, boolean isUp, boolean isRight, int cnt, int val) {
for(int i=0; i<cnt; i++) {
pieces[startRow][startCol] = val;
startRow = getNextRow(startRow, isUp);
startCol = getNextCol(startCol, isRight);
}
}
// 根据isUp 获取row的下一个行坐标
private int getNextRow(int row, boolean isUp) {
return getRow(row, isUp, 1);
}
// 根据isUp, offset 获取row的下一个行坐标
private int getRow(int row, boolean isUp, int offset) {
if(isUp) {
return row - offset;
} else {
return row + offset;
}
}
// 根据isRight 获取col的下一个列坐标
private int getNextCol(int col, boolean isRight) {
return getCol(col, isRight, 1);
}
// 根据isRight, offset 获取col的列标
private int getCol(int col, boolean isRight, int offset) {
if(isRight) {
return col + offset;
} else {
return col - offset;
}
}
// 获取val对立的棋子 如果是白棋 返回黑棋, 如果是黑棋 返回白棋
private static int getOppositeForPiece(int val) {
return Tools.WHITE_BLANK_SUM - val;
}
// 获取pieces
public int[][] getPieces() {
return pieces;
}
// 判断(row, col)是否是白棋
public boolean isWhite(int row, int col) {
return pieces[row][col] == Tools.WHITEPIECE;
}
}