JavaSE實(shí)現(xiàn)三子棋游戲
本文實(shí)例為大家分享了JavaSE實(shí)現(xiàn)三子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
用面向?qū)ο蟮乃季S把實(shí)現(xiàn)三子棋劃分為四個(gè)模塊:
main函數(shù)
public class main { ? ? public static void main(String[] args) { ? ? ? ? player player1 = new player(); ? ? ? ? game game1 = new game(player1); ? ? ? ? while(true){ ? ? ? ? ? ? game1.initialize(); ? ? ? ? ? ? game1.play(); ? ? ? ? ? ? game1.destroy(); ? ? ? ? ? ? boolean b = player1.queryContinue(); ? ? ? ? ? ? if (!b) { ? ? ? ? ? ? ? ? System.out.println("歡迎下次繼續(xù)游戲"); ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? } ? ? ? ? } ? ? } }
棋盤(pán)模塊設(shè)計(jì)
棋盤(pán)初始化
接受玩家落子并返回當(dāng)前棋盤(pán)狀態(tài)
接受AI落子并返回當(dāng)前棋盤(pán)狀態(tài)
判斷獲勝方、平局或是繼續(xù)游戲,新游戲重置棋盤(pán)。
import java.util.Arrays; public class chessboard { ? ? private static final int 空白 = 0; ? ? private static final int 畫(huà)圈 = 1; ? ? private static final int 畫(huà)叉 = 2; ? ? private int[][] array = { ? ? ? ? ? ? {空白,空白,空白}, ? ? ? ? ? ? {空白,空白,空白}, ? ? ? ? ? ? {空白,空白,空白}, ? ? }; ? ? public boolean moveCircleAt(int row,int column){ ? ? ? ? if(array[row][column] != 空白){ ? ? ? ? ? ? return false; ? ? ? ? } ? ? ? ? array[row][column] = 畫(huà)圈; ? ? ? ? return true; ? ? } ? ? public boolean moveCrossAt(int row,int column){ ? ? ? ? if(array[row][column] != 空白){ ? ? ? ? ? ? return false; ? ? ? ? } ? ? ? ? array[row][column] = 畫(huà)叉; ? ? ? ? return true; ? ? } ? ? public static final int CIRCLE_WIN = 0; ? ? public static final int CROSS_WIN = 1; ? ? public static final int DRAW = 2; ? ? public static final int CONTINUE = 3; ? ? private static String display(int i){ ? ? ? ? switch (i){ ? ? ? ? ? ? case 空白:return " "; ? ? ? ? ? ? case 畫(huà)圈:return "@"; ? ? ? ? ? ? case 畫(huà)叉:return "*"; ? ? ? ? ? ? default:return " "; ? ? ? ? } ? ? } ? ? @Override ? ? public String toString() { ? ? ? ? String s = "+-+-+-+-+-+\n"; ? ? ? ? for(int i = 0;i<2;i++){ ? ? ? ? ? ?s += ?String.format("|%s|%s|%s|\n",display(array[i][0]),display(array[i][1]),display(array[i][2])); // ? ? ? ? ? s += "+-+-+-+-+-+\n"; ? ? ? ? } ? ? ? ? s += ?String.format("|%s|%s|%s|\n",display(array[2][0]),display(array[2][1]),display(array[2][2])); ? ? ? ? s += "+-+-+-+-+-+"; ? ? ? ? return s; ? ? } ? ? public int getState(){ ? ? ? ? //按行判斷 ? ? ? ? for(int i = 0;i<3;i++){ ? ? ? ? ? ? if(array[i][0] == array[i][1] && array[i][1]== array[i][2]){ ? ? ? ? ? ? ? ? if(array[i][0] == 畫(huà)圈 ){ ? ? ? ? ? ? ? ? ? ? System.out.println("玩家勝"); ? ? ? ? ? ? ? ? ? ? return CIRCLE_WIN; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else if(array[i][0] == 畫(huà)叉){ ? ? ? ? ? ? ? ? ? ? System.out.println("機(jī)器贏"); ? ? ? ? ? ? ? ? ? ? return CROSS_WIN; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? //列判斷 ? ? ? ? for(int i = 0;i<3;i++){ ? ? ? ? ? ? if(array[0][i] == array[1][i] && array[1][i]== array[2][i]){ ? ? ? ? ? ? ? ? if(array[0][i] == 畫(huà)圈 ){ ? ? ? ? ? ? ? ? ? ? System.out.println("玩家勝"); ? ? ? ? ? ? ? ? ? ? return CIRCLE_WIN; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else if(array[0][i] == 畫(huà)叉){ ? ? ? ? ? ? ? ? ? ? System.out.println("機(jī)器贏"); ? ? ? ? ? ? ? ? ? ? return CROSS_WIN; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? //斜線(xiàn)判斷 ? ? ? ? if(array[0][0] == array[1][1] && array[1][1]== array[2][1]){ ? ? ? ? ? ? if(array[1][1] == 畫(huà)圈 ){ ? ? ? ? ? ? ? ? return CIRCLE_WIN; ? ? ? ? ? ? } ? ? ? ? ? ? else if(array[1][1] == 畫(huà)叉){ ? ? ? ? ? ? ? ? return CROSS_WIN; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? if(array[0][2] == array[1][1] && array[1][1]== array[2][0]){ ? ? ? ? ? ? if(array[1][1] == 畫(huà)圈 ){ ? ? ? ? ? ? ? ? return CIRCLE_WIN; ? ? ? ? ? ? } ? ? ? ? ? ? else if(array[1][1] == 畫(huà)叉){ ? ? ? ? ? ? ? ? return CROSS_WIN; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? //沒(méi)人贏 ? ? ? ? for(int i = 0;i<3;i++){ ? ? ? ? ? ? for(int j = 0;j<3;j++){ ? ? ? ? ? ? ? ? if(array[i][j] == 空白){ ? ? ? ? ? ? ? ? ? ? return CONTINUE; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? return DRAW; ? ? } ? ? public void reset() { ? ? ? ? for(int i = 0;i<3;i++){ ? ? ? ? ? ? Arrays.fill(array[i],空白); ? ? ? ? } ? ? } }
玩家模塊設(shè)計(jì)
輸入想要落子的位置,決定退出游戲還是再來(lái)一局。
import java.util.Scanner; public class player { ? ? private final Scanner scanner = new Scanner(System.in); ? ? public int[] getStation(){ ? ? ? ? System.out.println("請(qǐng)輸入要落子的位置,行,列,有效輸入是0,1,2"); ? ? ? ? int r,c; ? ? ? ? while (true) { ? ? ? ? ? ? System.out.print(">>>"); ? ? ? ? ? ? ?r = scanner.nextInt(); ? ? ? ? ? ? ?c = scanner.nextInt(); ? ? ? ? ? ? ?if(r >= 0 && r <= 2 &&c >= 0 && c <= 2){ ? ? ? ? ? ? ? ? ?break; ? ? ? ? ? ? ?} ? ? ? ? ? ? System.out.println("有效范圍是0,1,2,請(qǐng)重新輸入。"); ? ? ? ? } ? ? ? ? return new int[] {r,c}; ? ? } ? ? public boolean queryContinue(){ ? ? ? ? System.out.println("是否再來(lái)一把?,請(qǐng)輸入true or false"); ? ? ? ? System.out.println(">>>"); ? ? ? ? return scanner.nextBoolean(); ? ? } }
AI(電腦)模塊設(shè)計(jì)
生成隨機(jī)坐標(biāo)
import java.util.Random; public class AI { ? ? //返回落子的位置 ? ? //第幾行,第幾列都是從0開(kāi)始 ? ? //有效值0~2 ? ? private final Random random = new Random(); ? ? int r,c; ? ? public int[] getStation(){ ? ? ? ? r = random.nextInt(3); ? ? ? ? c = random.nextInt(3); ? ? ? ? return new int[] {r,c}; ? ? } }
游戲模塊設(shè)計(jì)
初始化工作:打印提示內(nèi)容和分割線(xiàn),加載棋盤(pán)
判斷是玩家落子還是AI落子
玩家落子情況下:判斷玩家輸入的合法性,超出邊界或是覆蓋落子都是不合法行為
AI落子情況下:判斷輸入的合法性。
控制棋盤(pán)重置新棋局
package 三子棋; public class game { ? ? private final chessboard chessboard1; ? ? private final player player1; ? ? private final AI ai; ? ? public game(player player1){ ? ? ? ? this.chessboard1 = new chessboard(); ? ? ? ? this.player1 = player1; ? ? ? ? this.ai = new AI(); ? ? } ? ? //游戲開(kāi)始之前,進(jìn)行一些準(zhǔn)備工作 ? ? public void initialize(){ ? ? ? ? System.out.println("歡迎進(jìn)入井字棋游戲"); ? ? ? ? System.out.println("規(guī)則如下;省略"); ? ? ? ? System.out.println("==========================="); ? ? ? ? System.out.println(chessboard1); ? ? } ? ? public void play(){//cintinue會(huì)繼續(xù),玩家勝,AI勝和平局 都是break,退出循環(huán)。 ? ? ? ? while(true){ ? ? ? ? ? ? if(playerTurn()){ ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? } ? ? ? ? ? ? if(aiTurn()) { ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? } ? ? ? ? } ? ? } ? ? //游戲結(jié)束之前,完成一些收尾工作 ? ? public void destroy(){ // ? ? ? ?ai.reset(); // ? ? ? ?player1.reset(); ? ? ? ? chessboard1.reset(); ? ? } ? ? private boolean playerTurn(){ ? ? ? ? System.out.println("玩家回合"); ? ? ? ? while (true){ ? ? ? ? ? ? int[] rc = player1.getStation(); ? ? ? ? ? ? int row = rc[0]; ? ? ? ? ? ? int column = rc[1]; ? ? ? ? ? ? if(chessboard1.moveCircleAt(row,column)) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? } ? ? ? ? ? ? System.out.println("該位置已經(jīng)有子,請(qǐng)重新選擇位置"); ? ? ? ? } ? ? ? ? System.out.println(chessboard1); ? ? ? ? if(chessboard1.getState() == chessboard.CONTINUE){ ? ? ? ? ? ? return false; ? ? ? ? } ? ? ? ? return true; ? ? } ? ? private boolean aiTurn(){ ? ? ? ? System.out.println("AI回合"); ? ? ? ? while (true){ ? ? ? ? ? ? int[] rc = ai.getStation(); ? ? ? ? ? ? int row = rc[0]; ? ? ? ? ? ? int column = rc[1]; ? ? ? ? ? ? if(chessboard1.moveCrossAt(row,column)) ? ? ? ? ? ? { ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? } ? ? ? ? ? ? System.out.println("該位置已經(jīng)有子,請(qǐng)重新選擇位置"); ? ? ? ? } ? ? ? ? System.out.println(chessboard1); ? ? ? ? if(chessboard1.getState() == chessboard.CONTINUE){ ? ? ? ? ? ? return false; ? ? ? ? } ? ? ? ? return true; ? ? } }
代碼還有不完善的地方,希望大家多提意見(jiàn)啦
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Data + Thymeleaf 3 + Bootstrap 4 實(shí)現(xiàn)分頁(yè)器實(shí)例代碼
本篇文章主要介紹了Spring Data + Thymeleaf 3 + Bootstrap 4 實(shí)現(xiàn)分頁(yè)器實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-05-05Java基礎(chǔ)之Unsafe內(nèi)存操作不安全類(lèi)詳解
Java是面向?qū)ο笳Z(yǔ)言,在使用Java編程時(shí),大多數(shù)情況下都不會(huì)直接操作內(nèi)存,而且Java也不提倡直接操作內(nèi)存,但是Java中到底有沒(méi)有可以直接操作內(nèi)存的工具類(lèi)呢?有!Java中提供Unsafe類(lèi)可以用來(lái)來(lái)直接操作內(nèi)存,文中詳細(xì)介紹了Unsafe內(nèi)存操作不安全類(lèi),需要的朋友可以參考下2021-06-06java如何讀取文件目錄返回樹(shù)形結(jié)構(gòu)
這篇文章主要介紹了java如何讀取文件目錄返回樹(shù)形結(jié)構(gòu)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01MyBatis-Plus中更新操作的兩種實(shí)現(xiàn)
本文主要介紹了MyBatis-Plus中更新操作的兩種實(shí)現(xiàn),主要是通過(guò)id更新和條件更新,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04淺談java switch如果case后面沒(méi)有break,會(huì)出現(xiàn)什么情況?
這篇文章主要介紹了淺談java switch如果case后面沒(méi)有break,會(huì)出現(xiàn)什么情況?具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨想小編過(guò)來(lái)看看吧2020-09-09Java 線(xiàn)程池ThreadPoolExecutor源碼解析
這篇文章主要介紹了Java 線(xiàn)程池ThreadPoolExecutor源碼解析2022-03-03java web實(shí)現(xiàn)自動(dòng)登錄
這篇文章主要為大家詳細(xì)介紹了java web實(shí)現(xiàn)自動(dòng)登錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08