五子棋小游戏——Java

news2025/2/23 5:01:22

文章目录

    • 一、内容简介:
    • 二、基本流程
    • 三、具体步骤
      • 1.菜单栏
      • 2.创建棋盘并初始化为空格
        • (1)定义行数、列数为常量
        • (2)定义棋盘
        • (3)给棋盘添加坐标并初始化棋盘为空格
      • 3.打印棋盘
      • 4.玩家落子
      • 5.判断输赢
    • 四、代码实现
    • 五、效果展示

一、内容简介:

五子棋小游戏是我们日常生活中经常玩的小游戏,游戏规则也很简单。下面就让我们使用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();
    }

}

五、效果展示

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/28862.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络工程SSM毕设项目 计算机毕业设计【源码+论文】

文章目录前言 题目1 : 基于SSM的游戏攻略资讯补丁售卖商城 <br /> 题目2 : 基于SSM的疫情期间医院门诊网站 <br /> 题目3 : 基于SSM的在线课堂学习设计与实现<br /> 题目4 : 基于SSM的大学生兼职信息系统 <br /> 题目5 : 基于SSM的大学生社团管理系统 …

2022 云原生编程挑战赛圆满收官,见证冠军战队的诞生

11 月 3 日&#xff0c;天池大赛第三届云原生编程挑战赛在杭州云栖大会圆满收官。三大赛道18大战队手历经 3 个月激烈的角逐&#xff0c;终于交上了满意的答卷&#xff0c;同时也捧回了属于他们的荣耀奖杯。 云原生编程挑战赛发起人王荣刚在开场分享中提到&#xff0c;“在阿里…

【无标题】后来,我认为王阳明比尼采,叔本华都高明

悲欣交集 ——灵遁者 虽然我是个写作者&#xff0c;但我还是希望无苦难可以诉说。可事与愿违&#xff0c;我的笔下总有忧伤&#xff0c;也许我天生忧郁。 我觉得现在比以往任何时候&#xff0c;都更能体验和接触苦难。打开新闻&#xff0c;打开抖音&#xff0c;苦难就扑面而…

SpringBoot 整合 Shiro 权限框架

目录Shiro概述Shiro介绍基本功能Shiro架构SpringBoot整合Shiro环境搭建登录、授权、角色认证实现自定义实现 RealmShiro配置类controller代码权限异常处理多个 realm 的认证策略设置会话管理获得session方式Shiro概述 Shiro介绍 Apache Shiro 是一个功能强大且易于使用的 Jav…

力扣(LeetCode)42. 接雨水(C++)

栈 明确目标——计算接雨水的总量。 可以想到一层一层的接雨水。和算法结合&#xff0c;介绍思想 &#xff1a; 遍历柱子&#xff0c;栈 stkstkstk 维护降序高度的柱子&#xff0c;如果出现升序&#xff0c;说明形成凹槽&#xff0c;计算凹槽能接的雨水&#xff0c;加入答案。…

Java强软弱虚引用和ThreadLocal工作原理(一)

一、概述 本篇文章先引入java的四种引用在android开发中的使用&#xff0c;然后结合弱引用来理解ThreadLocal的工作原理。 二、JVM名词介绍 在提出四种引用之前&#xff0c;我们先提前说一下 Java运行时数据区域 虚拟机栈 堆 垃圾回收机制 这四个概念。 2.1 java运行时数据…

freeswitch通过limit限制cps

概述 freeswitch在业务开发中有极大的便利性&#xff0c;因为fs内部实现了很多小功能&#xff0c;这些小功能组合在一起&#xff0c;通过拨号计划就可以实现很多常见的业务功能。 在voip云平台的开发中&#xff0c;我们经常会碰到资源的限制&#xff0c;有外部线路资源方面的…

Linux环境下安装并使用使用Git命令实现文件上传

⭐️前面的话⭐️ 本篇文章将介绍在Linux环境下安装Git并使用Git实现代码上传到gitee&#xff0c;上传操作的核心就是三把斧&#xff0c;一是add&#xff0c;二是commit&#xff0c;三是push&#xff0c;此外还会简单介绍一下.gitignore配置文件的作用。 &#x1f4d2;博客主页…

【broadcast-service】一个轻量级Python发布订阅者框架

本文节选至本人博客&#xff1a;https://www.blog.zeeland.cn/archives/broadcast-service-description Introduction 前两天在Python最佳实践-构建自己的第三方库文章中介绍了自己构建的一个轻量级的Python发布订阅者框架&#xff0c;今天来简单介绍一下。 项目地址&#xf…

不同的量化交易软件速度差距大吗?

哪家券商的软件交易速度快&#xff1f;那个平台有极速柜台系统&#xff1f;成为了一个热门的话题&#xff0c;我来说下我的看法。其实呢&#xff0c;大部分的主流券商速度都是差不多的&#xff0c;否则的话&#xff0c;那速度有差距大家肯定都会冲向最快的那一家了。极速柜台系…

查看mysql的版本

1. mysql --version linux下使用命令&#xff1a; mysql --version 2. mysql -V 没有连接到MySQL服务器&#xff0c;就想查看MySQL的版本。打开cmd&#xff0c;切换至mysql的bin目录&#xff0c;运行下面的命令即可&#xff1a; 2.1 mysql -V e:\mysql\bin> mysql -V mys…

k8s编程operator——client-go中的informer

文章目录1、介绍1.1 简单使用1.2 List & Watch1.3 informer简介2、store2.1 ThreadSafeMap建立索引&#xff1a;threadSafeMap源码分析&#xff1a;2.2 Indexer2.3 DeltaFIFO3、reflector3.1 Reflector的定义3.2 Reflector的创建3.3 Reflector的循环执行3.4 List操作3.5 Wa…

JAVA 之 Spring框架学习 1:Springの初体验 IOC DI 注入 案例

Spring技术是JavaEE开发必备技能&#xff0c;企业开发技术选型命中率>90% 专业角度 简化开发&#xff0c;降低企业级开发的复杂性 框架整合&#xff0c;高效整合其他技术&#xff0c;提高企业级应用开发与运行效率 1.学习Spring框架设计思想 2.学习基础操作&#xff0c;思…

数据结构之选择排序(堆排序)

选择排序 选择排序分为两种一个是堆排序 一个是简单选择排序 简单选择排序 就是从头到尾扫描一遍待排序元素找出最小的 最小的之前的数的往后一位&#xff0c;第一个空间空出来 把最小的元素存入 然后从第二个空间开始变为待排序元素 最后一个元素不用处理 代码实现 算法性…

【python】根据自定义曲线函数进行拟合

【参考】 官网 curve_fit示例与评估&#xff1a;拟合curve_fit使用矫正的R^2评估非线性模型&#xff1a;拟合评估其他&#xff1a; curve_fit()实现任意形式的曲线拟合-csdn拟合优度r^2-csdn 官网示例 拟合函数&#xff1a; f(x)ae−bxcf(x)ae^{-bx}cf(x)ae−bxc import m…

Git——IDEA集成Git(详细)

目录 一、配置Git忽略文件 1.1 为什么忽略&#xff1f; 1.2 怎么忽略&#xff1f; 二. IDEA定位Git程序&#xff08;准备环境&#xff09; 三、IDEA操作Git 3.1 初始化Git本地库、添加暂存区、提交本地库 3.2 切换版本 3.3 创建分支 3.4 切换分支 3.5 合并分支 3.5.1…

存储模块 --- Cache

Cache 高速缓冲存储器 内存一般采用SDRAM芯片&#xff0c;对内存的访问肯定是不及CPU的速度的&#xff0c;通常说内存访问要比CPU的速度慢的多。也就是说内存拖后腿了。 CPU访问内存并不是完全随机的。 在某个时间段内&#xff0c;CPU总是访问当前内存地址的相邻内存地址&…

数理统计笔记5:参数估计-区间估计

引言 数理统计笔记的第5篇先介绍了参数估计的区间估计。包括单总体均值、单总体比例、单总体方差以及两总体均值之差、两总体方差之比几种常见的情况。 引言总体均值的置信区间&#xff08;σ2\sigma^2σ2已知&#xff09;-Z法总体均值的置信区间&#xff08;σ2\sigma^2σ2未知…

【Call for papers】SP-2023(CCF-A/网络与信息安全/2022年12月2日截稿)

文章目录1.会议信息2.时间节点Since 1980, the IEEE Symposium on Security and Privacy has been the premier forum for presenting developments in computer security and electronic privacy, and for bringing together researchers and practitioners in the field. The…

whylogs工具库的工业实践!机器学习模型流程与效果监控 ⛵

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 机器学习实战系列&#xff1a;https://www.showmeai.tech/tutorials/41 &#x1f4d8; 本文地址&#xff1a;https://www.showmeai.tech/article-detail/395 &#x1f4e2; 声明&#xff1a;版权所有&#xff0c;转…