Помогите с реализацией игры

226
15 июля 2017, 06:58

Суть игры заключается в том, что есть 3 круга красного цвета, случайным образом выбирается один из них и закрашивается в зеленый. В течении определенного промежутка времени (который постепенно будет уменьшаться) необходимо клацнуть на него мышкой, если этого не происходит, выбирается другой случайный круг. Собственно, я не знаю как реализовать эти промежутки времени и не знаю как сделать, чтобы игра длилась определенное время. Вот, что у меня есть на данный момент

package yourreaction;
import javafx.application.Application;
import javafx.event.*;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.input.*;
import javafx.stage.Stage;
import javafx.scene.shape.Circle;
import javafx.scene.paint.Color;
import java.util.Vector;
import java.util.Random;
public class YourReaction extends Application {
    Scene scene;
    VBox vbox;
    final int AmountOfCircles = 9;
    final int radius = 20;
    int score = 0;
    public static void main(String[] args) {
        launch(args);
    }
    public void start(Stage stage) {
        stage.setTitle("Hello World!");
        vbox = new VBox(5);
        scene = new Scene(vbox, 300, 250);
        stage.setScene(scene);
        Button B_Start = new Button("Start");
        Button B_Exit  = new Button("Exit");
        B_Start.setOnMousePressed(new EventHandler<MouseEvent> () {
            public void handle(MouseEvent me) {
                GameProcess();
            }
        });
        B_Exit.setOnMousePressed(new EventHandler<MouseEvent> () {
            public void handle(MouseEvent me)  {
                System.exit(0);
            }
        });
        vbox.setAlignment(Pos.CENTER);
        vbox.getChildren().addAll(B_Start, B_Exit);
        stage.show();
    }
    public int GameProcess() {
        vbox.getChildren().clear();
        Random random = new Random();
        HBox hbox = new HBox(5);
        hbox.setAlignment(Pos.CENTER);
        scene.setRoot(hbox);
        Circle circle1 = new Circle(radius, Color.RED);
        Circle circle2 = new Circle(radius, Color.RED);
        Circle circle3 = new Circle(radius, Color.RED);
        hbox.getChildren().addAll(circle1, circle2, circle3);
        //while(true) {
            int RandomNum = 1 + random.nextInt(3);
            if(RandomNum == 1) circle1.setFill(Color.GREEN);
            if(RandomNum == 2) circle2.setFill(Color.GREEN);
            if(RandomNum == 3) circle3.setFill(Color.GREEN);
            circle1.setOnMousePressed(new EventHandler<MouseEvent> () {
                public void handle(MouseEvent me) {
                    circle1.setFill(Color.RED);
                    score++;
                }
            });
            circle2.setOnMousePressed(new EventHandler<MouseEvent> () {
                public void handle(MouseEvent me) {
                    circle2.setFill(Color.RED);
                    score++;
                }
            });
            circle3.setOnMousePressed(new EventHandler<MouseEvent> () {
                public void handle(MouseEvent me) {
                    circle3.setFill(Color.RED);
                    score++;
                }
            });
        //}
        return score;
    }
}
Answer 1

В создании этой игры, Вам не обойтись без использования нескольких потоков. Внимательно изучите тему многопоточности в java; обратите свое внимание на метод .sleep(). Вероятнее всего Вам нужно будет запустить ваш цикл в потоке таким образом чтобы на каждой итерации количество миллисекунд "пауза" уменьшалось.

Это, в некотором роде, может послужить примером: ожидание по времени.

Что бы игра длилась определённое время используй System.currentTimeMillis(). Метод вернёт тебе переменную типа long, это количество миллисекунд прошедших с 1 января 1970 по текущий момент (вызов метода). Добавь условие для выхода:

 if (System.currentTimeMillis() >= timeIsOut){ break }

где timeIsOut твоя переменная long которая указывает на время по достижению которого игра должна завершиться. Поток можно прервать методом interrupt(), но будьте осторожны, внезапное завершение потока может быть небезопасным. Здесь я не совсем уверен что использование System.currentTimeMillis() - лучший вариант. Но, считаю что после изучения темы потоков Вы сможете найти своё "лучшее решение". Не лишним будет посмотреть класс Calendar() хм.. Calendar.getInstance().

READ ALSO
Почему код работает в java 7 и не работает в java 8?

Почему код работает в java 7 и не работает в java 8?

Я использую в данный момент IDE Eclipse Version: Neon2 Release (4

154
Spring inline-script

Spring inline-script

Добрый деньИзучаю спринг по книге spring in action

258
Настройка метода registerGlobalAuthentication

Настройка метода registerGlobalAuthentication

Как мне сделать, что б при входе на сайт сначало проверяло inMemoryAuth, и если юзера там нету, то уже через UserDetailsServiceВот мой вариант кода:

213