使用Java實現一個五子棋小游戲?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
任務概述:
五子棋是全國智力運動會競技項目之一,是一種兩人對弈的純策略型棋類游戲。通常雙方分別使用黑白兩色的棋子,下在棋盤直線與橫線的交叉點上,先形成五子連線者獲勝。
任務過程:
1.繪制棋盤
2.提示黑方(用 1 表示)和白方(用 2 表示)分別下棋(X,Y 軸位置)并重新繪制棋盤
3.每當一方下棋后判斷是否獲勝
重點講解:
1.關于勝利的判斷:
根據用戶所下棋子的位置對其周圍進行檢測,分為以下情況:
橫向:當前下棋位置左右各4顆棋子連續相同5顆
豎向:當前下棋位置上下各4顆棋子連續相同5顆
斜向:當前下棋位置左上右下各4顆棋子連續相同5顆、當前下棋位置左下右上各4顆棋子連續相同5顆
在檢測時要注意數組的下標,若用戶下棋位置處于棋盤邊緣,則周圍坐標很可能已經在棋盤之外,要注意加上相應的判斷避免下標越界!
2.關于棋盤下滿:
我的思路是,先認為棋盤已經下滿,然后在打印棋盤的同時,若當前打印值為0,則認為棋盤未滿,可繼續下棋操作,若棋盤已經打印完畢,仍然沒有打印值為0的情況,則認為棋盤下滿,雙方平局,游戲結束。
其余內容在代碼上有詳細的注釋,以下為代碼:
import java.util.Scanner;
public class Chess {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int order = 1;//儲存順序,當order為1時輪到黑方下棋,當order為2時輪到白方下棋
int row = 0;//用來儲存要下棋的行數
int column = 0;//用來儲存要下棋的列數
int win = 0;//用來儲存獲勝者編號,為0則雙方均未獲勝,為1則白方獲勝,為2則黑方獲勝
int count1 = 0;//用來儲存當前下棋位置左右各4顆棋子的相同數量
int count2 = 0;//用來儲存當前下棋位置上下各4顆棋子的相同數量
int count3 = 0;//用來儲存當前下棋位置左上右下各4顆棋子的相同數量
int count4 = 0;//用來儲存當前下棋位置左下右上各4顆棋子的相同數量
int full = 1;//用來判斷棋盤是否下滿,默認值1認為已滿,只要有1處空則置0
int board[][] = new int[16][16];//用來記錄棋盤
//為棋盤的坐標賦值
for(int i = 0;i<16;i++) {
board[i][0] = i;//為棋盤的Y軸賦值
}
for(int j = 0;j<16;j++) {
board[0][j] = j;//為棋盤的X軸賦值
}
//開始下棋,無限循環直到有一方勝利或棋盤下滿
while(true) {
//首先輸出棋盤
for(int i = 0;i<16;i++) {
for(int j = 0;j<16;j++) {
if(board[i][j] == 0)//若棋盤有1處空則認為棋盤未滿
full = 0;
System.out.print(board[i][j]+"\t");
}
System.out.println();
}
//然后判斷棋盤是否下滿
if(full == 1) {//棋盤自始至終未有空值,則認為棋盤已經下滿
System.out.print("棋盤已下滿,雙方平局,游戲結束!");
break;//跳出循環
}
//棋盤未滿,進入下棋過程
if(order == 1) {//order為1黑方下棋
order = 2;//切換order,下一次則白方下棋
//無限循環直到下棋點可以正常下棋
while(true) {
System.out.println("請黑方下棋,請先輸入X軸位置(列數,1-15):");
column = scanner.nextInt();//儲存要下棋的列數
System.out.println("請黑方下棋,請輸入Y軸位置(行數,1-15):");
row = scanner.nextInt();//儲存要下棋的行數
if(board[row][column] != 0)//下棋點已有棋子,需重新下棋
System.out.println("此次下棋無效,請重新下棋!");
else {
board[row][column] = 1;//放置黑棋
break;//跳出循環
}
}
}
else {//order為2白方下棋
order = 1;//切換order,下一次則黑方下棋
//無限循環直到下棋點可以正常下棋
while(true) {
System.out.println("請白方下棋,請先輸入X軸位置(列數,1-15):");
column = scanner.nextInt();//儲存要下棋的列數
System.out.println("請白方下棋,請輸入Y軸位置(行數,1-15):");
row = scanner.nextInt();//儲存要下棋的行數
if(board[row][column] != 0)//下棋點已有棋子,需重新下棋
System.out.println("此次下棋無效,請重新下棋!");
else {
board[row][column] = 2;//放置白棋
break;//跳出循環
}
}
}
//本次下棋完畢,判斷是否有人獲勝
for(int i = -4;i < 4;i++) {
//判斷當前下棋位置左右各4顆棋子的相同數量,連續4組相同則獲勝
if(column+i>0 && column+i+1<16) {//防止下標越界
if(board[row][column+i] == board[row][column+i+1] && board[row][column+i] != 0) {
count1++;
if(count1 == 4) {//連續4組相同,獲勝
win = order;
break;
}
}
else
count1 = 0;//未連續相同,清除相同計數
}
//判斷當前下棋位置上下各4顆棋子的相同數量,連續4組相同則獲勝
if(row+i>0 && row+i+1<16) {//防止下標越界
if(board[row+i][column] == board[row+i+1][column] && board[row+i][column] != 0) {
count2++;
if(count2 == 4) {//連續4組相同,獲勝
win = order;
break;
}
}
else
count2 = 0;//未連續相同,清除相同計數
}
//判斷當前下棋位置左上右下各4顆棋子的相同數量,連續4組相同則獲勝
if(column+i>0 && column+i+1<16 && row+i>0 && row+i+1<16) {//防止下標越界
if(board[row+i][column+i] == board[row+i+1][column+i+1] && board[row+i][column+i] != 0) {
count3++;
if(count3 == 4) {//連續4組相同,獲勝
win = order;
break;
}
}
else
count3 = 0;//未連續相同,清除相同計數
}
//判斷當前下棋位置左下右上各4顆棋子的相同數量,連續4組相同則獲勝
if(column+i>0 && column+i+1<16 && row-i-1>0 && row-i<16) {//防止下標越界
if(board[row-i][column+i] == board[row-i-1][column+i+1] && board[row-i][column+i] != 0) {
count4++;
if(count4 == 4) {//連續4組相同,獲勝
win = order;
break;
}
}
else
count4 = 0;//未連續相同,清除相同計數
}
}
//有人獲勝,輸出棋盤及獲勝者,跳出循環
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("恭喜黑方獲勝,游戲結束!");
break;//跳出循環
}
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("恭喜白方獲勝,游戲結束!");
break;//跳出循環
}
//無人獲勝,清除相同棋子計數,開始新循環
count1 = 0;
count2 = 0;
count3 = 0;
count4 = 0;
full = 1;//再次認為棋盤已滿
}
}
}關于使用Java實現一個五子棋小游戲問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。