代码地址: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();}}

利用多线程写一个龟兔赛跑游戏相关推荐

  1. python抽奖游戏_利用Python写一个抽奖程序,解密游戏内抽奖的秘密

    原标题:利用Python写一个抽奖程序,解密游戏内抽奖的秘密 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客 ...

  2. java定时任务中使用多线程_java项目中如何利用多线程实现一个定时器任务

    java项目中如何利用多线程实现一个定时器任务 发布时间:2020-11-10 16:04:03 来源:亿速云 阅读:86 作者:Leah 今天就跟大家聊聊有关java项目中如何利用多线程实现一个定时 ...

  3. 利用python写一个简单的双色球彩票系统

    利用python写一个简单的双色球彩票系统 1.设置每次买的号码一样 写一个双色球彩票系统,系统可以随机产生一组数据,一组彩票数据有六位数,这六位数的的取值范围是0和1. 一张彩票是两块钱,用户可以选 ...

  4. 用Qt写一个迷宫游戏

    用Qt写一个迷宫游戏 一段时间以前,我用c写了个使用随机数生成迷宫的代码,现在在自学学Qt,于是就想到了利用这个代码改一个小游戏. 现在记录一下自己的学习过程,也算抛砖引玉,各位看官请多指教. 话不多 ...

  5. 利用Cocos2d-x写一个程序读取传奇wzl文件

    Cocos2d-x是一个用于游戏开发的开源框架,它提供了用于制作2D游戏的工具和功能.若要利用Cocos2d-x读取传奇wzl文件,需要对wzl文件的格式进行分析,并使用Cocos2d-x提供的读取文 ...

  6. 利用Flutter写一个跨平台的果核APP(4)——数据存储

    前言 目前我们已经实现了几个界面,今天这篇文章开始着手进行登录页的制作,主要流程就是获取输入框中的内容,发送给后台进行验证,如果成功将返回信息保存在本地并跳转至首页,如果失败就提示用户重新输入. 在这 ...

  7. python俄罗斯方块算法详解_用 Python 写一个俄罗斯方块游戏 (

    @@ -2,34 +2,34 @@ > * 原文作者:[Dr Pommes](https://medium.com/@pommes) > * 译文出自:[掘金翻译计划](https://g ...

  8. python写游戏脚本-使用Python写一个小游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...

  9. python编程小游戏-使用Python写一个小游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...

最新文章

  1. Limesurvey-2.55 (Ubuntu 16.04)
  2. 资本加码下注农牧供应链,健安供应链因何成为“香饽饽”?
  3. 填充因子-FILL FACTOR
  4. ios 应用商店_如何在预算范围内制作值得应用商店使用的iOS应用预览
  5. boot jndi数据源 spring_使用Spring Boot配置JNDI数据源 -Roy教程
  6. 操作系统的概念,功能和目标
  7. 美国国土安全部发布针对高风险铁路基础设施的强制性安全要求
  8. 安卓颜色标签android
  9. linux解压win10iso,ISO文件的解压和WINISO問題
  10. 异常来自 HRESULT:0x80070057 (E_INVALIDARG)
  11. ueditor如何改变图片大小等比缩放
  12. Python+Zookeeper操作
  13. gn、ninja的安装-Ubuntu18.04
  14. 此CA证书不受信任的解决办法
  15. Java 中的 getResource 方法
  16. 香港区块链贸易融资平台将于9月上线
  17. 个人日记:XML追加和覆盖内容,将XML某位置的子标签或者属性,文本删除
  18. React+Egg.js实现全栈个人博客
  19. 云原生第4课:Kubernetes 集群管理
  20. 三菱fx3u PLC 通讯设置

热门文章

  1. 百度百科创建词条教程合集分享,赶紧收藏起来
  2. 云服务器通过配置IIS实现本地访问文件并下载
  3. DreamweaverCs5中代码中写汉字编译…
  4. 如何开发一款基于 Vite+Vue3 的在线Excel表格系统(上)
  5. 1st Javascript Editor V3.8绝对完美破解版
  6. KFS源码编译与安装
  7. Vue和SpringBoot打造中学生家校互联系统
  8. MYSQL的索引主要作用是什么
  9. 编程如何修改Revit族类型名称
  10. 一步步教你搭建LAMP架构