Java---阶段项目----五子棋

news2024/10/5 15:23:49

Java---阶段项目----五子棋

  • 需求说明
  • 技术实现
  • 棋盘制作
  • 完整代码

在这里插入图片描述

需求说明

五子棋棋盘为一个10×10的方格,五子棋玩家共为两个(A,B),A在棋盘上落子后,B再落子,依次往复,直到一方胜利或者棋盘空间用完为止,判断胜利的条件就是一条线或者斜线上同时存在A或者B的连续的5颗棋子
如图:
在这里插入图片描述

技术实现

静态变量:

  • 语法:
public static 数据类型 变量名 = 变量值;

不加static的就是非静态变量

  • 解释说明
    静态变量只能定义在类中,不能定义在方法中。
    静态变量可以在static修饰的方法中使用,也可以在非静态的方法中访问
    主要解决在静态方法中不能访问非静态的变量。
public class study {      //类
    //静态变量只能定义在类中,不能定义在方法中
    public static  String  name = "张三";
    public static void main(String[] args) {    //方法
        System.out.println(name);	//可以调用
    }
}

静态方法:

  • 语法
public static 返回值类型 方法名(){

}
  • 解释说明
    静态方法就相当于一个箱子,只是箱子里面放的是代码,需要用这些代码的时候,直接把箱子放在指定位置即可
public class study {      //类
    public static void main(String[] args) {    //方法
        show();
    }
    public static void show(){
        System.out.println("张三");
        System.out.println("男");
        System.out.println("20");
    }
}

输出:

张三

20

棋盘制作

1.制作棋盘

  • 使用输入法中的制表符在控制台直接打印出棋盘,然后寻找落子位置的特征
  • 利用二维数组重新制作棋盘
public class study {
    public static char[][] chess_map={
            {'┌','┬','┬','┬','┬','┬','┬','┬','┬','┐'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'└','┴','┴','┴','┴','┴','┴','┴','┴','┘'}

    };
    public static String row = "────";
    public static void main(String[] args) {
        System.out.println(" 0    1    2    3    4    5    6    7    8    9");
        for(int i=0;i<chess_map.length;i++) {//外层循环控制行
            System.out.print(i);
            for(int j=0;j<chess_map[i].length;j++){//内层循环控制列
                if(j==chess_map[i].length-1){//最后一行不打印——
                    System.out.print(chess_map[i][j]);
                }else{
                    System.out.print(chess_map[i][j]+row);
                }
            }
            System.out.println();
            if(i<chess_map.length-1){//排除最后一行
                System.out.println(" │    │    │    │    │    │    │    │    │    │");
            }
        }
    }
}
  • 棋盘在玩家使用过程中会反复展示,需要使用方法来优化
    把棋盘放在一个方法内,直接调用

2.落子

  • 玩家A,B会交替落子
  • 落子的位置必须是0~100之间的整数,且不能使用已经存在的棋子
    public static char pieceA = '○';//玩家A的棋子
    public static char pieceB = '■';//玩家B的棋子
    public static void main(String[] args) {
        draw_map();
        int sum = chess_map.length*chess_map[0].length;
        Scanner sc = new Scanner(System.in);
        for(int i=0;i<sum;i++){
            System.out.println(i%2==0 ? "玩家A落子:":"玩家B落子:");
            int position;
            while(true){
                //保证落子成功
                if(sc.hasNextInt()){//判断Scanner中是否有输入的数据
                    position = sc.nextInt();
                    if(position >= 0 && position < sum){
                        char currentpiece = (i%2==0) ? pieceA : pieceB;
                        int row = position / chess_map.length;//位置除以棋盘数组长度得到行号
                        int col = position % chess_map[0].length;//位置取模棋盘数组的总列数得到列号
                        if(chess_map[row][col]==pieceA || chess_map[row][col]==pieceB) {
                            System.out.println("该位置已经有棋子,请重新输入:");
                            continue;
                        }else {
                            chess_map[row][col] = currentpiece;
                            break;
                        }
                    }else{
                        System.out.println("非法输入");
                    }
                }else{
                    System.out.println("非法输入");
                    sc.next();//将Scanner中的数据取出来,防止死循环
                }
            }
            //落子成功后棋盘需要重新打印
            draw_map();
        }
    }
  • 落子完成后,需要校验是否获胜
  • 棋盘使用完毕还未分出胜负,需要提示
            for (int m = 0; m < chess_map.length; m++) {
                for (int j = 0; j < chess_map[0].length; j++) {
                    //第一种,水平方向
                    boolean case1 = (j + 4 < chess_map[0].length)
                            && chess_map[m][j] == currentpiece
                            && chess_map[m][j + 1] == currentpiece
                            && chess_map[m][j + 2] == currentpiece
                            && chess_map[m][j + 3] == currentpiece
                            && chess_map[m][j + 4] == currentpiece;
                    //第二种,垂直方向
                    boolean case2 = (m + 4 < chess_map.length)
                            && chess_map[m][j] == currentpiece
                            && chess_map[m + 1][j] == currentpiece
                            && chess_map[m + 2][j] == currentpiece
                            && chess_map[m + 3][j] == currentpiece
                            && chess_map[m + 4][j] == currentpiece;
                    //第三种,135°角
                    boolean case3 = (i + 4 < chess_map.length)
                            && (j + 4 < chess_map[0].length)
                            && chess_map[m][j] == currentpiece
                            && chess_map[m + 1][j + 1] == currentpiece
                            && chess_map[m + 2][j + 2] == currentpiece
                            && chess_map[m + 3][j + 3] == currentpiece
                            && chess_map[m + 4][j + 4] == currentpiece;
                    //第四种,45°角
                    boolean case4 = (m > 4) && (j + 4 < chess_map[0].length)
                            && chess_map[m][j] == currentpiece
                            && chess_map[m - 1][j + 1] == currentpiece
                            && chess_map[m - 2][j + 2] == currentpiece
                            && chess_map[m - 3][j + 3] == currentpiece
                            && chess_map[m - 4][j + 4] == currentpiece;
                    if (case1 || case2 || case3 || case4) {
                        System.out.println(m % 2 == 0 ? "玩家A胜利" : "玩家B胜利");
                        break outer;
                    }
                }
            }
            i++;
        }
        if(i==100){
            System.out.println("平局");
        }

3.声音特效

  • 为落子,非法落子及其获胜添加音效

需要准备文件
在这里插入图片描述

    public static void playAudio(String fileName){
        URl url = Gobang.class.getResource(fileName);
        AudioClip clip = Applet.newAudioClip(url);
        clip.play();
        try{
            Thread.sleep(50L);
        }catch (InterruptedException e){}
    }

完整代码

import java.util.Scanner;

public class study {
    public static char[][] chess_map={
            {'┌','┬','┬','┬','┬','┬','┬','┬','┬','┐'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'├','┼','┼','┼','┼','┼','┼','┼','┼','┤'},
            {'└','┴','┴','┴','┴','┴','┴','┴','┴','┘'}

    };
    public static String ro = "────";
    public static char pieceA = '○';//玩家A的棋子
    public static char pieceB = '■';//玩家B的棋子
    public static int i = 0;//总次数
    public static void main(String[] args) {
        draw_map();
        int sum = chess_map.length * chess_map[0].length;
        Scanner sc = new Scanner(System.in);
        outer:
        while(i<sum){
            System.out.println(i % 2 == 0 ? "玩家A落子:" : "玩家B落子:");
            char currentpiece = (i % 2 == 0) ? pieceA : pieceB;
//            int position_row,position_col;
            int position;
            while (true) {
                //保证落子成功
                if (sc.hasNextInt()) {//判断Scanner中是否有输入的数据
//                    System.out.println("请输入行:");
//                    position_row = sc.nextInt();
//                    System.out.println("请输入列:");
//                    position_col = sc.nextInt();
                    position = sc.nextInt();
//                    if(position_row >= 0 && position_row < chess_map.length && position_col>=0 && position_col < chess_map[0].length){
                    if (position >= 0 && position < sum) {
                        int row = position / chess_map.length;//位置除以棋盘数组长度得到行号
                        int col = position % chess_map[0].length;//位置取模棋盘数组的总列数得到列号
//                        int row = position_row;
//                        int col = position_col;
                        if (chess_map[row][col] == pieceA || chess_map[row][col] == pieceB) {
                            System.out.println("该位置已经有棋子,请重新输入:");
                            continue;
                        } else {
                            chess_map[row][col] = currentpiece;
                            break;
                        }
                    } else {
                        System.out.println("非法输入");
                    }
                } else {
                    System.out.println("非法输入");
                    sc.next();//将Scanner中的数据取出来,防止死循环
                }
            }
            //落子成功后棋盘需要重新打印
            draw_map();
            for (int m = 0; m < chess_map.length; m++) {
                for (int j = 0; j < chess_map[0].length; j++) {
                    //第一种,水平方向
                    boolean case1 = (j + 4 < chess_map[0].length)
                            && chess_map[m][j] == currentpiece
                            && chess_map[m][j + 1] == currentpiece
                            && chess_map[m][j + 2] == currentpiece
                            && chess_map[m][j + 3] == currentpiece
                            && chess_map[m][j + 4] == currentpiece;
                    //第二种,垂直方向
                    boolean case2 = (m + 4 < chess_map.length)
                            && chess_map[m][j] == currentpiece
                            && chess_map[m + 1][j] == currentpiece
                            && chess_map[m + 2][j] == currentpiece
                            && chess_map[m + 3][j] == currentpiece
                            && chess_map[m + 4][j] == currentpiece;
                    //第三种,135°角
                    boolean case3 = (i + 4 < chess_map.length)
                            && (j + 4 < chess_map[0].length)
                            && chess_map[m][j] == currentpiece
                            && chess_map[m + 1][j + 1] == currentpiece
                            && chess_map[m + 2][j + 2] == currentpiece
                            && chess_map[m + 3][j + 3] == currentpiece
                            && chess_map[m + 4][j + 4] == currentpiece;
                    //第四种,45°角
                    boolean case4 = (m > 4) && (j + 4 < chess_map[0].length)
                            && chess_map[m][j] == currentpiece
                            && chess_map[m - 1][j + 1] == currentpiece
                            && chess_map[m - 2][j + 2] == currentpiece
                            && chess_map[m - 3][j + 3] == currentpiece
                            && chess_map[m - 4][j + 4] == currentpiece;
                    if (case1 || case2 || case3 || case4) {
                        System.out.println(m % 2 == 0 ? "玩家A胜利" : "玩家B胜利");
                        break outer;
                    }
                }
            }
            i++;
        }
        if(i==100){
            System.out.println("平局");
        }
    }
    public static void draw_map () {
        System.out.println(" 0    1    2    3    4    5    6    7    8    9");
        for (int i = 0; i < chess_map.length; i++) {//外层循环控制行
            System.out.print(i);
            for (int j = 0; j < chess_map[i].length; j++) {//内层循环控制列
                if (j == chess_map[i].length - 1) {//最后一行不打印——
                    System.out.print(chess_map[i][j]);
                } else {
                    System.out.print(chess_map[i][j] + ro);
                }
            }
            System.out.println();
            if (i < chess_map.length - 1) {//排除最后一行
                System.out.println(" │    │    │    │    │    │    │    │    │    │");
            }
        }
    }
    
}

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

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

相关文章

StarCCM+ 命令行运行(Windows)

添加环境变量 找到启动程序的位置。找到当初安装starccm的文件夹&#xff0c;一般就是 Siemens 文件夹&#xff0c;进入会看到各版本的安装文件夹&#xff08;如果你没有安装多个版本则只有一个&#xff09;&#xff0c;然后参考下面我的路径找到相应的文件夹。在bin文件夹内可…

【openGauss简单使用---快速入门】

【openGauss简单使用---快速入门】 &#x1f53b; 一、openGauss使用&#x1f530; 1.1 连接openGauss&#x1f530; 1.2 创建数据库用户和授权&#x1f530; 1.3 创建数据库&#x1f530; 1.4 创建SCHEMA&#x1f530; 1.5 创建表 &#x1f53b; 二、总结—温故知新 &#x1f…

信息系统之网络安全方案 — “3保1评”

信息系统之网络安全方案 — “3保1评” 序&#xff1a;什么是“3评1保”&#xff1f;一、网络安全等级保护1.1 概念1.2等保发展1.3法律要求1.4分级及工作流程 二、涉密信息系统分级保护2.1概念2.2法律要求2.3分级及工作流程 三、关键信息基础设施保护3.1概念3.2关保的发展3.3法…

建立和使用Python自定义模块:打包+pip安装

文章目录 &#xff08;零&#xff09;拷目录-无法卸载&#xff08;一&#xff09;打包结构&#xff08;1.1&#xff09;__init__.py&#xff08;1.2&#xff09;setup.py &#xff08;二&#xff09;开始打包&#xff08;2.1&#xff09;命令出错&#xff1f; &#xff08;三&a…

构建高可用、高并发和高性能的微服务系统(Spring Cloud实现)

目前Java都在流行一个说词&#xff1a;高并发。 反正不管是不是&#xff0c;反正就是高并发。 谈高并发&#xff0c;我们需要知道几个名词&#xff1a; -响应时间(Response Time&#xff0c;RT)-吞吐量(Throughput)-每秒查询率QPS(Query Per Second)-每秒事务处理量TPS(Transa…

SuiteQlet Bundle

Content​​​​​​​ 1. Foreword 2. Overview 2.1 Glossary 2.2 Features 2.3 Design Description 3. Install 4. Setup 5. Instruction 5.1 Query 5.2 Chart 5.3 Publish Dashboard 6. Note 7. Video Link 1. Foreword SuiteQL is a powerful tool for data q…

python 第八章 集合set {}

系列文章目录 第一章 初识python 第二章 变量 第三章 基础语句 第四章 字符串str 第五章 列表list [] 第六章 元组tuple ( ) 第七章 字典dict {} 文章目录 8.1 创建集合8.2集合常见操作方法增加数据删除数据查找数据 8.1 创建集合 创建集合使用 { } 或 set()&#xff0c;但是如…

【MySQL】增删查改基础

目录 一、Create(创建) 1、insert(插入) 1.1单行数据插入 1.2多行数据插入 1.3插入或者替换更新 2、replace(替换) 二、Retrieve(读取) 1、select 1.1全列查询 1.2指定列查询利用selsct计算表达式 1.3筛选结果去重 2、where 2.1运算符 2.2找到英语小于60分的同学…

RFID课程要点总结_4 Tag Identification Protocol

4. Tag Identification Protocol Checksum procedure: parity checks, LRC, CRC 奇偶校验不多说&#xff0c;查1的个数&#xff0c;poor error recognition。电路通过所有位异或是偶校验&#xff0c;结果为1说明有错误&#xff1b;再取反是奇校验。 LRC longitudinal redund…

02 React组件、React组件实例的三大核心属性

总结 一、React组件 1.1 函数组件 定义 要求组件名称的首字母需要大写 function 组件名称(){ // 返回一段jsx的视图结构 return <div></div> }调用 <组件名称></组件名称> 或 <组件名称 /> 组件名首字母必须大写. 因为react以此来区分组件元…

一、动画 - 过渡效果transition

内容目录&#xff1a; 过渡动画&#xff1b;过渡动画的属性&#xff1b; 一、过渡动画 过渡&#xff08;transition&#xff09;作用&#xff1a;- 通过过渡可以指定一个属性发生变化时的切换方式- 通过过渡可以创建一些非常好的效果&#xff0c;提升用户的体验现在我们通过一…

nginx的操作手册和nginx的升级

总结 目录 一首先关闭防火墙和下载nginx包 1.安装依赖包 2.创建运行用户与组 3.进入nginx的目录下进行编译安装 4. 编译和编译安装 5.让系统识别nginx的操作命令 ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ 6.添加nginx系统服务把nginx服务加入到…

Idea+maven+springboot项目搭建系列--3 整合阿里云Canal完成Mysql数据的监听

前言&#xff1a;在搭建canal 服务之后&#xff0c;项目中就可以连接canal &#xff0c;完成对感兴趣的数据库及其表中数据的变动完成监听&#xff0c;本文依赖于你已经完成了对canal 服务的搭建工作&#xff1b; 1 Cannal 特点&#xff1a; Canal是阿里巴巴开源的一款基于My…

Spring Boot实战:拦截器和监听器的应用指南

当使用Spring Boot时&#xff0c;我们可以通过拦截器&#xff08;Interceptor&#xff09;和监听器&#xff08;Listener&#xff09;来实现对请求和响应的处理。拦截器和监听器提供了一种可插拔的机制&#xff0c;用于在请求处理过程中进行自定义操作&#xff0c;例如记录日志…

使用自动化测试获取手机短信验证码

目前在职测试开发,,写一些脚本,个人认为这职业不科学不应该有的职业,测试就是测试,开发就是开发,运维还是老鸟,这行业总能折腾些莫名其妙的东西出来,刚做这行时学的第一门语言是bash shell, 去新去单位上班直接写了个一键搭建测试环境的测试脚本,本来不想干测试了,好好做微信小…

Linux 学习记录36(C高级篇)

Linux 学习记录36(C高级篇) 本文目录 Linux 学习记录36(C高级篇)一、文件相关指令1. chmod 修改文件用户权限(1. 权限字母表示法(2. 权限8进制表示法 2. 修改文件所属组(1. chgrp(2. chown 能够同时修改多个(3. 创建链接文件>1 ln创建硬链接文件>2 ln -s 创建软链接文件 …

7DGroup性能实施项目日记1

壬寅年 己酉月 丁丑日 2022年9月21日 晴 经过上周的7DGroup学员群内部沟通&#xff0c;我们决定启动一个性能实施项目。 在这个实施项目中&#xff0c;把RESAR性能工程的每个环节都落地一遍&#xff0c;让所有参与培训的学员都可以参与。 在这个项目实施过程中&#xff0c;我打…

苹果照片传输到电脑怎么传?批量传输的技巧!

苹果照片传输到电脑怎么传&#xff1f;照片是苹果手机和电脑之间传输比较频繁的内容。对于刚接触苹果手机的朋友&#xff0c;可能还不是很了解传输方法&#xff0c;鉴于此&#xff0c;我们在这里提供几种有效方法来帮助您完成此项任务。无论您想要使用或不使用 iTunes 将照片从…

CAN Frame详解

CAN Frame是CAN总线通信的基本单位&#xff0c;它有多种类型&#xff0c;其中最常见的是数据帧&#xff08;Data Frame&#xff09;&#xff0c;用于传输数据。数据帧有标准格式&#xff08;Standard Format&#xff09;和扩展格式&#xff08;Extended Format&#xff09;&…

redhat 6.4安装oracle11g RAC (一)

&#xff08;一&#xff09;基础环境 虚拟机环境 &#xff1a;vmware workstation 12 操作系统 &#xff1a; redhat6.4 - 64bit 数据库版本 &#xff1a;11.2.0.4 Last login: Fri Jun 16 18:40:20 2023 from 192.168.186.1 [rootrhel64 ~]# cat /etc/redhat-release Red Ha…