Java编写掷骰子游戏

编程之家收集整理的这篇文章主要介绍了Java编写掷骰子游戏编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

这篇文章主要介绍了Java编写掷骰子游戏,需要的朋友可以参考下

废话不多说了,直接奔主题

**多线程&&观察者模式

题目要求:《掷骰子》窗体小游戏,在该游戏中,玩家初始拥有1000的金钱,每次输入押大还是押小,以及下注金额,随机3个骰子的点数,如果3个骰子的总点数小于等于9,则开小,否则开大,然后判断玩家是否押对,如果未押对则扣除下注金额,如果押对则奖励和玩家下注金额相同的金钱。

分析:这个题目要求灵活运用多线程的相关知识,达到点击开始按钮时,有3个线程启动,分别控制3颗骰子的转动,在3颗骰子全部转完以后,回到主线程计算游戏结果。

//个线程控制颗骰子 Thread t = new Thread(); Thread t = new Thread(); Thread t = new Thread(); //启动个线程 t.start(); t.start(); t.start(); //将个线程加入主线程 t.join(); t.join(); t.join();

But,,,写完代码以后发现,这样做虽然能够保证游戏能够正确运行,但是当我点击开始按钮时,由于3个骰子线程都是直接开在主线程上的,点击开始按钮时,按钮出现下沉情况,子线程一直在后台运行,我窗体中的图片根本不会发生改变,而是直接显示最后的结果,意思就是骰子一直在后台转动,不在前台的窗体中及时更新显示。后来在网上苦苦找寻,大神们说如果想要通过点击JButton使窗体中的JLabel/JTextFeild等其他组件及时更新,直接在JButton的监听事件的实现方法里面直接创建匿名线程,也就是说直接在actionPerformed()方法修改代码即可,这样能保证你的组件中内容的及时变换,实现非常炫酷的效果

代码如下:

public void actionPerformed(ActionEvent e) { new Thread(new Runnable() { @Override public void run() { //将外部线程类转移到窗体内部 } }).start(); }

 But,,,But,,,   虽然非常炫酷了,能够实现图片的及时更新了,游戏结果却错了,每次我的骰子还在转动呢,我的游戏结果却早早的就出来了。

原因:3根骰子线程属于子线程,窗体线程属于主线程,问题就在于:子线程可以通过变成精灵线程来保持与主线程的同生死,但是主线程却无法控制子线程何时死亡,只有等待子线程执行完所属的run()方法,结束线程后才知道。

解决方法:在主线程(main)中开3个子线程(t1,t2,t3),在每个子线程上再开一个子子线程(t11,t21,t31)。

t1,t2,t3只运行一次,负责创建子子线程;t11,t21,t31每个线程运行多次,负责控制窗体中的图标及时更新。

这样主线程就不受子线程的影响,开始按钮也不回出现下沉的情况。

但是同样在此处使用join方法也是hold不住子线程的,毕竟t1,t2,t3只运行了一次,join对他们来说根本不起作用,想要掌控t11,t21,t31,最容易理解的办法,就是使用观察者模式了。

将窗体看做观察者,子线程看做被观察者。子线程运行完时,通知观察者我已经运行完成,当观察者观察到子线程全都运行完时,才开始运行后续步骤。

全部代码

1.窗体

package com.sxt.dice; import java.awt.Color; public class DiceFrame extends JFrame implements ActionListener, Observer { /** * 《掷骰子》控制台小游戏,在该游戏中,玩家初始拥有的金钱,每次输入押大还是押小, * 以及下注金额,随机个骰子的点数,如果个骰子的总点数小于等于,则开小,否则开大, * 然后判断玩家是否押对,如果未押对则扣除下注金额,如果押对则奖励和玩家下注金额相同的金钱。 * * 运用观察者模式 个子线程分别控制个骰子,都已经结束时,通知观察者窗体,窗体观察到所有子线程都结束时,计算游戏结果 * */ private static final long serialVersionUID = L; private JTextField txtPut; private JButton btnStart; private JLabel labResult; private JComboBox comboBox; private JLabel labBigOrSmall; private JLabel labPut; private JLabel labSumMoney; private JLabel labDice; private JLabel labDice; private JLabel labDice; private JLabel labSum; private JLabel labMes; private static List imgs = new ArrayList(); public static void main(String[] args) { new DiceFrame(); } public DiceFrame() { this.setLocationRelativeto(null); this.setBounds(, , , ); this.setDefaultCloSEOperation(JFrame.disPOSE_ON_CLOSE); getContentPane().setLayout(null); this.setResizable(false); labDice = new JLabel(""); labDice.setIcon(new ImageIcon("img/dices.jpg")); labDice.setBounds(, , , ); getContentPane().add(labDice); labSum = new JLabel("uuFuDuDuFFA"); labSum.setBounds(, , , ); getContentPane().add(labSum); labDice = new JLabel(""); labDice.setIcon(new ImageIcon("img/dices.jpg")); labDice.setBounds(, , , ); getContentPane().add(labDice); labDice = new JLabel(""); labDice.setIcon(new ImageIcon("img/dices.jpg")); labDice.setBounds(, , , ); getContentPane().add(labDice); labSumMoney = new JLabel(""); labSumMoney.setForeground(Color.red); labSumMoney.setBounds(, , , ); getContentPane().add(labSumMoney); labPut = new JLabel("uCuBuEBuCEuFFA"); labPut.setToolTipText("."); labPut.setBounds(, , , ); getContentPane().add(labPut); txtPut = new JTextField(); txtPut.setBounds(, , , ); getContentPane().add(txtPut); txtPut.setColumns(); labBigOrSmall = new JLabel("uBCuFFA"); labBigOrSmall.setBounds(, , , ); getContentPane().add(labBigOrSmall); comboBox = new JComboBox(); comboBox.setBounds(, , , ); getContentPane().add(comboBox); comboBox.addItem("大"); comboBox.addItem("小"); labResult = new JLabel(""); labResult.setBounds(, , , ); getContentPane().add(labResult); btnStart = new JButton("START"); btnStart.setBounds(, , , ); getContentPane().add(btnStart); labMes = new JLabel("*"); labMes.setBounds(, , , ); getContentPane().add(labMes); this.setVisible(true); imgs.add(new ImageIcon("img/.png")); imgs.add(new ImageIcon("img/.png")); imgs.add(new ImageIcon("img/.png")); imgs.add(new ImageIcon("img/.png")); imgs.add(new ImageIcon("img/.png")); imgs.add(new ImageIcon("img/.png")); btnStart.addActionListener(this); } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == btnStart) { // 清除上次游戏的结果 labResult.setText(""); // 获取当前下注金额,用户余额,用户押大还是押小 String txt = txtPut.getText().trim(); String remain = labSumMoney.getText().trim(); // 余额不足,不能开始游戏,提示用户充值 if (Integer.parseInt(remain) 上一篇:Java使用反射操作数组示例下一篇:Spring核心IoC和AOP的理解 热门搜索

掷骰子游戏 

掷骰子 

掷色子游戏 

java编写helloworld怎么编写 

游戏编程 

相关文章

Java编写掷骰子游戏

2021-09-10阅读(8983)评论(0)推荐()

这篇文章主要介绍了Java编写掷骰子游戏,需要的朋友可以参考下

Java实现的简单掷骰子游戏示例

2021-10-18阅读(5513)评论(0)推荐()

这篇文章主要介绍了Java实现的简单掷骰子游戏,涉及Java随机数的简单生成、运算与判定相关操作技巧,需要的朋友可以参考下

PHP实现的中秋博饼游戏之掷骰子并输出结果功能详解

2021-09-13阅读(9270)评论(0)推荐()

这篇文章主要介绍了PHP实现的中秋博饼游戏之掷骰子并输出结果功能,结合实例形式分析了PHP掷骰子的原理及游戏结果的图形输出相关操作技巧,需要的朋友可以参考下

jquery实现掷骰子小游戏

2021-10-10阅读(3016)评论(0)推荐()

这篇文章主要为大家详细介绍了jquery实现掷骰子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

js实现掷骰子小游戏

2021-09-18阅读(7476)评论(0)推荐()

这篇文章主要为大家详细介绍了js实现掷骰子小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

使用jQuery实现掷骰子游戏

2021-10-09阅读(3969)评论(0)推荐()

这篇文章主要介绍了使用jQuery实现掷骰子游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Python使用random模块实现掷骰子游戏的示例代码

2021-11-03阅读(5154)评论(0)推荐()

这篇文章主要介绍了Python使用random模块实现掷骰子游戏的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

取消

有人回复邮件通知

提交评论

© 2021 编程之家 

工信部备案号:琼ICP备2022000316号

总结

以上是编程之家为你收集整理的Java编写掷骰子游戏全部内容,希望文章能够帮你解决Java编写掷骰子游戏所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

Java相关文章

使用SpringBoot2.x配置静态文件缓存
Java动态代理四种实现方式详解
Eclipse开发JavaWeb项目配置Tomcat的方法步骤
详解领域驱动设计之事件驱动与CQRS
SpringBoot全局配置long转String丢失精度的问题解决
springboot yml定义属性,下文中${} 引用说明
IDEA解决Java:程序包xxxx不存在的问题
编程语言榜单Java与Python并列第二!Julia下滑
MyBatis Log 插件无法显示SQL语句的原因解析
jsp response.sendRedirect()用法详解
使用springboot访问图片本地路径并映射成url
springboot文件虚拟路径映射方式