溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用Java實(shí)現(xiàn)一個(gè)五子棋小游戲

發(fā)布時(shí)間:2020-11-05 16:27:57 來源:億速云 閱讀:142 作者:Leah 欄目:開發(fā)技術(shù)

使用Java實(shí)現(xiàn)一個(gè)五子棋小游戲?針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

任務(wù)概述:

五子棋是全國(guó)智力運(yùn)動(dòng)會(huì)競(jìng)技項(xiàng)目之一,是一種兩人對(duì)弈的純策略型棋類游戲。通常雙方分別使用黑白兩色的棋子,下在棋盤直線與橫線的交叉點(diǎn)上,先形成五子連線者獲勝。

任務(wù)過程:

1.繪制棋盤
2.提示黑方(用 1 表示)和白方(用 2 表示)分別下棋(X,Y 軸位置)并重新繪制棋盤
3.每當(dāng)一方下棋后判斷是否獲勝

重點(diǎn)講解:

1.關(guān)于勝利的判斷:

根據(jù)用戶所下棋子的位置對(duì)其周圍進(jìn)行檢測(cè),分為以下情況:
橫向:當(dāng)前下棋位置左右各4顆棋子連續(xù)相同5顆
豎向:當(dāng)前下棋位置上下各4顆棋子連續(xù)相同5顆
斜向:當(dāng)前下棋位置左上右下各4顆棋子連續(xù)相同5顆、當(dāng)前下棋位置左下右上各4顆棋子連續(xù)相同5顆
在檢測(cè)時(shí)要注意數(shù)組的下標(biāo),若用戶下棋位置處于棋盤邊緣,則周圍坐標(biāo)很可能已經(jīng)在棋盤之外,要注意加上相應(yīng)的判斷避免下標(biāo)越界!

2.關(guān)于棋盤下滿:

我的思路是,先認(rèn)為棋盤已經(jīng)下滿,然后在打印棋盤的同時(shí),若當(dāng)前打印值為0,則認(rèn)為棋盤未滿,可繼續(xù)下棋操作,若棋盤已經(jīng)打印完畢,仍然沒有打印值為0的情況,則認(rèn)為棋盤下滿,雙方平局,游戲結(jié)束。

其余內(nèi)容在代碼上有詳細(xì)的注釋,以下為代碼:

import java.util.Scanner;

public class Chess {

 public static void main(String[] args) {
 Scanner scanner = new Scanner(System.in);
 int order = 1;//儲(chǔ)存順序,當(dāng)order為1時(shí)輪到黑方下棋,當(dāng)order為2時(shí)輪到白方下棋
 int row = 0;//用來儲(chǔ)存要下棋的行數(shù)
 int column = 0;//用來儲(chǔ)存要下棋的列數(shù)
 int win = 0;//用來儲(chǔ)存獲勝者編號(hào),為0則雙方均未獲勝,為1則白方獲勝,為2則黑方獲勝
 int count1 = 0;//用來儲(chǔ)存當(dāng)前下棋位置左右各4顆棋子的相同數(shù)量
 int count2 = 0;//用來儲(chǔ)存當(dāng)前下棋位置上下各4顆棋子的相同數(shù)量
 int count3 = 0;//用來儲(chǔ)存當(dāng)前下棋位置左上右下各4顆棋子的相同數(shù)量
 int count4 = 0;//用來儲(chǔ)存當(dāng)前下棋位置左下右上各4顆棋子的相同數(shù)量
 int full = 1;//用來判斷棋盤是否下滿,默認(rèn)值1認(rèn)為已滿,只要有1處空則置0
 int board[][] = new int[16][16];//用來記錄棋盤
 
 //為棋盤的坐標(biāo)賦值
 for(int i = 0;i<16;i++) {
  board[i][0] = i;//為棋盤的Y軸賦值
 }
 for(int j = 0;j<16;j++) {
  board[0][j] = j;//為棋盤的X軸賦值
 }
 
 //開始下棋,無限循環(huán)直到有一方勝利或棋盤下滿
 while(true) {
  
  //首先輸出棋盤
  for(int i = 0;i<16;i++) {
  for(int j = 0;j<16;j++) {
   if(board[i][j] == 0)//若棋盤有1處空則認(rèn)為棋盤未滿
   full = 0;
   System.out.print(board[i][j]+"\t");
  }
  System.out.println();
  }
  
  //然后判斷棋盤是否下滿
  if(full == 1) {//棋盤自始至終未有空值,則認(rèn)為棋盤已經(jīng)下滿
  System.out.print("棋盤已下滿,雙方平局,游戲結(jié)束!");
  break;//跳出循環(huán)
  }
  
  //棋盤未滿,進(jìn)入下棋過程
  if(order == 1) {//order為1黑方下棋
  order = 2;//切換order,下一次則白方下棋
  //無限循環(huán)直到下棋點(diǎn)可以正常下棋
  while(true) {
   System.out.println("請(qǐng)黑方下棋,請(qǐng)先輸入X軸位置(列數(shù),1-15):");
   column = scanner.nextInt();//儲(chǔ)存要下棋的列數(shù)
   System.out.println("請(qǐng)黑方下棋,請(qǐng)輸入Y軸位置(行數(shù),1-15):");
   row = scanner.nextInt();//儲(chǔ)存要下棋的行數(shù)
   if(board[row][column] != 0)//下棋點(diǎn)已有棋子,需重新下棋
   System.out.println("此次下棋無效,請(qǐng)重新下棋!");
   else {
   board[row][column] = 1;//放置黑棋
   break;//跳出循環(huán)
   }
  }
  }
  else {//order為2白方下棋
  order = 1;//切換order,下一次則黑方下棋
  //無限循環(huán)直到下棋點(diǎn)可以正常下棋
  while(true) {
   System.out.println("請(qǐng)白方下棋,請(qǐng)先輸入X軸位置(列數(shù),1-15):");
   column = scanner.nextInt();//儲(chǔ)存要下棋的列數(shù)
   System.out.println("請(qǐng)白方下棋,請(qǐng)輸入Y軸位置(行數(shù),1-15):");
   row = scanner.nextInt();//儲(chǔ)存要下棋的行數(shù)
   if(board[row][column] != 0)//下棋點(diǎn)已有棋子,需重新下棋
   System.out.println("此次下棋無效,請(qǐng)重新下棋!");
   else {
   board[row][column] = 2;//放置白棋
   break;//跳出循環(huán)
   }
  }
  }
  
  //本次下棋完畢,判斷是否有人獲勝
  for(int i = -4;i < 4;i++) {
  
  //判斷當(dāng)前下棋位置左右各4顆棋子的相同數(shù)量,連續(xù)4組相同則獲勝
  if(column+i>0 && column+i+1<16) {//防止下標(biāo)越界
   if(board[row][column+i] == board[row][column+i+1] && board[row][column+i] != 0) {
   count1++;
   if(count1 == 4) {//連續(xù)4組相同,獲勝
    win = order;
    break;
   }
   }
   else
   count1 = 0;//未連續(xù)相同,清除相同計(jì)數(shù)
  }
  
  //判斷當(dāng)前下棋位置上下各4顆棋子的相同數(shù)量,連續(xù)4組相同則獲勝
  if(row+i>0 && row+i+1<16) {//防止下標(biāo)越界
   if(board[row+i][column] == board[row+i+1][column] && board[row+i][column] != 0) {
   count2++;
   if(count2 == 4) {//連續(xù)4組相同,獲勝
    win = order;
    break;
   }
   }
   else
   count2 = 0;//未連續(xù)相同,清除相同計(jì)數(shù)
  }
  
  //判斷當(dāng)前下棋位置左上右下各4顆棋子的相同數(shù)量,連續(xù)4組相同則獲勝
  if(column+i>0 && column+i+1<16 && row+i>0 && row+i+1<16) {//防止下標(biāo)越界
   if(board[row+i][column+i] == board[row+i+1][column+i+1] && board[row+i][column+i] != 0) {
   count3++;
   if(count3 == 4) {//連續(xù)4組相同,獲勝
    win = order;
    break;
   }
   }
   else
   count3 = 0;//未連續(xù)相同,清除相同計(jì)數(shù)
  }
  
  //判斷當(dāng)前下棋位置左下右上各4顆棋子的相同數(shù)量,連續(xù)4組相同則獲勝
  if(column+i>0 && column+i+1<16 && row-i-1>0 && row-i<16) {//防止下標(biāo)越界
   if(board[row-i][column+i] == board[row-i-1][column+i+1] && board[row-i][column+i] != 0) {
   count4++;
   if(count4 == 4) {//連續(xù)4組相同,獲勝
    win = order;
    break;
   }
   }
   else
   count4 = 0;//未連續(xù)相同,清除相同計(jì)數(shù)
  }
  
  }
  
  //有人獲勝,輸出棋盤及獲勝者,跳出循環(huán)
  if(win == 2) {//由于win是order的值,order輪到白方,說明黑方獲勝
  //輸出棋盤
  for(int i = 0;i<16;i++) {
   for(int j = 0;j<16;j++) {
   System.out.print(board[i][j]+"\t");
   }
   System.out.println();
  }
  System.out.println("恭喜黑方獲勝,游戲結(jié)束!");
  break;//跳出循環(huán)
  }
  else if(win == 1) {//由于win是order的值,order輪到黑方,說明白方獲勝
  //輸出棋盤
  for(int i = 0;i<16;i++) {
   for(int j = 0;j<16;j++) {
   System.out.print(board[i][j]+"\t");
   }
   System.out.println();
  }
  System.out.println("恭喜白方獲勝,游戲結(jié)束!");
  break;//跳出循環(huán)
  }
  
  //無人獲勝,清除相同棋子計(jì)數(shù),開始新循環(huán)
  count1 = 0;
  count2 = 0;
  count3 = 0;
  count4 = 0;
  full = 1;//再次認(rèn)為棋盤已滿
 
 }
 }

}

關(guān)于使用Java實(shí)現(xiàn)一個(gè)五子棋小游戲問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI