本文实例为大家分享了Java控制台和窗体实现掷骰子的具体代码,供大家参考,具体内容如下
程序目标:同时3掷骰子,让骰子转动若干次后停下来的正面朝上的数字之和大于9 则为大,小于等于9则为小
用于需要提前选择押大还是小,程序结束返回是否押中的结果。
1.掷骰子控制台实现
本程序分为三层:
- 表示层 :用类Player2 实现
- 业务逻辑层:类DiceGame2 实现
- 数据/技术服务层:类Dice2 实现
Dice2 类 实现Runnable接口,重新run()方法来设置每个骰子转动10次 ,并在停下来后获取正面朝上的值。
DiceGame2 类中创建三个线程来模拟同时掷3个骰子,并能在在骰子转动结束后得到总点数和每个骰子的点数。
其中roll()方法开启线程, result()计算点数
Player2 类 主函数创建菜单,提示用户输入操作。并在控制台显示结果。
代码如下:
public class Player2 { //表示层
public static void main(String[] args) throws InterruptedException {
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("**************掷 骰 子 游 戏***************");
System.out.println("请输入0表示押小,输入1表示押大,输入2表示退出");
int i = sc.nextInt();
if(i == 2)
System.exit(0);
DiceGame2 d = new DiceGame2();
d.roll();
Thread.sleep(500);// 主线程等待
int n = d.result();
if (i == 0 && n <= 9)
System.out.println("恭喜你,押小赢了");
else if (i == 0 && n > 9)
System.out.println("很遗憾,押小输了");
else if (i == 1 && n > 9)
System.out.println("恭喜你,押大赢了");
else if (i == 1 && n <= 9)
System.out.println("很遗憾,押大输了");
System.out.println();
}
}
}
class DiceGame2 { //业务逻辑层
Dice2 d1, d2, d3;
public DiceGame2() {
}
public void roll() { // 同时三个掷骰子
d1 = new Dice2();
d2 = new Dice2();
d3 = new Dice2();
Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2);
Thread t3 = new Thread(d3);
t1.start();
t2.start();
t3.start();
}
public int result() { // 计算点数
int sum = 0;
int i = d1.getUpNum();
int j = d2.getUpNum();
int k = d3.getUpNum();
sum = i + j + k;
System.out.println("掷得点数和为:" + sum + " [" + i + " - " + j + " - " + k + " ]");
return sum;
}//
}
class Dice2 implements Runnable { // 骰子类 数据/技术服务层
private int upnum;
public Dice2() {
this.upnum = 1;
}
@Override
public void run() {
int count = 10;// 设置每颗骰子转动10次
while (count > 0) {
upnum = new Random().nextInt(6) + 1;
System.out.println(Thread.currentThread().getName() + " " + upnum);
count--;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public int getUpNum() {
return upnum;
}
}
2.掷骰子窗体实现
窗体程序思路和控制台一样,只是把显示界面由控制台改为窗体。
类SiziGame extends JFrame implements ActionListener
类IconThread implements Runnable
首先,SiziGame类通过构造器初始化设置窗体和里面控件,并且把代表6种点数的图片加载到imgs集合里面,还要给开始按钮绑定监听事件函数。
其次,重写actionPerformed()函数,来实现按钮触发3个骰子转动。在这个函数里开始3个线程让骰子图片转动起来,并在转动结束后计算机每个骰子显示图片对应的点数和总点数。再根据用户之前选择的押大或押小返回输赢结果。
然后,IconThread 类重写run()方法,来实现图片的动态效果。通过随机生成[0-6)的随机整数作为imgs集合的index,再根据索引从imgs里取对应的图片显示在窗体上,由于线程运行速度较快,且设置了多次取图片的动作从而形成了动态效果。注意的是集合下标为[0-5],所以在SiziGame类中的result()方法计算点数时要+1。
public class SiziGame extends JFrame implements ActionListener{
private JLabel lb1;
private JLabel lb2;
private JLabel lb3;
private JLabel lbNote;
private JComboBox<String> cmb;
private JButton btn;
private JLabel labResult;
private static List<Icon> imgs = new ArrayList<Icon>();
IconThread it1,it2,it3;
Thread t1,t2,t3;
public static void main(String[] args) {
new SiziGame();
}
public SiziGame(){
this.setLocationRelativeTo(null);
this.setBounds(200, 50, 380, 297);
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
getContentPane().setLayout(null);
this.setResizable(false);
lb1 = new JLabel("");
lb1.setIcon(new ImageIcon( getClass().getResource("img/a.jpg")));
lb1.setBounds(30, 30, 96, 96);
getContentPane().add(lb1);
lb2 = new JLabel("");
lb2.setIcon(new ImageIcon( getClass().getResource("img/a.jpg")));
lb2.setBounds(136, 30, 96, 96);
getContentPane().add(lb2);
lb3 = new JLabel("");
lb3.setIcon(new ImageIcon( getClass().getResource("img/a.jpg")));
lb3.setBounds(242, 30, 96, 96);
getContentPane().add(lb3);
lbNote = new JLabel("押");
lbNote.setBounds(40, 200, 30, 30);
getContentPane().add(lbNote);
cmb = new JComboBox<String>();
cmb.setBounds(80, 200, 60, 30);
getContentPane().add(cmb);
cmb.addItem("大");
cmb.addItem("小");
btn = new JButton("START");
btn.setBounds(220, 190, 100, 50);
btn.addActionListener(this);
getContentPane().add(btn);
labResult = new JLabel("结果"); //结果
labResult.setBounds(136, 156, 126, 27);
getContentPane().add(labResult);
this.setVisible(true);
imgs.add(new ImageIcon(getClass().getResource("img/1.gif")));
imgs.add(new ImageIcon(getClass().getResource("img/2.gif")));
imgs.add(new ImageIcon(getClass().getResource("img/3.gif")));
imgs.add(new ImageIcon(getClass().getResource("img/4.gif")));
imgs.add(new ImageIcon(getClass().getResource("img/5.gif")));
imgs.add(new ImageIcon(getClass().getResource("img/6.gif")));
it1 = new IconThread(lb1, imgs);
it2 = new IconThread(lb2, imgs);
it3 = new IconThread(lb3, imgs);
t1 = new Thread(it1);
t2 = new Thread(it2);
t3 = new Thread(it3);
}//
public void thread(){
it1 = new IconThread(lb1, imgs);
it2 = new IconThread(lb2, imgs);
it3 = new IconThread(lb3, imgs);
t1 = new Thread(it1);
t2 = new Thread(it2);
t3 = new Thread(it3);
}
@Override
public void actionPerformed(ActionEvent args) {
String ya = cmb.getSelectedItem().toString();
System.out.println("\n你本次押的"+ya);
thread();
t1.start();
t2.start();
t3.start();
try {
t1.join();
t2.join();
t3.join();
} catch (InterruptedException e) {}
int i = result(lb1);
int j = result(lb2);
int k = result(lb3);
int sum = i + j + k;
System.out.println("掷得点数和为:" + sum + " [" + i + " - " + j + " - " + k + " ]");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
if (sum > 9 && "大".equals(ya) || sum <= 9 && "小".equals(ya)) {
labResult.setText("赢");
labResult.setForeground(Color.GREEN);
labResult.setFont(new Font("宋体", Font.BOLD, 30));
}
else {
labResult.setText("输");
labResult.setForeground(Color.red);
labResult.setFont(new Font("宋体", Font.BOLD, 30));
}
}//
public int result(JLabel lab) {
Icon icon = lab.getIcon();// 获取当前骰子图片
int sum = 0;
for (int i = 0; i < imgs.size(); i++) {
if (icon.equals(imgs.get(i))) { //取出和lab最后图片对应的点数
sum += (i + 1);
break;
}
}
return sum;
}//
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。