JavaSE實現(xiàn)三子棋游戲
本文實例為大家分享了JavaSE實現(xiàn)三子棋游戲的具體代碼,供大家參考,具體內(nèi)容如下
用面向?qū)ο蟮乃季S把實現(xiàn)三子棋劃分為四個模塊:
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; ? ? ? ? ? ? } ? ? ? ? } ? ? } }
棋盤模塊設計
棋盤初始化
接受玩家落子并返回當前棋盤狀態(tài)
接受AI落子并返回當前棋盤狀態(tài)
判斷獲勝方、平局或是繼續(xù)游戲,新游戲重置棋盤。
import java.util.Arrays; public class chessboard { ? ? private static final int 空白 = 0; ? ? private static final int 畫圈 = 1; ? ? private static final int 畫叉 = 2; ? ? private int[][] array = { ? ? ? ? ? ? {空白,空白,空白}, ? ? ? ? ? ? {空白,空白,空白}, ? ? ? ? ? ? {空白,空白,空白}, ? ? }; ? ? public boolean moveCircleAt(int row,int column){ ? ? ? ? if(array[row][column] != 空白){ ? ? ? ? ? ? return false; ? ? ? ? } ? ? ? ? array[row][column] = 畫圈; ? ? ? ? return true; ? ? } ? ? public boolean moveCrossAt(int row,int column){ ? ? ? ? if(array[row][column] != 空白){ ? ? ? ? ? ? return false; ? ? ? ? } ? ? ? ? array[row][column] = 畫叉; ? ? ? ? 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 畫圈:return "@"; ? ? ? ? ? ? case 畫叉: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] == 畫圈 ){ ? ? ? ? ? ? ? ? ? ? System.out.println("玩家勝"); ? ? ? ? ? ? ? ? ? ? return CIRCLE_WIN; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else if(array[i][0] == 畫叉){ ? ? ? ? ? ? ? ? ? ? System.out.println("機器贏"); ? ? ? ? ? ? ? ? ? ? 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] == 畫圈 ){ ? ? ? ? ? ? ? ? ? ? System.out.println("玩家勝"); ? ? ? ? ? ? ? ? ? ? return CIRCLE_WIN; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? else if(array[0][i] == 畫叉){ ? ? ? ? ? ? ? ? ? ? System.out.println("機器贏"); ? ? ? ? ? ? ? ? ? ? return CROSS_WIN; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? //斜線判斷 ? ? ? ? if(array[0][0] == array[1][1] && array[1][1]== array[2][1]){ ? ? ? ? ? ? if(array[1][1] == 畫圈 ){ ? ? ? ? ? ? ? ? return CIRCLE_WIN; ? ? ? ? ? ? } ? ? ? ? ? ? else if(array[1][1] == 畫叉){ ? ? ? ? ? ? ? ? return CROSS_WIN; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? if(array[0][2] == array[1][1] && array[1][1]== array[2][0]){ ? ? ? ? ? ? if(array[1][1] == 畫圈 ){ ? ? ? ? ? ? ? ? return CIRCLE_WIN; ? ? ? ? ? ? } ? ? ? ? ? ? else if(array[1][1] == 畫叉){ ? ? ? ? ? ? ? ? return CROSS_WIN; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? //沒人贏 ? ? ? ? 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],空白); ? ? ? ? } ? ? } }
玩家模塊設計
輸入想要落子的位置,決定退出游戲還是再來一局。
import java.util.Scanner; public class player { ? ? private final Scanner scanner = new Scanner(System.in); ? ? public int[] getStation(){ ? ? ? ? System.out.println("請輸入要落子的位置,行,列,有效輸入是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,請重新輸入。"); ? ? ? ? } ? ? ? ? return new int[] {r,c}; ? ? } ? ? public boolean queryContinue(){ ? ? ? ? System.out.println("是否再來一把?,請輸入true or false"); ? ? ? ? System.out.println(">>>"); ? ? ? ? return scanner.nextBoolean(); ? ? } }
AI(電腦)模塊設計
生成隨機坐標
import java.util.Random; public class AI { ? ? //返回落子的位置 ? ? //第幾行,第幾列都是從0開始 ? ? //有效值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}; ? ? } }
游戲模塊設計
初始化工作:打印提示內(nèi)容和分割線,加載棋盤
判斷是玩家落子還是AI落子
玩家落子情況下:判斷玩家輸入的合法性,超出邊界或是覆蓋落子都是不合法行為
AI落子情況下:判斷輸入的合法性。
控制棋盤重置新棋局
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(); ? ? } ? ? //游戲開始之前,進行一些準備工作 ? ? public void initialize(){ ? ? ? ? System.out.println("歡迎進入井字棋游戲"); ? ? ? ? System.out.println("規(guī)則如下;省略"); ? ? ? ? System.out.println("==========================="); ? ? ? ? System.out.println(chessboard1); ? ? } ? ? public void play(){//cintinue會繼續(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)有子,請重新選擇位置"); ? ? ? ? } ? ? ? ? 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)有子,請重新選擇位置"); ? ? ? ? } ? ? ? ? System.out.println(chessboard1); ? ? ? ? if(chessboard1.getState() == chessboard.CONTINUE){ ? ? ? ? ? ? return false; ? ? ? ? } ? ? ? ? return true; ? ? } }
代碼還有不完善的地方,希望大家多提意見啦
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Spring Data + Thymeleaf 3 + Bootstrap 4 實現(xiàn)分頁器實例代碼
本篇文章主要介紹了Spring Data + Thymeleaf 3 + Bootstrap 4 實現(xiàn)分頁器實例代碼,非常具有實用價值,需要的朋友可以參考下2017-05-05淺談java switch如果case后面沒有break,會出現(xiàn)什么情況?
這篇文章主要介紹了淺談java switch如果case后面沒有break,會出現(xiàn)什么情況?具有很好的參考價值,希望對大家有所幫助。一起跟隨想小編過來看看吧2020-09-09Java 線程池ThreadPoolExecutor源碼解析
這篇文章主要介紹了Java 線程池ThreadPoolExecutor源碼解析2022-03-03