Cree un juego de expresión de cálculo en Java

Java es un lenguaje de programación orientado a objetos y basado en clases y está diseñado para tener la menor cantidad posible de dependencias de implementación. Un lenguaje de programación de propósito general hecho para que los desarrolladores escriban una vez y se ejecuten en cualquier lugar que esté compilado. El código Java puede ejecutarse en todas las plataformas que admiten Java. Las aplicaciones de Java se compilan en un código de bytes que se puede ejecutar en cualquier máquina virtual de Java. La sintaxis de Java es similar a c/c++. 

¿Qué vamos a construir en este artículo? 

¿Qué es 2+3? ¡Sí, 5 es correcto! ¿Qué pasa con 5*8? 40, cierto !! ¡¿Tomó tiempo calcularlo?! Averigüemos cuántas preguntas simples de este tipo pueden hacer usted y sus amigos en solo 60 segundos. ¡¡El juego nos permitirá averiguar cuántas preguntas seremos capaces de hacer correctamente en tan solo 60 segundos!! Para esto, crearemos un «Juego de cálculo de expresión» SIMPLE e interactivo basado en el tiempo en Java utilizando los componentes Java swing . A continuación se muestra un video de muestra para tener una idea de lo que vamos a hacer en este artículo.

Entonces los resultados del aprendizaje serán:

  1. Creando una GUI interactiva para nuestro juego
  2. Integración de dos JFrame
  3. Creación de un temporizador viable
  4. Desarrollo de un estilo para gestionar componentes

El proyecto contendrá 3 clases java: 

  1. Principal.java
  2. Inicio.java
  3. Reproducir.java

Diseñaremos dos páginas o JFrames como lo llamamos. 1st JFrame dará la opción de JUGAR o SALIR del juego. En caso de que el usuario elija jugar, el segundo JFrame contendrá el juego en el que el jugador debe responder preguntas basadas en expresiones matemáticas máximas en 60 segundos.

Implementación paso a paso

Paso 1. Comenzaremos primero importando todas las clases que necesitaremos para este juego. Aprenderemos cómo serán útiles a medida que avancemos en este proyecto. 

Java

// File name is Main.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;
import java.util.Random;

Paso 2. Definiremos una clase Main que llamará a la clase Home Constructor.

Java

// File name is Main.java
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;
import java.util.Random;
import javax.swing.*;
  
public class Main {
    public static void main(String[] arg)
    {
        // to call the constructor of class Home
        Home frame = new Home();
        // Sets the title for this frame "HOME"
        frame.setTitle("HOME");
        // Component will be displayed on the screen
        frame.setVisible(true);
        // position and size of the frame
        // using setBounds(x,y,width,height)
        frame.setBounds(10, 10, 370, 600);
        // application exits on close window
        // event from the operating system
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        // user cannot re-size the frame
        frame.setResizable(false);
    }
}

Paso 3. Ahora definiremos nuestra clase Inicio y prepararemos un estilo para ella, de modo que el seguimiento de los componentes no haga que nuestra cabeza se vuelva loca. Además, es hora de aclarar algunos conceptos!! Heredaremos la clase JFrame, que es un componente swing (parte del paquete javax.swing). Para definir qué se debe hacer cuando un usuario realiza ciertas operaciones, implementaremos la interfaz ActionListener. ActionListener (que se encuentra en el paquete java.awt.event) tiene solo un método actionPerformed(ActionEvent) que se llama cuando el usuario realiza alguna acción.

Java

// File name is Main.java
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;
import java.util.Random;
import javax.swing.*;
  
class Home extends JFrame implements ActionListener {
    Home()
    {
        setLayoutManager();
        setLocationAndSize();
        addComponentsToContainer();
        addActionEvent();
    }
    public void setLayoutManager() {}
    public void setLocationAndSize() {}
    public void addComponentsToContainer() {}
    public void addActionEvent() {}
    @Override public void actionPerformed(ActionEvent e) {}
}
  
public class Main {
    public static void main(String[] arg)
    {
        // to call the constructor of class Home
        Home frame = new Home();
        // Sets the title for this frame "HOME"
        frame.setTitle("HOME");
        // Component will be displayed on the screen
        frame.setVisible(true);
        // position and size of the frame
        // using setBounds(x,y,width,height)
        frame.setBounds(10, 10, 370, 600);
        // application exits on close window
        // event from the operating system
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        // user cannot re-size the frame
        frame.setResizable(false);
    }
}

Paso 4. Definiremos los componentes y los agregaremos al marco Inicio. 

Java

// File name is Main.java
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;
import java.util.Random;
import javax.swing.*;
  
class Home extends JFrame implements ActionListener {
  
    Container container = getContentPane();
    JLabel home = new JLabel("HOME", JLabel.CENTER);
    JButton playbutton = new JButton("PLAY");
    JButton exitbutton = new JButton("EXIT");
  
    Home()
    {
        setLayoutManager();
        setLocationAndSize();
        addComponentsToContainer();
        addActionEvent();
    }
    public void setLayoutManager()
    {
        // Content panes use
        // BorderLayout by default
        container.setLayout(null);
    }
    public void setLocationAndSize()
    {
        // position and size of the components
        // using setBounds(x,y,width,height)
        home.setBounds(125, 20, 125, 30);
        // to display content or BackGround
        // behind a given component
        home.setOpaque(true);
        home.setBackground(Color.BLACK);
        home.setForeground(Color.WHITE);
        playbutton.setBounds(75, 200, 225, 30);
        exitbutton.setBounds(75, 250, 225, 30);
    }
    public void addComponentsToContainer()
    {
        container.add(home);
        container.add(playbutton);
        container.add(exitbutton);
    }
    public void addActionEvent()
    {
        // listen for changes on the object
        playbutton.addActionListener(this);
        exitbutton.addActionListener(this);
    }
    @Override public void actionPerformed(ActionEvent e) {}
}
  
public class Main {
    public static void main(String[] arg)
    {
        // to call the constructor of class Home
        Home frame = new Home();
        // Sets the title for this frame "HOME"
        frame.setTitle("HOME");
        // Component will be displayed on the screen
        frame.setVisible(true);
        // position and size of the frame
        // using setBounds(x,y,width,height)
        frame.setBounds(10, 10, 370, 600);
        // application exits on close window
        // event from the operating system
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        // user cannot re-size the frame
        frame.setResizable(false);
    }
}

Paso 5. Tiempo para agregar funcionalidades a los botones.

Java

// File name is Main.java
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;
import java.util.Random;
import javax.swing.*;
  
class Home extends JFrame implements ActionListener {
  
    Container container = getContentPane();
    JLabel home = new JLabel("HOME", JLabel.CENTER);
    JButton playbutton = new JButton("PLAY");
    JButton exitbutton = new JButton("EXIT");
  
    Home()
    {
        setLayoutManager();
        setLocationAndSize();
        addComponentsToContainer();
        addActionEvent();
    }
    public void setLayoutManager()
    {
        // Content panes use BorderLayout by default
        container.setLayout(null);
    }
    public void setLocationAndSize()
    {
        // position and size of the components
        // using setBounds(x,y,width,height)
        home.setBounds(125, 20, 125, 30);
        // to display content or BackGround
        // behind a given component
        home.setOpaque(true);
        home.setBackground(Color.BLACK);
        home.setForeground(Color.WHITE);
        playbutton.setBounds(75, 200, 225, 30);
        exitbutton.setBounds(75, 250, 225, 30);
    }
    public void addComponentsToContainer()
    {
        container.add(home);
        container.add(playbutton);
        container.add(exitbutton);
    }
    public void addActionEvent()
    {
        // listen for changes on the object
        playbutton.addActionListener(this);
        exitbutton.addActionListener(this);
    }
    @Override public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == playbutton) {
            // dispose() method clear
            // resources at each frame
            dispose();
            // to call the constructor of class Play
            Play frame = new Play();
            // Sets the title for this frame "PLAY"
            frame.setTitle("PLAY");
            // Component will be displayed on the screen
            frame.setVisible(true);
            // position and size of the frame using
            // setBounds(x,y,width,height)
            frame.setBounds(10, 10, 370, 600);
            // application exits on close window
            // event from the operating system
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            // user cannot re-size the frame
            frame.setResizable(false);
        }
        if (e.getSource() == exitbutton) {
            // asks for confirmation from the user to exit
            // or not
            int option = JOptionPane.showConfirmDialog(
                this, "Do You Really Want To Quit",
                "Thank you", JOptionPane.YES_NO_OPTION,
                JOptionPane.PLAIN_MESSAGE);
            if (option == JOptionPane.YES_OPTION) {
                dispose();
            }
        }
    }
}
  
public class Main {
    public static void main(String[] arg)
    {
        // to call the constructor of class Home
        Home frame = new Home();
        // Sets the title for this frame "HOME"
        frame.setTitle("HOME");
        // Component will be displayed on the screen
        frame.setVisible(true);
        // position and size of the frame
        // using setBounds(x,y,width,height)
        frame.setBounds(10, 10, 370, 600);
        // application exits on close window
        // event from the operating system
        frame.setDefaultCloseOperation(
            JFrame.DISPOSE_ON_CLOSE);
        // user cannot re-size the frame
        frame.setResizable(false);
    }
}

Paso 6. Veamos dos funciones de utilidad que se utilizarán para nuestro proyecto. Calcular función para generar expresión matemática. Aquí estamos generando dos números aleatorios usando la clase importada import java.util.Random en el rango dado.

Java

int Calculate(){
        int num1 = new Random().nextInt(11); // 0 to 10
        int num2 = new Random().nextInt(11) + 1; // 1 to 11
  
        String operator = "+-/*%";
        int random_operator = new Random().nextInt(5);
  
        questiontext.setText("(" + num1 + ") " + operator.charAt(random_operator) + " (" + num2 + ")");
  
        return switch (operator.charAt(random_operator)) {
            case ('+') -> num1 + num2;
            case ('-') -> num1 - num2;
            case ('*') -> num1 * num2;
            case ('/') -> num1 / num2;
            case ('%') -> num1 % num2;
            default -> 0;
        };
    }

Función de puntuación para mostrar la puntuación actualizada del jugador.

Java

void Score(){
   score += 1;
   presentscoretext.setText(" " +score + " ");
}

Paso 7. Ahora definiremos el esqueleto de la clase Play. 

Aquí estamos solicitando el enfoque de nuestro objeto JFrame en el campo de texto usando WindowActionListener. Además, estamos creando un TEMPORIZADOR de 60 segundos para que no se acepte ninguna entrada justo después de un retraso de 60 segundos y también esto asegurará que no se tomen más de 60 entradas (en caso de que un usuario siga presionando la misma entrada muchas veces) . En la práctica, el temporizador se ejecuta después de un retraso de 1000 milisegundos esperando la entrada del usuario y es por eso que estamos rodeando el ActionEvent para intentar capturar bloques en los casos en que el usuario no proporciona entrada para ese segundo en particular.

Java

// File name is Main.java
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;
import java.util.Random;
import javax.swing.*;
  
class Game extends JFrame implements ActionListener {
  
    Container container = getContentPane();
  
    JLabel questionlabel = new JLabel("QUESTION : ");
    JTextField questiontext = new JTextField();
    JLabel answerlabel = new JLabel("ANSWER : ");
    JTextField answertext = new JTextField();
    JLabel presentscorelabel
        = new JLabel("PRESENT SCORE : ");
    JTextField presentscoretext = new JTextField();
  
    int result = 0;
    int score = -1;
    Timer gametimer;
    // GAME TIMER in seconds
    int start = 60;
  
    Game()
    {
        setLayoutManager();
        setLocationAndSize();
        addComponentsToContainer();
        addActionEvent();
        result = Calculate();
        Score();
        setTimer();
    }
    public void setLayoutManager()
    {
        container.setLayout(null);
    }
    public void setLocationAndSize()
    {
        questionlabel.setBounds(100, 100, 150, 30);
        questiontext.setBounds(100, 140, 150, 30);
        answerlabel.setBounds(100, 200, 150, 30);
        answertext.setBounds(100, 240, 150, 30);
        presentscorelabel.setBounds(100, 290, 150, 30);
        presentscoretext.setBounds(100, 330, 150, 30);
    }
    public void addComponentsToContainer()
    {
        container.add(questionlabel);
        container.add(questiontext);
        container.add(answerlabel);
        container.add(answertext);
        container.add(presentscorelabel);
        container.add(presentscoretext);
    }
    public void addActionEvent()
    {
        questiontext.setEditable(false);
        presentscoretext.setEditable(false);
        answertext.addActionListener(this);
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowOpened(WindowEvent evt)
            {
                super.windowOpened(evt);
                answertext.requestFocus();
            }
        });
    }
    public void setTimer()
    {
        gametimer = new Timer(1000, this);
        gametimer.start();
    }
    @Override public void actionPerformed(ActionEvent e1) {}
}
  
class Home extends JFrame implements ActionListener {
  
    Container container = getContentPane();
    JLabel home = new JLabel("HOME", JLabel.CENTER);
    JButton playbutton = new JButton("PLAY");
    JButton exitbutton = new JButton("EXIT");
  
    Home()
    {
        setLayoutManager();
        setLocationAndSize();
        addComponentsToContainer();
        addActionEvent();
    }
    public void setLayoutManager()
    {
        // Content panes use
        // BorderLayout by default
        container.setLayout(null);
    }
    public void setLocationAndSize()
    {
        // position and size of the components
        // using setBounds(x,y,width,height)
        home.setBounds(125, 20, 125, 30);
        // to display content or BackGround
        // behind a given component
        home.setOpaque(true);
        home.setBackground(Color.BLACK);
        home.setForeground(Color.WHITE);
        playbutton.setBounds(75, 200, 225, 30);
        exitbutton.setBounds(75, 250, 225, 30);
    }
    public void addComponentsToContainer()
    {
        container.add(home);
        container.add(playbutton);
        container.add(exitbutton);
    }
    public void addActionEvent()
    {
        // listen for changes on the object
        playbutton.addActionListener(this);
        exitbutton.addActionListener(this);
    }
    @Override public void actionPerformed(ActionEvent e)
    {
        if (e.getSource() == playbutton) {
            // dispose() method clear resources at each
            // frame
            dispose();
            // to call the constructor of class Play
            Game frame = new Game();
            // Sets the title for this frame "PLAY"
            frame.setTitle("PLAY");
            // Component will be displayed on the screen
            frame.setVisible(true);
            // position and size of the frame
            // using setBounds(x,y,width,height)
            frame.setBounds(10, 10, 370, 600);
            // application exits on close window
            // event from the operating system
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            // user cannot re-size the frame
            frame.setResizable(false);
        }
        if (e.getSource() == exitbutton) {
            // asks for confirmation from the user to exit
            // or not
            int option = JOptionPane.showConfirmDialog(
                this, "Do You Really Want To Quit",
                "Thank you", JOptionPane.YES_NO_OPTION,
                JOptionPane.PLAIN_MESSAGE);
            if (option == JOptionPane.YES_OPTION) {
                dispose();
            }
        }
    }
}
  
public class Main {
    public static void main(String[] arg)
    {
        // to call the constructor of class Home
        Home frame = new Home();
        // Sets the title for this frame "HOME"
        frame.setTitle("HOME");
        // Component will be displayed on the screen
        frame.setVisible(true);
        // position and size of the frame
        // using setBounds(x,y,width,height)
        frame.setBounds(10, 10, 370, 600);
        // application exits on close window
        // event from the operating system
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        // user cannot re-size the frame
        frame.setResizable(false);
    }
}

Paso 8. Ahora estamos en la última etapa en la que agregamos las utilidades a nuestro código fuente y también agregamos dos mensajes para que el usuario pueda ver la puntuación a medida que transcurren 60 segundos y pedirle que vuelva a jugar. A continuación se muestra el código fuente de trabajo para este juego.

Java

// File name is Main.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Random;
  
class Game extends JFrame implements ActionListener{
    
    Container container = getContentPane();
  
    JLabel questionlabel = new JLabel("QUESTION : ");
    JTextField questiontext = new JTextField();
    JLabel answerlabel = new JLabel("ANSWER : ");
    JTextField answertext = new JTextField();
    JLabel presentscorelabel = new JLabel("PRESENT SCORE : ");
    JTextField presentscoretext = new JTextField();
  
    int result = 0;
    int score = -1;
    Timer gametimer;
    // GAME TIMER in seconds
    int start = 60; 
  
    Game(){
        setLayoutManager();
        setLocationAndSize();
        addComponentsToContainer();
        addActionEvent();
        result = Calculate();
        Score();
        setTimer();
    }
    public void setLayoutManager() {
        container.setLayout(null);
    }
    public void setLocationAndSize() {
        questionlabel.setBounds(100, 100, 150, 30);
        questiontext.setBounds(100, 140, 150, 30);
        answerlabel.setBounds(100, 200, 150, 30);
        answertext.setBounds(100, 240, 150, 30);
        presentscorelabel.setBounds(100, 290, 150, 30);
        presentscoretext.setBounds(100, 330, 150, 30);
    }
    public void addComponentsToContainer() {
        container.add(questionlabel);
        container.add(questiontext);
        container.add(answerlabel);
        container.add( answertext);
        container.add(presentscorelabel);
        container.add( presentscoretext);
    }
    public void addActionEvent() {
        questiontext.setEditable(false);
        presentscoretext.setEditable(false);
        answertext.addActionListener(this);
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowOpened(WindowEvent evt) {
                super.windowOpened(evt);
                answertext.requestFocus();
            }
        });
    }
    public void setTimer(){
        gametimer = new Timer(1000,this);
        gametimer.start();
    }
    @Override
    public void actionPerformed(ActionEvent e1) {
        start -= 1;
        if(start >= 0){
            try{
                String s = e1.getActionCommand();
                if(result == Integer.parseInt(s)){
                    Score();
                }
                result = Calculate();
                answertext.setText(null);
            }
            catch(Exception e3){
  
            }
        }else{
            gametimer.stop();
            JOptionPane.showMessageDialog(this,"TIME IS UP. YOUR SCORE IS : " + score ,"SCORE",JOptionPane.PLAIN_MESSAGE);
            int option = JOptionPane.showConfirmDialog(this,"DO YOU  WANT TO PLAY AGAIN ?","PLAY AGAIN SCORE : " + score,JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE);
            if(option == JOptionPane.YES_OPTION){
                dispose();
                Game frame = new Game();
                frame.setTitle("PLAY");
                frame.setVisible(true);
                frame.setBounds(10,10,370,600);
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.setResizable(false);
            }
            else{
                dispose();
                Home frame = new Home();
                frame.setTitle("HOME");
                frame.setVisible(true);
                frame.setBounds(10,10,370,600);
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                frame.setResizable(false);
            }
        }
    }
  
    int Calculate(){
        int num1 = new Random().nextInt(11); // 1 to 10
        int num2 = new Random().nextInt(11) + 1; // 0 to 10
  
        String operator = "+-/*%";
        int random_operator = new Random().nextInt(5);
  
        questiontext.setText("(" + num1 + ") " + operator.charAt(random_operator) + " (" + num2 + ")");
  
        return switch (operator.charAt(random_operator)) {
            case ('+') -> num1 + num2;
            case ('-') -> num1 - num2;
            case ('*') -> num1 * num2;
            case ('/') -> num1 / num2;
            case ('%') -> num1 % num2;
            default -> 0;
        };
    }
  
    void Score(){
        score += 1;
        presentscoretext.setText(" " +score + " ");
    }
}
  
class Home extends JFrame implements ActionListener{
  
    Container container = getContentPane();
    JLabel home = new JLabel("HOME",JLabel.CENTER);
    JButton playbutton = new JButton("PLAY");
    JButton exitbutton = new JButton("EXIT");
  
    Home(){
        setLayoutManager();
        setLocationAndSize();
        addComponentsToContainer();
        addActionEvent();
    }
    public void setLayoutManager(){
        // Content panes use 
        // BorderLayout by default
        container.setLayout(null);
    }
    public void setLocationAndSize(){
        // position and size of the components
        // using setBounds(x,y,width,height)
        home.setBounds(125,20,125,30);
        // to display content or BackGround 
        // behind a given component
        home.setOpaque(true);
        home.setBackground(Color.BLACK);
        home.setForeground(Color.WHITE);
        playbutton.setBounds(75,200,225,30);
        exitbutton.setBounds(75,250,225,30);
    }
    public void addComponentsToContainer(){
        container.add(home);
        container.add(playbutton);
        container.add(exitbutton);
    }
    public void addActionEvent(){
        // listen for changes on the object
        playbutton.addActionListener(this);
        exitbutton.addActionListener(this);
    }
    @Override
    public void actionPerformed(ActionEvent e){
        if(e.getSource() == playbutton){
            // dispose() method clear
              // resources at each frame
            dispose();
            // to call the constructor of class Play
            Game frame = new Game();
            // Sets the title for this frame "PLAY"
            frame.setTitle("PLAY");
            // Component will be displayed on the screen
            frame.setVisible(true);
            // position and size of the frame 
            // using setBounds(x,y,width,height)
            frame.setBounds(10,10,370,600);
            // application exits on close window 
            // event from the operating system
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            // user cannot re-size the frame
            frame.setResizable(false);
        }
        if(e.getSource() == exitbutton){
            // asks for confirmation from the user to exit or not
            int option = JOptionPane.showConfirmDialog(this,"Do You Really Want To Quit","Thank you", JOptionPane.YES_NO_OPTION,JOptionPane.PLAIN_MESSAGE);
            if(option == JOptionPane.YES_OPTION){
                dispose();
            }
        }
    }
}
  
public class MAN {
    public static void main(String[] arg){
        // to call the constructor of class Home
        Home frame = new Home();
        // Sets the title for this frame "HOME"
        frame.setTitle("HOME");
        // Component will be displayed on the screen
        frame.setVisible(true);
        // position and size of the frame 
        // using setBounds(x,y,width,height)
        frame.setBounds(10,10,370,600);
        // application exits on close window 
        // event from the operating system
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        // user cannot re-size the frame
        frame.setResizable(false);
    }
}

Producción:

Publicación traducida automáticamente

Artículo escrito por tejasrafale1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *