Java Craps 小程序总是崩溃?

标签 java applet

我正在为我的编程课制作一个掷骰子小程序,但似乎我所做的一切都不对?一旦我单击按钮掷骰子,骰子就会从屏幕上消失,小程序会卡住,不允许我单击任何内容。如果我第一次掷骰子赢了或输了,那么“掷骰子!”按钮被禁用(就像它应该的那样),但是当我单击“开始游戏!”时尽管我可以单击“开始游戏!”,但它不会重新激活。按钮。我不知道如何在整个游戏中保持分值相同。我很迷茫,不知道问题是什么,我所做的一切都不起作用。到目前为止,我对代码感到失望:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;

public class Craps extends JApplet implements ActionListener {
Button button1 = new Button("Start game!");
Button button2 = new Button("Roll dice!");
Random gen = new Random();
int buttonPressed = 0;
int die1 = 0;
int die2 = 0;
int wins = 0;
int losses = 0;
int point = 0;
String result = "";
Image[] dice = new Image[6];

public void init() {
    setLayout(null);
    setSize(400, 500);
    dice[0] = getImage(getCodeBase(), "dice1.gif");
    dice[1] = getImage(getCodeBase(), "dice2.gif");
    dice[2] = getImage(getCodeBase(), "dice3.gif");
    dice[3] = getImage(getCodeBase(), "dice4.gif");
    dice[4] = getImage(getCodeBase(), "dice5.gif");
    dice[5] = getImage(getCodeBase(), "dice6.gif");

    button1.setBounds(50,300,125,20);
    button1.addActionListener(this);
    add(button1);

    button2.setBounds(250,300,125,20);
    button2.addActionListener(this);
    add(button2);
}

public void paint (Graphics g) {
    super.paint(g);
    //background
    g.setColor(Color.black);
    g.fillRect(0, 0, 400, 500);
    //table
    g.setColor(Color.cyan);
    g.fillRoundRect(50, 50, 300, 200, 50, 50);
    //dice
    g.drawImage(dice[die1], 50+(int)(Math.random()*275), 50+(int)(Math.random()*175), 32, 32, this);
    g.drawImage(dice[die2], 50+(int)(Math.random()*275), 50+(int)(Math.random()*175), 32, 32, this);


    if (buttonPressed == 2) {
        if (die1+die2==0||die1+die2==1||die1+die2==10) {
            result = "Sorry, you lose.";
            g.drawString(result, 50, 385);
            button2.setEnabled(false);
            if (buttonPressed == 1) {
                add(button2);
            }
        } else if (die1+die2==5||die1+die2==9) {
            result = "Congrats! You win!";
            g.drawString(result, 50, 385);
            button2.setEnabled(false);
            if (buttonPressed == 2) {
                add(button2);
            }
        } else {
            while (die1+die2!=0||die1+die2!=1||die1+die2!=5||die1+die2!=9||die1+die2!=10) { //2,3,7,11,12
                int point = die1 + die2;
                int sum = (die1+die2)+2;
                result = "You rolled "+sum+".";
                g.drawString(result, 50, 385);
                g.drawString("The point is "+((die1+die2)+2)+".", 50, 410);
            }    
                if (die1+die2==5) {
                    result = "Sorry, you lose.";
                    g.drawString(result, 50, 385);
            }
        }    
    } else if (buttonPressed == 1) {
        g.setColor(Color.white);
        g.drawString("Roll 'em!", 50, 350);
    }
}

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == button1) {
        buttonPressed = 1;
    }    

    if (e.getSource() == button2) {
        buttonPressed = 2;
        die1 = gen.nextInt(6);
        die2 = gen.nextInt(6);
    }
    repaint();
}


}

最佳答案

这是一个无限循环:

        while (die1+die2!=0||die1+die2!=1||die1+die2!=5||die1+die2!=9||die1+die2!=10) { //2,3,7,11,12
            int point = die1 + die2;
            int sum = (die1+die2)+2;
            result = "You rolled "+sum+".";
            g.drawString(result, 50, 385);
            g.drawString("The point is "+((die1+die2)+2)+".", 50, 410);
        }

有两个原因。首先,进入循环后永远不会更新 die1die2 的值。

第二个是因为这样的情况:

while ( someValue != 0 || someValue != 1 ) {

永远都是真的。这是因为如果 someValue0 那么它一定不是 1,反之亦然。看看 while 循环之前的 if/else 结构,我怀疑您的意思是条件是 && 而不是 ||

此外,您不应该在 paint 中执行任何程序逻辑。只会画画。这不仅会减慢绘制速度,而且还会从重绘请求外部调用 paint。您无法控制代码何时运行。

关于Java Craps 小程序总是崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20415349/

相关文章:

java - 查找带有在 Plone 中运行的小程序的 .xls 文件

javascript - 检测谷歌浏览器是否阻止 Java 插件

java - 固定尺寸 Swing GUI 在使用不同分辨率时发生变化

java - org.json.JSONException : JSONObject ["address"] is not a JSONArray

java - 如何获取文本框的字符串值

java - 链表的 getlast() 中出现 NullPointerException

java - 小程序窗口的外观在后续显示中发生变化

java - 如何创建动画方法并将其放入绘制方法中?我的代码不起作用

java - 传递 SelectOneMenu 值以在 JSF/Primefaces 中添加功能

javascript - 如何在不使用 javascript 在 asp.net 中重新加载页面的情况下刷新 APPLET?