Java实现掷骰子控制台和窗体两种方法

网友投稿 336 2022-10-06


Java实现掷骰子控制台和窗体两种方法

本文实例为大家分享了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 cmb;

private JButton btn;

private JLabel labResult;

private static List imgs = new ArrayList();

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();

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.FVEYNrGcdrsetBounds(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(){

/*IconThread it1 = new IconThread(lb1, imgs);

IconThread it2 = new IconThread(lb2, imgs);

IconThread it3 = new IconThread(lb3, imgs);

Thread t1 = new Thread(it1);

Thread t2 = new Thread(it2);

Thread t3 = new Thread(it3);*/

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);

/* t1.start();

t2.start();

t3.start();

try {

t1.join();

t2.join();

t3.join();

} catch (InterruptedException e) {}*/

}

@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;

}//

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:做到这5点,安全开发让你的应用不再漏洞百出 ​
下一篇:存在多年的Linux恶意软件被发现,可窃取用户敏感信息
相关文章

 发表评论

暂时没有评论,来抢沙发吧~