龟兔赛跑(基于GUI与多线程实现)

直击龟兔赛跑现场

下面这张图是我们设计龟兔赛跑界面的初始效果与基本组成结构:

接下来是我仅代表我个人提出的一些疑问与解答:

1、俩动物以图片的形式显示?

其实在这里两个动物类就像标签一样

标签组件是什么?用于短文本字符串或图片显示固定提示信息。

下面给出这个初始界面的代码与效果图:

class Race extends JFrame{JPanel p;private JButton b=new JButton("开始");//开始按钮private JLabel stateOfRabbit=new JLabel("乌龟和兔子的比赛现场");//显示比赛/兔子状态private JLabel rabbit =new JLabel(new ImageIcon("images/rabbit.jpg"));//兔子private JLabel tortoise =new JLabel(new ImageIcon("images/tortoise.jpg"));//乌龟public Race(){super("龟兔赛跑");//标题p=new JPanel(null);b.setBounds(20, 10, 70, 30);rabbit.setBounds(20, 100, 150, 166);tortoise.setBounds(20, 390, 150, 136);stateOfRabbit.setBounds(300, 20, 260, 50);stateOfRabbit.setFont(new Font("", Font.BOLD, 22));p.add(b);p.add(stateOfRabbit);p.add(rabbit);p.add(tortoise);this.add(p);this.setBounds(200,150,1000,650);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setVisible(true);}
}

2、多线程实现俩小动物比赛

在上面的代码中,我们把兔子乌龟都定为标签类,但是俩东西参加比赛,是要同时参与比赛过程的,这里要利用多线程实现,也就是兔子、乌龟这俩标签要在比赛过程中(进程)移动,他俩的行为都属于这个进程(比赛)中的俩线程。

我们知道线程的创建方式有很多种:

  • 继承Thread,重写run()(创建单独的类/匿名内部类)
  • 实现Runnable,重写run()(创建单独的类/匿名内部类)
  • 实现Callable,重写call()(创建单独的类/匿名内部类)
  • 使用lambda表达式
  • 线程工厂 ThreadFactory
  • 线程池 ThreadPoolEcecutor

在GUI的学习中我们知道可以把Rabblt定位一个类,继承JFrame类再改写可以实现我们想要的窗口效果。同样标签类也是这样,可以把Rabbit类继承Jlabel类实现想要的兔子标签。

一个类可以实现多个接口,但只能继承一个父类。这里很明显要么实现Runnable,要么实现Callable接口,那就拿实现Runnable来举例

class Race extends JFrame{......private Rabbit rabbit =new Rabbit(new ImageIcon("images/rabbit.jpg"));//兔子private Tortoise tortoise =new Tortoise(new ImageIcon("images/tortoise.jpg"));//乌龟.......class Rabbit extends JLabel implements Runnable{public Rabbit(Icon image) {super(image);}@Overridepublic void run() {}}class Tortoise extends JLabel implements Runnable{public Tortoise(Icon image) {super(image);}@Overridepublic void run() {}}}

 

3、兔子和乌龟跑起来?

这里就表示一下俩东西的x方向的位移就行了,窗口里的效果相当于是50米跑一样的。

俩东西一起出发,兔子领先过不了一会就闭了(不动-位移不变),乌龟此时依旧锲而不舍!˃̣̣̥᷄⌓˂̣̣̥᷅  但是很可惜!兔子居然就睡了4000ms就醒了!难道兔子是外星兔嘛!不过好在我龟也不是太慢!老天不负有心龟,🐢胜利!

利用组件可以在窗口里访问更新位置来实现兔子乌龟的移动效果

public abstract class Componentpublic Point getLocation() {return location();}public void setLocation(int x, int y) {move(x, y);}public void move(int x, int y) {synchronized(getTreeLock()) {setBoundsOp(ComponentPeer.SET_LOCATION);setBounds(x, y, width, height);}}
}

实现代码如下: 

乌龟状态:(一直低俗慢跑)

 class Tortoise extends JLabel implements Runnable{public Tortoise(Icon image) {super(image);}boolean stop;//默认falseint speed=4;int x,y;@Overridepublic void run() {//easy一直低速跑(未停时-未到终点前)while (!stop){//获取起始坐标x=getLocation().x;y=getLocation().y;//移动-更新坐标x+=speed;setLocation(x,y);//循环一次太快了不符合乌龟龟设,慢点慢点...同时也把cpu给人兔子让一让try {Thread.sleep(50);} catch (InterruptedException e) {throw new RuntimeException(e);}if(x>=MAX_LENGTH)stop=true;}}}

兔子状态:(快速跑-睡大觉-快速跑)

 class Rabbit extends JLabel implements Runnable{public Rabbit(Icon image) {super(image);}boolean stop;int speed=10;int x,y;@Overridepublic void run() {x=getLocation().x;y=getLocation().y;while (!stop){x+=speed;setLocation(x,y);try {Thread.sleep(500);//彼此彼此你也用您也用用cpuif(x<300)//小白兔全力冲刺!stateOfRabbit.setText("无敌飞毛腿!");//因为等下要大睡4000毫秒,所以直接在这里面写了,就不用在解决一边异常了if(x==300){//兔子此时跑到300px树下->睡大觉->又冲刺!stateOfRabbit.setText("兔子睡大觉!");Thread.sleep(4000);/** ->(x=300)时更改为 speed=0* ->x+=0(x=300)->slepp(50)->speed=10;setText(兔子惊讶..)*/if(speed==0){speed=10;stateOfRabbit.setText("兔子惊讶!全力冲刺吧!");}else {speed=0;}}if (x>=MAX_LENGTH){stateOfRabbit.setText("啊?乌龟赢了?哈哈哈哈啊哈哈哈");stop=true;}} catch (InterruptedException e) {throw new RuntimeException(e);}}}}

4、开始按钮-处理事件 

 b.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {new Thread(rabbit).start();new Thread(tortoise).start();b.setVisible(false);}});

完整代码见这里这里请点击吧!

文本形式的龟兔赛跑代码请点击

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

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

相关文章

从loss角度理解LLM涌现能力

如今的很多研究都表明小模型也能出现涌现能力&#xff0c;本文的作者团队通过大量实验发现模型的涌现能力与模型大小、训练计算量无关&#xff0c;只与预训练loss相关。 作者团队惊奇地发现&#xff0c;不管任何下游任务&#xff0c;不管模型大小&#xff0c;模型出现涌现能力…

云贝教育 |【直播课】5月19日Oracle 19c OCM认证大师课 即将上课了!(附课件预览)

贝教育独家认证课OCM全网价格最低&#xff0c;性价比最高&#xff01;&#xff01;&#xff01; Oracle 19c OCM认证大师培训 - 课程体系 - 云贝教育 (yunbee.net) OCM部分课件预览 Oracle Database 19c Certified Master Exam (OCM) 认证大师 25 天 / 150课时 什么是Oracle 1…

0X JavaSE-- UML、

# Unified Modeling Language UML 统一建模语言 UML 是一种图形化的语言。 UML 不是专门为 Java 准备的。 只要是面向对象的编程语言&#xff0c;开发前的设计&#xff0c;都需要画 UML 图进行系统设计。 最常用的四个 UML 图是 类图&#xff08;Class Diagram&#xff09;&…

启明云端ESP32 C3 模组WT32C3通过 MQTT 连接 AWS

ESP32-C3因为其性价比高&#xff0c;价格便宜性能又好一直是量产的首选芯片&#xff0c;随着量产项目扩大&#xff0c;对接云服务器的情况也增加了&#xff0c;接下来小启给大家分享下启明云端ESP32-C3模组——WT32C3系列模组/开发板连接AWS亚马逊云方法。 WT32C3系列模组 WT3…

笨方法自学python(一)

我觉得python和c语言有很多相似之处&#xff0c;如果有c语言基础的话学习python也不是很难。这一系列主要是学习例题来学习python&#xff1b;我用的python版本是3.12 代码编辑器我用的是notepad&#xff0c;运行py程序用cmd 现在开始写第一个程序&#xff1a; print ("…

ViLT 浅析

ViLT 浅析 论文链接&#xff1a;ViLT 文章目录 ViLT 浅析创新点网络结构总结 创新点 本文先分析了4种不同类型的Vision-and-Language Pretraining(VLP) 其中每个矩形的高表示相对计算量大小&#xff0c;VE、TE和MI分别是visual embedding、text embedding和modality interact…

Excel 根据分类及组内序号进行编码

例题描述和简单分析 Excel 记录课程数据&#xff0c;未排序&#xff0c;部分如下&#xff1a; ABC1CourseDateTime2Word1-Sep-209:003Word1-Sep-209:004PowerPoint1-Sep-209:005Word1-Sep-2012:006PowerPoint1-Sep-2012:007Excel1-Sep-2012:008Word1-Sep-2012:00 现在要新增…

【CAD建模号】学习笔记(四):工作平面

工作平面介绍 CAD建模号右侧导航栏提供了很多便捷的工具&#xff0c;有测量工具、坐标系、模型和图层切换、视图切换等。 1. 测量工具组 测量工具可以测量图形的几何体积&#xff0c;长度&#xff0c;角度等。工具组包含如下&#xff1a; 测量几何&#xff1a;可以测量图形的面…

笨方法自学python(二)-注释

注释和#号 程序里的注释是很重要的。它们可以用自然语言告诉你某段代码的功能是什么。在你想要临时移除一段代码时&#xff0c;你还可以用注解的方式将这段代码临时禁用。 # A comment, this is so you can read your program later. # Anything after the # is ignored by py…

【Python】IPython 魔法命令使用指南

依然记得从你口中 说出再见坚决如铁 昏暗中有种烈日灼身的错觉 黄昏的地平线 划出一句离别 爱情进入永夜 依然记得从你眼中 滑落的泪伤心欲绝 混乱中有种热泪烧伤的错觉 黄昏的地平线 割断幸福喜悦 相爱已经幻灭 &#x1f3b5; 周传雄《黄昏》 %run - 运行…

面向对象的三大特性:封装、继承、多态

一、封装 封装是面向对象的核心思想。是以类为载体&#xff0c;将对象的属性和行为封装起来&#xff0c;对外隐藏其实现细节。 封装保证了类内部数据结构的完整性&#xff0c;使得外部&#xff08;使用该类的用户&#xff09;不能轻易地直接操作此数据结构&#xff0c;只能执…

考了PMP后,NPDP到底还有没有必要考?NPDP通关宝典来啦!

NPDP和PMP相比&#xff0c;两者的相同点都是由美国发起的&#xff0c;都是管理行业的证书。区别也很大&#xff0c;PMP是项目经理国际认证证书&#xff0c;NPDP是产品经理认证证书&#xff0c;不过PMP已经由外专局引入国内二十多年了&#xff0c;在市面上知名度更高&#xff0c…

svg 元素 getBoundingClientRect() 数值为 0

问题 在页面在刷新时&#xff0c;想要立即获取页面中 svg 元素的宽高&#xff0c;做进一步的计算。发现通过 getBoundingClientRect 获取会有一定几率获取值为 0。 解决方案 监听 svg 元素的 load 事件&#xff0c;在回调中再获取。 svgElem.addEventListener("load&…

Vite创建Vue3项目识别 ../ 与 @/ 引入路径

在使用vite脚手架生成项目时,会出现一些引入路径失败的错误 例子:router中用 component引入路径时 引入 ../ 路径失败 找不到模块“../views/login/index.vue”或其相应的类型声明 {path: "/login",name: "login",component: () > import("../v…

鸿蒙开发接口Ability框架:【(窗口扩展能力)】

窗口扩展能力 WindowExtensionAbility基于ExtensionAbility&#xff0c;WindowExtensionAbility中展示的内容作为一个控件(AbilityComponent)内容展示在其他应用窗口中&#xff0c;实现在一个窗口中展示多个应用程序内容的功能。 说明&#xff1a; 本模块首批接口从API versio…

互斥锁和自旋锁的实现机制

本文介绍互斥锁和自旋锁的实现原理和工作过程 一、互斥锁 1.内存标记——线程id 互斥锁会记录下访问锁的线程的id&#xff0c;用于进行线程切换、组织阻塞队列等操作 2.阻塞队列 当多个线程试图获取同一把互斥锁&#xff0c;没有获取的锁的线程会被组织到阻塞队列中&#…

Keysight 是德 N1077B 光/电时钟恢复设备,收藏保存

Keysight N1077B是一款光/电时钟恢复设备&#xff0c;支持115 MBd至24 GBd的数据速率范围&#xff0c;适用于多模和单模光信号以及电信号。该设备能够处理PAM4和NRZ两种类型的数据信号&#xff0c;并提供符合标准的时钟恢复功能。 N1077B具备可调峰值和环路带宽&#xff08;高…

leetcode206-Reverse Linked List

题目 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 分析 用一个指针记录当前位置&#xff0c;另外一个指针记录当前位置的前一个位置&#xff0c…

【经验分享】图片自适应窗口大小css;CSS实现背景图片全屏铺满自适应的方式

目录 设置背景颜色和边距 设置背景图片 调整背景图片尺寸和位置 完整代码 使用效果如下&#xff08;展示&#xff09; 网页版图片效果展示 手机版图片效果展示 如何使用 CSS 创建网页背景效果 在网页设计中&#xff0c;背景是一个重要的视觉元素&#xff0c;它可以为网…

39-5 入侵检测系统(IDS)- 安装配置IDS(注意我没安装成功,阅读需谨慎)

官网:Snort Rules and IDS Software Download 参考: (这位大佬分享了安装包下载链接):https://www.cnblogs.com/taoyuanming/p/12722263.html (安装过程参考这位大佬):Snort 安装与配置(CentOS 7)_centos 7 snort-CSDN博客一、安装 IDS(我这里在 CentOS 7 虚拟机中安…