Java测试编程题

news2024/12/25 0:33:34

题目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黑先白后

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

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

相关文章

【做一名健康的CSDNer】

程序员由于工作性质&#xff0c;常常需要长时间面对电脑&#xff0c;这可能对身心健康带来挑战。以下是一些实用的建议&#xff0c;帮助程序员保持身心健康&#xff1a; 规律生活&#xff1a;建立健康的生活习惯&#xff0c;包括规律的作息时间和固定的饮食时间&#xff0c;保证…

2024 年选择安全运营中心 (SOC) 工具指南

安全运营中心 (SOC) 是对抗网络威胁的前线。他们使用各种安全控制措施来监控、检测和快速响应任何网络威胁。这些控制措施对于确保信息系统全天候安全至关重要。 大型组织中的现代 SOC 与各种安全供应商合作&#xff0c;处理 75 到 100 种不同的工具。让我们探讨一下您可能遇到…

操作教程丨MaxKB+Ollama:快速构建基于大语言模型的本地知识库问答系统

2024年4月12日&#xff0c;1Panel开源项目组正式对外介绍了其官方出品的开源子项目——MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09;。MaxKB是一款基于LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB的产品命名内涵为“Max …

二维图像的双线性插值

1. 原理 见下图,假设原图为单通道的灰度图,想求图像中某点Q(x,y)的灰度值。 2. 代码实现 #include <iostream> #include <stdio.h> #include <stdint.h> #include <string> #include<opencv2/opencv.hpp> #include<opencv2/core.hpp>…

C++ 程序的内存分配

C 程序的内存分配 C 程序的内存分配栈堆数据区程序代码区参考 C 程序的内存分配 一个 C 编译的程序占用内存分为以下几个部分&#xff08;从高地址到低地址&#xff09;&#xff1a; 内核空间&#xff1a;由操作系统创建并控制&#xff0c;用户代码不能读写。栈&#xff1a;由…

政安晨:【深度学习神经网络基础】(十二)—— 深度学习概要

目录 概述 深度学习的概况 深度学习的组成部分 部分标记的数据 修正线性单元 卷积神经网络 神经元Dropout GPU训练 政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xf…

在Java中使用XxlCrawler时防止被反爬的几种方式

目录 前言 一、常见的反爬措施 1、User-Agent识别 2、Referer识别 3、频率限制 4、IP限制 二、XxlCrawer的应对之道 1、User-Agent应对 2、频率限制 3、IP限制 三、XxlCrawler执行解析 1、XxlCrawler对象 2、启动对象 3、信息爬取线程 总结 前言 众所周知&#x…

Parade Series - CoreAudio Loopback

Scenario 鉴于业务场景需要&#xff0c; 经过技术路径探索&#xff0c; 发现 comtypes 兼容性过于混乱&#xff0c;故而考虑整合一个 CoreAudio 的轮子dll来解决实际问题&#xff01;std::StringStream ⇒ std::ios::binary ⇒ std::ofstream Loopback.dll #ifndef _DLL_C…

第63天:服务攻防-框架安全CVE 复现DjangoFlaskNode.JSJQuery

目录 思维导图 案例一&#xff1a;JavaScript-开发框架安全-Jquery&Node node.js目录穿越 CVE-2021-21315命令执行 Jquery CVE-2018-9207 案例二&#xff1a;Python-开发框架安全-Django&Flask django cve_2019_14234 CVE-2021-35042 flask ssti 思维导图 案…

LeetCode刷题实战4:寻找两个正序数组的中位数

题目内容 给定两个大小分别为 m 和 n 的正序&#xff08;从小到大&#xff09;数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (mn)) 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,3], nums2 [2] 输出&#xff1a;2.0…

Three.js--》探秘虚拟现实VR展厅的视觉盛宴

今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 目录 项目搭建 初始化three代码 camera-controls控制器使用 添加画框 画框处理事件 添加机器人模型 …

一文学会 ts 构建工具 —— tsup

文章目录 能打包什么&#xff1f;安装用法自定义配置文件条件配置在 package.json 中配置多入口打包生成类型声明文件sourcemap生成格式自定义输出文件代码分割产物目标环境支持 es5编译的环境变量对开发命令行工具友好监听模式 watch提供成功构建的钩子 onSuccess压缩产物 min…

LLMs之Llama3:Llama 3的简介、安装和使用方法、案例应用之详细攻略

LLMs之Llama3&#xff1a;Llama 3的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;2024年4月18日&#xff0c;Meta 重磅推出了Meta Llama 3&#xff0c;本文章主要介绍了Meta推出的新的开源大语言模型Meta Llama 3。模型架构 Llama 3 是一种自回归语言模型&#x…

gdb 调试常用命令

运行命令 run简写r 运行程序&#xff0c;当遇到断点后&#xff0c;程序会在断点处停止运行continue简写c 运行到下一个断点next简写n 执行下一步语句&#xff0c;不进入函数step简写s 执行下一步语句until运行到循环体结束until 行数运行到某一行call 函数(参数)调用函数finis…

Windows10安装配置nodejs环境

一、下载 下载地址&#xff1a;https://nodejs.cn/download/ ​ 二、安装 1、找到node-v16.17.0-x64.msi安装包, 根据默认提示安装, 过程中间的弹窗不勾选 2、安装完成后, 打开powershell(管理员身份) ​ 3、命令行输入 node -v 和 npm -v 如下图所示则nodejs安装成功 ​ 三…

人大金仓参与编写《通信行业信息技术应用创新发展白皮书(2024年)》正式发布...

近日&#xff0c;由中国信息通信研究院技术与标准研究所主办的通信行业信创发展分论坛在京成功举办&#xff0c;人大金仓受邀分享行业信创实践经验及成果。论坛上正式发布了人大金仓参与编写的《通信行业信息技术应用创新发展白皮书&#xff08;2024年&#xff09;》。 本次论坛…

pycharm创建的项目

pycharm生成django templates删出 settings.py

解锁ApplicationContext vs BeanFactory: 谁更具选择性?

目录 一、聚焦源码回顾 &#xff08;一&#xff09;源码分析和理解 &#xff08;二&#xff09;简短的回顾对比建议 二、ApplicationContext vs BeanFactory特性对比 &#xff08;一&#xff09;主要特性总结 &#xff08;二&#xff09;直接建议 三、案例简单说明 &am…

21.组件组成

组件组成 组件最大的优势就是可复用性 当使用构建步骤时&#xff0c;我们一般会将 Vue 组件定义在一个单独的 .vue 文件中&#xff0c;这被叫做单文件组件(简称 SFC) 组件组成结构 <template><div>承载标签</div> </template> <script> expor…

矽塔SA8321 单通道 2.7-12.0V 持续电流 3.0A H 桥驱动芯片

描述 SA8321是为消费类产品&#xff0c;玩具和其他低压或者电池供电的运动控制类应用提供了一个集成的电机驱动器解决方案。此器件能够驱动一个直流无刷电机&#xff0c;由一个内部电荷泵生成所需的栅极驱动电压电路和4个功率 NMOS组成H桥驱动&#xff0c;集成了电机正转/反…