老虎机Java游戏

时间:2017-11-17 03:28:59

标签: java swing jframe jpanel jlabel

我正在为学校制作这个java老虎机并编写了它。我正在使用JFrame但我无法将图像显示在屏幕上。插槽[] jLabel似乎有问题。 slot是一个包含三个不同卷轴的数组。我不知道问题是否与gridlayout有关。我很困惑

package slots;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

public class SlotMachineProgram extends JFrame {
  private int total = 2000; //this is the max bet you can have 
  private int bet = 100; //default bet amount 
  private int maxWin; //this variable stores the max wins 

  private String[] symbols = {
    "Cherry",
    "Bear",
    "Diamond",
    "Penguin",
    "Star",
    "Shoe",
    "Banana",
    "Orange",
    "Apple"
  }; //symbols that are available for the slot machine 

  //amount winning
  int[] gotTwo = {
    30,
    16,
    15,
    12,
    11,
    10,
    9,
    7,
    5
  }; //Prize moneys for two matches 
  int[] gotThree = {
    60,
    32,
    30,
    24,
    22,
    20,
    18,
    14,
    10
  }; //prize money for three matches 

  public JPanel slotPanel = new JPanel(new GridLayout(1, 3)); //creates a grid that holds the three slot options 
  public JLabel[] slot = new JLabel[3]; //create the three slots 

  //LABELS
  private JLabel amount = new JLabel("Total: $" + total); //this is the label for the total amount 
  private JLabel betLabel = new JLabel("Bet: $" + bet); //this is the label for the bet amount 

  //BUTTONS 
  private JButton add50Button = new JButton("+50"); //creates a button called add50Button that adds 50 dollars to the bet
  private JButton spin = new JButton("Spin"); //creates a button that spins the slot machine 
  private JButton maxBetButton = new JButton("Max"); //creates a button that makes the max amount the bet 
  private JButton subtract50Button = new JButton("-50"); //creates a button that subtracts 50 from bet 
  private JButton getBet = new JButton("Enter Bet"); //a button that pops up a new window that allows the user to type in a bet

  public SlotMachineProgram() { //constructor
    maxWin = total; //set win to total 

    //Coloring Buttons
    spin.setBackground(Color.GREEN); //sets color of button to be green 
    spin.setOpaque(true); //Sets Button Opaque so it can be seen 
    maxBetButton.setBackground(Color.CYAN); //sets color of button to be green 
    maxBetButton.setOpaque(true); //Sets Button Opaque so it can be seen 
    add50Button.setBackground(Color.YELLOW); //sets color of button to be green 
    add50Button.setOpaque(true); //Sets Button Opaque so it can be seen 
    subtract50Button.setBackground(Color.MAGENTA); //sets color of button to be green 
    subtract50Button.setOpaque(true); //Sets Button Opaque so it can be seen 
    getBet.setBackground(Color.ORANGE); //sets color of button to be green 
    getBet.setOpaque(true); //Sets Button Opaque so it can be seen 

    //money panel
    JPanel moneyPanel = new JPanel(new GridLayout(2, 1)); //creates a grid called money panel that is 2x1 that stores total and bet
    moneyPanel.setBorder(new TitledBorder("Money")); //creates the title of the panel 
    moneyPanel.add(amount); //adds the amount to the panel 
    moneyPanel.add(betLabel); //adds the BetLabel to the panel 

    //button panel 
    JPanel buttonsPanel = new JPanel(new GridLayout(2, 1)); //creates a new panel called buttonsPanel that has all of the buttons 
    JPanel buttonTopPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 2)); //this orients the buttons to the middle in a row
    buttonsPanel.setBorder(new TitledBorder("             Buttons")); //sets the title of the buttons panel to buttons 

    buttonTopPanel.add(add50Button); //add the add50button to the button panel
    buttonTopPanel.add(spin); //adds a spin button
    buttonTopPanel.add(maxBetButton); //adds a max bet button 

    JPanel BottomPanel = new JPanel(); //creates a panel for the bottom of the screen 
    BottomPanel.add(subtract50Button); //adds the subtract 50 button
    BottomPanel.add(getBet); //adds the get bet button

    buttonsPanel.add(buttonTopPanel, BorderLayout.NORTH); //adds a border on the north edge
    buttonsPanel.add(BottomPanel, BorderLayout.SOUTH); //adds a border on the south edge

    // TODO
    //set slots to their default image
    slot[0] = new JLabel(new ImageIcon("/images/left.png"));
    slot[1] = new JLabel(new ImageIcon("/images/middle.png"));
    slot[2] = new JLabel(new ImageIcon("/images/right.png"));


    //add Action listeners to bet buttons
    add50Button.addActionListener(new ActionListener() { //action listener for the add 50 button 
      @Override public void actionPerformed(ActionEvent e) { //makes an action performed method
        bet += 50; //increase bet by 50 if the button add50 is clicked
        if (bet > total) bet = total; //else skip
        betLabel.setText("Bet: $" + bet); //show the bet next to the bet label
      }
    });

    maxBetButton.addActionListener(new ActionListener() { //creates an action listener for the maxbetbutton
      @Override public void actionPerformed(ActionEvent e) { //creates a method for the maxbetbutton's action listener
        bet = total; //make bet the maxBet
        betLabel.setText("Bet: $" + bet); //show bet next to the bet label
      }
    });

    subtract50Button.addActionListener(new ActionListener() { //creates an actionlistener for the subtract 50 button
      @Override public void actionPerformed(ActionEvent e) { //creates an actionperformed method 
        bet -= 50; //subtracts the value of the bet by 50
        if (bet < 0) bet = 0; //is the user tries to have a negative bet, set bet to 0
        betLabel.setText("Bet: $" + bet); //display the value of the bet next to a bet label
      }
    });

    getBet.addActionListener(new ActionListener() { //create an actionlistener for the getbet button that allows the user to type in a custom amount 
      @Override public void actionPerformed(ActionEvent e) { // create an actionperformed method 
        String input; //creates a variables called input of type string. This is what is displayed on the screen
        int betInput; //creates a variables called betInput of type int 
        //"How much do you want to bet" is the text that appears in the bet amount window.
        //"Enter your bet amount" is the header on the bet window
        input = JOptionPane.showInputDialog(null,
          "How Much Do You Want To Bet? ", "Enter Your Bet Amount",
          JOptionPane.QUESTION_MESSAGE);
        betInput = Integer.parseInt(input); //set the user input to the betInput
        if (betInput > total) { //if the inputed value is more than the total amount of money they user has left
          bet = total; //set the bet to equal the amount of money the user has
        } else { //if the inputed bet amount is less than the total
          bet = betInput; //set the bet input the value of the bet
        }
        betLabel.setText("Bet: $" + bet); //updates the bet label to show the bet value next to its label
      }
    });

    spin.addActionListener(new ActionListener() { //creates an actionlistener for the spin button
      @Override
      public void actionPerformed(ActionEvent e) { //creates a method called actionperformed 
        String[] rand = new String[3]; //creates an array of 3 strings 
        int addTotal; //creates a variable called addTotal
        //generate 3 new slots
        for (int i = 0; i < 3; i++) { //loops through the three panes
          int choice; //creates a varaibe called choice 
          double random = Math.random(); //creates a random variable and assigns it a random value
          random *= 8; //times the value by 8
          choice = (int) random; //assigns the value of choice to be random with a cast of int
          rand[i] = symbols[choice]; //assigns  the value rand at index i to be symbols at index choice
          slot[i].setIcon(new ImageIcon("/images/" + symbols[choice] + ".png")); //shows the image for the slot in the panel
          // TODO
        }


        //check for matches
        //three matches
        if (rand[0] == rand[1] && rand[1] == rand[2]) { //if there were three matches
          int index = 0; //creates a variable index of type int and assigns it to the value 0 and 
          for (int i = 0; i < symbols.length; i++) //a loop that runs the length of symbols 
            if (rand[0] == symbols[i]) { //if rand[0] is equal to symbols[i]
              index = i; //assign index to equal i
            }
          addTotal = bet * gotThree[index]; //increase addTotal by bet times gotThree[index], which stores the bonuses for triple pairs
          total += addTotal; //increment total by addTotal
          //pop-up menu saying the bet amount, the amount won and the updated total
          JOptionPane.showMessageDialog(null, "Your Bet: $" + bet + "\nYou Win: $" + addTotal + "\nMoney Left: $" + total,
            "Three Matches", JOptionPane.INFORMATION_MESSAGE);

          amount.setText("Total: $" + total); //set the label Total: to equal total 
          if (total > maxWin) { //if the new total is greater than maxWin
            maxWin = total; //maxWin is now assigned to total
          }
        } else if (rand[0] == rand[1] || rand[1] == rand[2] || rand[2] == rand[0]) { //checks if there is a match between 2 tiles
          int match, index = 0; //creates integer variables match and index, assigning it to 0
          if (rand[0] == rand[1] || rand[0] == rand[2]) { //if the first box has a match
            match = 0; //match is assigned the value of 0
          } else { //if the second of third box has the match
            match = 1; //assign match to the value of 1
          }

          //find the index
          for (int i = 0; i < symbols.length; i++) { //A loop that iterates the amount of times of the length of symbols
            if (rand[0] == symbols[i]) { //if rand at index 0 is equal to symbols at index i
              index = i; //set index to equal i
            }
          }
          addTotal = bet * gotTwo[index]; //increment addTotal by bet*gotTwo[index]
          //Creates a pop-up window that displays the bet amount and the winnings
          JOptionPane.showMessageDialog(null, "Your Bet: $" + bet + "\nYou Win: $" + addTotal,
            "Two Matches", JOptionPane.INFORMATION_MESSAGE);
          total += addTotal; //increments total by addTotal
          amount.setText("Total: $" + total); //updates the text next to total
          if (total > maxWin) { //if the total is greater than maxWin
            maxWin = total; //set maxWin to total
          }


        } else { //run this is there are no matches
          total -= bet; //decrement  total by bet
          //Creates a pop-up window that shows the lost amount (bet) and the money left
          JOptionPane.showMessageDialog(null, "You Lost: $" + bet + "\nMoney Left: $" + total, "No Matches", JOptionPane.INFORMATION_MESSAGE);
          amount.setText("Total: $" + total); //updates the total amount that will be seen on the screen
          if (total > maxWin) { //if the total is greater than maxWin
            maxWin = total; //sets maxWin to equal total
          }
          if (bet > total) { //if bet is greater than the amount of money left (total) than 
            bet = total; //set the bet to total
            betLabel.setText("Bet: $" + bet); //create the betLabel and update the value of it 
          }
          if (total == 0) { //if the total is the 
            bet = 0; //sets the bet value to equal 0
            betLabel.setText("Bet: $" + bet); //updates the betLabel to the new bet value 
            //Creates a pop-up message saying "You Lost :( and it also displays the maximum amount that the user won
            JOptionPane.showMessageDialog(null, "You Lost :( \nThe Maximum That You Won Was $" + maxWin,
              "\nGame Over", JOptionPane.INFORMATION_MESSAGE);
            System.exit(0); //exit the program 
          }
        }
      }
    });

    JPanel panelOnBottom = new JPanel(new BorderLayout()); //creates a panel on the bottom 
    panelOnBottom.add(moneyPanel, BorderLayout.WEST); //adds the money panel to the west/left border of the window
    panelOnBottom.add(buttonsPanel, BorderLayout.EAST); //adds the buttons panel to the east/right border of the window

    // TODO
    JPanel all = new JPanel(new GridLayout(2, 1)); //creates a panel called all with a grid layout of 2x1
    slotPanel.setVisible(true);
    slotPanel.setOpaque(true);
    all.add(slotPanel); //adds slotPanel to the 'all' panel
    all.add(panelOnBottom); //adds the panelOnBottom to the 'all' panel
    add(all); //add all to the window

  }

  public static void main(String[] args) { //the main class
    JFrame frame = new SlotMachineProgram(); //creates a new frame of type SlotMachineProgram
    frame.setTitle("Gambling Time!"); //creates the title of the frame to be Gambling Time!
    frame.setLocationRelativeTo(null); //sets the location of the window to null, meaning it opens in the middle 
    frame.setSize(400, 300); //sets the size of the window to be 400 by 300
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //sets the default close method to exit
    frame.setResizable(false); //makes the window not resizable
    frame.setVisible(true); //makes the window visible


  }
}

1 个答案:

答案 0 :(得分:0)

您必须首先将带有图像的jlables添加到slotPanel。

//set slots to their default image
slot[0] = new JLabel(new ImageIcon("/images/left.png"));
slot[1] = new JLabel(new ImageIcon("/images/middle.png"));
slot[2] = new JLabel(new ImageIcon("/images/right.png"));

slotPanel.add(slot[0]);
slotPanel.add(slot[1]);
slotPanel.add(slot[2]);

然后,您确定所有图像都存在于 / images 目录中,就像您在代码中的第一位声明一样。

private String[] symbols = { 
        "Cherry", "Bear", 
        "Diamond", "Penguin", 
        "Star", "Shoe", 
        "Banana", "Orange", 
        "Apple" }; // symbols that are available for the slot machine