Java五子棋功能实现

本文档介绍了如何使用Java编程实现五子棋游戏,包括棋盘创建、棋子定义、五子棋规则设定以及测试代码。作者分享了棋盘类、棋子类和规则类的详细代码,并给出了游戏运行的示例。文章最后总结了代码规范和IDE的操作技巧。
摘要由CSDN通过智能技术生成


前言

本篇主要记录自己做完五子棋后的代码分享和问题回顾


一、创建棋盘

五子棋由15*15共125个单元,可以通过二维数组创建,
然后通过for循环嵌套if语句赋值

package javaBase.javase.gobang;

import java.util.HashMap;
import java.util.Map;

/**
 * @author liwei
 * @title: ChessBoard
 * @projectName JavaTest
 * @description: TODO
 * @date 2022/6/1415:12
 */
//棋盘类(Chessboard ):Piece[15][15] pieceArr. 初始化棋盘(给pieceArr赋初始值), 打印棋盘,落子方法
public class ChessBoard {
	//不要直接为棋盘二维数组定义大小,可以先定义两个final类型的常量为其赋值
    public static final int ROW_MAX = 15;
    public static final int COLUMN_MAX = 15;
    private Pieces[][] pieceArr = new Pieces[ROW_MAX][COLUMN_MAX];
    ChessBoard(){}
    public Pieces[][] getPieceArr(){
        return pieceArr;
    }
    //初始化棋盘
    public void init(){
        for (int i = 0; i < ROW_MAX; i++) {
            for (int j = 0; j < COLUMN_MAX; j++) {
                Pieces p = null;
                if(i == 0){

                    if(j==0){
                         p = new Pieces(i,j,"┌");
                        pieceArr[i][j] = p;
                    }else if(j == COLUMN_MAX-1){
                         p = new Pieces(i,j,"┐");
                    }else {
                         p = new Pieces(i,j,"┬");
                    }
                }else if(i == ROW_MAX-1){
                    if (j == 0){
                        p = new Pieces(i,j,"└");
                    }else if(j == COLUMN_MAX-1){
                        p = new Pieces(i,j,"┘");
                    }else{
                        p = new Pieces(i,j,"┴");
                    }
                }else{
                    if (j == 0){
                        p = new Pieces(i,j,"├");
                    }else if(j == COLUMN_MAX-1){
                        p = new Pieces(i,j,"┤");
                    }else{
                        p = new Pieces(i,j,"┼");
                    }
                }
                pieceArr[i][j] = p;
            }
        }
    }
	//打印棋盘
    public void printChessBoard(){
        String[] arr = {"1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
        System.out.print(" ");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "  ");
        }
        System.out.println();
        for (int i = 0; i < pieceArr.length; i++) {
            System.out.print(arr[i]);
            for (int j = 0; j < pieceArr.length; j++) {
                if (j < COLUMN_MAX-1){
                    System.out.print(pieceArr[i][j].getSymbol()+"──");
                }else {
                    System.out.print(pieceArr[i][j].getSymbol());
                }

            }
            System.out.println();
        }
    }
	//判断有没有棋子,没有则赋值
    public boolean moveLater(Pieces pieces){
        //判断该位置是否存在棋子
        boolean flag = false;
        if(Rule.isMoveLater(pieces,pieceArr)){
            pieceArr[pieces.getRow()][pieces.getColumn()] = pieces;
            flag = true;
        }else{
            System.out.println("此处已存在棋子,请重新落位");
        }
       return flag;
    }
}

棋盘的效果如下图所示:
在这里插入图片描述


二、创建棋子

package javaBase.javase.gobang;

/**
 * @author liwei
 * @title: Pieces
 * @projectName JavaTest
 * @description: TODO
 * @date 2022/6/1415:06
 */
 //棋子由横坐标,纵坐标和特殊符号构成
public class Pieces {
    private Integer row;
    private Integer column;
    private String symbol;
    public Pieces(){}

    public Pieces(Integer row, Integer column, String symbol) {
        this.row = row;
        this.column = column;
        this.symbol = symbol;
    }

    public Integer getRow() {
        return row;
    }

    public void setRow(Integer row) {
        this.row = row;
    }

    public Integer getColumn() {
        return column;
    }

    public void setColumn(Integer column) {
        this.column = column;
    }

    public String getSymbol() {
        return symbol;
    }

    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }


    @Override
    public String toString() {
        return "Pieces{" +
                "row=" + row +
                ", column=" + column +
                ", symbol=" + symbol +
                '}';
    }
}


三、定义五子棋规则

package javaBase.javase.gobang;

import java.util.HashMap;
import java.util.Map;

/**
 * @author liwei
 * @title: Rule
 * @projectName JavaTest
 * @description: TODO
 * @date 2022/6/1415:57
 */
public class Rule {

    Rule() {
    }

    //判断下标,通过map来存储每个字符的值,这样输入大小写都可判断
    public static Pieces judgeIndex(String x,String y){
        Map<String,Integer> map = new HashMap() {{
            put("A",10);
            put("a",10);
            put("B",11);
            put("b",11);
            put("C",12);
            put("c",12);
            put("D",13);
            put("d",13);
            put("E",14);
            put("e",14);
            put("F",15);
            put("f",15);
        }};
        Pieces pieces = new Pieces(0,0,"");
        //横坐标
        int row = 0;
        //纵坐标
        int column = 0;
        for (int i = 1; i < 10; i++) {
            if(Integer.toString(i).equals(x)){
                row = Integer.parseInt(x)-1;
                break;
            }
        }
        if(map.get(x) != null){
            row = map.get(x)-1;
        }
        for (int i = 1; i < 10; i++) {
            if(Integer.toString(i).equals(y)){
                column = Integer.parseInt(y)-1;
                break;
            }
        }
        if(map.get(y) != null){
            column = map.get(y)-1;
        }
        pieces.setRow(row);
        pieces.setColumn(column);
        return pieces;
    }

    public static boolean isMoveLater(Pieces pieces, Pieces[][] array) {
        if (array[pieces.getRow()][pieces.getColumn()].getSymbol().equals("o") ||
                array[pieces.getRow()][pieces.getColumn()].getSymbol().equals("●")) {
            return false;
        } else {
            return true;
        }
    }

    //判断五子相连
    public static boolean isSuccess(Pieces pieces, Pieces[][] array) {
        Integer row = pieces.getRow();
        Integer column = pieces.getColumn();
        String symbol = pieces.getSymbol();
        //判断有没有5个一样的
        int index = 1;
        //水平向左
        int x = 0;
        int y = row-1;
        while(y>=0){
            if (array[y][column].getSymbol() == symbol) {
                index++;
                y--;
            }else {
                break;
            }
        }
        y = row + 1;
        //水平向右
        while (y <= ChessBoard.COLUMN_MAX-1){
            if (array[y][column].getSymbol() == symbol) {
                index++;
                y++;
            }else {
                break;
            }
        }
        if (index >= 5){
            return true;
        }

        index = 1;
         /* 垂直向下
         */
        x = column - 1;
        while(x>=0){
            if (array[row][x].getSymbol() == symbol) {
                index++;
                x--;
            }else {
                break;
            }
        }
        x = column + 1;
        //垂直向上
        while (x <= ChessBoard.COLUMN_MAX-1){
            if (array[row][x].getSymbol() == symbol) {
                index++;
                x++;
            }else {
                break;
            }
        }
        if (index >= 5){
            return true;
        }

        index = 1;
        /**判断左上右下方向上的胜负
         * 先判断左边的
         */
        x = row-1;
        y = column+1;
        while (x >= 0 && y <= ChessBoard.COLUMN_MAX){
            if (array[x][y].getSymbol() == symbol) {
                index++;
                x--;
                y++;
            }else {
                break;
            }
        }
        //判断右边的
        x = row + 1;
        y = column - 1;
        while (x <= ChessBoard.ROW_MAX-1 && y >= 0){
        if (array[x][y].getSymbol() == symbol) {
                index++;
                x++;
                y--;
            }else {
            break;
        }
        }
        if (index >= 5) {
            return true;
        }
        index = 1;
        /**判断左下右上方向上的胜负
         * 判断左边的
         */
        x = row -1;
        y = column -1;
        while (x >= 0 && y >= 0){
            if (array[x][y].getSymbol() == symbol) {
                index++;
                x--;
                y--;
            }else {
                break;
            }
        }
        x = row +1;
        y = column+1;
        //判断右边的
        while (x <= ChessBoard.ROW_MAX-1 && y <= ChessBoard.COLUMN_MAX-1){
            if (array[x][y].getSymbol() == symbol) {
                index++;
                x++;
                y++;
            }else {
                break;
            }
        }
        if (index >= 5) {
            return true;
        }
        return false;
    }
}

四、编写测试语句

package javaBase.javase.gobang;

import java.util.Scanner;

/**
 * @author liwei
 * @title: GoBang
 * @projectName JavaTest
 * @description: TODO
 * @date 2022/6/1414:37
 */
 //通过index是奇数还是偶数来判断黑棋和白棋
public class GoBang {
    public static void main(String[] args) {
        ChessBoard chessBoard = new ChessBoard();
        chessBoard.init();
        Pieces[][] pieceArr = chessBoard.getPieceArr();
        //黑白棋子
        String symbol1 = "●";
        String symbol2 = "o";
        //落子次数
        int index = 0;
        Scanner sc = new Scanner(System.in);
        //判断该位置是否存在棋子
        boolean flag1 = false;
        //判断游戏胜利
        boolean flag2 = false;
        while (true) {
            Pieces pieces = new Pieces(0, 0, "");
            chessBoard.printChessBoard();
            System.out.print("请输入落点位置(例如5,A):");
            String s = sc.nextLine();
            while (s.length() != 3 || (s.charAt(0) < '1' && s.charAt(0) > '9')
                    || s.charAt(1) != ',' || (s.charAt(1) < 'A' && s.charAt(1) > 'F')) {
                System.out.print("位置输入有误,请重新输入(例如A,9):");
                s = sc.nextLine();
            }
            String[] split = s.split(",");
            String x = split[0];
            String y = split[1];

            pieces = Rule.judgeIndex(x, y);
            if (index % 2 == 0) {
                pieces.setSymbol(symbol1);
            } else {
                pieces.setSymbol(symbol2);
            }
            flag1 = chessBoard.moveLater(pieces);
            if (flag1) {
                index++;
            }
            flag2 = Rule.isSuccess(pieces, pieceArr);
            if (flag2) {
            	chessBoard.printChessBoard();
                System.out.println(pieces.getSymbol() + "游戏胜利,比赛结束!");
                break;
            }
        }
    }
}

最终效果如图所示:
在这里插入图片描述

我声明的是黑棋先行,所以说黑棋胜利,如有需要,也可以自己变更


总结

五子棋只是一个小小的磨练,百炼成钢,如果你看到了这里,告诉你一个关于idea的好的操作,按ctrl+alt+L为代码规范位置,ctrl+alt+O清理无用的引入包

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值