Programación Juego de Máquina Tragaperras con Java

Codigos

No importa lo simple o complejo que sea el juego, ¡Java puede hacer el trabajo!

En esta publicación, vamos a echar un vistazo a cómo los principiantes de la programación en Java pueden hacer una máquina tragaperras (o conocidas en inglés como slots) simple, pero totalmente funcional en Java. Las máquinas tragaperras existen desde hace mucho tiempo, pero su valor de entretenimiento no parece desvanecerse ni un poco. InterCasino, el primer sitio web que ofreció juegos de casino en línea al mundo en 1996, sigue existiendo y sus juegos de tragaperras parecen actualizarse a menudo.

Además, según la American Gaming Association, las tragaperras generan entre el 62% y el 90% del dinero del juego, lo que convierte a las máquinas en las vacas lecheras de los casinos. Teniendo en cuenta estos datos, ¿no quieres crear tu propia máquina tragaperras que pueda gustar a millones de aficionados a los juegos de casino en el futuro? Si estás interesado en crear juegos de tragaperras basados en Java, el código que aparece a continuación podría resultarle útil.

Si estás más interesado en el tema de Tragaperras, en SlotJava podrás encontrar las máquinas de slots más recientes del mercado. No tendrás que descargar ni instalar ningún programa, puesto de disfrutar de máquinas tragaperras directamente desde el navegador.

Descripción del Proyecto

Una máquina tragaperras es un dispositivo de juego en el que el usuario introduce dinero y luego tira de una palanca (o pulsa un botón). La máquina tragaperras muestra entonces un conjunto de imágenes aleatorias. Si dos o más de las imágenes coinciden, el usuario gana una cantidad de dinero que la máquina tragaperras le devuelve.

Juego Tragaperras con Java
Juego Tragaperras con Java

Crea una clase que simule una máquina tragaperras. Cuando el programa se ejecuta, debe hacer lo siguiente

  • El jugador inicia con 100 créditos y $0 de dinero.
  • Pide al usuario que gire la palanca y empiece a jugar.
  • El programa mostrará al azar algunas de las siguientes imágenes: Plátano, Bar, Campana, Cerezas, Ficha de 5, Ficha de 25, Ficha de 50, Ficha de 100, Flor, Moneda, Diamante, Oro, Billete, Ciruela, 7, Cara de troll (Trollface), Sandía.
Modo Trollface en juego Tragaperras
Modo Trollface en juego Tragaperras
  • El programa debe seleccionar al azar una imagen de esta lista tres veces y mostrar las tres imágenes.
  • Si ninguna de las palabras seleccionadas al azar coincide, el programa informará al usuario de que ha perdido 15 créditos.
  • Si dos de las imágenes coinciden, el programa informará al usuario que ha ganado $5.
  • Si tres de las imágenes coinciden, el programa informará al usuario que ha ganado $25.
Ganar en juevo Tragaperras con Java
Ganar en juevo Tragaperras con Java
  • El costo de 100 créditos es de $10. Cada vez que te quedes sin créditos, se mostrará un mensaje para comprar más, con el dinero disponible.
Comprar créditos para apostar
Comprar créditos para apostar
  • Cada vez que el usuario gana, aumenta el estado de una barra para desbloquear el menú de trucos (se necesitan 100 victorias). El menú de trucos incluye: “Modo siempre gana”, “Trollface”, y “Super Jackpot”.
Desbloquear menú de trucos para juego de Slots
Desbloquear menú de trucos para juego de Slots
  • Existe una opción independiendo del llenado de la barra: El botón “Sonido ON”, activa o desactiva el sonido de fondo.
  • El juego pregunta si el usuario desea comprar más créditos con dinero. Si es así, se repiten estos pasos. Si no, el programa muestra la cantidad total de dinero disponible en la máquina tragaperras, el saldo de la cuenta y la cantidad total ganada o perdida.
Sin saldo para apostar. Fin del juego
Sin saldo para apostar. Fin del juego

Código fuente

Los juegos de máquinas tragaperras son los más populares tanto en los casinos físicos como en los online. Aunque la mecánica de estos juegos parece sencilla en comparación con otros juegos de casino populares, crearlos puede ser un poco más difícil de lo que podrías haber imaginado.

Código fuente de juego Tragaperras Java
Al parece he tenido mucha suerte en este juego de tragaperras en Java.

A continuación, ofrecemos un ejemplo sobre el proceso de construcción y desarrollo de tu propio juego de máquinas tragaperras desde cero. Empecemos.

package slotMachineGUI;

import java.awt.*;
import javax.swing.*;
import javax.swing.LayoutStyle.ComponentPlacement;
import java.text.DecimalFormat;
import java.util.Random;
import java.util.ArrayList;
import javax.swing.border.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class SlotMachineGUI {

  private JButton btnCash, btnSpin;
  private JCheckBox cbAlwaysWin, cbSuperJackpot, cbTrollface;
  private JFrame frmFrame;
  private JLabel lblCredits, lblLost, lblMatchThree, lblMatchTwo, lblMoney, lblReel1, lblReel2, lblReel3, lblStatus, lblWon;
  private JPanel pnlReels, pnlReel1, pnlReel2, pnlReel3;
  private JProgressBar prgbarCheatUnlocker;
  private JSeparator sepCheats, sepStats, sepStats2, sepStatus;
  private JToggleButton tgglSound;
  private int credits = 100, boughtCredits = 100, bet = 15, matchThree, matchTwo, win, lost;
  private double payout = 25.0, creditBuyout = 10.0, funds;
  private int reel1 = 7, reel2 = 7, reel3 = 7; // starting values of the reels.
  private ArrayList<ImageIcon> images = new ArrayList<ImageIcon>();
  private DecimalFormat df = new DecimalFormat("0.00");

  public SlotMachineGUI(int credits, int boughtCredits, int bet, double payout, double creditBuyout, int reel1, int reel2, int reel3) {
    this.credits=credits;
    this.boughtCredits=boughtCredits;
    this.bet=bet;
    this.payout=payout;
    this.creditBuyout=creditBuyout;
    this.reel1=reel1;
    this.reel2=reel2;
    this.reel3=reel3;
    createForm();
    loadImages();
    addFields();
    addButtons();
    layoutFrame();
    layoutReels();
    layoutOther();
  }	
  
  public SlotMachineGUI() {	
    createForm();
    loadImages();
    addFields();
    addButtons();
    layoutFrame();
    layoutReels();
    layoutOther();
  }		

  /** Creates the JFrame and Panels. */
  private void createForm() {

    frmFrame = new JFrame();
    frmFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frmFrame.setTitle("Warner Slots");
    frmFrame.setResizable(false);
    frmFrame.setVisible(true);

    pnlReels = new JPanel();
    pnlReels.setBorder(BorderFactory.createEtchedBorder());

    pnlReel1 = new JPanel();
    pnlReel1.setBackground(new Color(255, 215, 0));
    pnlReel1.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));
    pnlReel2 = new JPanel();
    pnlReel2.setBackground(new Color(255, 216, 0));
    pnlReel2.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));
    pnlReel3 = new JPanel();
    pnlReel3.setBackground(new java.awt.Color(255, 215, 0));
    pnlReel3.setBorder(new SoftBevelBorder(BevelBorder.LOWERED));

  }

  /** Adds labels to the form. */
  private void addFields() {

    lblReel1 = new JLabel();
    lblReel2 = new JLabel();
    lblReel3 = new JLabel();

    sepStats = new JSeparator();
    lblMatchTwo = new JLabel();
    lblMatchTwo.setText("Dos Coincidencias: ");
    lblMatchThree = new JLabel();
    lblMatchThree.setText("Tres Coincidencias: ");
    lblWon = new JLabel();
    lblWon.setText("Ganado: ");

    sepStats2 = new JSeparator();
    sepStats2.setOrientation(SwingConstants.VERTICAL);
    lblCredits = new JLabel();
    lblCredits.setText("Créditos: "+credits);
    lblMoney = new JLabel();
    lblMoney.setText("Dinero: $"+df.format(funds));
    lblLost = new JLabel();
    lblLost.setText("Perdido: ");

    sepStatus = new JSeparator();
    lblStatus = new JLabel();
    lblStatus.setBackground(new Color(255, 255, 255));
    lblStatus.setFont(new Font("Arial", 1, 14));
    lblStatus.setHorizontalAlignment(SwingConstants.CENTER);
    lblStatus.setText("¡¡Bienvenido a WARNER SLOTS!! ©2021");

    sepCheats = new JSeparator();
    prgbarCheatUnlocker = new JProgressBar();
    prgbarCheatUnlocker.setToolTipText("Llena la barra para desbloquear el menú de trucos.");

    lblReel1.setIcon(images.get(reel1));
    lblReel2.setIcon(images.get(reel2));
    lblReel3.setIcon(images.get(reel3));

  }

  /** Adds buttons to the form. */
  private void addButtons() {

    btnSpin = new JButton();
    btnSpin.setBackground(new Color(50, 255, 50));
    btnSpin.setText("Girar");
    btnSpin.setToolTipText("¡Haz clic para hacer girar los carretes!");
    btnSpin.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
    btnSpin.setInheritsPopupMenu(true);
    btnSpin.setMaximumSize(new Dimension(200, 50));
    btnSpin.setMinimumSize(new Dimension(200, 50));
    btnSpin.addActionListener(new SpinHandler());

    btnCash = new JButton();
    btnCash.setBackground(new Color(255, 0, 0));
    btnCash.setText("Comprar Créditos");
    btnCash.setToolTipText("$"+df.format(bet)+" se convierte en "+boughtCredits+" créditos.");
    btnCash.setHorizontalTextPosition(SwingConstants.CENTER);
    btnCash.addActionListener(new BuyCreditsHandler());

    tgglSound = new JToggleButton();
    tgglSound.setSelected(false);
    tgglSound.setText("Sonido ON");
    tgglSound.addActionListener(new SoundHandler());

    cbAlwaysWin = new JCheckBox();
    cbAlwaysWin.setText("Modo Siempre Gana");
    cbAlwaysWin.setEnabled(false);
    cbAlwaysWin.addActionListener(new AlwaysWinHandler());

    cbTrollface = new JCheckBox();
    cbTrollface.setText("Trollface");
    cbTrollface.setEnabled(false);
    cbTrollface.addActionListener(new TrollfaceHandler());

    cbSuperJackpot = new JCheckBox();
    cbSuperJackpot.setText("Super Jackpot");
    cbSuperJackpot.setEnabled(false);
    cbSuperJackpot.addActionListener(new SuperPrizeHandler());

  }

  /** Lays out the frame. */
  private void layoutFrame() {

    GroupLayout frameLayout = new GroupLayout(frmFrame.getContentPane());
    frmFrame.getContentPane().setLayout(frameLayout);
    frameLayout.setHorizontalGroup(
        frameLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGap(0, 400, Short.MAX_VALUE)
        );
    frameLayout.setVerticalGroup(
        frameLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGap(0, 300, Short.MAX_VALUE)
        );
  }

  /** Lays out the panels and reels. */
  private void layoutReels() {

    GroupLayout pnlReelsLayout = new GroupLayout(pnlReels);
    pnlReels.setLayout(pnlReelsLayout);
    pnlReelsLayout.setHorizontalGroup(
        pnlReelsLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(pnlReelsLayout.createSequentialGroup()
            .addContainerGap()
            .addComponent(pnlReel1, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
            .addGap(18, 18, 18)
            .addComponent(pnlReel2, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
            .addGap(18, 18, 18)
            .addComponent(pnlReel3, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
            .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
    pnlReelsLayout.setVerticalGroup(
        pnlReelsLayout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(pnlReelsLayout.createSequentialGroup()
            .addContainerGap()
            .addGroup(pnlReelsLayout.createParallelGroup(GroupLayout.Alignment.TRAILING, false)
                .addComponent(pnlReel2, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(pnlReel1, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(pnlReel3, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

    GroupLayout pnlReel1Layout = new GroupLayout(pnlReel1);
    pnlReel1.setLayout(pnlReel1Layout);
    pnlReel1Layout.setHorizontalGroup(
        pnlReel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(pnlReel1Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(lblReel1)
            .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
    pnlReel1Layout.setVerticalGroup(
        pnlReel1Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(pnlReel1Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(lblReel1)
            .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

    GroupLayout pnlReel2Layout = new GroupLayout(pnlReel2);
    pnlReel2.setLayout(pnlReel2Layout);
    pnlReel2Layout.setHorizontalGroup(
        pnlReel2Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(pnlReel2Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(lblReel2)
            .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
    pnlReel2Layout.setVerticalGroup(
        pnlReel2Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(pnlReel2Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(lblReel2)
            .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

    GroupLayout pnlReel3Layout = new GroupLayout(pnlReel3);
    pnlReel3.setLayout(pnlReel3Layout);
    pnlReel3Layout.setHorizontalGroup(
        pnlReel3Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(pnlReel3Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(lblReel3)
            .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
    pnlReel3Layout.setVerticalGroup(
        pnlReel3Layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(pnlReel3Layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(lblReel3)
            .addContainerGap(GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

  }

  /** lays out the remaining labels, check boxes, progress bars, etc. */
  private void layoutOther() {

    GroupLayout layout = new GroupLayout(frmFrame.getContentPane());
    frmFrame.getContentPane().setLayout(layout);

    layout.setHorizontalGroup(
        layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false)
                        .addComponent(sepCheats)
                        .addComponent(prgbarCheatUnlocker, GroupLayout.DEFAULT_SIZE, 426, Short.MAX_VALUE))
                        .addGap(0, 0, Short.MAX_VALUE))
                        .addGroup(layout.createSequentialGroup()
                            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false)
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(cbAlwaysWin)
                                        .addGap(18, 18, 18)
                                        .addComponent(cbTrollface)
                                        .addGap(18, 18, 18)
                                        .addComponent(cbSuperJackpot)
                                        .addPreferredGap(ComponentPlacement.RELATED, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(tgglSound))
                                        .addComponent(btnSpin, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(pnlReels, GroupLayout.Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addComponent(sepStats, GroupLayout.Alignment.TRAILING)
                                        .addComponent(lblStatus, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                        .addGroup(layout.createSequentialGroup()
                                            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING, false)
                                                .addComponent(lblMatchTwo, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                .addComponent(lblWon, GroupLayout.Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                .addComponent(lblMatchThree, GroupLayout.DEFAULT_SIZE, 149, Short.MAX_VALUE))
                                                .addPreferredGap(ComponentPlacement.UNRELATED)
                                                .addComponent(sepStats2, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                                                .addPreferredGap(ComponentPlacement.UNRELATED)
                                                .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING, false)
                                                    .addComponent(lblLost, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                    .addComponent(lblCredits, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                                    .addComponent(lblMoney, GroupLayout.DEFAULT_SIZE, 154, Short.MAX_VALUE))
                                                    .addGap(0, 0, Short.MAX_VALUE)))
                                                    .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
                                                        .addComponent(btnCash)
                                                        .addComponent(sepStatus, GroupLayout.PREFERRED_SIZE, 426, GroupLayout.PREFERRED_SIZE)))
                                                        .addContainerGap())))
        );

    layout.setVerticalGroup(
        layout.createParallelGroup(GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addComponent(pnlReels, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(ComponentPlacement.RELATED)
            .addComponent(btnSpin, GroupLayout.PREFERRED_SIZE, 56, GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(ComponentPlacement.UNRELATED)
            .addComponent(sepStats, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(ComponentPlacement.UNRELATED)
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(lblWon, GroupLayout.PREFERRED_SIZE, 19, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(lblMatchTwo, GroupLayout.PREFERRED_SIZE, 19, GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(ComponentPlacement.RELATED)
                    .addComponent(lblMatchThree, GroupLayout.DEFAULT_SIZE, 25, Short.MAX_VALUE))
                    .addComponent(sepStats2)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(lblLost, GroupLayout.PREFERRED_SIZE, 19, GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(ComponentPlacement.RELATED)
                        .addComponent(lblCredits, GroupLayout.PREFERRED_SIZE, 19, GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(ComponentPlacement.RELATED)
                        .addComponent(lblMoney, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addComponent(btnCash, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                        .addPreferredGap(ComponentPlacement.UNRELATED)
                        .addComponent(sepStatus, GroupLayout.PREFERRED_SIZE, 2, GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(ComponentPlacement.UNRELATED)
                        .addComponent(lblStatus, GroupLayout.PREFERRED_SIZE, 30, GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(ComponentPlacement.UNRELATED)
                        .addComponent(sepCheats, GroupLayout.PREFERRED_SIZE, 5, GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(ComponentPlacement.RELATED)
                        .addComponent(prgbarCheatUnlocker, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                            .addComponent(cbAlwaysWin)
                            .addComponent(cbTrollface)
                            .addComponent(cbSuperJackpot)
                            .addComponent(tgglSound))
                            .addContainerGap())
        );

    frmFrame.pack();

  }

  /** Performs action when Buy Credits button is clicked. */
  class BuyCreditsHandler implements ActionListener {
    public void actionPerformed(ActionEvent event) {
      buyCredits();
    }
  }

  /** if the player has enough funds credits are added. */
  public void buyCredits() {
    if (funds >= creditBuyout) {
      funds -= creditBuyout;
      lblMoney.setText("Dinero: $"+df.format(funds));
      credits += boughtCredits;
      lblCredits.setText("Créditos: "+credits);
      lblStatus.setText("+"+boughtCredits+" ¡créditos comprados! -$"+df.format(creditBuyout));
    } else {
      lblStatus.setText("¡No hay dinero suficiente para comprar créditos!");
    }
    buyCreditsCheck();
  }

  /** if user has enough funds to buy credits changes buttons colour to alert user. */
  public void buyCreditsCheck() {
    if (funds < bet) {
      btnCash.setBackground(new java.awt.Color(255, 0, 0));
    } else {
      btnCash.setBackground(new java.awt.Color(50, 255, 50));
    }
  }

  /** Performs action when Spin button is clicked. */
  class SpinHandler implements ActionListener {
    public void actionPerformed(ActionEvent event) {
      if (funds < creditBuyout && credits < bet) {
        lblStatus.setText("<html><a href='https://www.slotjava.es/'>www.slotjava.es</a></html>");
      } else if ((credits - bet) >= 0) {
        pnlReel1.setBackground(new java.awt.Color(255, 215, 0));
        pnlReel2.setBackground(new java.awt.Color(255, 215, 0));
        pnlReel3.setBackground(new java.awt.Color(255, 215, 0));
        genReelNumbers();
        matchCheck();
      } else {
        lblStatus.setText("La apuesta es de "+bet+" créditos, compra más con $!");
      }
      buyCreditsCheck();
    }
  }	

  /** Generates the 3 reel numbers. */
  public void genReelNumbers() {
    Random rand = new Random();
    if (cbAlwaysWin.isSelected() == true) { // If the Always win cheat mode is enabled.
      int winType = rand.nextInt(4); // generates number between 0-3 to determine the type of win
      reel1 = rand.nextInt(images.size());
      if (winType == 0) { 		// winType = 0 - Reels 1, 2 and 3 will all match.
        reel2 = reel1;
        reel3 = reel1;
      } else if (winType == 1) { 	// winType = 1 - Reels 1 and 2 will match.
        reel2 = reel1;
      } else if (winType == 2) { 	// winType = 2 - Reels 1 and 3 will match.
        reel3 = reel1;
      } else {					// winType = 3 - Reels 2 and 3 will match.
        if (reel1 >= 0 ) { 
          reel2 = reel1 + 1;
          reel3 = reel1 + 1;
        } if (reel1 == images.size()-1) {
          reel2 = reel1 - 1;
          reel3 = reel1 - 1;
        }
      }
    } else { // If the Always win cheat mode is disabled play a normal game.
      reel1 = rand.nextInt(images.size());
      reel2 = rand.nextInt(images.size());
      reel3 = rand.nextInt(images.size());
    }
    setReelIcon(reel1, reel2, reel3); // Set the reel image
  }

  /** Sets the reels icon based on loaded image in images ArrayList. */
  public void setReelIcon(int ico1, int ico2, int ico3) {
    lblReel1.setIcon(images.get(ico1)); // icon = the ArrayList index = random reel number
    lblReel2.setIcon(images.get(ico2));
    lblReel3.setIcon(images.get(ico3));
  }

  /** Checks for number matches and adjusts score depending on result. */
  public void matchCheck() {
    if (reel1 == reel2 && reel2 == reel3) {
      lblStatus.setText("Has hecho coincidir TRES símbolos ("+images.get(reel1).getDescription()+")! +$"+df.format(getPrize(payout))+"!");
      lblMatchThree.setText("Tres Coincidencias: "+matchThree());
      pnlReel1.setBackground(new java.awt.Color(255, 0, 0)); // Highlights matched icons.
      pnlReel2.setBackground(new java.awt.Color(255, 0, 0));
      pnlReel3.setBackground(new java.awt.Color(255, 0, 0));	
    } else if (reel1 == reel2 || reel1 == reel3) {
      lblStatus.setText("Has hecho coincidir DOS símbolos ("+images.get(reel1).getDescription()+")! +$"+df.format(getPrize(payout))+"!");
      lblMatchTwo.setText("Dos Coincidencias: "+matchTwo());
      if (reel1 == reel2) {
        pnlReel1.setBackground(new java.awt.Color(255, 0, 0)); // Highlights matched icons.
        pnlReel2.setBackground(new java.awt.Color(255, 0, 0));
      } else if (reel1 == reel3){
        pnlReel1.setBackground(new java.awt.Color(255, 0, 0)); // Highlights matched icons.
        pnlReel3.setBackground(new java.awt.Color(255, 0, 0));
      }
    } else if (reel2 == reel3) {
      lblStatus.setText("Has hecho coincidir DOS símbolos ("+images.get(reel2).getDescription()+")! +$"+df.format(getPrize(payout))+"!");
      lblMatchTwo.setText("Dos Coincidencias: "+matchTwo());
      pnlReel2.setBackground(new java.awt.Color(255, 0, 0)); // Highlights matched icons.
      pnlReel3.setBackground(new java.awt.Color(255, 0, 0));
    } else {
      lblStatus.setText("Lo siento, no has coincidido con ningún símbolo. -"+bet+" créditos!");
      lblLost.setText("Perdidos: "+lose());
    }
    lblCredits.setText("Créditos: "+(credits -= bet)); // deduct bet amount from available credits.
    lblMoney.setText("Dinero: $"+df.format((funds += getPrize(payout)))); // If there is a win add amount to cash pot.
    lblWon.setText("Ganados: "+win()); // increment win amount.
  }

  /** sets progress bar equal to the current win count. if bar is full it unlocks cheat menu */
  public void prgBarCheck() {
    if (prgbarCheatUnlocker.getValue() <= 99) {
      prgbarCheatUnlocker.setValue(win);
    } else if (prgbarCheatUnlocker.getValue() == 100) { // after 100 wins unlock the cheats.
      prgbarCheatUnlocker.setValue(100);
      lblStatus.setText("¡100 victorias! Enhorabuena, has desbloqueado el menú de trucos.");
      cbTrollface.setEnabled(true);
      cbSuperJackpot.setEnabled(true);
      cbAlwaysWin.setEnabled(true);
    }
  }

  /** calculates prize to be awarded for win based on number of matches and cheats. */
  public double getPrize(double prize) {
    if (reel1 == reel2 && reel2 == reel3) {
      if (cbSuperJackpot.isSelected() == true) {
        prize *= 100; // if cheating and all are matched return the full pay out x100.
      } else {
        prize = payout; // if all are matched return the full pay out.
      }
    } else if (reel1 == reel2 || reel1 == reel3 || reel2 == reel3) {
      if (cbSuperJackpot.isSelected() == true) {
        prize *= 50; // if cheating and two are matched return the pay out x50.
      } else {
        prize = payout / 5; // if two are matched return 1/5th of the pay out.
      }
    } else {
      prize = 0; // If no win return no prize.
    }
    return prize;
  }

  /** Performs action when Super Jack pot check box is clicked. */
  class SuperPrizeHandler implements ActionListener{
    public void actionPerformed(ActionEvent e) {
      if (cbSuperJackpot.isSelected() == true) {
        lblStatus.setText("¡Modo de Superpremio Habilitado! El $ ganado es ahora x100!");
      } 
      if (cbSuperJackpot.isSelected() == false) {
        lblStatus.setText("¡Modo de superpremio DESACTIVADO! :'(");
      }
    }
  }

  /** Performs action when Troll face check box is clicked. */
  class AlwaysWinHandler implements ActionListener{
    public void actionPerformed(ActionEvent e) {
      if (cbAlwaysWin.isSelected() == true) {
        lblStatus.setText("¡Modo Siempre Ganar Habilitado! ¡7-7-7's aquí vamos!");
      } 
      if (cbAlwaysWin.isSelected() == false) {
        lblStatus.setText("¡Modo de ganar siempre DESACTIVADO! :'(");
      }
    }
  }

  /** Performs action when Troll face check box is clicked. */
  class TrollfaceHandler implements ActionListener{
    public void actionPerformed(ActionEvent e) {
      if (cbTrollface.isSelected() == true && images.get(images.size()-1) != createImageIcon("images/Trollface.png", "Trollface")) {
        images.add(createImageIcon("images/Trollface.png", "Trollface")); // adds a bonus image to the images ArrayList.
        lblStatus.setText("¡Modo Trollface ACTIVADO! Trolololololol!");
      } 
      if (cbTrollface.isSelected() == false && images.get(images.size()-1) != createImageIcon("images/Trollface.png", "Trollface")) {
        images.remove(images.size()-1);  // removes the bonus image (or last one added to the ArrayList) from the images ArrayList.
        lblStatus.setText("¡Modo Trollface DESACTIVADO! :'(");
      }
    }
  }

  /** Performs action when sound toggle button is clicked. 
   * 	NOT IMPLEMENTED
   */
  class SoundHandler implements ActionListener{
    public void actionPerformed(ActionEvent e) {
      if (tgglSound.isSelected() == false) {
        tgglSound.setText("Sonido ON");
        lblStatus.setText("Se han HABILITADO los efectos de sonido.");
        // allowed to play sounds				
      } else {
        tgglSound.setText("Sonido OFF");
        lblStatus.setText("Los efectos de sonido se han DESACTIVADO.");
        // disable sounds
      }
    }
  }

  /** Loads ImageIcons into the images ArrayList. 
   *	The difficulty is determined by the number of images present in the ArrayList:
   *		•	Add images here to make game more difficult. 
   *		•	Remove images here to make game easier. 
   */
  public void loadImages() {
    images.add(createImageIcon("images/Banana.png", "Banana"));
    images.add(createImageIcon("images/Bar.png", "Bar"));
    images.add(createImageIcon("images/Bell.png", "Bell"));
    images.add(createImageIcon("images/Cherry.png", "Cherry"));
    images.add(createImageIcon("images/Clover.png", "Clover"));
    images.add(createImageIcon("images/Diamond.png", "Diamond"));
    images.add(createImageIcon("images/Plum.png", "Plum"));
    images.add(createImageIcon("images/Seven.png", "Seven"));
    images.add(createImageIcon("images/Watermelon.png", "Watermelon"));
  }

  /** Create a new ImageIcon, unless the URL is not found. */
  public ImageIcon createImageIcon(String path, String description) {
    java.net.URL imgURL = getClass().getResource(path);
    if (imgURL != null) {
      return new ImageIcon(imgURL, description);
    } else {
      System.err.println("Couldn't find file: " + path);
      return null;
    }
  }
  
  /** Increments matchThree by 1 and returns value. */
  public int matchThree() {
    matchThree++;
    return matchThree;
  }

  /** Increments matchTwo by 1 and returns value. */
  public int matchTwo() {
    matchTwo++;
    return matchTwo;
  }

  /** Increments lost by 1 and returns value. */
  public int lose() {
    lost++;
    return lost;
  }

  /** Increments win by 1, increases progress bar and returns value. */
  public int win() {
    win = matchThree + matchTwo;
    prgBarCheck(); // Increments the progress bar to unlock cheat menu.
    return win;
  }

  public static void main(String args[]) {

    try {
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
        if ("Nimbus".equals(info.getName())) {
          javax.swing.UIManager.setLookAndFeel(info.getClassName());
          break;
        }
      }
    } catch (ClassNotFoundException ex) {
      java.util.logging.Logger.getLogger(SlotMachineGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (InstantiationException ex) {
      java.util.logging.Logger.getLogger(SlotMachineGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (IllegalAccessException ex) {
      java.util.logging.Logger.getLogger(SlotMachineGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    } catch (javax.swing.UnsupportedLookAndFeelException ex) {
      java.util.logging.Logger.getLogger(SlotMachineGUI.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
    }

    java.awt.EventQueue.invokeLater(new Runnable() {

      public void run() {
        new SlotMachineGUI();
      }
    });		

  }

}

El trabajo es de Mike Warner, un usuario de YouTube, que desarrolló el código anterior. Este código fuente incluye las imágenes que utilizó en la creación del juego.

Palabras Finales

Las tragaperras tienen la particularidad de que deben ser programadas en un lenguaje determinado. El lenguaje Java es el más común y el más fácil de usar ya que permite la creación de juegos y aplicaciones en línea. Java es un lenguaje de programación que es muy complejo e implica muchos temas diferentes. La programación en Java puede utilizarse para crear muchos tipos de juegos diferentes, como juegos de cartas, videojuegos y los populares juegos interactivos de Internet.

Las máquinas tragaperras son el juego más popular en los casinos modernos. Si nunca has visto una, una máquina tragaperras se parece a un juego de arcade que tiene una palanca en su lado. Por un módico precio puedes tirar de la palanca y la máquina generará una combinación aleatoria de tres símbolos. Si aparece la combinación correcta, puedes ganar un premio, incluso el premio mayor. ¡Disfruta del código fuente y el juego!

Sobre el Autor:

Hey hola! Yo soy Alex Walton y tengo el placer de compartir conocimientos hacía ti sobre el tema de Programación en Java, desde cero, Online y Gratis.

Deja una Respuesta

*

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.