五子棋小游戏——Java

一、内容简介:

五子棋小游戏是我们日常生活中经常玩的小游戏,游戏规则也很简单。下面就让我们使用Java来实现五子棋的编写吧!

二、基本流程

1.通过菜单选择开始游戏和退出游戏
2.创建并初始化棋盘为空格
3.打印棋盘
4.玩家以坐标的形式落子
5.判断输赢

三、具体步骤

1.菜单栏

public static void menu() {
        System.out.println("-------------------------------------------------------");
        System.out.println("---------------1.开始游戏      2.退出游戏----------------");
        System.out.println("-------------------------------------------------------");
    }

2.创建棋盘并初始化为空格

(1)定义行数、列数为常量
public static final int ROW = 10;//行数
public static final int COL = 10;//列数
public static final String BlackChess = "#";//黑方
public static final String WhiteChess = "*";//白方
(2)定义棋盘
String[][] board = new String[ROW + 1][COL + 1];

多的一行、一列为了添加坐标使用。

(3)给棋盘添加坐标并初始化棋盘为空格
	/**
     * 给棋盘添加坐标并初始化棋盘为空格
     *
     * @param board 棋盘
     * @param row   行数
     * @param col   列数
     */
    private static void InitBoard(String[][] board, int row, int col) {
        String[] arr = {"1 ", "2 ", "3 ", "4 ", "5 ", "6 ", "7 ", "8 ", "9 ", "10"};
        board[row] = arr;
        for (int i = 0; i < arr.length; i++) {
            board[i][col] = arr[i];
        }
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                board[i][j] = " ";
            }
        }
        System.out.println();
    }

}

3.打印棋盘

	/**
     * 打印棋盘
     * @param board 棋盘
     * @param row   行数
     * @param col   列数
     */
    private static void PrintBoard(String[][] board, int row, int col) {
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col + 1; j++) {
                System.out.printf(" %s ", board[i][j]);
                if (j < col)
                    System.out.print("|");
            }
            System.out.println();
            if (i < row - 1) {
                for (int j = 0; j < col + 1; j++) {
                    System.out.print("---");
                    if (j < col)
                        System.out.print("|");
                }
                System.out.println();
            }
        }
        for (int j = 0; j < col; j++) {
            System.out.printf(" %s", board[row][j]);
            if (j < col - 1)
                System.out.print("|");
        }
    }

4.玩家落子

	/**
     * 玩家落子
     *
     * @param board //棋盘
     * @param x     //横坐标
     * @param y     //纵坐标
     * @param Chess //棋子
     * @param row   // 行数
     * @param col   // 列数
     */
    private static boolean PlayerMove(String[][] board, int x, int y, String Chess, int row, int col) {
        while (true) {
            if (x >= 0 && x < row && y >= 0 && y < col) {
                if (board[x][y].equals(" ")) {
                    board[x][y] = Chess;
                    return false;
                } else {
                    System.out.println("该坐标已被占用!");
                    return true;
                }
            } else {
                System.out.println("坐标非法,请您重新输入!");
                return true;
            }
        }
    }

如果落子成功,返回false,不进入外面的循环;如果落子失败,返回true,进入外面的循环,重新落子。

5.判断输赢

1.判断横着或竖着是否有连续的相同的5颗棋子,这个比较容易实现。
2.判断斜着是否有连续的相同的5颗棋子。
将下的这颗棋子为中心,分别判断它的左上、右下和左下、右上是否有连续的相同的5颗棋子。

	 /**
     * @param board     //棋盘
     * @param x         //横坐标
     * @param y         //纵坐标
     * @param Chess//棋子
     * @param row       //行数
     * @param col       //列数
     * @return //true或false
     */
    private static boolean IsWin(String[][] board, int x, int y, String Chess, int row, int col) {
        //判断横或竖是否有相同的五颗棋
        for (int i = 0; i < row - 5; i++) {
            if (board[x][i].equals(Chess) && board[x][i + 1].equals(Chess) && board[x][i + 2].equals(Chess)
                    && board[x][i + 3].equals(Chess)
                    && board[x][i + 4].equals(Chess))
                return true;
            if (board[i][y].equals(Chess) && board[i + 1][y].equals(Chess) && board[i + 2][y].equals(Chess)
                    && board[i + 3][y].equals(Chess)
                    && board[i + 4][y].equals(Chess))
                return true;
        }

        //判断该棋子的左上、右下和左下、右上是否有连续的相同的五颗棋子
        int count1 = 1;
        int count2 = 1;
        int lx, ly;
        //左上
        for (lx = x - 1, ly = y + 1; lx >= 0 && ly >= 0; lx--, ly--) {
            if (board[lx][ly].equals(Chess)) {
                count1++;
                if (count1 >= 5)
                    return true;
            } else {
                break;
            }
        }
        //右下
        for (lx = x + 1, ly = y - 1; lx >= 0 && ly >= 0; lx--, ly--) {
            if (board[lx][ly].equals(Chess)) {
                count1++;
                if (count1 >= 5)
                    return true;
            } else {
                break;
            }
        }
        //左下
        for (lx = x - 1, ly = y - 1; lx >= 0 && ly >= 0; lx--, ly--) {
            if (board[lx][ly].equals(Chess)) {
                count2++;
                if (count2 >= 5)
                    return true;
            } else {
                break;
            }
        }
        //右上
        for (lx = x + 1, ly = y + 1; lx >= 0 && ly >= 0; lx--, ly--) {
            if (board[lx][ly].equals(Chess)) {
                count2++;
                if (count2 >= 5)
                    return true;
            } else {
                break;
            }
        }
        return false;//没有人赢
    }

四、代码实现

import java.util.Scanner;

public class Main {
    public static final int ROW = 10;//行数
    public static final int COL = 10;//列数
    public static final String BlackChess = "#";
    public static final String WhiteChess = "*";

    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        menu();
        System.out.println("请您输入选择:");
        int input = sca.nextInt();
        while (true) {
            switch (input) {
                case 1:
                    //开始游戏
                    beginGame(sca);
                    break;
                case 2:
                    //退出游戏
                    endGame();
                    break;
                default:
                    System.out.println("非法输入!");
                    System.out.println("请您重新输入!");
            }
            break;
        }
    }

    /**
     * 退出游戏
     */
    private static void endGame() {
        System.out.println("您已退出游戏!");
        return;
    }

    public static void menu() {
        System.out.println("-------------------------------------------------------");
        System.out.println("---------------1.开始游戏      2.退出游戏----------------");
        System.out.println("-------------------------------------------------------");
    }

    public static void beginGame(Scanner sca) {
        //1.定义棋盘
        String[][] board = new String[ROW + 1][COL + 1];
        //2.给棋盘添加坐标并初始化棋盘为空格
        InitBoard(board, ROW, COL);
        //3.打印棋盘
        PrintBoard(board, ROW, COL);
        /**
         * 开始下棋
         */
        while (true) {
            boolean flag = true;
            //4.黑方落子
            System.out.println();
            int x = 0, y = 0;
            System.out.println("请黑方落子:");
            x = sca.nextInt() - 1;
            y = sca.nextInt() - 1;
            while (PlayerMove(board, x, y, BlackChess, ROW, COL)) {
                System.out.println("请重新输入!");
                x = sca.nextInt() - 1;
                y = sca.nextInt() - 1;
            }
            PrintBoard(board, ROW, COL);//打印棋盘
            //5.判断输赢
            boolean winer = IsWin(board, x, y, BlackChess, ROW, COL);
            if (winer) {
                System.out.println();
                System.out.println("黑方胜!");
                System.out.println("游戏结束!");
                break;
            }
            //6.白方落子
            System.out.println();
            System.out.println("请白方落子");
            x = sca.nextInt() - 1;
            y = sca.nextInt() - 1;
            while (PlayerMove(board, x, y, WhiteChess, ROW, COL)) {
                System.out.println("请重新输入!");
                x = sca.nextInt() - 1;
                y = sca.nextInt() - 1;
            }
            PrintBoard(board, ROW, COL);//打印棋盘
            //判断输赢
            if (IsWin(board, x, y, WhiteChess, ROW, COL)) {
                System.out.println();
                System.out.println("白方胜!");
                System.out.println("游戏结束!");
                break;
            }
        }
        return;
    }

    /**
     * 玩家落子
     *
     * @param board //棋盘
     * @param x     //横坐标
     * @param y     //纵坐标
     * @param Chess //棋子
     * @param row   // 行数
     * @param col   // 列数
     */
    private static boolean PlayerMove(String[][] board, int x, int y, String Chess, int row, int col) {
        while (true) {
            if (x >= 0 && x < row && y >= 0 && y < col) {
                if (board[x][y].equals(" ")) {
                    board[x][y] = Chess;
                    return false;
                } else {
                    System.out.println("该坐标已被占用!");
                    return true;
                }
            } else {
                System.out.println("坐标非法,请您重新输入!");
                return true;
            }
        }
    }

    /**
     * @param board     //棋盘
     * @param x         //横坐标
     * @param y         //纵坐标
     * @param Chess//棋子
     * @param row       //行数
     * @param col       //列数
     * @return //true或false
     */
    private static boolean IsWin(String[][] board, int x, int y, String Chess, int row, int col) {
        //判断横或竖是否有相同的五颗棋
        for (int i = 0; i < row - 5; i++) {
            if (board[x][i].equals(Chess) && board[x][i + 1].equals(Chess) && board[x][i + 2].equals(Chess)
                    && board[x][i + 3].equals(Chess)
                    && board[x][i + 4].equals(Chess))
                return true;
            if (board[i][y].equals(Chess) && board[i + 1][y].equals(Chess) && board[i + 2][y].equals(Chess)
                    && board[i + 3][y].equals(Chess)
                    && board[i + 4][y].equals(Chess))
                return true;
        }

        //判断该棋子的左上、右下和左下、右上是否有连续的相同的五颗棋子
        int count1 = 1;
        int count2 = 1;
        int lx, ly;
        //左上
        for (lx = x - 1, ly = y + 1; lx >= 0 && ly >= 0; lx--, ly--) {
            if (board[lx][ly].equals(Chess)) {
                count1++;
                if (count1 >= 5)
                    return true;
            } else {
                break;
            }
        }
        //右下
        for (lx = x + 1, ly = y - 1; lx >= 0 && ly >= 0; lx--, ly--) {
            if (board[lx][ly].equals(Chess)) {
                count1++;
                if (count1 >= 5)
                    return true;
            } else {
                break;
            }
        }
        //左下
        for (lx = x - 1, ly = y - 1; lx >= 0 && ly >= 0; lx--, ly--) {
            if (board[lx][ly].equals(Chess)) {
                count2++;
                if (count2 >= 5)
                    return true;
            } else {
                break;
            }
        }
        //右上
        for (lx = x + 1, ly = y + 1; lx >= 0 && ly >= 0; lx--, ly--) {
            if (board[lx][ly].equals(Chess)) {
                count2++;
                if (count2 >= 5)
                    return true;
            } else {
                break;
            }
        }
        return false;//没有人赢
    }

    /**
     * 打印棋盘
     * @param board 棋盘
     * @param row   行数
     * @param col   列数
     */
    private static void PrintBoard(String[][] board, int row, int col) {
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col + 1; j++) {
                System.out.printf(" %s ", board[i][j]);
                if (j < col)
                    System.out.print("|");
            }
            System.out.println();
            if (i < row - 1) {
                for (int j = 0; j < col + 1; j++) {
                    System.out.print("---");
                    if (j < col)
                        System.out.print("|");
                }
                System.out.println();
            }
        }
        for (int j = 0; j < col; j++) {
            System.out.printf(" %s", board[row][j]);
            if (j < col - 1)
                System.out.print("|");
        }
    }

    /**
     * 给棋盘添加坐标并初始化棋盘为空格
     *
     * @param board 棋盘
     * @param row   行数
     * @param col   列数
     */
    private static void InitBoard(String[][] board, int row, int col) {
        String[] arr = {"1 ", "2 ", "3 ", "4 ", "5 ", "6 ", "7 ", "8 ", "9 ", "10"};
        board[row] = arr;
        for (int i = 0; i < arr.length; i++) {
            board[i][col] = arr[i];
        }
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) {
                board[i][j] = " ";
            }
        }
        System.out.println();
    }

}

五、效果展示

开始选项
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值