利用多线程写一个龟兔赛跑游戏
代码地址:src · master · 小肖在路上 / ider · GitCode
直接克隆就好了
我来说一下大致思路:
1.利用swing创建窗口,开始按钮,复原按钮,乌龟图片、兔子图片
2.点击开始进行游戏,再次点击暂停游戏,再次点击继续游戏,点击复原按钮回到起点
2.获取到兔子和乌龟的x坐标,创建两个线程每次加0~5随机,每加完一次休眠0~500毫秒
3.当有其中一个到达终点时,停止游戏,点击复原再点击开始可以再次开始
创建窗口代码如下:
private void initialize() {frame = new JFrame();frame.setBounds(200, 100, 500, 500);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().setLayout(null);frame.setTitle("龟兔赛跑");//乌龟图片wuGui = new JLabel(new ImageIcon("src\\wg1.png"));wuGui.setBounds(0, 102, 100, 100);frame.getContentPane().add(wuGui);//兔子图片tuZi = new JLabel(new ImageIcon("src\\tz1.png"));tuZi.setBounds(0, 271, 100, 100);frame.getContentPane().add(tuZi);Thread wg = null;initializationWgThread(wg, false);Thread tz = null;initializationTzThread(tz, false);//开始按钮JButton kaiShi = new JButton("开始");kaiShi.setFont(new Font("宋体", Font.BOLD, 30));kaiShi.setBounds(150, 10, 100, 54);kaiShi.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if (buttons) {buttons = false;isVictory = false;initializationWgThread(wg, true);initializationTzThread(tz, true);} else {String t = kaiShi.getText();if (t.equals("开始")) {state = true;kaiShi.setText("暂停");} else {state = false;continues();kaiShi.setText("开始");}}}});frame.getContentPane().add(kaiShi);//复原按钮JButton fuYuan = new JButton("复原");fuYuan.setFont(new Font("宋体", Font.BOLD, 30));fuYuan.setBounds(260, 10, 100, 54);frame.add(fuYuan);fuYuan.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {wuGui.setBounds(0, 102, 100, 100);tuZi.setBounds(0, 271, 100, 100);}});
}
代码也很好理解,主要是开始按钮这里:
我给了一个标识量: buttons
作用于表示本次点击是开始游戏还是暂停游戏
点击时标识量为true:开始游戏,调用初始化乌龟、兔子的线程方法
点击时标识量为false:
判断当前按钮的汉字,为“开始”时,改变为“暂停”,调用暂停游戏的方法,原理就是利用Object的 wait()方法,暂停该线程,等待解开。
按钮名字为“暂停”时,调用继续游戏方法,利用Object的notifyAll()方法解开被暂停的线程,由于时暂停了两个线程,所以要调用notifyAll()方法,而不是notify()方法,因为notify()方法只能一次解开一个线程,所以会导致一个在动,另一个不动的bug。
继续游戏方法:
private void continues() {synchronized (lock) {lock.notifyAll();}}
暂停游戏方法:
private void pause() {synchronized (lock) {try {lock.wait();} catch (InterruptedException e) {throw new RuntimeException(e);}}}
复原按钮:
点击复原乌龟、兔子的位置,但是不停止游戏、
我认为我这个程序最值得注意的一点是:
当游戏结束时,我们点击复原,再点击开始还能继续游戏,本来我原始时直接调用乌龟和兔子的开始线程方法,不过很显然是错的,因为一个线程不允许调用启动两次,所以我就把他们封装为一个初始化方法,每次新游戏是创建两个新的线程,这样就实现的二次游戏的目的。
private void initializationTzThread(Thread tz, boolean isYes) {tz = new Thread() {@Overridepublic void run() {while (!isVictory) {if (state) {pause();}double x = tuZi.getBounds().getX();tuZi.setBounds(((int) x) + r.nextInt(11) + testSpeed, 271, 100, 100);if (tuZi.getBounds().getX() >= 400) {synchronized (r) {if (isVictory == false) {isVictory = true;JOptionPane.showMessageDialog(null, "兔子胜利", "游戏结束", JOptionPane.YES_NO_OPTION);buttons = true;}}break;}try {//距离大于50时,兔子会睡觉5秒int s = (int) (tuZi.getBounds().getX() - wuGui.getBounds().getX());if (s >= 50) {Thread.sleep(5000);}Thread.sleep((r.nextInt(6)) * 100);} catch (InterruptedException e) {throw new RuntimeException(e);}}}};if (isYes) {tz.start();}}/*** @initializationWgThread 乌龟线程初始化*/private void initializationWgThread(Thread wg, boolean isYes) {wg = new Thread() {@Overridepublic void run() {while (!isVictory) {if (state) {pause();}double x = wuGui.getBounds().getX();wuGui.setBounds(((int) x) + r.nextInt(6) + testSpeed, 102, 100, 100);if (wuGui.getBounds().getX() >= 400) {synchronized (r) {if (isVictory == false) {isVictory = true;JOptionPane.showMessageDialog(null, "乌龟胜利", "游戏结束", JOptionPane.YES_NO_OPTION);buttons = true;}}break;}try {Thread.sleep(150);} catch (InterruptedException e) {throw new RuntimeException(e);}}}};if (isYes) {wg.start();}}
利用多线程写一个龟兔赛跑游戏相关推荐
- python抽奖游戏_利用Python写一个抽奖程序,解密游戏内抽奖的秘密
原标题:利用Python写一个抽奖程序,解密游戏内抽奖的秘密 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客 ...
- java定时任务中使用多线程_java项目中如何利用多线程实现一个定时器任务
java项目中如何利用多线程实现一个定时器任务 发布时间:2020-11-10 16:04:03 来源:亿速云 阅读:86 作者:Leah 今天就跟大家聊聊有关java项目中如何利用多线程实现一个定时 ...
- 利用python写一个简单的双色球彩票系统
利用python写一个简单的双色球彩票系统 1.设置每次买的号码一样 写一个双色球彩票系统,系统可以随机产生一组数据,一组彩票数据有六位数,这六位数的的取值范围是0和1. 一张彩票是两块钱,用户可以选 ...
- 用Qt写一个迷宫游戏
用Qt写一个迷宫游戏 一段时间以前,我用c写了个使用随机数生成迷宫的代码,现在在自学学Qt,于是就想到了利用这个代码改一个小游戏. 现在记录一下自己的学习过程,也算抛砖引玉,各位看官请多指教. 话不多 ...
- 利用Cocos2d-x写一个程序读取传奇wzl文件
Cocos2d-x是一个用于游戏开发的开源框架,它提供了用于制作2D游戏的工具和功能.若要利用Cocos2d-x读取传奇wzl文件,需要对wzl文件的格式进行分析,并使用Cocos2d-x提供的读取文 ...
- 利用Flutter写一个跨平台的果核APP(4)——数据存储
前言 目前我们已经实现了几个界面,今天这篇文章开始着手进行登录页的制作,主要流程就是获取输入框中的内容,发送给后台进行验证,如果成功将返回信息保存在本地并跳转至首页,如果失败就提示用户重新输入. 在这 ...
- python俄罗斯方块算法详解_用 Python 写一个俄罗斯方块游戏 (
@@ -2,34 +2,34 @@ > * 原文作者:[Dr Pommes](https://medium.com/@pommes) > * 译文出自:[掘金翻译计划](https://g ...
- python写游戏脚本-使用Python写一个小游戏
引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...
- python编程小游戏-使用Python写一个小游戏
引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...
最新文章
- Limesurvey-2.55 (Ubuntu 16.04)
- 资本加码下注农牧供应链,健安供应链因何成为“香饽饽”?
- 填充因子-FILL FACTOR
- ios 应用商店_如何在预算范围内制作值得应用商店使用的iOS应用预览
- boot jndi数据源 spring_使用Spring Boot配置JNDI数据源 -Roy教程
- 操作系统的概念,功能和目标
- 美国国土安全部发布针对高风险铁路基础设施的强制性安全要求
- 安卓颜色标签android
- linux解压win10iso,ISO文件的解压和WINISO問題
- 异常来自 HRESULT:0x80070057 (E_INVALIDARG)
- ueditor如何改变图片大小等比缩放
- Python+Zookeeper操作
- gn、ninja的安装-Ubuntu18.04
- 此CA证书不受信任的解决办法
- Java 中的 getResource 方法
- 香港区块链贸易融资平台将于9月上线
- 个人日记:XML追加和覆盖内容,将XML某位置的子标签或者属性,文本删除
- React+Egg.js实现全栈个人博客
- 云原生第4课:Kubernetes 集群管理
- 三菱fx3u PLC 通讯设置