Java實(shí)現(xiàn)五子棋的基礎(chǔ)方法
本文實(shí)例為大家分享了Java實(shí)現(xiàn)五子棋的具體代碼,供大家參考,具體內(nèi)容如下
任務(wù)概述:
五子棋是全國(guó)智力運(yùn)動(dòng)會(huì)競(jìng)技項(xiàng)目之一,是一種兩人對(duì)弈的純策略型棋類游戲。通常雙方分別使用黑白兩色的棋子,下在棋盤直線與橫線的交叉點(diǎn)上,先形成五子連線者獲勝。
任務(wù)過(guò)程:
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)打印完畢,仍然沒(méi)有打印值為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;//用來(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)判斷棋盤是否下滿,默認(rèn)值1認(rèn)為已滿,只要有1處空則置0 int board[][] = new int[16][16];//用來(lái)記錄棋盤 //為棋盤的坐標(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軸賦值 } //開(kāi)始下棋,無(wú)限循環(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)入下棋過(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ù) } } //有人獲勝,輸出棋盤及獲勝者,跳出循環(huán) if(win == 2) {//由于win是order的值,order輪到白方,說(shuō)明黑方獲勝 //輸出棋盤 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ō)明白方獲勝 //輸出棋盤 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)為棋盤已滿 } }}
更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:
C++經(jīng)典小游戲匯總
python經(jīng)典小游戲匯總
python俄羅斯方塊游戲集合
JavaScript經(jīng)典游戲 玩不停
javascript經(jīng)典小游戲匯總
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. XML入門的常見(jiàn)問(wèn)題(二)2. ASP常用日期格式化函數(shù) FormatDate()3. 如何在jsp界面中插入圖片4. ASP中實(shí)現(xiàn)字符部位類似.NET里String對(duì)象的PadLeft和PadRight函數(shù)5. jsp實(shí)現(xiàn)textarea中的文字保存換行空格存到數(shù)據(jù)庫(kù)的方法6. PHP設(shè)計(jì)模式中工廠模式深入詳解7. ASP基礎(chǔ)入門第八篇(ASP內(nèi)建對(duì)象Application和Session)8. 將properties文件的配置設(shè)置為整個(gè)Web應(yīng)用的全局變量實(shí)現(xiàn)方法9. 利用CSS3新特性創(chuàng)建透明邊框三角10. 在JSP中使用formatNumber控制要顯示的小數(shù)位數(shù)方法
