控制台游戏——五子棋

来源:互联网 发布:网络主播怎么赚钱 编辑:程序博客网 时间:2024/05/29 06:54

加深自己对面向对象的理解

1.棋子类

package com.code.t01;/** * Created with IntelliJ IDEA. * Description:棋子类 * User: ChenXinpeng * Date: 2017-08-01 * Time: 18:14 */public enum ChessMan {    BLACK("●"),WHITE("○"),DRAW("+");    private String name;    private ChessMan(String name){        this.name = name;    }    public String getName(){        return this.name;    }}

2.棋盘类

package com.code.t01;/** * Created with IntelliJ IDEA. * Description:棋盘类 * User: ChenXinpeng * Date: 2017-08-01 * Time: 17:40 */public class Chessboard {    private String[][] board;//棋盘数组    public static int SIZE = 22;//棋盘大小    /**     * 初始化棋盘     */    public void initBoard(){        board = new String[SIZE][SIZE];        for (int i = 0; i < SIZE; i++) {            for (int j = 0; j < SIZE; j++) {                board[i][j] = "+";            }        }    }    /**     * 打印棋盘     */    public void printBoard(){        for (int i = 0; i < this.SIZE; i++) {            for (int j = 0; j < this.SIZE; j++) {                if(board[i][j] == "+")                    System.out.print(board[i][j] + "  ");                else                    System.out.print(board[i][j] + " ");            }            System.out.println();        }    }    /**     * 将棋子放在棋盘上     * @param posX int 坐标X     * @param posY int 坐标Y     * @param chessMan String 棋子类型     */    public void setBoard(int posX, int posY, String chessMan) {        this.board[posX][posY] = chessMan;    }    /**     * @return String[][] 棋盘     */    public String[][] getBoard() {        return board;    }}

3.游戏逻辑类

package com.code.t01;import java.util.Scanner;/** * Created with IntelliJ IDEA. * Description:游戏逻辑类 * User: ChenXinpeng * Date: 2017-08-01 * Time: 18:38 */public class GoBangGame {    private final int WIN_COUNT = 5;//胜利条件    private int posX; //坐标X    private int posY;//坐标Y    private Chessboard chessboard;//棋盘    /**     * 无参构造方法     */    public GoBangGame() {        this.chessboard = new Chessboard();    }    /**     * 构造方法     * @param chessboard Chessboard 棋盘     */    public GoBangGame(Chessboard chessboard) {        this.chessboard = chessboard;    }    /**     * 检查输入是否合法     * @param inputStr String 坐标字符串(X,Y)     * @return boolean 是否符合     */    public boolean isValid(String inputStr){        String[] str = inputStr.split(",");        try{            posX = Integer.parseInt(str[0]) - 1;            posY = Integer.parseInt(str[1]) - 1;        }catch (Exception e){            chessboard.printBoard();            System.out.println("请以(数字,数字)的格式输入:");            return false;        }        if(posY < 0 || posY >= Chessboard.SIZE || posX < 0 || posX >= Chessboard.SIZE){            System.out.println("X与Y坐标只能大于等于1,与小于等于" + Chessboard.SIZE + "请重新输入:");            return false;        }        String[][] board = this.chessboard.getBoard();        if (!board[posX][posY].equals("+")){            chessboard.printBoard();            System.out.println("此位置已经有旗子了,请重新输入:");            return false;        }        return true;    }    /**     * 电脑随机下棋     */    public void computerRandom(){        this.posX = (int)(Math.random() * Chessboard.SIZE );        this.posY = (int)(Math.random() * Chessboard.SIZE );        String[][] board = chessboard.getBoard();        while(board[posX][posY] != "+"){            this.posX = (int)(Math.random() * Chessboard.SIZE);            this.posY = (int)(Math.random() * Chessboard.SIZE);        }    }    /**     * 检查棋盘是否已满     * @return boolean 是否已满     */    public boolean isFull(){        boolean flag = false;        String[][] board = chessboard.getBoard();        for (int i = 0; i < Chessboard.SIZE; i++) {            for (int j = 0; j < Chessboard.SIZE; j++) {                if(board[i][j] == "+"){                    flag = true;                }            }        }        return flag;    }    /**     * 判断比赛结果     * @param posX int 坐标X     * @param posY int 坐标Y     * @param ico int 棋子类型     * @return boolean 比赛结果     */    public boolean  isWin(int posX, int posY, String ico){        int startX = 0;        int startY = 0;        int endX = Chessboard.SIZE - 1;        int endY = endX;        int sameCount = 0;        int temp = 0;        temp = posX - WIN_COUNT + 1;        startX = temp < 0 ? 0 : temp;        temp = posY - WIN_COUNT + 1;        startY = temp < 0 ? 0 : temp;        temp = posX + WIN_COUNT - 1;        endX = temp > Chessboard.SIZE - 1 ? Chessboard.SIZE - 2 : temp;        temp = posY + WIN_COUNT - 1;        endY = temp > Chessboard.SIZE - 1 ? Chessboard.SIZE - 2 : temp;        String[][] board = this.chessboard.getBoard();        for (int i = startY; i < endY; i++) {            if(board[posX][i] == ico && board[posX][i + 1] == ico){                sameCount ++;                if(sameCount == this.WIN_COUNT - 1){                    return true;                }            }else if(sameCount != WIN_COUNT - 1){                sameCount = 0;            }        }//end for        for (int i = startX; i < endX; i++) {            if(board[i][posY] == ico && board[i + 1][posY] == ico){                sameCount ++;                if(sameCount == this.WIN_COUNT - 1){                    return true;                }            }else if(sameCount != WIN_COUNT - 1){                sameCount = 0;            }        }//end for        for (int i = startX, j = startY; i < endX && j< endY; i++, j++) {            if(board[i][j] == ico && board[i + 1][j + 1] == ico){                sameCount ++;                if(sameCount == this.WIN_COUNT - 1){                    return true;                }            }else if(sameCount != WIN_COUNT - 1){                sameCount = 0;            }        }        return false;    }    /**     * 开始游戏     */    public void start() {        chessboard.initBoard();        System.out.println("游戏开始");        Scanner scanner = new Scanner(System.in);        String inputStr = null;        while((inputStr = scanner.next()) != null){            boolean isOver = false;//游戏结果            if(!isValid(inputStr)){                continue;            }            String chessman = ChessMan.BLACK.getName();            chessboard.setBoard(posX, posY, chessman);            if(isWin(posX, posY, chessman)){                isOver = true;            }else{                isOver = isFull();                if(!isOver){                    chessman = ChessMan.DRAW.getName();                }else {                    this.computerRandom();                    chessman = ChessMan.WHITE.getName();                    chessboard.setBoard(posX, posY, chessman);                    if(isWin(posX, posY, chessman)){                        isOver = true;                    }                }            }            chessboard.printBoard();            if(isOver){                if(isReplay(chessman)){                    chessboard.initBoard();                    chessboard.printBoard();                    continue;                }                break;            }        }    }    /**     * 选择是否重新开始     * @param chessman String 棋子类型     * @return boolean 是否重新开始     */    public boolean isReplay(String chessman){        chessboard.printBoard();        String message = chessman.equals(ChessMan.BLACK.getName()) ? (chessman.equals(ChessMan.DRAW.getName()) ? "平局" : "恭喜您,您赢了") : "很遗憾,您输了";        System.out.println(message + "再来下一局?(y/n)");        Scanner scanner = new Scanner(System.in);        String str = scanner.next();        if(str.equals("y") || str.equals("Y")){            return true;        }        return false;    }}



原创粉丝点击