Программа лотереи игнорирует функцию - PullRequest
1 голос
/ 23 января 2020

Я собираюсь написать программу, которая перечисляет одно случайное число за другим, что оно и делает (вместе со звуковым сигналом). Однако он игнорирует фундаментальную функцию, необходимую для правильной работы программы. Функция ask () делает то, что она подразумевает, она просит пользователя ввести целое число в диапазоне (1000-9999), которое затем сравнивается с выигрышным числом (случайным), чтобы увидеть, правильно ли пользователь угадал его и, таким образом, выиграл. Я только недавно начал писать в Java, поэтому я не уверен, что я делаю основную ошибку c. Будем благодарны за любую помощь!

package edu.pupr.pega4;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.util.Scanner;
import javax.swing.JOptionPane;
import javax.swing.Timer;
public class Pega4Driver {
    public static void main(String[] args) {
        Pega4 test = new Pega4(2000, true);
        test.start();
        JOptionPane.showMessageDialog(null, "Quit program?");
        JOptionPane.showMessageDialog(null, "Perdiste!!!");
        System.exit(0);
    }
}

class Pega4 {
    private int interval; //Time interval for new number to appear
    private boolean beep; //BEEP
    private int number; //The input number
    private int tiradas = 1; //Counter
    private int winNum; //The winning number 
    //Constructor
    public Pega4(int interval, boolean beep) {
        this.interval = interval;
        this.beep = beep;
    }
    //Returns a random number within a specified range
    public double getRandomIntegerBetweenRange(double min, double max){
        double x = (int)(Math.random()*((max-min)+1))+min;
        return x;
    }
    public void start() {
        class Pega4Inner implements Asker, ActionListener {
            Scanner input = new Scanner(System.in);
            Date now = new Date();
            @Override
            public void ask() {
                System.out.println("Entrar numero deseado: ");
                number = input.nextInt();
                //Input Validation
                if (number < 1000 || number > 9999)
                {
                    System.out.println("Entrada invalida. Entrar numero deseado: ");
                    number = input.nextInt();
                }
                System.out.println(now);
            }
            @Override
            public void actionPerformed(ActionEvent e) {
                winNum = (int) getRandomIntegerBetweenRange(1000, 9999);
                System.out.println("Tirada #" + (tiradas++) + ": " + winNum);
                if (beep)
                    Toolkit.getDefaultToolkit().beep();
                if (winNum == number)
                {
                    JOptionPane.showMessageDialog(null, "Ganaste!!!");
                    System.exit(0);
                }
            }
        }
        ActionListener listener = new Pega4Inner();
        Timer timer = new Timer(interval, listener);
        timer.start();
    }
}

Класс Pega4Inner реализует созданный мной интерфейс под названием Asker. Его код выглядит следующим образом:

package edu.pupr.pega4;

public interface Asker {
    void ask();
}

1 Ответ

1 голос
/ 23 января 2020

Вам нужно было бы фактически вызвать ваш метод ask() откуда-то :) Я думаю, что правильная точка для этого в вашем текущем коде будет в начале вашего actionPerformed() метода в Pega4Inner:

 public void actionPerformed(ActionEvent e) {
     ask();
     winNum = (int) getRandomIntegerBetweenRange(1000, 9999);
     …

РЕДАКТИРОВАТЬ

Исходя из вашего требования вызывать ask() только один раз, один из способов сделать это - вынуть этот метод из внутреннего класса и поместить его в свой. внешний класс, затем вызовите его явно в вашем классе драйвера. Итак, ваш Pega4 класс может выглядеть так:

class Pega4 {
    private int interval; //Time interval for new number to appear
    private boolean beep; //BEEP
    private int number; //The input number
    private int tiradas = 1; //Counter
    private int winNum; //The winning number 
    //Constructor
    Date now = new Date();
    Scanner input = new Scanner(System.in);

    public Pega4(int interval, boolean beep) {
        this.interval = interval;
        this.beep = beep;
    }

    //Returns a random number within a specified range
    public double getRandomIntegerBetweenRange(double min, double max) {
        double x = (int) (Math.random() * ((max - min) + 1)) + min;
        return x;
    }

    public void ask() {
        System.out.println("Entrar numero deseado: ");
        number = input.nextInt();
        //Input Validation
        while (number < 1000 || number > 9999) { // not IF here
            System.out.println("Entrada invalida. Entrar numero deseado: ");
            number = input.nextInt();
        }
        System.out.println(now);
    }

    public void start() {
        class Pega4Inner implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
                // ask();
                winNum = (int) getRandomIntegerBetweenRange(1000, 9999);
                System.out.println("Tirada #" + (tiradas++) + ": " + winNum);
                if (beep) {
                    Toolkit.getDefaultToolkit().beep();
                }
                if (winNum == number) {
                    JOptionPane.showMessageDialog(null, "Ganaste!!!");
                    System.exit(0);
                }
            }
        }
        ActionListener listener = new Pega4Inner();
        Timer timer = new Timer(interval, listener);
        timer.start();
    }
}

А затем в вашем Pega4Driver классе:

...
Pega4 test = new Pega4(2000, true);
test.ask();
test.start();
...
...