-3

このプログラムは最終的に、友人のゲームに統合されるスロット マシンのようなものを作成するように設計されています。(彼はクラス プロジェクトの ATM にのみ使用しています)

package SlotMachine;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import java.awt.Color;

public class SlotGui{


        static Random one = new Random();
        static Random two = new Random();
        static Random three = new Random();
        static Random four = new Random();
        static Random five = new Random();
        static Random six = new Random();
        static Random seven = new Random();
        static Random eight = new Random();
        static Random nine = new Random();
        static int st = one.nextInt(10);
        static int nd = two.nextInt(10);
        static int trd = three.nextInt(10);
        static int frth = four.nextInt(10);
        static int fth = five.nextInt(10);
        static int sxth = six.nextInt(10);
        static int svth = seven.nextInt(10);
        static int eth = eight.nextInt(10);
        static int nth = nine.nextInt(10);
        static int coins = 15;
        static JTextField money = new JTextField(Integer.toString(coins));
        static JLabel blueLabel = new JLabel();
        static JLabel slotOne = new JLabel();
        static JLabel slotTwo = new JLabel();
        static JLabel slotThree = new JLabel();
        static JLabel slotFour = new JLabel();
        static JLabel slotFive = new JLabel();
        static JLabel slotSix = new JLabel();
        static JLabel slotSeven = new JLabel();
        static JLabel slotEight = new JLabel();
        static JLabel slotNine = new JLabel();
        static Icon lever = new ImageIcon("lever.jpg");
        static Icon a = new ImageIcon("0.jpg");
        static Icon b = new ImageIcon("1.jpg");
        static Icon c = new ImageIcon("2.jpg");
        static Icon d = new ImageIcon("3.jpg");
        static Icon ee = new ImageIcon("4.jpg");
        static Icon f = new ImageIcon("5.jpg");
        static Icon g = new ImageIcon("6.jpg");
        static Icon h = new ImageIcon("7.jpg");
        static Icon i = new ImageIcon("8.jpg");
        static Icon j = new ImageIcon("9.jpg");
        static JButton startLever = new JButton(lever);
        static Color backGround = new Color (0,0,0);

        public static void slotVisualSet(JLabel slot,int Xval, int Yval, int h, int w){
            slot.setOpaque(true);
            slot.setLocation(Xval,Yval);
            slot.setSize(h,w);
            slot.setVisible(true);  
        }

            public static void slotLogic(JLabel slotLab,int slotNum){

                if (slotNum == 0){
                        slotLab.setIcon(a);
                    } else if (slotNum == 1){
                        slotLab.setIcon(b);
                    } else if (slotNum == 2){
                        slotLab.setIcon(c);
                    } else if (slotNum == 3){
                        slotLab.setIcon(d);
                    } else if (slotNum == 4){
                        slotLab.setIcon(ee);
                    } else if (slotNum == 5){
                        slotLab.setIcon(f);
                    } else if (slotNum == 6){
                        slotLab.setIcon(g);
                    } else if (slotNum == 7){
                        slotLab.setIcon(h);
                    } else if (slotNum == 8){
                        slotLab.setIcon(i);
                    } else if (slotNum == 9){
                        slotLab.setIcon(j);
                    }
            }

            public static void makeWindow(){

            //creating the window

                JFrame windo = new JFrame ();
            windo.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            windo.setExtendedState(JFrame.MAXIMIZED_BOTH);
                windo.setVisible(true);

                //creating the components of the window


                    money.setOpaque(true);
                    money.setLocation(500,900);
                    money.setSize(60,20);

                    blueLabel.setOpaque(true);
                    blueLabel.setBackground(backGround);
                    blueLabel.setPreferredSize(new Dimension(1000, 1000));
                    blueLabel.setVisible(true);
                    blueLabel.setLayout(null);                      
                    //setting the coordinates and sizes of the slots
                    slotVisualSet(slotOne,100,100,225,225);
                    slotVisualSet(slotTwo,350,100,225,225);         
                    slotVisualSet(slotThree,600,100,225,225);
                    slotVisualSet(slotFour,100,350,225,225);
                    slotVisualSet(slotFive,350,350,225,225);
                    slotVisualSet(slotSix,600,350,225,225);         
                    slotVisualSet(slotSeven,100,600,225,225);
                    slotVisualSet(slotEight,350,600,225,225);
                    slotVisualSet(slotNine,600,600,225,225);


                startLever.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                    int st = one.nextInt(10);
                    int nd = two.nextInt(10);
                    int trd = three.nextInt(10);                
                    int frth = four.nextInt(10);
                    int fth = five.nextInt(10);
                    int sxth = six.nextInt(10);
                    int svth = seven.nextInt(10);
                    int eth = eight.nextInt(10);
                    int nth = nine.nextInt(10);
                    coins = coins - 5;
                    money.setText(Integer.toString(coins));
                    // making the slots change pictures when the lever is pulled
                    slotLogic(slotOne,st);
                    slotLogic(slotTwo,nd);
                    slotLogic(slotThree,trd);
                    slotLogic(slotFour,frth);
                    slotLogic(slotFive,fth);
                    slotLogic(slotSix,sxth);
                    slotLogic(slotSeven,svth);
                    slotLogic(slotEight,eth);
                    slotLogic(slotNine,nth);

                    if ((st == nd) && (nd == trd)){
                        coins = coins + 30;
                    }else if((frth == fth) && (fth == sxth)){
                        coins = coins + 30;
                    }else if ((svth == eth) && (eth == nth)){
                        coins = coins + 30;
                    } else if ((st == fth) && (fth == nth)){
                        coins = coins + 100;
                    }else if ((svth == fth) && (fth == trd)){
                        coins = coins + 100;
                    }

                }
            }); 
            startLever.setSize(183,275);
            startLever.setLocation(1000,300);


                windo.add(startLever);
                windo.add(money);
                windo.add(blueLabel);
                windo.add(slotOne);
                windo.add(slotTwo);
                windo.add(slotThree);
                windo.add(slotFour);
                windo.add(slotFive);
                windo.add(slotSix);
                windo.add(slotSeven);
                windo.add(slotEight);
                windo.add(slotNine);

            }

    public static void main(String[] args) {

        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                makeWindow();

            }
        } );
    }   

}

ここには 3 つのバグがあります。私は永遠に答えを探していましたが、見つけることができなかったので、助けていただければ幸いです。

  1. 9 番目のスロットは、何らかの理由で配置パラメーターをリッスンせず、脇に座っています。

  2. 画像を変更するはずのボタンをクリックした後、スロットが常に表示されるとは限りません (これには JLabels 以外のものを使用する必要があるのでしょうか?)

  3. 背景の色は変わりません。

4

1 に答える 1

5

問題のあるコードには非常に多くの問題があります。いくつか列挙させてください。

  • コンテナを使用してnull以外のレイアウトでコンポーネントの位置を設定しようとしています
  • レイアウトマネージャーを使用せずに、セットの場所をまったく使用しようとしています。正確な配置にこだわることなく、複雑な GUI を簡単に作成できるようにするためです。
  • 配列を使用しない。
  • 静電気の使いすぎ。どのフィールドも静的であってはなりません。編集:定数である可能性が非常に高い背景色を除いて、背景という名前の静的最終変数。
  • 9 つの Random オブジェクトを使用します。1つは問題なく機能し、混乱がはるかに少なくなります。
  • ....など...

  • 「友達の」クラス プロジェクトのコードを投稿します。


このコードを修正する最善の方法は、それを廃棄することであり、代わりに、配列を使用して、レイアウト マネージャーを使用し、静的変数を回避して、コードを最初から書き直すことです。最初からやり直せば、すぐに素敵な GUI を作成でき、その過程でかなりのことを学ぶことができます。


編集 2

  • JPanel を使用して GridLayout を使用して、JLabels の 3 x 3 グリッドを保持することを検討してください。
  • GridLayout JPanel を BorderLayout.CENTER の位置に配置して、GUI 全体に BorderLayout を使用することを検討してください。
  • 再生ボタンは、メイン GUI の BorderLayout.EAST 位置に配置された JPanel に配置できます。
  • ベット ウィンドウは、メイン GUI の BorderLayout.SOUTH 位置にある JPanel に移動できます。
  • ここでも配列を使用すると、コードが単純化および縮小され、デバッグと強化がはるかに容易になります。
  • GUI のデバッグ、拡張、および変更を容易にするレイアウト マネージャーの使用についても同じことが言えます。
于 2013-11-12T00:38:05.457 に答える