packageday17.gobang;
importjava.util.Arrays;
publicclassGoBangGame{
publicstaticfinalcharBLANK='*';
publicstaticfinalcharBLACK='@';
publicstaticfinalcharWHITE='O';
publicstaticfinalintMAX=16;
privatestaticfinalintCOUNT=5;
//棋盘
privatechar[][]board;
publicGoBangGame(){
}
//开始游戏
publicvoidstart(){
board=newchar[MAX][MAX];
//把二维数组都填充‘*’
for(char[]ary:board){
Arrays.fill(ary,BLANK);
}
}
publicchar[][]getChessBoard(){
returnboard;
}
publicvoidaddBlack(intx,inty)throwsChessExistException{
//@
//charblank='*';
//System.out.println(x+,+y+:+board[y][x]+,+BLANK);
if(board[y][x]==BLANK){//x,y位置上必须是空的才可以添棋子
board[y][x]=BLACK;
return;
}
thrownewChessExistException(已经有棋子了!);
}
publicvoidaddWhite(intx,inty)
throwsChessExistException{
if(board[y][x]==BLANK){//x,y位置上必须是空的才可以添棋子
board[y][x]=WHITE;
return;
}
thrownewChessExistException(已经有棋子了!);
}
//chess棋子:'@'/'O'
publicbooleanwinOnY(charchess,intx,inty){
//先找到y方向第一个不是blank的棋子
inttop=y;
while(true){
if(y==0||board[y-1][x]!=chess){
//如果y已经是棋盘的边缘,或者的前一个不是chess
//就不再继续查找了
break;
}
y--;
top=y;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
intcount=0;
y=top;
while(true){
if(y==MAX||board[y][x]!=chess){
//如果找到头或者下一个子不是chess就不再继续统计了
break;
}
count++;
y++;
}
returncount==COUNT;
}
//chess棋子:'@'/'O'
publicbooleanwinOnX(charchess,intx,inty){
//先找到x方向第一个不是blank的棋子
inttop=x;
while(true){
if(x==0||board[y][x-1]!=chess){
//如果x已经是棋盘的边缘,或者的前一个不是chess
//就不再继续查找了
break;
}
x--;
top=x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
intcount=0;
x=top;
while(true){
if(x==MAX||board[y][x]!=chess){
//如果找到头或者下一个子不是chess就不再继续统计了
break;
}
count++;
x++;
}
returncount==COUNT;
}
//chess棋子:'@'/'O'
publicbooleanwinOnXY(charchess,intx,inty){
//先找MAX向第一个不是blank的棋子
inttop=y;
intleft=x;
while(true){
if(x==0||y==0||board[y-1][x-1]!=chess){
//如果x已经是棋盘的边缘,或者的前一个不是chess
//就不再继续查找了
break;
}
x--;
y--;
top=y;
left=x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
intcount=0;
x=left;
y=top;
while(true){
if(x==MAX||y==MAX||board[y][x]!=chess){
//如果找到头或者下一个子不是chess就不再继续统计了
break;
}
count++;
x++;
y++;
}
returncount==COUNT;
}
//chess棋子:'@'/'O'
publicbooleanwinOnYX(charchess,intx,inty){
//先找到x方向第一个不是blank的棋子
inttop=y;
intleft=x;
while(true){
if(x==MAX-1||y==0||board[y-1][x+1]!=chess){
//如果x已经是棋盘的边缘,或者的前一个不是chess
//就不再继续查找了
break;
}
x++;
y--;
top=y;
left=x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
intcount=0;
x=left;
y=top;
while(true){
if(x==0||y==MAX||board[y][x]!=chess){
//如果找到头或者下一个子不是chess就不再继续统计了
break;
}
count++;
x--;
y++;
}
returncount==COUNT;
}
publicbooleanwhiteIsWin(intx,inty){
//在任何一个方向上赢了,都算赢
returnwinOnY(WHITE,x,y)||
winOnX(WHITE,x,y)||
winOnXY(WHITE,x,y)||
winOnYX(WHITE,x,y);
}
publicbooleanblackIsWin(intx,inty){
returnwinOnY(BLACK,x,y)||
winOnX(BLACK,x,y)||
winOnXY(BLACK,x,y)||
winOnYX(BLACK,x,y);
}
}