井字棋遊戲實現-java(低階方法實現)
import java.util.Scanner; public class JingGame { final static int LENGTH=3; //棋局的長度 final static int NUM_FOR_WIN=3;//幾個子連起來贏 public static void main(String[] args) { char[][] board=new char[LENGTH][LENGTH*2+1];//儲存棋局的模樣 int[][] status=new int[LENGTH][LENGTH]; //儲存棋局的邏輯狀態 //初始化棋局的模樣 for(int i=0;i<board.length;i++) { for(int j=0;j<board[0].length;j++) { if(j%2==0) //偶數存 l board[i][j]='l'; else //奇數存 空格 board[i][j]=' '; } } printBoard(board);//顯示初始棋盤 boolean isX=true; //用於控制X下棋還是O下棋 //只要遊戲還沒分出勝負就一戰到底 while(judgeStatus(status)==2) { if(isX) //該X下棋 { if(!drop(isX,board,status)) continue; printBoard(board); isX=!isX; //下一次就是O下棋 } else if(!isX&&judgeStatus(status)==2)//該O下棋 { if(!drop(isX,board,status)) continue; printBoard(board); isX=!isX; //下一次就是X下棋 } } if(judgeStatus(status)==1) System.out.println("X player won"); else System.out.println("O player won"); } /**列印棋盤*/ public static void printBoard(char[][] board) { for(int i=0;i<board.length;i++) System.out.print("------"); System.out.println(); for(int i=0;i<board.length;i++) { for(int j=0;j<board[0].length;j++) { System.out.printf("%-4c",board[i][j]); } System.out.println(); for(int j=0;j<board.length;j++) System.out.print("------"); System.out.println(); } } /**下棋,改變棋盤和其邏輯狀態,X狀態=1,O狀態=-1*/ public static boolean drop(boolean isX,char[][] board,int[][] status) { int x,y;//棋子座標 Scanner input=new Scanner(System.in); System.out.printf("玩家%c,輸入棋子行數(0、1、2):",isX?'X':'O'); x=input.nextInt(); System.out.printf("玩家%c,輸入棋子列數(0、1、2):",isX?'X':'O'); y=input.nextInt(); //如果這個位置已經被佔了 if(x<0||x>=board.length||y<0||y>=board[0].length) { System.out.println("輸入的位置不對!重新選個位置吧!"); return false; } if(status[x][y]!=0) { System.out.println("這個地方已經有棋子了!!重新選個位置吧!"); return false; } status[x][y]=isX?1:-1; board[x][y*2+1]=isX?'X':'O'; return true; } /**判斷棋局是什麼狀態,X贏返回1,O贏返回-1,平局返回0,繼續遊戲返回2*/ public static int judgeStatus(int[][] status) { for(int i=0;i<status.length;i++) { for(int j=0;j<status[0].length;j++) { if(rowWin(i,j,status)==1||colWin(i,j,status)==1||diagonalWin(i,j,status)==1) return 1; else if(rowWin(i,j,status)==-1||colWin(i,j,status)==-1||diagonalWin(i,j,status)==-1) return -1; } } return 2; } /**以行的形式贏得比賽*/ public static int rowWin(int x,int y,int[][] status) { int r=x,c=y; int countX=0; int countO=0; if(r>=0&&r<status.length&&c>=0&&c<status[0].length) //不要超過邊界 { if(status[r][c]==1) { for(int i=0;i<NUM_FOR_WIN&&c+i>=0&&c+i<status[0].length;i++) //內層迴圈也不能超過邊界 { if(status[r][c+i]!=1) return 2; if(status[r][c+i]==1) countX++; } if(countX==NUM_FOR_WIN) return 1; return 2; } else if(status[r][c]==-1) { for(int i=0;i<NUM_FOR_WIN&&c+i>=0&&c+i<status[0].length;i++) //內層迴圈也不能超過邊界 { if(status[r][c+i]!=-1) return 2; if(status[r][c+i]==-1) countO++; } if(countO==NUM_FOR_WIN) return -1; return 2; } } return 2; } /**以列的形式贏得比賽*/ public static int colWin(int x,int y,int[][] status) { int r=x,c=y; int countX=0; int countO=0; if(r>=0&&r<status.length&&c>=0&&c<status[0].length) //不要超過邊界 { if(status[r][c]==1) { for(int i=0;i<NUM_FOR_WIN&&r+i>=0&&r+i<status.length;i++) //內層迴圈也不能超過邊界 { if(status[r+i][c]!=1) return 2; if(status[r+i][c]==1) countX++; } if(countX==NUM_FOR_WIN) return 1; return 2; } else if(status[r][c]==-1) { for(int i=0;i<NUM_FOR_WIN&&r+i>=0&&r+i<status.length;i++) //內層迴圈也不能超過邊界 { if(status[r+i][c]!=-1) return 2; if(status[r+i][c]==-1) countO++; } if(countO==NUM_FOR_WIN) return -1; return 2; } } return 2; } /**以對角線的形式贏得比賽(這個方法的程式碼寫的太爛了!!)*/ public static int diagonalWin(int x,int y,int[][] status) { int r=x,c=y; int count=0; //代表四個方向搜尋完了沒有 while(r>=0&&r<status.length&&c>=0&&c<status[0].length&&count<=4) //不要超過邊界 { int countX=0,countO=0; count++; if(status[r][c]==1) { for(int i=0;i<NUM_FOR_WIN&&r>=0&&r<status.length&&c>=0&&c<status[0].length&&count<=4;i++) //內層迴圈也不能超過邊界 { if(count==1) { if(r+i<status.length&&c+i>=0&&c+i<status[0].length&&r+i>=0) { if(status[r+i][c+i]!=1) return 2; if(status[r+i][c+i]==1) countX++; } else { count++; i=0; continue; } } if(count==2) { if(r-i>=0&&r-i<status.length&&c-i>=0&&c-i<status[0].length) { if(status[r-i][c-i]!=1) return 2; if(status[r-i][c-i]==1) countX++; } else { count++; i=0; continue; } } if(count==3) { if(r+i<status.length&&c-i>=0&&c-i<status[0].length) { if(status[r+i][c-i]!=1) return 2; if(status[r+i][c-i]==1) countX++; } else { count++; i=0; continue; } } if(count==4) { if(r-i>=0&&r-i<status.length&&c+i>=0&&c+i<status[0].length) { if(status[r-1][c+1]!=1) return 2; if(status[r-1][c+1]==1) countX++; } else { count++; i=0; continue; } } if(count>4) return 2; } if(countX==NUM_FOR_WIN) return 1; return 2; } else if(status[r][c]==-1) { for(int i=0;i<NUM_FOR_WIN&&r>=0&&r<status.length&&c>=0&&c<status[0].length&&count<=4;i++) //內層迴圈也不能超過邊界 { if(count==1) { if(r+i<status.length&&c+i>=0&&c+i<status[0].length&&r+i>=0) { if(status[r+i][c+i]!=-1) return 2; if(status[r+i][c+i]==-1) countO++; } else { count++; i=0; continue; } } if(count==2) { if(r-i>=0&&r-i<status.length&&c-i>=0&&c-i<status[0].length) { if(status[r-i][c-i]!=-1) return 2; if(status[r-i][c-i]==-1) countO++; } else { count++; i=0; continue; } } if(count==3) { if(r+i<status.length&&c-i>=0&&c-i<status[0].length) { if(status[r+i][c-i]!=-1) return 2; if(status[r+i][c-i]==-1) countO++; } else { count++; i=0; continue; } } if(count==4) { if(r-i>=0&&r-i<status.length&&c+i>=0&&c+i<status[0].length) { if(status[r-1][c+1]!=-1) return 2; if(status[r-1][c+1]==-1) countO++; } else { count++; i=0; continue; } } if(count>4) return 2; } if(countO==NUM_FOR_WIN) return -1; return 2; } else return 2; } return 2; } }