控制檯五子棋遊戲類記錄
這個文件上面的教程和我所理解的有所不同呢,果然還是需要自己來寫,文件只是提供了一個大致方向
每個函式的功能都有註釋,今天主要把時間用在了這個判斷輸贏,也就是五棋相連上。public class ChessGame { int posX,posY; int WIN_COUNT=5; ChessMap map=new ChessMap(); public void newQi(int posx,int posy){ //玩家新座標後更新棋盤 map.setMap(posx, posy, ChessQizi.BLACK.getChessqizi()); } public void newCom(){ //玩家下一步之後,此功能電腦隨機走一步 int posx=(int)(Math.random()*(map.MAP_SIZE-1)); int posy=(int)(Math.random()*(map.MAP_SIZE-1)); String[][] board=map.getMap(); while (board[posx][posy]!="+"){ posX=(int)(Math.random()*(map.MAP_SIZE-1)); posY=(int)(Math.random()*(map.MAP_SIZE-1)); } map.setMap(posX, posY, ChessQizi.WHITE.getChessqizi()); } public boolean inputIegal(int posx,int posy){ //判斷玩家輸入的座標是否合法 boolean t=true; if (posx<0 || posx>=WIN_COUNT || posy<0 || posy>=WIN_COUNT) t=false; return t; } public boolean isWin(int posx,int posy){ //判斷是否有勝利 int startX=0; int startY=0; int endX=map.MAP_SIZE-1; int endY=endX; int sameCount=0; int temp=0; boolean t=false; temp=posx-WIN_COUNT+1; //計算起點的最小X左邊與Y座標 startX=temp<0?0:temp; temp=posy-WIN_COUNT+1; startY=temp<0?0:temp; temp=posx+WIN_COUNT-1; //計算終點的最大X座標與Y座標 endX=temp>map.MAP_SIZE-1?map.MAP_SIZE-1:temp; temp=posy+WIN_COUNT-1; endY=temp>map.MAP_SIZE-1?map.MAP_SIZE-1:temp; String[][] board=map.getMap(); for (int i=startY;i<endY;i++) if (board[posx][i]==board[posx][i+1]) //這裡只是橫向判斷有無五子,豎向和斜向只需更改board裡的座標即可 sameCount++; else if(sameCount!=WIN_COUNT-1) sameCount=0; if (sameCount==5) t=true; return t; } }
1.每次下完一顆棋子,就通過程式從橫、豎、斜各個方向掃描棋盤,如果在某個方向中,有同種顏色的棋子達到五連子,則此顏色的玩家為贏。如果沒有相同顏色的棋子達到五連子,則繼續遊戲。該判斷方法需要遍歷整個棋盤,也就是意味著每次下棋後(玩家或者“電腦”)都需要對棋盤進行遍歷,這樣對程式的效能會造成一定的影響。
2.每次下完一顆棋子,以該棋子為中心,掃描在此棋子所在範圍內的橫、豎、斜方向,驗證加上此棋子有沒有形成五連子,如果形成五連子,則下棋子的玩家為贏。此方法與前面的方法比較,因為不需要掃描整個棋盤,所以更加快速,本章程式使用的是此方法。
可以看出,(0,0),(0,3),(0,6),(3,0),(6,0),(3,7),(7,3),(7,7)這些座標都是此黑棋能形成五連子的最小或者最大位置的棋子,如果各個方向有足夠的空間,就延伸到第五顆棋子,如果沒有,就只延伸到邊界。所以,只要能計算出任意一顆棋子的這些位置,我們就可以判斷遊戲的輸贏,並且是以該棋子為中心向周圍進行遍歷。
首先是計算出在這顆棋子的直線上(橫、豎、斜方向)能達到五連子的最小x、y座標與最大x、y座標,然後從最小x、y座標訪問到最大x、y座標,如果此顏色棋子的相連累積數目達到五連子,則為贏。以上程式碼只是實現橫向遍歷判斷,豎向遍歷與斜向遍歷的判斷方法與橫向遍歷的實現基本類似。這裡需要注意的是,當遇到一個可以相邊的棋子,就需要為
以上為文件裡面的教程,移過來供大家學習參考。
然後今天還有一個問題就是,現在寫的是類,這個類裡面的屬性posX,posY應該如何使用,差點搞不明白,都是在按自己的邏輯思維在寫。現在我可以很清晰的講出我寫的意思,就等最後再看吧,有問題了再解決。