1 packagecom.sxt.dice;2

3 importjava.awt.Color;4

5 public class DiceFrame extends JFrame implementsActionListener, Observer {6

7 /**

8 * 《掷骰子》控制台小游戏,在该游戏中,玩家初始拥有1000的金钱,每次输入押大还是押小,9 * 以及下注金额,随机3个骰子的点数,如果3个骰子的总点数小于等于9,则开小,否则开大,10 * 然后判断玩家是否押对,如果未押对则扣除下注金额,如果押对则奖励和玩家下注金额相同的金钱。11 *12 * 运用观察者模式 3个子线程分别控制3个骰子,都已经结束时,通知观察者窗体,窗体观察到所有子线程都结束时,计算游戏结果13 *14 */

15

16 private static final long serialVersionUID = 1L;17 privateJTextField txtPut;18 privateJButton btnStart;19 privateJLabel labResult;20 private JComboBoxcomboBox;21 privateJLabel labBigOrSmall;22 privateJLabel labPut;23 privateJLabel labSumMoney;24 privateJLabel labDice3;25 privateJLabel labDice2;26 privateJLabel labDice1;27 privateJLabel labSum;28 privateJLabel labMes;29

30 private static List imgs = new ArrayList();31

32 public static voidmain(String[] args) {33 newDiceFrame();34 }35

36 publicDiceFrame() {37 this.setLocationRelativeTo(null);38 this.setBounds(200, 50, 380, 297);39 this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);40 getContentPane().setLayout(null);41 this.setResizable(false);42

43 labDice1 = new JLabel("");44 labDice1.setIcon(new ImageIcon("img/dices.jpg"));45 labDice1.setBounds(30, 50, 96, 96);46 getContentPane().add(labDice1);47

48 labSum = new JLabel("\u5269\u4F59\u91D1\u989D\uFF1A");49 labSum.setBounds(10, 10, 69, 23);50 getContentPane().add(labSum);51

52 labDice2 = new JLabel("");53 labDice2.setIcon(new ImageIcon("img/dices.jpg"));54 labDice2.setBounds(136, 50, 96, 96);55 getContentPane().add(labDice2);56

57 labDice3 = new JLabel("");58 labDice3.setIcon(new ImageIcon("img/dices.jpg"));59 labDice3.setBounds(242, 50, 96, 96);60 getContentPane().add(labDice3);61

62 labSumMoney = new JLabel("3000");63 labSumMoney.setForeground(Color.red);64 labSumMoney.setBounds(86, 10, 63, 23);65 getContentPane().add(labSumMoney);66

67 labPut = new JLabel("\u672C\u6B21\u4E0B\u6CE8\uFF1A");68 labPut.setToolTipText("0.0");69 labPut.setBounds(10, 199, 69, 23);70 getContentPane().add(labPut);71

72 txtPut = newJTextField();73 txtPut.setBounds(80, 200, 69, 21);74 getContentPane().add(txtPut);75 txtPut.setColumns(10);76

77 labBigOrSmall = new JLabel("\u62BC\uFF1A");78 labBigOrSmall.setBounds(45, 232, 34, 27);79 getContentPane().add(labBigOrSmall);80

81 comboBox = new JComboBox();82 comboBox.setBounds(80, 234, 69, 23);83 getContentPane().add(comboBox);84 comboBox.addItem("大");85 comboBox.addItem("小");86

87 labResult = new JLabel("");88 labResult.setBounds(136, 156, 126, 27);89 getContentPane().add(labResult);90

91 btnStart = new JButton("START");92 btnStart.setBounds(263, 199, 88, 58);93 getContentPane().add(btnStart);94

95 labMes = new JLabel("*");96 labMes.setBounds(152, 203, 101, 15);97 getContentPane().add(labMes);98

99 this.setVisible(true);100

101 imgs.add(new ImageIcon("img/1.png"));102 imgs.add(new ImageIcon("img/2.png"));103 imgs.add(new ImageIcon("img/3.png"));104 imgs.add(new ImageIcon("img/4.png"));105 imgs.add(new ImageIcon("img/5.png"));106 imgs.add(new ImageIcon("img/6.png"));107

108 btnStart.addActionListener(this);109 }110

111 @Override112 public voidactionPerformed(ActionEvent e) {113 if (e.getSource() ==btnStart) {114

115 //清除上次游戏的结果

116 labResult.setText("");117

118 //获取当前下注金额,用户余额,用户押大还是押小

119 String txt =txtPut.getText().trim();120 String remain =labSumMoney.getText().trim();121

122 //余额不足,不能开始游戏,提示用户充值

123 if (Integer.parseInt(remain) <= 0) {124 JOptionPane.showMessageDialog(null, "当前余额不足,请充值!");125 return;126 }127

128 //下注金额合法性检查

129 if (txt.length() == 0) {130 //提示用户输入

131 labMes.setText("*请输入下注金额");132 labMes.setForeground(Color.RED);133 return;134 }135 //检查用户下注金额是否在有效范围内

136 if (Integer.parseInt(txt) <= 0

137 || Integer.parseInt(txt) >Integer.parseInt(remain)) {138 txtPut.setText("");139 labMes.setText("下注金额应在0~" + remain + "之间");140 return;141 }142

143 //游戏开始后相关项不可更改

144 txtPut.setEnabled(false);145 labMes.setText("");146 comboBox.setEnabled(false);147

148 //在主线程上开t1,t2,t3 3个子线程

149 Thread t1 = newThread() {150 @Override151 public voidrun() {152 //每个子线程上再开子子线程,控制图标变换

153 IconThread t11 = newIconThread(labDice1, imgs);154 //给t11添加观察者,即当前窗体

155 t11.addObserver(DiceFrame.this);156 newThread(t11).start();157 }158 };159

160 Thread t2 = newThread() {161 @Override162 public voidrun() {163 IconThread t21 = newIconThread(labDice2, imgs);164 t21.addObserver(DiceFrame.this);165 newThread(t21).start();166 }167 };168

169 Thread t3 = newThread() {170 @Override171 public voidrun() {172 IconThread t31 = newIconThread(labDice3, imgs);173 t31.addObserver(DiceFrame.this);174 newThread(t31).start();175 }176 };177

178 t1.start();179 t2.start();180 t3.start();181 }182

183 }184

185 /**

186 * 获取骰子点数和187 *188 *@paramlab189 *@returnsum190 */

191 private intresult(JLabel lab) {192 //获取当前骰子图片

193 Icon icon =lab.getIcon();194 int sum = 0;195 for (int i = 0; i < imgs.size(); i++) {196 if(icon.equals(imgs.get(i))) {197 sum += (i + 1);198 break;199 }200 }201 returnsum;202 }203

204 //构建所有被观察者的集合

205 Vector allObservables = new Vector();206

207 @Override208 public voidupdate(Observable o, Object arg) {209 System.out.println(o + ".................");210 //如果集合中不包含当前被观察者,将此被观察者加入集合

211 if (allObservables.contains(o) == false) {212 allObservables.add(o);213 }214

215 //如果集合中被观察者个数为3,说明3个骰子线程已经全部结束

216 if (allObservables.size() == 3) {217 //获取当前下注金额,用户余额,用户押大还是押小

218 String txt =txtPut.getText().trim();219 String remain =labSumMoney.getText().trim();220 String bigOrSmall =comboBox.getSelectedItem().toString();221 //获取每个骰子点数

222 int sum1 =result(labDice1);223 int sum2 =result(labDice2);224 int sum3 =result(labDice3);225 System.out.println(sum1 + "-" + sum2 + "-" +sum3);226 int sum = sum1 + sum2 +sum3;227 System.out.println(sum);228

229 if (sum > 9 && "大".equals(bigOrSmall) || sum <= 9

230 && "小".equals(bigOrSmall)) {231

232 //奖励玩家相应金额

233 remain =String.valueOf(Integer.parseInt(remain)234 +Integer.parseInt(txt));235 labSumMoney.setText(remain);236

237 //显示游戏结果

238 labResult.setText("WIN");239 labResult.setForeground(Color.GREEN);240 labResult.setFont(new Font("宋体", Font.BOLD, 40));241

242 } else{243 //扣除玩家相应金额

244 remain =String.valueOf(Integer.parseInt(remain)245 -Integer.parseInt(txt));246 labSumMoney.setText(remain);247

248 labResult.setText("FAIL");249 labResult.setForeground(Color.red);250 labResult.setFont(new Font("宋体", Font.BOLD, 40));251

252 }253 txtPut.setEnabled(true);254 comboBox.setEnabled(true);255 //本次游戏结束后移除集合中所有线程

256 allObservables.removeAll(allObservables);257 }258 }259

260 }

掷骰子java程序_掷骰子游戏窗体实现--Java初级小项目相关推荐

  1. 如何分析java程序_如何利用 JConsole观察分析Java程序的运行,进行排错调优

    一.JConsole是什么 从Java 5开始 引入了 JConsole.JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行.您可以轻松地使用 JCons ...

  2. 送给女朋友的java程序_逗女朋友开心的玫瑰花Java web程序

    最近写的一个逗女朋友开心的玫瑰花Java web程序 有兴趣的同学可以参考一下 Java类RoseController package com.spring.controller; import ja ...

  3. 用控制台怎么编译java程序_怎么在cmd中运行java控制台程序?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 2010-08-07  17:00             1,111 SendGift.java 2010-08-09  17:40           ...

  4. UML设计java程序_利用UML序列图设计Java应用程序详解

    [IT168 技术文章] Java应用程序由许多类所构成,是Java实现面向对象应用程序的核心.类图主要描述Java应用程序中各种类之间的相互静态关系,如类的继承.抽象.接口以及各种关联.要利用UML ...

  5. ubuntu openjdk6 无法编译java程序_无法在Ubuntu上运行Java GUI程序

    我正在学习Java中的GUI,为此我创建了一个演示程序: import java.awt.*; public class FrameDemo extends Frame { public FrameD ...

  6. 第一段Java程序_借助Win控制命令台编译执行 编辑器Notepad++

    第一段Java程序_借助Win控制命令台编译执行 编辑器Notepad++ 准备代码: 第一次编译: 显然需要先配置环境变量: 先找到java.exe和javac.exe所在的文件夹位置: 此电脑-& ...

  7. qtp启动java程序_转: QTP六脉神剑之调用Java程序

    查看( 1147 ) / 评论( 21 ) 六脉神剑之调用程 序0Xp1zLN_0版权声明:原创作品,转载请以链接方式注明出自http://www.51testing.com/?35,否则将追究法律责 ...

  8. 控制台编写JAVA程序教程_写一个java程序的步骤是什么?写java程序技巧

    写Java程序是要按照步骤来的,这样才能写好一个java程序,那么接下来,我们就来给大家讲解一下写一个java程序的步骤是什么? (1)创建Java项目:"FileàNewàProjectà ...

  9. 2019最新Java程序员面试指南——HR的套路+Java常见技术点

    本文转载自:2019最新Java程序员面试指南--HR的套路+Java常见技术点 面试是件既简单又复杂的事情,也正是因为简单和复杂的两面性,所以Java程序员在面试的时候要多学些面试技巧,当然技术也不 ...

最新文章

  1. MyBatis学习总结[4]-ResultMap子元素
  2. Juniper防火墙命令行查错工具snoop的使用
  3. CPU资源和可用内存大小
  4. ES6之const命令
  5. 计算机云文档,计算机的云计算论文.doc
  6. html焦点自动轮播幻灯片js,js实现幻灯片轮播图
  7. 调用讯飞开放平台的语音转写api
  8. php中表格的高度怎么改,ppt表格行高调整不了怎么办
  9. matlab如何提取文本词干,英文词干提取(stemming)算法 - Lovins, Porter
  10. 预装windows 8 系统GPT模式的ThinkPad T440改装64位 windows 7旗舰版
  11. 阿里云大数据ACA考点总结
  12. redis-发布与订阅
  13. 微信开发——熟悉支付流程
  14. 宏基台式计算机编号,ACER如何查询型号名称序列号SNID?
  15. .msi文件安装报错
  16. Windows下Idea,AndroidStudio的字体美化
  17. HTML、CSS中雪碧图的使用
  18. 16281053_杨瑷彤_操作系统第五次实验-文件系统
  19. Android之蚂蚁森林能量水滴效果
  20. dell g3 3590 黑苹果折腾日记(0)

热门文章

  1. JavaWeb基本概念与术语
  2. linux获取时间,精确到微秒usec
  3. 记一次开发环境redis出现key丢失排查
  4. Ubuntu好用的视频播放器
  5. CentOS 7 的安装教程
  6. android app 自动更新,app升级项目,新增强制更新(可静默),支持热更新(wgt),可支持高版本安卓系统...
  7. 【数据结构】kd树实现,范围查询,邻近查询笔记【1】2d树的构造
  8. mysql 最大分区数量_最大分区数 分区限制
  9. 【领导力】同理心:CIO 的力量倍增器
  10. How to find block sql from dba_waiters v$session v$sql