当前位置: 首页 > news >正文

Java程序设计2023-第四次上机练习

8-1三子棋

编写程序,实现简单的三子棋游戏。在三子棋中,双方在3×3的棋盘中轮流下棋,一方用*示,另一方用O表示。如果一方的3个棋子占据了同一行,同一列或者对角线,则该方获胜。如果棋盘已被棋子占满,但没有一方获胜则出现平局。在程序中,一方为用户,用户在界面上输入每次下棋的位置;另一方下棋的位置为随机自动生成。
在这里插入图片描述
在这里插入图片描述

参考代码 有所修改

import java.util.Random;
import javax.swing.*;
class CheckerBoard{static final Integer BOUNDARY = 3;char[][] board;int count;int[] route;boolean firstPlayer;public CheckerBoard() {count = 0;int num = 1;route = new int[10];board = new char[5][5];for(int i = 1; i <= BOUNDARY; i++){for(int j = 1; j <= BOUNDARY; j++){board[i][j] = (char) ('0' + num++);}}}public void update(int local, char c) {int i = (local + 3 - 1) / 3;int j = (local - 1) % 3 + 1;board[i][j] = c;count++;route[count] = local;}public boolean goBack(){if(count <= 1){return false;}count-=2;for(int k = 1; k <= 2; k++){int local = route[count + k];int i = (local + 3 - 1) / 3;int j = (local - 1) % 3 + 1;board[i][j] = (char) (local + '0');}return true;}public boolean check(int local) {int i = (local + 3 - 1) / 3;int j = (local - 1) % 3 + 1;return board[i][j] == '*' || board[i][j] == 'o';}public String output() {StringBuilder str = new StringBuilder("-----------------------\n");for(int i = 1; i <= BOUNDARY; i++) {str.append(" |   ").append(board[i][1]).append("   |   ").append(board[i][2]).append("   |   ").append(board[i][3]).append("   |\n");str.append("------------------------\n");       }return str.toString();}public boolean isExceed(int local) {return local < 1 || local > 9 ;}public boolean isWin() {//判断行列for(int i = 1; i <= BOUNDARY; i++) {if(board[i][1] == board[i][3] && board[i][2] == board[i][1])return true;if(board[1][i] == board[3][i] && board[2][i] == board[1][i])return true;}//判断对角线if(board[1][1] == board[3][3] && board[1][1] == board[2][2])return true;return board[1][3] == board[3][1] && board[1][3] == board[2][2];}
}
public class TicTacToe {static CheckerBoard b = new CheckerBoard();public static void robotPut () {Random rand = new Random();int local = rand.nextInt(9) + 1;while(b.check(local)) {local = rand.nextInt(9) + 1;}b.update(local, 'o');}public static void userPut() {UIManager.put("OptionPane.cancelButtonText", "撤销");String s = JOptionPane.showInputDialog(b.output() + "请输入位置:");while("".equals(s) || s == null || b.isExceed(Integer.parseInt(s)) || b.check(Integer.parseInt(s))) {if(s == null){if(b.goBack()){JOptionPane.showMessageDialog(null, "撤销成功!");}else{JOptionPane.showMessageDialog(null, "撤销失败!","提示",JOptionPane.ERROR_MESSAGE);}userPut();return;}JOptionPane.showMessageDialog(null, "输入有误, 请重新输入!","提示",JOptionPane.ERROR_MESSAGE);s = JOptionPane.showInputDialog(b.output() + "请输入位置:");}b.update(Integer.parseInt(s), '*');}public static void main(String[] args) {int f=JOptionPane.showConfirmDialog(null,"你是否要先下?","选择",JOptionPane.YES_NO_CANCEL_OPTION);boolean curPlayer=true;if(f==0) {curPlayer=true;JOptionPane.showMessageDialog(null,"你先下!");}else if(f==1){curPlayer=false;JOptionPane.showMessageDialog(null,"机器人先下!");}else System.exit(0);if(curPlayer) {userPut();} else {robotPut();}curPlayer = !curPlayer;while(!b.isWin()) {if(b.count == 9) {//判断是否平局JOptionPane.showMessageDialog(null,b.output() + "平局!");System.exit(0);}if(curPlayer) {userPut();} else {robotPut();}curPlayer = !curPlayer;}String str = curPlayer ? "机器人" : "你";if(str.equals("机器人"))JOptionPane.showMessageDialog(null, b.output()+"很遗憾,你输了!");JOptionPane.showMessageDialog(null, b.output() + "恭喜你赢了!");System.exit(0);}
}

8-3绘制随机图形

定义4个类,MyShape、MyLine、MyRectangle和MyOval,其中MyShape是其他三个类的父类。MyShape为抽象类,包括图形位置的四个坐标;一个无参的构造方法,将所有的坐标设置为0;一个带参的构造函数,将所有的坐标设置为相应值;每个坐标的设置和读取方法;abstract void draw(Graphics g)方法。MyLine类负责画直线,实现父类的draw方法;MyRectangle负责画矩形,实现父类的draw方法;MyOval负责画椭圆,实现父类的draw方法。编写一个应用程序,使用上面定义的类,随机选取位置和形状,绘制20个图形。
在这里插入图片描述

参考代码

package ticTacToe.pack;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
import javax.swing.JFrame;abstract class MyShape{double a;double b;double c;double d;public MyShape(){a=0;b=0;c=0;d=0;}public MyShape(double a,double b,double c,double d) {this.a=a;this.b=b;this.c=c;this.d=d;}public double getA() {return a;}public void setA(int a) {this.a = a;}public double getB() {return b;}public void setB(int b) {this.b = b;}public double getC() {return c;}public void setC(int c) {this.C = c;}public double getD() {return d;}public void setD(int d) {this.d = d;}abstract void draw(Graphics g);
}
class MyLine extends MyShape{public MyLine(double a,double b,double c,double d) {super(a,b,c,d);}void draw(Graphics g) {Graphics2D g2=(Graphics2D )g;Line2D line=new Line2D.Double(this.a,this.b,this.c,this.d);g2.draw(line);}
}
class MyRectangle extends MyShape{public MyRectangle(double a,double b,double c,double d) {super(a,b,c,d);}void draw(Graphics g) {Graphics2D g2=(Graphics2D )g;Rectangle2D rectangle=new Rectangle2D.Double(this.a,this.b,this.c,this.d);g2.draw(rectangle);}
}
class MyOval extends MyShape{public MyOval(double a,double b,double c,double d) {super(a,b,c,d);}void draw(Graphics g) {Graphics2D g2=(Graphics2D )g;Ellipse2D ellipse=new Ellipse2D.Double(this.a,this.b,this.c,this.d);g2.draw(ellipse);}
}public class Paint{public static void main(String []args) {EventQueue.invokeLater(new Runnable(){public void run(){JFrame Frame = new JFrame();Frame.add(new DrawComponent());Frame.pack();Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Frame.setVisible(true);}});}
}
class DrawComponent extends JComponent
{private static final int DEFAULT_WIDTH=500;private static final int DEFAULT_HEIGHT=500;public void paintComponent(Graphics g){for(int i=0;i<20;i++) {double a = Math.random()*300;double b = Math.random()*300;double c = Math.random()*300;double d = Math.random()*300;if(i<6) {MyOval aMyOval = new MyOval(a, b, c, d);aMyOval.draw(g);}else if(i<12) {MyRectangle aMyRectangle = new MyRectangle(a, b, c, d);aMyRectangle.draw(g);}else {MyLine aLine = new MyLine(a, b, c, d);aLine.draw(g);}}}public Dimension getPreferredSize(){return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);}
}

8-4猜数游戏

编写一个猜数程序,该程序随机在1到1000的范围中选择一个供用户猜测的整数。界面上提供一个文本框来接收用户输入的猜测的数,如果用户猜得太大,则背景变为红色,如果猜得太小,背景变为蓝色。用户猜对后,文本框变为不可编辑,同时提示用户猜对了。界面上提供一个按钮,使用户可以重新开始这个游戏。在界面上还需显示用户猜测的次数。
实验步骤:
(1) 定义继承自JFrame的类,在该类中添加界面各部分;
(2) 定义事件监听器类完成事件处理;
(3) 定义一个包含main方法的测试类,在该类中创建框架类对象,并显示。
实验提示:
(1) 使用面板进行页面布局;
(2) 可以使用内部类定义事件监听器类;
(3) 按钮点击通过处理ActionEvent事件来完成响应。
在这里插入图片描述

参考代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
class Gs extends JPanel implements ActionListener{private int cnt;private int truenb;private JPanel all;private JLabel lb1,lb2,lb3,lb4,lb5;private JButton bnt1,bnt2,bnt3;private JTextField inp;private JFrame jf;public void generate(){//生成随机数作为答案Random r=new Random();truenb=r.nextInt(1000)+1;}public Gs(){cnt=0;generate();//生成所有物件的容器all=new JPanel();all.setLayout(null);  all.setBounds(100,80,350,200);// JLabel提示信息lb1= new JLabel("你已经猜了"+cnt+"次"); //已经猜了x次lb1.setBounds(0, 5, 150, 20);lb1.setFont(new Font("宋体",Font.BOLD,14));// lb1.setVisible(true);all.add(lb1);lb2=new JLabel(); //输入猜测的数lb2.setText("输入猜测的数");lb2.setFont(new Font("宋体",Font.BOLD,14));lb2.setBounds(10, 40, 110, 20);all.add(lb2);     inp=new JTextField(); //输入框inp.setBounds(110, 40, 120, 20);inp.setBackground(Color.WHITE);all.add(inp);lb3=new JLabel(); //太大or太小lb3.setFont(new Font("宋体",Font.BOLD,14));lb3.setBounds(240, 40, 120, 20);lb3.setVisible(false);all.add(lb3);lb4=new JLabel("恭喜你猜对了");lb4.setFont(new Font("宋体",Font.BOLD,14));lb4.setBounds(10, 125, 120, 20);lb4.setVisible(false);all.add(lb4);lb5=new JLabel("猜测范围在1—~1000之间");lb5.setFont(new Font("宋体",Font.BOLD,14));lb5.setBounds(10,60,180,20);all.add(lb5);bnt1=new JButton("确定");bnt1.setBounds(10, 90, 90, 30);all.add(bnt1);bnt2=new JButton("重新开始");bnt2.setBounds(120, 90, 90, 30);all.add(bnt2);bnt3=new JButton("退出");bnt3.setBounds(230, 90, 90, 30);all.add(bnt3);//给按钮添加事件监听bnt1.addActionListener(this);    //传this指针方便判断bnt2.addActionListener(this);bnt3.addActionListener(this);//将Jpanel加入Jframejf=new JFrame();jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.setTitle("猜数游戏");// jf.setLayout(null);jf.setBounds(250,200,350,200);jf.add(all);jf.setVisible(true);}public void actionPerformed(ActionEvent e){if(e.getSource()==bnt1){   //确定按钮cnt++;lb1.setText("您已经猜了"+cnt+"次");int gus=Integer.valueOf(inp.getText());if(gus<truenb){   //太小lb3.setVisible(true);lb3.setText("太小");all.setBackground(Color.BLUE);}else if(gus>truenb){    //太大lb3.setVisible(true);lb3.setText("太大!");all.setBackground(Color.RED);}else{    //猜对了lb4.setVisible(true);inp.setEditable(false);    //禁止用户编辑bnt1.setEnabled(false);    //禁止按确认按钮lb3.setVisible(false);all.setBackground(Color.GREEN);}}else if(e.getSource()==bnt2)     //重开{cnt=0;      //重开次数置零lb1.setText("您已经猜了"+cnt+"次");generate(); //生成新数all.setBackground(null);   //清除背景色inp.setText(null);      //清空输入框inp.setEditable(true);lb4.setVisible(false);  //胜利提示关掉bnt1.setEnabled(true);    //允许按确认按钮lb3.setVisible(false);}else {       //退出System.exit(0);}}
}
public class guess {public static void main(String[] args) {new Gs();}
}

相关文章:

Java程序设计2023-第四次上机练习

8-1三子棋 编写程序&#xff0c;实现简单的三子棋游戏。在三子棋中&#xff0c;双方在33的棋盘中轮流下棋&#xff0c;一方用*示&#xff0c;另一方用O表示。如果一方的3个棋子占据了同一行&#xff0c;同一列或者对角线&#xff0c;则该方获胜。如果棋盘已被棋子占满&#xf…...

nonaDlA 逻辑分析仪 使用记录

注意事项&#xff0c;很灵敏&#xff0c;不要用手碰&#xff0c;产生误触发 安装软件 github地址 官方提供的淘宝地址与使用说明 1.安装 1.安装程序 &#xff1a;下载githubDLA源码&#xff0c;打开 software\PulseView.exe安装 2.安装驱动&#xff1a;安装完第一步后&a…...

用HFSS仿真平面线圈的电感量

用HFSS工具仿真平面线圈的电感量 平面线圈是指在平面上绕制而成的线圈&#xff0c;如PCB上的电感线圈、无线供电使用的金属丝绕制而成的线圈等。根据线圈的不同形状可将平面线圈分为方形线圈&#xff0c;六角形线圈、八角形线圈、螺旋原型线圈等。 网络上的计算平面线圈电感量…...

字节面试题——数据库, linux

数据库 1.sq|语句取-一个月内的id分组取-一个年级中每个班级年龄最小的同学名字成绩表输出前三名的 成绩&#xff0c;后三名呢拷贝A表的数据到B表查询每1 ]科目都大于80分的学生名字筛选出每个小时 的记录考察where考察聚合函数where和having的区别-一个数据库sq|查询重复个数…...

ES基础知识

ES基础知识 单独查询一个文档&#xff08;_doc&#xff09;时&#xff0c;Elasticsearch 会返回该文档的原始数据&#xff0c;通常以 JSON 格式呈现。以下是一些常见字段及其含义&#xff1a; _index: 表示文档所属的索引名称。_type (在较早的 Elasticsearch 版本中使用&…...

当年很流行,现在已经淘汰的前端技术有哪些?

近几年&#xff0c;前端技术真可谓是飞速发展&#xff0c;不断有新的技术涌现&#xff0c;爆火的前端框架 Astro&#xff0c;前端运行时 Bun&#xff0c;构建工具 Vite 等都给前端提供了强大动力。当然&#xff0c;也有很多前端技术随着技术的发展不再需要使用&#xff0c;有了…...

IP地址定位是什么?有哪些优缺点?

IP地址定位是一种用于确定设备或用户地理位置的方法&#xff0c;具有一些明显的优点和缺点。以下是IP地址定位的优缺点&#xff1a; 优点&#xff1a; 广泛适用性&#xff1a; IP地址定位适用于几乎所有与互联网连接的设备&#xff0c;包括计算机、智能手机、平板电脑和物联网…...

scrapy爬虫之网站图片爬取

Scrapy是一个强大的Python爬虫框架&#xff0c;可以用于爬取网站上的各种数据&#xff0c;包括图片。以下是一个简单的示例&#xff0c;演示如何使用Scrapy来爬取网站上的图片&#xff1a; 安装Scrapy&#xff1a; 如果尚未安装Scrapy&#xff0c;可以使用以下命令安装它&…...

flask整合rabbitMQ插件的方式

文章目录 二、Python-flask-rabbitMQ-插件方式整合引言具体步骤1 安装依赖&#xff1a;2 编写实体类&#xff1a;3 编写消费者和生产者&#xff1a;4 初始化消费者和生产者&#xff1a;5 其他地方使用生产者 二、Python-flask-rabbitMQ-插件方式整合 引言 当今互联网应用的高…...

【React】高频面试题

1. 简述下 React 的事件代理机制&#xff1f; React使用了一种称为“事件代理”&#xff08;Event Delegation&#xff09;的机制来处理事件。事件代理是指将事件处理程序绑定到组件的父级元素上&#xff0c;然后在需要处理事件的子元素上触发事件时&#xff0c;事件将被委托给…...

Java数据结构之稀疏数组

目录 线性结构与非线性结构线性结构非线性结构 稀疏数组应用场景 代码实现二维数组转稀疏数组稀疏数组转二维数组 线性结构与非线性结构 线性结构 数据结构分两种&#xff0c;线性与非线性&#xff0c;线性结构的数据元素之间存在一对一的关系。 一对一指的是每个数据元素都…...

迅为RK3568开发板RTMP推流之视频监控

1 搭建 RTMP 媒流体服务器 nginx-rtmp 是一个基于 nginx 的 RTMP 服务模块&#xff0c;是一个功能强大的流媒体服务器模块&#xff0c; 它提供了丰富的功能和灵活的配置选项&#xff0c;适用于构建各种规模的流媒体平台和应用。无论是搭建实时视频直播平台、点播系统或多屏互…...

利用CSRF或XSS攻击网站的例子

利用 CSRF 攻击网站的简单示例&#xff1a; 假设有一个在线银行应用&#xff0c;用户可以在其中执行转账操作。用户登录后&#xff0c;系统会生成一个包含转账信息的表单&#xff0c;用户需要填写表单来发起转账。这个表单如下所示&#xff1a; <form action"https:/…...

LeetCode讲解篇之113. 路径总和 II

文章目录 题目描述题解思路题解代码 题目描述 题解思路 深度优先遍历二叉树&#xff0c;遍历的同时记录路径&#xff0c;直到遍历到叶节点&#xff0c;若路径和为targetSum则添加到结果集中 题解代码 func pathSum(root *TreeNode, targetSum int) [][]int {var res make([…...

中国HR从业者现状是怎样的?应如何提升自己?

HR(Human Resource)解释为人力资源&#xff0c;现在统称为人力资源顾问&#xff0c;跟传统人事有本质区别。传统人事一般是和行政部做相类似的工作&#xff0c;比如招聘&#xff0c;培训&#xff0c;职员的考核&#xff0c;职员的薪酬&#xff0c;职员调动等。现代人力资源&…...

Promise笔记-同步回调-异步回调-JS中的异常error处理-Promis的理解和使用-基本使用-链式调用-七个关键问题

Promise笔记 1. 预备知识1.1 实例对象与函数对象1.2 两种类型的回调函数1. 同步回调2. 异步回调 1.3 JS中的异常error处理1. 错误的类型2. 错误处理&#xff08;捕获与抛出&#xff09;3. 错误对象 2.Promise的理解和使用2.1 Promise是什么1.理解Promise2.Promise 的状态3. Pro…...

计算机考研自命题(2)

1、C语言-字符串交替拼接 1、用C编程&#xff0c;将两个字符串数组存储实现交替连接如aaa和bbb两个字符连接成ababab 如aaa和baba 两个字符&#xff0c;连接成 abaaaba #include<stdio.h>/* 解题思路&#xff1a;将两个字符串交替拼接&#xff0c;定义三个数组&#xff0…...

ZKP6.1 Discrete-log-based Polynomial Commitments (Preliminary)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 6: Discrete-log-based Polynomial Commitments (Yupeng Zhang) Recall How to build an efficient SNARK? A polynomial commitment scheme A polynomial interactive oracle proof (IOP) SNARK for general circuits Plo…...

五金经营小程序商城的作用体现在哪

对消费者而言&#xff0c;如今线上购买五金是很多人的选择&#xff0c;传统线下购买&#xff0c;不仅需要跑路&#xff0c;而且店内未必有所需品&#xff0c;但线上平台则一目了然购买所需品&#xff0c;本地/外地均可以触达到&#xff0c;同时还可对用户/会员进行高效管理&…...

今年这行情,不会自动化的要做好心理准备了

李强是一名软件测试工程师&#xff0c;入行之后在一家小型公司工作了五年。这段时间里&#xff0c;他主要负责手工测试和一些简单的自动化测试工作。由于公司项目也相对简单&#xff0c;他逐渐陷入了工作的舒适区&#xff0c;没有积极追求新的知识和技能。 然而随着身边朋友发展…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...