0

HighLow と呼ばれる Java で単純な GUI サイコロ ゲームをコーディングしようとしています。基本的に、ユーザーは 50 ポンドの初期残高で開始し、3 つの異なる賭け額から選択できます。低を選択した場合、サイコロは 2、3、4、5、または 6 のいずれかに着地する必要があり、1:1 を支払う必要があります。 High を選択すると、サイコロは 8、9、10、11、または 12 のいずれかに着地する必要があり、1:1 を支払います。彼らがセブンを選んだ場合、サイコロは 7 に着地し、4:1 を支払う必要があります。サイコロは 2 つあるので、両方の値を加算する必要があります。これは私の質問のポイントではありませんが、ゲームのポイントを理解できるように、それを明確にしたいと思いました.

私はパネル、イベント処理、およびそのようなすべてにまったく慣れていないため、現在学習中ですが、これを解決するのに苦労しています。私は 5 つのクラスを持っています: Dice.java は getFaceValue() と throwDie() メソッドで構成され、サイコロのランダムなスローをシミュレートします。DiceFace.java は、ピップ/ドットが配置されたサイコロを作成します。DiceFaceViewer.java はフレーム クラスです。DiceFaceComponent は 2 つのサイコロのコンポーネントで、GamePanel はすべての JButton や JComboBox などが配置されているパネルです。

フレームを作成し、ボタンなどをパネルに貼り付け、サイコロの画像をフレームに追加しました。私が望むのは、「サイコロを投げる」ボタンをクリックするたびに、サイコロがランダムな面でフレームに再描画されることです。ウィンドウを開いたり閉じたりすると、ランダムな顔が生成されるだけです。

サイコロ

import java.util.Random;
public class Dice {

    // Instance variables
    private int faceValue;
    private int sides;
    private Random generator;

    public Dice(int s) {
        generator = new Random();
        sides = s;
        faceValue = generator.nextInt(sides) + 1;
    }

    // Simulates the throw of a die landing on a random face.
    public int throwDie() {
        return faceValue = (int)(Math.random() * sides) + 1;
    }

    // Returns the current face value of the die
    public int getFaceValue() {
        return faceValue;
    }

    // Set face value of die
    public void setValue(int v) {
        faceValue = v;
    }
}

ダイスフェイス

import java.awt.*;
import java.awt.geom.*;

public class DiceFace {

    // Holds the seven possible dot positions on a standard die
    private Ellipse2D.Double[] dots = new Ellipse2D.Double[7];

    private Rectangle box;
    private int xLeft;
    private int yTop;
    private int side;
    private int diceValue;

    public DiceFace(int s, int x, int y, int v) {
        side = s;       // Dimension of dice face
        xLeft = x;      // xPos
        yTop = y;       // yPos
        diceValue = v;  // Pip value
    }

    public void draw(Graphics2D g2) {
        box = new Rectangle(xLeft, yTop, side, side);
        makeDots();

        // Black background
        g2.setColor(Color.BLACK);
        g2.fill(box);

        // White dots on black
        g2.setColor(Color.WHITE);

        // Draw dots
        if (diceValue == 1) 
            g2.fill(dots[0]);

        else if (diceValue == 2) {
            g2.fill(dots[1]); g2.fill(dots[2]);
        }

        else if (diceValue == 3) {
            g2.fill(dots[0]); g2.fill(dots[1]); g2.fill(dots[2]);
        }

        else if (diceValue == 4) {
            g2.fill(dots[1]); g2.fill(dots[2]);
            g2.fill(dots[3]); g2.fill(dots[4]);
        }

        else if (diceValue == 5) {
            g2.fill(dots[0]); g2.fill(dots[1]);
            g2.fill(dots[2]); g2.fill(dots[3]); g2.fill(dots[4]);
        }

        else if (diceValue == 6) {
            g2.fill(dots[1]); g2.fill(dots[2]); g2.fill(dots[3]);
            g2.fill(dots[4]); g2.fill(dots[5]); g2.fill(dots[6]);
        }
    }

    public void makeDots() {

        int w = side/6; // Dot width
        int h = side/6; // Dot height

        dots[0] =  new Ellipse2D.Double(xLeft + (2.5 * side)/6,
                yTop + (2.5 * side)/6, h, w);

        dots[1] = new Ellipse2D.Double(xLeft + (3.75 * side)/6,
                yTop + (3.75 * side)/6, h, w);

        dots[2] = new Ellipse2D.Double(xLeft + (1.25 * side)/6,
                yTop + (1.25 * side)/6, h, w);

        dots[3] = new Ellipse2D.Double(xLeft + (1.25 * side)/6,
                yTop + (3.75 * side)/6, h, w);

        dots[4] = new Ellipse2D.Double(xLeft + (3.75 * side)/6,
                yTop + (1.25 * side)/6, h, w);

        dots[5] =  new Ellipse2D.Double(xLeft + (1.25 * side)/6,
                yTop + (2.5 * side)/6, h, w);

        dots[6] =  new Ellipse2D.Double(xLeft + (3.75 * side)/6,
                yTop + (2.5 * side)/6, h, w);
    }
}

DiceFaceViewer

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

public class DiceFaceViewer {
    public static void main(String[] args) {

        // Create frame
        JFrame frame = new JFrame();

        // Set frame attributes
        frame.getContentPane().setPreferredSize(new Dimension(360, 320));
        frame.pack();
        frame.setTitle("High Low");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(false);

        // Set location of frame to centre screen
        Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

        int w = frame.getSize().width;
        int h = frame.getSize().height;
        int x = (dim.width-w)/2;
        int y = (dim.height-h)/2;
        frame.setLocation(x, y);

        DiceFaceComponent component = new DiceFaceComponent();
        frame.add(component);

        // Add panel to frame
        GamePanel panel = new GamePanel();
        frame.add(panel, BorderLayout.NORTH);

        frame.setVisible(true);
    }
}

DiceFaceComponent

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

public class DiceFaceComponent extends JComponent {

    // Instance variables
    private int faceValue1;
    private int faceValue2;

    public DiceFaceComponent() {
        faceValue1 = new Dice(6).getFaceValue();
        faceValue2 = new Dice(6).getFaceValue();
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // Recover Graphics2D
        Graphics2D g2 = (Graphics2D) g;

        DiceFace dice1 = new DiceFace(75, 66, 160, faceValue1); // s, x, y, v
        dice1.draw(g2);
        repaint();

        DiceFace dice2 = new DiceFace(75, 219, 160, faceValue2);
        dice2.draw(g2);
        repaint();
    }
}

ゲームパネル

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

public class GamePanel extends JPanel {

    private int balance = 50;

    public GamePanel() {

        // Components
        JRadioButton highButton = new JRadioButton("High");
        JRadioButton lowButton = new JRadioButton("Low");
        JRadioButton sevensButton = new JRadioButton("Sevens");

        // Button group
        ButtonGroup bg = new ButtonGroup();
        bg.add(highButton);
        bg.add(lowButton);
        bg.add(sevensButton);

        add(highButton);
        add(lowButton);
        add(sevensButton);

        // Array to hold bet amounts
        String betAmounts[] = {"£10", "£5", "£1"};

        // Bets combo box
        JComboBox bets = new JComboBox(betAmounts);
        add(bets);

        // Balance
        JLabel bal = new JLabel(" Balance: £" + balance);
        add(bal);

        // Throw dice button
        final JButton throwButton = new JButton("Throw Dice");
        add(throwButton, FlowLayout.RIGHT);

        class Action implements ActionListener {

            Dice dice = new Dice(6);

            public void actionPerformed(ActionEvent e) {

                dice.throwDie();
                dice.getFaceValue();
            }
        }

        throwButton.addActionListener(new Action());
    }
}
4

1 に答える 1

1

paintどのメソッド内からもrepaintを呼び出さないでください。これにより、再描画マネージャーは別の再描画イベントをスケジュールし、最終的にCPUを消費し、プログラミングを停止させます。

代わりにrepaint、ダイビングの額面を更新しているアクションリスナーを呼び出します。

また、サイコロとサイコロの間に関係はなく、DiceFaceComponentどの値を描画する必要があるかはわかりません。

また、あなたのDiceFaceクラスでは、ドローごとに「ドット」を再作成する必要はありません。それは無駄です。代わりに、コンストラクターでそれらを作成してください。

同じことがpaintComponentメソッドにも当てはまります。わざわざDiceFaceを再作成する必要はありません。クラスを作成するときに、2つの参照を作成し、必要に応じてそれらの面の値を更新するだけです。

Diceさまざまな要素をすべて結び付けるベースモデルとしてを使用します。のようなものを使用することにより、さまざまなコンポーネントに変更が発生したChangeListernerことDiceを通知して、画面を更新できるようにすることができます。

于 2012-10-28T19:07:28.983 に答える