Java测试编程题

题目1

1.创建5个线程对象
线程名设置为(Thread01,Thread02,Thread03,Thread04,Thread05)使用 代码实现5个线程有序的循环打印,效果如下:
Thread01正在打印1
Thread02正在打印2
Thread03正在打印3
Thread04正在打印4
Thread05正在打印5
Thread01正在打印6
Thread02正在打印7

package Test;

public class Test01 {
    public static void main(String[] args) {
        Object lock = new Object();
        int[] currentNum = {1}; // 记录当前应该打印的数字

        for (int i = 1; i <= 5; i++) {
            final int threadNum = i;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized (lock) {
                        try {
                            for (int j = 0; j < 10; j++) {
                                // 等待轮到自己打印
                                while ((currentNum[0] - 1) % 5 != threadNum - 1) {
                                    lock.wait();
                                }
                                // 打印数字
                                System.out.println("Thread" + threadNum + "正在打印" + currentNum[0]);
                                currentNum[0]++;
                                // 唤醒下一个线程
                                lock.notifyAll();
                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
        }

        // 开始第一个线程的执行
        synchronized (lock) {
            lock.notifyAll();
        }
    }
}

运行截图
在这里插入图片描述

题目二

package Test;

import java.io.*;
import java.net.*;
import java.util.Scanner;

public class Server {
    public static void main(String[] args) throws IOException{
        ServerSocket serverSocket = new ServerSocket(8080);
        Socket socket = serverSocket.accept();

        Scanner scan = new Scanner(System.in);
        Gobang gobang = new Gobang();  // 创建五子棋对象

        StatusCode statusCode = new StatusCode();  // 添加状态码
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));
        PrintStream ps = new PrintStream(socket.getOutputStream());

        while (true){
//            ps.println("服务端:" + scan.next());
            System.out.println("请服务端输入落子位置:");
            int x = scan.nextInt() - 1;
            int y = scan.nextInt() - 1;

            // 落子
            if(gobang.play(x, y, true) != statusCode.successfulLanding) {

                continue;
            }
//            ps.println("服务端端落子:(" + x + "," + y + ")");
            ps.println(x + "," + y);
            String str = br.readLine();
            System.out.println(str);
            int client_x = Integer.parseInt(str.split(",")[0]);
            int client_y = Integer.parseInt(str.split(",")[1]);

            System.out.println("客户端x:" + client_x);
            System.out.println("客户端y:" + client_y);
            if(gobang.play(client_x , client_y, false) != statusCode.successfulLanding) {

                continue;
            }

            // 打印棋盘
            for (String[] ss : gobang.gobang) {
                for (String element : ss) {
                    System.out.print(element);
                }
                System.out.println();
            }

            // 提升作业:判断输赢
            if(gobang.isWin(x, y)) {
                System.out.println("服务端胜利");
                break;
            }
        }


    }
}
package Test;
import java.io.*;
import java.net.*;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1", 8080);

        Scanner scan = new Scanner(System.in);
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF8"));
        PrintStream ps = new PrintStream(socket.getOutputStream());

        Gobang gobang = new Gobang();  // 创建五子棋对象

        StatusCode statusCode = new StatusCode();  // 添加状态码

        while(true){
            System.out.println("请客户端输入落子位置:");
            int x = scan.nextInt() - 1;
            int y = scan.nextInt() - 1;

            // 落子
            if(gobang.play(x, y, false) != statusCode.successfulLanding) {
                continue;
            }

//            ps.println("客户端落子:(" + x + "," + y + ")");
            ps.println(x + "," + y);
            String str = br.readLine();
            System.out.println(str);
            int server_x = Integer.parseInt(str.split(",")[0]);
            int server_y = Integer.parseInt(str.split(",")[1]);
            System.out.println("服务端x:" + server_x);
            System.out.println("服务端y:" + server_y);

            if(gobang.play(server_x, server_y, true) != statusCode.successfulLanding) {
                continue;
            }


            // 打印棋盘
            for (String[] ss : gobang.gobang) {
                for (String element : ss) {
                    System.out.print(element);
                }
                System.out.println();
            }

            if(gobang.isWin(x, y)) {
                System.out.println("客户端胜利");
                break;
            }

        }
    }
}

package Test;

public class Gobang {
    /**
     * 五子棋类
     * */
    // 棋盘长度
    int len = 20;
    // 棋盘容器
    String[][] gobang = new String[len][len];

    // 棋盘的符号
    String add = "┼";// ┼
    String black = "●";
    String white = "○";
    String[] indexs = { "⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖", "⒗", "⒘", "⒙",
            "⒚", "⒛" };

    public Gobang(){
        init();
        printGoBang();
    }

    // 初始化棋盘
    private void init() {
        for (int i = 0; i < gobang.length; i++) {
            for (int j = 0; j < gobang[i].length; j++) {
                if (j==len-1) {  // 每行的最后一列  设置 xx行
                    gobang[i][j] = indexs[i] + "行";
                }else if(i==len-1){ // 每列的最后一行 设置 xx 列
                    gobang[i][j] = indexs[j];
                }else {
                    gobang[i][j] = add;
                }
            }
        }

    }

    // 打印棋盘
    private void printGoBang() {
        for (int i = 0; i < gobang.length; i++) {
            for (int j = 0; j < gobang[i].length; j++) {
                System.out.print(gobang[i][j]);
            }
            System.out.println();
        }
    }


    // 判断坐标是否在棋盘内
    private boolean isIndexOutOfGoBang(int x, int y) {
        if(x<0 || x>len-2 || y<0 || y>len-2){
            System.out.println("落子失败 - 坐标超出棋盘范围");
            return true;
        }
        return false;
    }

    // 判断坐标是否有棋子
    private boolean isPiece(int x, int y) {
        if(!gobang[x][y].equals(add)){
            return true;
        }
        return false;
    }

    // 落子
    public int play(int x, int y, boolean bool) {
        StatusCode statusCode = new StatusCode();
        // 判断坐标是否超出棋盘范围
        if (isIndexOutOfGoBang(x, y)) {
            System.out.println("落子失败 - 坐标超出棋盘范围");
            return statusCode.indexOutOfRange;
        }

        // 判断坐标上是否有棋子
        if (isPiece(x, y)) {
            System.out.println("落子失败 - 坐标上已有棋子");
            return statusCode.existingPieces;
        }

        gobang[x][y] = (bool) ? black : white;
        return statusCode.successfulLanding;
    }

    public boolean isWin(int x, int y) {
        if(
                upAndDown(x, y)
                        || leftAndRight(x, y)
                        || leftUpAndRightDown(x, y)
                        || leftDownAndRightUp(x, y)
        ) {
            return true;
        }
        return false;
    }

    // 落子之后, 上下判断输赢
    private boolean upAndDown(int x, int y) {
        int count = 1;
        for (int i = x-1;i>=0;i--) {
            if (this.gobang[x][y]==this.gobang[i][y]) {
                count++;
            }else {
                break;
            }
        }

        for(int i=x+1;i<=this.len;i++) {
            if(this.gobang[x][y]==this.gobang[i][y]) {
                count++;
            }else {
                break;
            }
        }
        return (count>=5)?true:false;
    }

    // 落子之后, 左右判断输赢
    private boolean leftAndRight(int x, int y) {
        int count = 1;
        for (int i=y-1;i>=0;i--) {
            if(this.gobang[x][y]==this.gobang[x][i]) {
                count++;
            }else {
                break;
            }
        }

        for (int i=y+1;i<=this.len;i++) {
            if(this.gobang[x][y]==this.gobang[x][i]) {
                count++;
            }else {
                break;
            }
        }
        return (count>=5)?true:false;
    }

    // 落子之后, 左上右下判断输赢
    private boolean leftUpAndRightDown(int x, int y) {
        int count = 1;
        for (int i=y-1, j=x-1;i>=0&&j>=0;i--, j--) {
            if(this.gobang[x][y]==this.gobang[j][i]) {
                count++;
            }else {
                break;
            }
        }

        for (int i=y+1, j=x+1;i<=this.len&&j<=this.len;i++,j++) {
            if(this.gobang[x][y]==this.gobang[j][i]) {
                count++;
            }else {
                break;
            }
        }
        return (count>=5)?true:false;
    }

    // 落子之后, 左下右上判断输赢
    private boolean leftDownAndRightUp(int x, int y) {
        int count = 1;
        for (int i=y-1, j=x+1;i>=0&&j<=this.len;i--, j++) {
            if(this.gobang[x][y]==this.gobang[j][i]) {
                count++;
            }else {
                break;
            }
        }

        for (int i=y+1, j=x-1;i<=this.len&&j>=0;i++,j--) {
            if(this.gobang[x][y]==this.gobang[j][i]) {
                count++;
            }else {
                break;
            }
        }
        return (count>=5)?true:false;
    }
}
package Test;

public class StatusCode {
    /**
     * 五子棋状态码
     * */
    int indexOutOfRange = -1;  // 超出棋盘范围
    int existingPieces = -2;	// 该位置已有棋子
    int successfulLanding = 1;  // 落子成功

    public int getIndexOutOfRange() {
        return this.indexOutOfRange;
    }

    public int getExistingPieces() {
        return this.existingPieces;
    }

    public int getSuccessfulLanding() {
        return this.successfulLanding;
    }
}

运行截图
在这里插入图片描述

存在bug

  1. 使用单聊模式为通信方式, 如果一方能正常落子, 一方错误输入已经落过子的坐标, 正常落子方会比错误落子方多落一子.
  2. 一方胜利之后, 另外一方的窗口不能结束.
  3. 双方第一次落子如果落在一处, 没有相应的处理逻辑.
  4. 落子双方没有先后顺序, 正常先后顺序应该为i黑先白后

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenHarmony多媒体-mp3agic

简介 mp3agic 用于读取 mp3 文件和读取/操作 ID3 标签&#xff08;ID3v1 和 ID3v2.2 到 ID3v2.4&#xff09;,协助开发者处理繁琐的文件操作相关&#xff0c;多用于操作文件场景的业务应用。 效果展示&#xff1a; 下载安装 ohpm install ohos/mp3agicOpenHarmony ohpm环境配…

【Day 4】Maven + Spring入门 + HTTP 协议

开始学后端&#xff01; 1 Maven Maven 是一款用于管理和构建 Java 项目的工具&#xff0c;基于项目对象模型(POM)的概念&#xff0c;通过一小段描述信息来管理项目的构建。 作用&#xff1a; 依赖管理 方便快捷的管理项目依赖的资源(jar 包)&#xff0c;避免版本冲突问题 …

接雨水 , 给定二维图,能容多少水

42. 接雨水 - 力扣&#xff08;LeetCode&#xff09; 看着就是非常常规的题目&#xff0c;所以非常有必要掌握。 最少也把O&#xff08;n^2&#xff09;的方法写出来吧。力扣官方题解的三种方法O&#xff08;n&#xff09;都挺好&#xff0c;不过可能有点难读&#xff0c;在此…

简单的LRU本地缓存实现-Java版本

文章目录 什么是缓存缓存的种类缓存的关键特性缓存的优势与挑战优势&#xff1a;挑战&#xff1a; 缓存的应用场景什么是LRUCacheLRU 缓存的工作原理核心操作为何选择 LRU使用场景 一个简单的LRU缓存实现相关资料基础资料 什么是缓存 缓存&#xff08;Cache&#xff09;是一种…

机器人课程教师面对的困境有哪些(补充)

唯有自救&#xff0c;唯有自强&#xff0c;方能有希望。 前序 距离这一篇博文发表已经快2年了…… 机器人课程教师面对的困境有哪些 至少从5年前就已经有需求减少&#xff0c;供给过剩的现象出现了。 为何在2019年之后应用型本科开设ROS课程优势消逝 案例 博客分享过工作…

VSCode 目录折叠展开、缩进深度设置

1、VSCode 目录折叠展开设置 运行 Visual Studio Code &#xff0c;按 Ctrl &#xff0c;打开设置 输入Explorer:Compact Folders&#xff0c;取消勾选 或者在设置文件上添加 "explorer.compactFolders": false2、VSCode 目录缩进深度设置 输入Workbench Tree:…

AI大模型日报#0420:开源模型击败GPT-4、西湖大学蛋白质通用大模型、GPT的七条经验

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。 标题: 开源模型打败GPT-4&#xff01;LLM竞技场最新战报&#xff0c;Cohere Command R上线 摘要: GPT-4在LLM竞技场被开源模型Cohere的…

【开发问题记录】启动某个服务时请求失败(docker-componse创建容器时IP参数不正确)

问题记录 一、问题描述1.1 产生原因1.2 产生问题 二、问题解决2.1 找到自己的docker-compose.yml文件2.2 重新编辑docker-compose.yml文件2.3 通过docker-componse重新运行docker-compose.yml文件2.4 重新启动docker容器2.5 查看seata信息 一、问题描述 1.1 产生原因 因为我是…

在ubuntu20.04下迁移anaconda的目录,试验不行后,换成软连接

一、原因 随着不断的搭建不同的算法环境&#xff0c;原本在固态硬盘上安装的anaconda上占用空间越来越多。导致可用的固态硬盘空间越来越少&#xff0c;又因安装的环境太多&#xff0c;重新搭建比较费时费力。有没有直接将当前已经搭建好环境的anaconda 迁移到另外的目录呢&…

算法题解记录19+++回文链表(百日筑基)

题目描述&#xff1a; 难度&#xff1a;简单 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示…

Kotlin语法快速入门--变量声明(1)

Kotlin语法入门–变量声明&#xff08;1&#xff09; 文章目录 Kotlin语法入门--变量声明&#xff08;1&#xff09;一、变量声明1、整型2、字符型3、集合3.1、创建array数组3.2、创建list集合3.3、不可变类型数组3.4、Set集合--不重复添加元素3.5、键值对集合Map 4、kotlin特有…

【Python系列】python 如何打印带时间的日志

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【软件测试】正交表测试例题

【软件测试】正交表测试 例题1答案 例题2答案 例题3答案 例题1 很多Word编辑器都有字体修饰功能&#xff0c;可以将一个字加粗、倾斜、以及加上下划线。一个字可以同时被加粗和倾斜&#xff0c;也可以同时被倾斜和加下划线。三种因子Bold, Italic, Underline的效果可以任意组合…

累加(C语言)

一、题目&#xff1b; 二、N-S流程图&#xff1b; 三、运行结果&#xff1b; 四、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int i 0;int j 0;int n 5;int result 0;int sum 0;//运算&#…

【氧化镓】Ga2O3 MOSFET器件的单SEB机制TCAD研究

本文是一篇关于氧化镓(Ga2O3)金属氧化物半导体场效应晶体管(MOSFET)在单粒子烧毁(single event burnout, SEB)事件中的机制研究的文章。文章通过使用技术计算机辅助设计(TCAD)模拟来探究侧向耗尽型氧化镓MOSFET设备在SEB中的敏感区域和安全操作电压&#xff0c;并提出了辐射损伤…

俊杰测评:电视盒子什么牌子好?电视盒子品牌排行榜

欢迎各位来到俊杰的数码测评频道&#xff0c;每年我会进行数十次电视盒子测评&#xff0c;今年已经买过二十多款电视盒子了&#xff0c;本期的测评主题是电视盒子什么牌子好&#xff0c;通过十天的深入详细对比后我整理了电视盒子品牌排行榜&#xff0c;近期想买电视盒子的可以…

C++运算符

运算符 作用&#xff1a;用于执行代码的运算 本文章主要讲解以下四种运算符&#xff1a; 1.算术运算符 作用&#xff1a;用于处理四则运算 算术运算符包括以下这些符号&#xff1a; 举例&#xff1a; 注&#xff1a; 在除法运算中&#xff0c;除数不能为0 在取模运算…

【MATLAB源码-第194期】基于matlab的MB-OFDM仿真,超宽带(UWB)无线传输。对比LS/DFT及其改进算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 一、无线通信的基本原理 无线通信是通过空气或其他介质传播电磁波来传输信息的技术。这种通信方式的核心在于电磁波&#xff0c;它能够在没有物理连接的情况下传输数据。无线通信的基本流程包括&#xff1a; 信号的生成&am…

Redis集合[持续更新]

Redis&#xff08;全称&#xff1a;Remote Dictionary Server 远程字典服务&#xff09;是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库&#xff0c;并提供多种语言的 API。 数据结构 1. string 字符串 字符串类型是 Redis 最…

springboot实现SSE之牛刀小试

文章目录 一&#xff0c;概述1.SSE是何方神圣&#xff1f;2.sse与webscoket区别 二&#xff0c;实现过程1.效果展示2. 简要流程3. 源码放送4.完整项目 一&#xff0c;概述 1.SSE是何方神圣&#xff1f; SSE 全称Server Sent Event&#xff0c;直译一下就是服务器发送事件。 …