Java實(shí)現(xiàn)五子棋的基礎(chǔ)方法
本文實(shí)例為大家分享了Java實(shí)現(xiàn)五子棋的具體代碼,供大家參考,具體內(nèi)容如下
任務(wù)概述:
五子棋是全國(guó)智力運(yùn)動(dòng)會(huì)競(jìng)技項(xiàng)目之一,是一種兩人對(duì)弈的純策略型棋類(lèi)游戲。通常雙方分別使用黑白兩色的棋子,下在棋盤(pán)直線與橫線的交叉點(diǎn)上,先形成五子連線者獲勝。
任務(wù)過(guò)程:
1.繪制棋盤(pán)
2.提示黑方(用 1 表示)和白方(用 2 表示)分別下棋(X,Y 軸位置)并重新繪制棋盤(pán)
3.每當(dāng)一方下棋后判斷是否獲勝
重點(diǎn)講解:
1.關(guān)于勝利的判斷:
根據(jù)用戶(hù)所下棋子的位置對(duì)其周?chē)M(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),若用戶(hù)下棋位置處于棋盤(pán)邊緣,則周?chē)鴺?biāo)很可能已經(jīng)在棋盤(pán)之外,要注意加上相應(yīng)的判斷避免下標(biāo)越界!
2.關(guān)于棋盤(pán)下滿(mǎn):
我的思路是,先認(rèn)為棋盤(pán)已經(jīng)下滿(mǎn),然后在打印棋盤(pán)的同時(shí),若當(dāng)前打印值為0,則認(rèn)為棋盤(pán)未滿(mǎn),可繼續(xù)下棋操作,若棋盤(pán)已經(jīng)打印完畢,仍然沒(méi)有打印值為0的情況,則認(rèn)為棋盤(pán)下滿(mǎn),雙方平局,游戲結(jié)束。
其余內(nèi)容在代碼上有詳細(xì)的注釋?zhuān)韵聻榇a:
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;//用來(lái)儲(chǔ)存要下棋的行數(shù)
int column = 0;//用來(lái)儲(chǔ)存要下棋的列數(shù)
int win = 0;//用來(lái)儲(chǔ)存獲勝者編號(hào),為0則雙方均未獲勝,為1則白方獲勝,為2則黑方獲勝
int count1 = 0;//用來(lái)儲(chǔ)存當(dāng)前下棋位置左右各4顆棋子的相同數(shù)量
int count2 = 0;//用來(lái)儲(chǔ)存當(dāng)前下棋位置上下各4顆棋子的相同數(shù)量
int count3 = 0;//用來(lái)儲(chǔ)存當(dāng)前下棋位置左上右下各4顆棋子的相同數(shù)量
int count4 = 0;//用來(lái)儲(chǔ)存當(dāng)前下棋位置左下右上各4顆棋子的相同數(shù)量
int full = 1;//用來(lái)判斷棋盤(pán)是否下滿(mǎn),默認(rèn)值1認(rèn)為已滿(mǎn),只要有1處空則置0
int board[][] = new int[16][16];//用來(lái)記錄棋盤(pán)
//為棋盤(pán)的坐標(biāo)賦值
for(int i = 0;i<16;i++) {
board[i][0] = i;//為棋盤(pán)的Y軸賦值
}
for(int j = 0;j<16;j++) {
board[0][j] = j;//為棋盤(pán)的X軸賦值
}
//開(kāi)始下棋,無(wú)限循環(huán)直到有一方勝利或棋盤(pán)下滿(mǎn)
while(true) {
//首先輸出棋盤(pán)
for(int i = 0;i<16;i++) {
for(int j = 0;j<16;j++) {
if(board[i][j] == 0)//若棋盤(pán)有1處空則認(rèn)為棋盤(pán)未滿(mǎn)
full = 0;
System.out.print(board[i][j]+"\t");
}
System.out.println();
}
//然后判斷棋盤(pán)是否下滿(mǎn)
if(full == 1) {//棋盤(pán)自始至終未有空值,則認(rèn)為棋盤(pán)已經(jīng)下滿(mǎn)
System.out.print("棋盤(pán)已下滿(mǎn),雙方平局,游戲結(jié)束!");
break;//跳出循環(huán)
}
//棋盤(pán)未滿(mǎn),進(jìn)入下棋過(guò)程
if(order == 1) {//order為1黑方下棋
order = 2;//切換order,下一次則白方下棋
//無(wú)限循環(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("此次下棋無(wú)效,請(qǐng)重新下棋!");
else {
board[row][column] = 1;//放置黑棋
break;//跳出循環(huán)
}
}
}
else {//order為2白方下棋
order = 1;//切換order,下一次則黑方下棋
//無(wú)限循環(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("此次下棋無(wú)效,請(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ù)
}
}
//有人獲勝,輸出棋盤(pán)及獲勝者,跳出循環(huán)
if(win == 2) {//由于win是order的值,order輪到白方,說(shuō)明黑方獲勝
//輸出棋盤(pán)
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輪到黑方,說(shuō)明白方獲勝
//輸出棋盤(pán)
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)
}
//無(wú)人獲勝,清除相同棋子計(jì)數(shù),開(kāi)始新循環(huán)
count1 = 0;
count2 = 0;
count3 = 0;
count4 = 0;
full = 1;//再次認(rèn)為棋盤(pán)已滿(mǎn)
}
}
}
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專(zhuān)題,分享給大家:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
簡(jiǎn)單理解遵循接口隔離原則的Java設(shè)計(jì)模式編程
這篇文章主要介紹了遵循接口隔離原則的Java設(shè)計(jì)模式編程,針對(duì)Java編程中interface接口方面的編寫(xiě)進(jìn)行約束,需要的朋友可以參考下2016-02-02
SpringBoot實(shí)現(xiàn)簡(jiǎn)單文件上傳功能
這篇文章主要為大家詳細(xì)介紹了SpringBoot實(shí)現(xiàn)簡(jiǎn)單文件上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Java連接Mysql數(shù)據(jù)庫(kù)詳細(xì)代碼實(shí)例
這篇文章主要介紹了Java連接Mysql數(shù)據(jù)庫(kù)詳細(xì)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
Maven坐標(biāo)和依賴(lài)的實(shí)現(xiàn)示例
本文主要介紹了Maven坐標(biāo)和依賴(lài)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-04-04
Java9版本新特性同一個(gè)Jar支持多JDK版本運(yùn)行
這篇文章主要為大家介紹了Java9新版本的特性之同一個(gè)Jar支持多JDK版本運(yùn)行的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
java解析XML Node與Element的區(qū)別(推薦)
下面小編就為大家分享一篇java解析XML Node與Element的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01

