程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 瘋狂Java講義 第一章控制台五子棋(代碼分析),講義五子棋

瘋狂Java講義 第一章控制台五子棋(代碼分析),講義五子棋

編輯:JAVA綜合教程

瘋狂Java講義 第一章控制台五子棋(代碼分析),講義五子棋


1 package com.test; 2 3 public class Chessboard { 4 //定義二維數組作為棋盤 5 private String[][] board; 6 //定義棋盤大小 7 public static final int BOARD_SIZE=22; 8 9 //初始化棋盤 10 public void initBoard(){ 11 board=new String[BOARD_SIZE][BOARD_SIZE];//創建二維數組 12 //定義初值,嵌套循環 13 for(int i=0;i<BOARD_SIZE;i++){ 14 for(int j=0;j<BOARD_SIZE;j++){ 15 board[i][j]="十"; 16 } 17 } 18 } 19 //test函數的意義不明 20 public void test(){ 21 Object[][] array=new Object[10][10]; 22 for(int i=0;i<array.length;i++){ 23 for(int j=0;j<array.length;j++){ 24 array[i][j]=new Object(); 25 } 26 } 27 } 28 //打印棋盤 29 public void printBoard(){ 30 for(int i=0;i<BOARD_SIZE;i++){ 31 for(int j=0;j<BOARD_SIZE;j++){ 32 System.out.print(board[i][j]); 33 } 34 System.out.print("\n"); 35 } 36 } 37 //放置棋子 38 public void setBoard(int posX,int posY,String chessman){ 39 this.board[posX][posY]=chessman; 40 } 41 //返回棋盤 42 public String [][] getBoard(){ 43 return this.board; 44 } 45 46 } Chessboard.java 1 package com.test; 2 3 public enum Chessman { 4 BLACK("●"),WHITE("○"); 5 //設置兩個靜態棋子屬性 6 //等同於public static final Chessman BLACK=new Chessman("●") 7 private String chessman; 8 //設置後可通過.BLACK.chessman進行設置棋子種類 9 private Chessman(String chessman){ 10 this.chessman=chessman; 11 } 12 //返回棋子 13 public String getChessman(){ 14 return this.chessman; 15 } 16 } Chessman.java

以上為棋盤類(Chessboard),棋子類(Chessman,枚舉類)

最後是游戲類GobangGame.java

  1 package com.test;
  2 
  3 import java.io.BufferedReader;//輸入
  4 import java.io.InputStreamReader;//輸出
  5 
  6 public class GobangGame {
  7     private final int WIN_COUNT=5;//設置獲勝棋子數
  8     private int posX=0;
  9     private int posY=0;
 10     private Chessboard chessboard;//Chessboard類的一個實例
 11     
 12     //將chessboard實例調用
 13     public GobangGame(Chessboard chessboard){
 14             this.chessboard=chessboard;
 15     }
 16     //接收inputStr裡面的x,y值,並賦給posX/Y
 17     public boolean isValid(String inputStr){
 18         String[] posStrArr=inputStr.split(",");
 19         //將字符串分割成字符數組,分割標志為“,”
 20         try{
 21             posX=Integer.parseInt(posStrArr[0])-1;
 22             posY=Integer.parseInt(posStrArr[1])-1;
 23         }catch(NumberFormatException e){
 24             chessboard.printBoard();
 25             System.out.println("pls input position like num,num");
 26             return false;
 27         }
 28         if(posX<0||posX>=Chessboard.BOARD_SIZE||posY<0||posY>=Chessboard.BOARD_SIZE){
 29             chessboard.printBoard();
 30             System.out.println("reinput");
 31             return false;
 32         }
 33         //接收chessboard
 34         String[][] board=chessboard.getBoard();
 35         
 36         
 37         if(board[posX][posY]!="十"){
 38             chessboard.printBoard();
 39             System.out.println("re input");
 40             return false;
 41         }
 42         return true;
 43     }
 44     //游戲主流程函數,配圖
 45     public void start()throws Exception{
 46         boolean isOver=false;
 47         chessboard.initBoard();
 48         chessboard.printBoard();
 49         BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
 50         String inputStr=null;
 51         //若輸入不為空,開始循環
 52         while((inputStr=br.readLine())!=null){
 53             isOver=false;
 54             //驗證有效(是棋盤坐標)
 55             if(!isValid(inputStr)){
 56                 continue;
 57             }
 58             //設定棋子
 59             String chessman=Chessman.BLACK.getChessman();
 60             chessboard.setBoard(posX, posY, chessman);
 61             //判定是否勝利
 62             if(isWon(posX,posY,chessman)){
 63                 isOver=true;
 64             }else{
 65                 int[] computerPosArr=computerDo();
 66                 chessman=Chessman.WHITE.getChessman();
 67                 chessboard.setBoard(computerPosArr[0], computerPosArr[1], chessman);
 68                 if(isWon(computerPosArr[0],computerPosArr[1],chessman)){
 69                     isOver=true;
 70                 }
 71             }
 72             //判定是否結束
 73             if(isOver){
 74                 if(isReplay(chessman)){
 75                     chessboard.initBoard();
 76                     chessboard.printBoard();
 77                     continue;
 78                 }
 79                 break;
 80             }
 81             //進行下一回合
 82             chessboard.printBoard();
 83             System.out.println("pls input the num");
 84         }
 85     }
 86     //是否重新開始游戲
 87     public boolean isReplay(String chessman)throws Exception{
 88         chessboard.printBoard();
 89         String message=chessman.equals(Chessman.BLACK.getChessman())? "you win":"you lose";
 90         System.out.println(message+"paly again?(Y/N)");
 91         BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
 92         if(br.readLine().equals("y")){
 93             return true;
 94         }
 95         return false;
 96     }
 97     //生成電腦棋子(隨機生成即可,無邏輯)
 98     public int[] computerDo(){
 99         int posX=(int)(Math.random()*(Chessboard.BOARD_SIZE-1));
100         int posY=(int)(Math.random()*Chessboard.BOARD_SIZE-1);
101         String[][] board=chessboard.getBoard();
102         //驗證電腦下一步棋的坐標沒有棋子
103         while(board[posX][posY]!="十"){
104             posX=(int)(Math.random()*Chessboard.BOARD_SIZE-1);
105             posY=(int)(Math.random()*Chessboard.BOARD_SIZE-1);
106         }
107         int[] result={posX,posY};
108         return result;
109     }
110     //勝利判定(方法為在當前所下棋子周圍進行檢查,非遍歷棋盤法)
111     public boolean isWon(int posX,int posY,String ico){
112         int startX=0;//直線開始X坐標
113         int startY=0;//直線開始Y坐標
114         int endX=Chessboard.BOARD_SIZE-1;//直線結束X坐標
115         int endY=endX;//直線結束Y坐標
116         int sameCount=0;//同條直線上相鄰棋子數
117         int temp=0;
118         //計算棋子的最小X坐標和Y坐標
119         temp=posX-WIN_COUNT+1;
120         startX=temp<0?0:temp;//若小於0,則為0
121         temp=posY-WIN_COUNT+1;
122         startY=temp<0?0:temp;
123         //計算棋子的最大X坐標和Y坐標
124         temp=posX+WIN_COUNT-1;
125         endX=temp>Chessboard.BOARD_SIZE-1?Chessboard.BOARD_SIZE-1:temp;
126         temp=posY+WIN_COUNT-1;
127         endY=temp>Chessboard.BOARD_SIZE-1?Chessboard.BOARD_SIZE-1:temp;
128         //從左到右方向計算相同相鄰棋子的數目
129         String[][] board=chessboard.getBoard();
130         //豎直方向
131         for(int i=startY;i<endY;i++){
132             if(board[posX][i]==ico&&board[posX][i+1]==ico){
133                 sameCount++;
134             }else if(sameCount!=WIN_COUNT-1){
135                 sameCount=0;
136             }
137         }
138         //水平方向
139         if(sameCount==0){
140             for(int i=startX;i<endX;i++){
141                 if(board[i][posY]==ico&&board[i+1][posY]==ico){
142                     sameCount++;
143                 }else if(sameCount!=WIN_COUNT-1){
144                     sameCount=0;
145                 }
146             }
147         }
148         if(sameCount==0){
149             int j=startY;
150             for(int i=startX;i<endX;i++){
151                     if(j<endY){
152                         if(board[i][j]==ico&&board[i+1][j+1]==ico){
153                             sameCount++;
154                         }else if(sameCount!=WIN_COUNT-1){
155                             sameCount=0;
156                         }
157                         j++;
158                     }
159                 }
160             }
161             return sameCount==WIN_COUNT-1?true:false;
162         }
163         
164         
165     public static void main(String[] args)throws Exception{
166         GobangGame gb=new GobangGame(new Chessboard());//創建實例
167         gb.start();//開始程序
168     }
169 }
170     

其中的start()函數寫了多個if語句,可讀性較差。附上流程圖(^…^!手寫渣)

-END

-^^^^^^^^^^^^^^^^^^

-人世幾回傷往事,山形依舊枕寒流。

-2016-09-06

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved