当前位置: 首页 > 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;没有积极追求新的知识和技能。 然而随着身边朋友发展…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...