五子棋遊戲規則:
- 五子棋分黑棋、白棋,兩人輪流下棋,任意方向滿五個即可勝利。
- 下棋操作:輸入棋子的座標進行下棋
注意:已經有棋子的地方不能進行二次下棋
遊戲思路:
- 初始化棋盤 initBoard()
- 打印棋盤 printBoard()
- 開始遊戲 startGame()
- 下棋(黑白) putDownChess()
- 判斷輸贏 isGameOver()
首先,將board數據定義爲全局變量,即任何函數都可以訪問的變量,因爲遊戲思路中所展示的的方法都會使用數據board,每次將board當做參數傳遞給函數的時候會比較麻煩,所以將board數據定義爲全局變量。定義爲全局變量的數據還有,黑白棋以及輸入座標。下面代碼中就會涉及。
注:全局變量定義在函數的外面,類的裏面,必須以 public static 開頭
第一步:初始化棋盤
public static void initBoard(){
board=new String[15][15];//創建的棋盤爲15行,15列
for(int i=0;i<board.length;i++){
for(int j=0;j<board[i].length;j++){
board[i][j]="+";
}
}
}
棋盤的表示:創建一個String的二維數組來表示棋盤,數組中存放 字符 " + "
第二步:打印棋盤
public static void printBoard(){//打印棋盤
for(int i = 0;i<board.length;i++){
for(int j=0;j<board[i].length;j++){
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
打印棋盤展示:
第三步:開始遊戲
public static void startGame(){//開始遊戲
System.out.println("遊戲開始");
while(true){
if(player % 2==0){
System.out.println("請黑方下棋");
if(!putDownChess(BLACK_CHESS)){
continue;
}
}else{
System.out.println("請白方下棋");
if(!putDownChess(WHITE_CHESS)){
continue;
}
}
if(isGameOver()){
break;
}
player++;
}
}
第四步:下棋
public static boolean putDownChess(String chess){
int x=scanner.nextInt()-1;
int y=scanner.nextInt()-1;
if(!board[x][y].equals("+")){
System.out.println("此處已有棋子,請重新下棋");
return false;
}
board[x][y]=chess;
printBoard();//下一次棋打印一次棋盤
return true;
}
第五步:判斷輸贏
public static boolean isGameOver(){
for(int i = 0;i<board.length;i++){
for(int j= 0;j<board[i].length;j++){
if(!board[i][j].equals("+")){
if(j<board[i].length-4){//向右
boolean flag=true;
for(int c = j+1;c<j+5;c++){
if(board[i][j]!= board[i][c]){
flag=false;
break;
}
}
if(flag){
System.out.println("遊戲結束");
return true;
}
}
if(i<board.length-4){//向下
boolean flag=true;
for(int c = i+1;c<i+5;c++){
if(board[i][j]!= board[c][j]){
flag=false;
break;
}
}
if(flag){
System.out.println("遊戲結束");
return true;
}
}
if(j<board[i].length-4 && i<board.length-4){//向右下
boolean flag=true;
for(int c = j+1,d = i+1;c<j+5;c++,d++){
if(board[i][j]!= board[d][c]){
flag=false;
break;
}
}
if(flag){
System.out.println("遊戲結束");
return true;
}
}
if(i>3 && j<board.length-4){//向右上
boolean flag=true;
for(int c = i-1,d = j+1;d<j+5;c--,d++){
if(board[i][j]!= board[c][d]){
flag=false;
break;
}
}
if(flag){
System.out.println("遊戲結束");
return true;
}
}
}
}
}
return false;
}
參考上圖,就可以很輕鬆的寫出判斷遊戲輸贏的邏輯啦~上述代碼中,主要應用了二維數組中連續相等問題的思路。其中一共分了4個方向,只要任意一個方向有5個棋子連成,遊戲就結束啦。之所以分4個方向是因爲,其他四個方向和圖中四個方向是等效的,例如右下就等於左上,以此類推。
主函數代碼展示:
public static String[][] board;//定義全局變量棋盤
public static String BLACK_CHESS="O"; //黑棋
public static String WHITE_CHESS="X"; //白棋
public static Scanner scanner=new Scanner(System.in);//輸入棋子座標
public static int player = 0;//判斷棋子顏色
public static void main(String[] args){
initBoard();
printBoard();
startGame();
}
可以發現主函數的代碼量十分簡潔,這就是定義方法的優勢。
代碼優化:
- 遊戲結束時,加上判斷棋子顏色,如:遊戲結束,黑棋獲勝。實現此功能新增一個方法調用即可。方法代碼展示如下:
public static void Colur(){
if(player % 2==0){
System.out.println("遊戲結束,黑棋獲勝");
}else{
System.out.println("遊戲結束,白棋獲勝");
}
}
結果展示:
- 爲棋盤加上行序和列序,即對printBoard()方法進行了優化,代碼展示如下:
public static void printBoard(){//打印棋盤
System.out.print(" ");//爲了讓列標與棋盤對齊,在數字1前加入適當空格即可
for(int k = 1;k<=15;k++){//打印列標
System.out.printf("%-3d",k);
}
System.out.println();
for(int i = 0;i<board.length;i++){
System.out.printf("%2d ",i+1);//打印行標
for(int j=0;j<board[i].length;j++){
System.out.print(board[i][j] + " ");
}
System.out.println();
}
}
棋盤展示:
其他優化,再做補充~