//井字游戏
/*
* 用字符串数组作为井字游戏的游戏板 board,判断该游戏板有没有可能最终形成。
* 游戏板是一个 3 x 3 数组,由字符 " ",“X” 和 “O” 组成。字符 " " 代表一个空位。
* 两个玩家轮流将字符放入空位,一个玩家执X棋,另一个玩家执O棋
* X和O 只允许放置在空位中,不允许对已放有字符的位置进行填充。
* 当有3个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,board生成
* board就是能不能形成这样的棋盘的意思
* */
public class P42 {
public static void main(String[] args) {
System.out.println(validBoard(new String[]{"xxx", "oxo", "o o"})); //x赢,o棋子比x少1
System.out.println(validBoard(new String[]{"xxx", "oxo", "o "}));
}
//只有三种结果:x赢,o赢,胜负未分
/*
* x赢,有必然条件:x-o = 1,因为是x先手
* o赢,有必然条件:o-x = 0,因为o是后手
* 胜负未分:!(x-o=1 || x-o=0)
* */
private static boolean validBoard(String[] board) {
int xCount = 0; //x棋的数量
int oCount = 0;
for(String row : board){
for(char c : row.toCharArray()){
if(c == 'x'){
xCount++;
}else if(c == 'o'){
oCount++;
}
}
}
if(xCount != oCount && xCount-oCount!=1){
return false;
}
//x赢得时候,必然是多一个棋的
if(win(board, "xxx") && xCount-oCount!=1){
return false;
}
//o赢得时候,必然是棋子相等的
if(win(board, "ooo") && xCount-oCount!=0){
return false;
}
return true;
}
public static boolean win(String[] board, String flag){
for(int i=0; i<3; i++){
//纵向3连
if(flag.equals("" + board[0].charAt(i)+board[1].charAt(i)+board[2].charAt(i))){
return true;
}
//横向3连
if(flag.equals(board[i])){
return true;
}
}
//对角线
if(flag.equals("" + board[0].charAt(0)+board[1].charAt(1)+board[2].charAt(2))){
return true;
}
if(flag.equals("" + board[0].charAt(2)+board[1].charAt(1)+board[2].charAt(1))){
return true;
}
return false;
}
}
网友评论