1. 程式人生 > >井字棋遊戲實現-java(低階方法實現)

井字棋遊戲實現-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;     } }