2016-01-11 103 views
0

我写了一个Snake Game,当它碰到它的尾巴时,它将会游戏结束,并发出警报。我在新游戏的预警阶段设置了一个按钮,我想先用它来再次运行我的鳕鱼。有没有什么方法或东西...开始一个新游戏(运行带有新游戏按钮的程序)JavaFX

这是我的警报类

class alart { 
    public static void Game_over_alart(int dom) { 

     dom = (dom - 9) * 10 ; 
     Label sdom = new Label(Integer.toString(dom)); 

     Stage window = new Stage(); 
     window.setTitle("Game_Over"); 
     Label gameOver = new Label("Game Over"); 
     Label scor = new Label("SCORE : "); 
     Label best = new Label("BEST : "); 
     Text newgame = new Text("NEW GAME"); 

     HBox hbox1 = new HBox(2, scor , sdom); 
     HBox hbox2 = new HBox(2, best); 

     VBox vbox = new VBox(2, hbox1, hbox2); 

     gameOver.setStyle("" 
       + "-fx-alignment: top;" 
       + "-fx-font-size: 40px;" 
       + "-fx-font-style: italic;" 
       + "-fx-font-weight: bold;" 
       + "-fx-font-family: fantasy;" 
       + "-fx-text-fill: lightgrey ;"); 
     // + "-fx-background-color: gray"); 


     DropShadow d = new DropShadow(5, Color.BLACK); 

     ScaleTransition st=new ScaleTransition(Duration.millis(100),newgame); 
     st.setToX(1.1); 
     st.setToY(1.1); 
     st.setFromX(1); 
     st.setFromY(1); 
     //st.setAutoReverse(true); 
     // st.setCycleCount(Animation.INDEFINITE); 



     gameOver.setEffect(d); 
     BorderPane b = new BorderPane(); 
     b.setTop(gameOver); 
     b.setCenter(vbox); 
     b.setBottom(newgame); 
     gameOver.setAlignment(Pos.CENTER); 
     Scene s = new Scene(b, 400, 200); 
     window.setScene(s); 
     window.show(); 
     window.setResizable(false); 

     newgame.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() { 


      @Override 
      public void handle(MouseEvent event) { 

      } 

     }); 

     newgame.addEventHandler(MouseEvent.MOUSE_ENTERED, new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event1) { 
       st.play(); 

      } 
     }); 

     newgame.addEventHandler(MouseEvent.MOUSE_EXITED, new EventHandler<MouseEvent>() { 
      @Override 
      public void handle(MouseEvent event1) { 
       st.setFromX(1.1); 
       st.setFromY(1.1); 
       st.setToX(1); 
       st.setToY(1); 

      } 
     }); 
    } 
} 

,它是整个我的代码

/** 
* Created by Nadia on 12/31/2015. 
*/ 

import javafx.animation.Animation; 
import javafx.animation.AnimationTimer; 
import javafx.animation.ScaleTransition; 
import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.canvas.Canvas; 
import javafx.scene.canvas.GraphicsContext; 
import javafx.scene.control.Label; 
import javafx.scene.effect.DropShadow; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.StackPane; 
import javafx.scene.layout.VBox; 
import javafx.scene.paint.Color; 
import javafx.scene.shape.Rectangle; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 
import javafx.util.Duration; 
import sun.jvm.hotspot.debugger.cdbg.Sym; 

import javax.swing.text.StyledEditorKit; 
import java.util.ArrayList; 

public class Main_Snake extends Application{ 

    Canvas canvas = new Canvas(399, 599); 
    Rectangle round = new Rectangle(0 ,0 , 400 , 600); 

    B_Part snake = new Snake(); 
    B_Part apple = new Apple(); 
    B_Part mane = new Mane(); 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     round.setStroke(Color.BLACK); 
     round.setFill(Color.WHITE); 
     StackPane ss = new StackPane(); 
     ss.getChildren().addAll(round, canvas); 

     BorderPane b = new BorderPane(); 
     b.setBottom(ss); 
     Scene scene = new Scene(b, 410, 700); 
     primaryStage.setScene(scene); 
     primaryStage.setTitle ("Snake"); 
     primaryStage.show(); 
     primaryStage.setResizable(false); 

     play(); 



    } 


    public void play() { 
     AnimationTimer timer = new AnimationTimer() { 

      private long lastUpdate = 0; 

      @Override 
      public void handle(long now) { 

       if (now - lastUpdate >= 20_000_000) { // payin avordane [email protected] 

        GraphicsContext gc = canvas.getGraphicsContext2D(); 
        gc.setFill(Color.WHITE); 
        gc.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); 




         try { 
          for (int i = 0 ; i < 5 ; i++) 
           mane.Move(canvas.getScene()); 

         } catch (Game_Over_Exception e) { 

         }finally { 
          mane.Drow(canvas); 
         } 


        try { 
         apple.Move(canvas.getScene()); 

        }catch (Exception e) { 

        }finally { 
         apple.Drow(canvas); 

        } 

        try { 
         snake.Move(canvas.getScene()); 

        } catch (Game_Over_Exception e) { 
         stop(); 
         alart.Game_over_alart(snake.X.size()); 

        }finally { 
         snake.Drow(canvas); // har bar mar rasm mishe bad az move va ye sib ba X,Y khodesh rasm mishe tu tabe move dar morede tabe Point hast 

        } 

        lastUpdate = now; // [email protected] 

       } 

      } 
     }; 
       timer.start(); 
     } 


    } 


abstract class B_Part { 


    boolean goNorth = true, goSouth = false, goWest = false, goEast = false; /////////////////////////////////////////////////////// 

    static int GM = 0 ; 

    int Mx , My ; 
    static ArrayList<Integer> Mane_x = new ArrayList<>(); 
    static ArrayList<Integer> Mane_y = new ArrayList<>(); 

    static int x, y ; // marbut be apple 
    static int j = 0; 
    // int gm_ov = 0; // vase game over shodan 
    static ArrayList<Integer> X = new ArrayList<>(); 
    static ArrayList<Integer> Y = new ArrayList<>(); 

    static int Domx1 =400 , Domy1 =390 ; 
    static int Domx2 =400, Domy2 =400 ; 

    abstract public void Drow(Canvas canvas); 

    abstract public void Move(Scene scene)throws Game_Over_Exception; 

    void Point() { 
     if (X.get(0) == x && Y.get(0) == y) 
      j = 0; 
    } 
    void Game_Over() { 


     for (int i = 1 ; i < X.size() ; i ++) { // inke mokhtasate sare mar tu mokhtasate tanesh hast ya na 
      if (X.get(0).equals(X.get(i)) && Y.get(0).equals(Y.get(i))) { 
       GM = 1; 
      } 
     } 


     for (int i = 0 ; i < Mane_x.size() ; i ++) { // inke mokhtasate sare mar be mane hast ya na 
      if (X.get(0).equals(Mane_x.get(i)) && Y.get(0).equals(Mane_y.get(i))) { 
       GM = 1; 

      } 
     } 


    } 

} 
class Apple extends B_Part { 


    @Override 
    public void Move(Scene scene) { 
     if (j == 0) { // ye sib bede ke ru mar nabashe (rasmesh tu rasme) 
      do { 
       x = (int) (Math.random() * 390 + 1); 
       y = (int) (Math.random() * 590 + 1); 
      } while (X.indexOf(x) != -1 && Y.get(X.indexOf(x)) == y || x % 10 != 0 || y % 10 != 0); 
/* 
inja aval chek kardam tu araylist x hast ya na ag bud sharte aval ok hala sharte do ke tu Y ham mibinim tu hamun shomare khune 
         y barabare y mast ag bud pas ina bar ham montabeghan va sharte dovom ham ok . 2 sharte akhar ham vase ine ke mare ma faghat mazrab 
         haye 10 and pas ta vaghti in se shart bargharare jahayie ke ma nemikhaym va hey jaye dg mide 
*/ 


      j = 1; 
     } 
    } 

    @Override 
    public void Drow(Canvas canvas) { 

     DropShadow dd = new DropShadow(20,Color.RED); 

     GraphicsContext a = canvas.getGraphicsContext2D(); 
     a.setFill(Color.RED); 
     a.setEffect(dd); 
     a.fillRect(x , y , 9 ,9); 
     a.setEffect(null); 
    } 

} 

class Snake extends B_Part { 


    Snake() { //cunstructor 

     X.add(400); 
     Y.add(300); 

     X.add(400); 
     Y.add(310); 

     X.add(400); 
     Y.add(320); 

     X.add(400); 
     Y.add(330); 


     X.add(400); 
     Y.add(340); 

     X.add(400); 
     Y.add(350); 

     X.add(400); 
     Y.add(360); 

     X.add(400); 
     Y.add(370); 

     X.add(400); 
     Y.add(380); 

    } 

    @Override 
    public void Drow(Canvas canvas) { 
     GraphicsContext gc = canvas.getGraphicsContext2D(); 
     gc.setFill(Color.BLACK); 

     // keshidane mar (body yeki ezafe tar az adade morabaA mide) 
     for (int i = X.size() - 1; i >= 0; i--) { 
      gc.fillRect(X.get(i), Y.get(i), 9, 9); 
      gc.setStroke(Color.WHITE); 
     } 

     } 

    @Override 
    public void Move(Scene scene) throws Game_Over_Exception { 


     scene.setOnKeyPressed(new EventHandler<KeyEvent>() { 
      @Override 
      public void handle(KeyEvent small) { 
       switch (small.getText()) { 
        case "W": 
         if (!goSouth) { 
          goNorth = true; 
          goSouth = false; 
          goWest = false; 
          goEast = false; 
         } 
         break; 
        case "w": 
         if (!goSouth) { 
          goNorth = true; 
          goSouth = false; 
          goWest = false; 
          goEast = false; 
         } 
         break; 
        case "S": 
         if (!goNorth) { 
          goSouth = true; 
          goNorth = false; 
          goWest = false; 
          goEast = false; 
         } 
         break; 
        case "s": 
         if (!goNorth) { 
          goSouth = true; 
          goNorth = false; 
          goWest = false; 
          goEast = false; 
         } 
         break; 
        case "A": 
         if (!goEast) { 
          goWest = true; 
          goEast = false; 
          goSouth = false; 
          goNorth = false; 
         } 
         break; 
        case "a": 
         if (!goEast) { 
          goWest = true; 
          goEast = false; 
          goSouth = false; 
          goNorth = false; 
         } 
         break; 
        case "D": 
         if (!goWest) { 
          goEast = true; 
          goWest = false; 
          goSouth = false; 
          goNorth = false; 
         } 
         break; 
        case "d": 
         if (!goWest) { 
          goEast = true; 
          goWest = false; 
          goSouth = false; 
          goNorth = false; 
         } 
         break; 

       } 
      } 
     }); 
    /* scene.setOnKeyPressed(new EventHandler<KeyEvent>() { 
      @Override 
      public void handle(KeyEvent e) { 
       switch (e.getCode()) { 
        case UP: 
         if (!goSouth) { 
          goNorth = true; 
          goSouth = false; 
          goWest = false; 
          goEast = false; 
         } 
         break; 
        case DOWN: 
         if (!goNorth) { 
          goSouth = true; 
          goNorth = false; 
          goWest = false; 
          goEast = false; 
         } 
         break; 
        case LEFT: 
         if (!goEast) { 
          goWest = true; 
          goEast = false; 
          goSouth = false; 
          goNorth = false; 
         } 
         break; 
        case RIGHT: 
         if (!goWest) { 
          goEast = true; 
          goWest = false; 
          goSouth = false; 
          goNorth = false; 
         } 
         break; 

       } 
      } 
     }); 
*/ 

     Domx1 = X.get(X.size() - 1); 
     Domy1 = Y.get(Y.size() - 1); 

     for (int z = X.size() - 1; z > 0; z--) { 
      X.remove(z); 
      X.add(z, X.get(z - 1)); 
      Y.remove(z); 
      Y.add(z, Y.get(z - 1)); 

     } 

     if (goNorth) { 
      Y.add(0, Y.get(0) - 10); 
      Y.remove(1); 

     } 
     if (goSouth) { 
      Y.add(0, Y.get(0) + 10); 
      Y.remove(1); 

     } 
     if (goEast) { 
      X.add(0, X.get(0) + 10); 
      X.remove(1); 

     } 
     if (goWest) { 
      X.add(0, X.get(0) - 10); 
      X.remove(1); 

     } 

     Point();  // emtiaz gerefte 
     if (j == 0) { 
      X.add(Domx1); 
      Y.add(Domy1); 
      X.add(Domx2); 
      Y.add(Domy2); 
      Domx2 = Domx1; 
      Domy2 = Domy1; 

      System.out.println(); 
      System.out.println("size : "+Mane_x.size()); 

      System.out.print(" clear : "); 

      Mane_x.clear(); 
      Mane_y.clear(); 

      System.out.println("size : "+Mane_x.size()); 

     } 

     Game_Over(); 
     if (GM == 1) { 
       throw new Game_Over_Exception("Game Over"); 
      } 

     if (X.get(0) > 390) { 
      X.remove(0); 
      X.add(0, 0); 
     } 
     if (X.get(0) < 0) { 
      X.remove(0); 
      X.add(0, 400); 
     } 
     if (Y.get(0) > 590) { 
      Y.remove(0); 
      Y.add(0, 0); 
     } 
     if (Y.get(0) < 0) { 
      Y.remove(0); 
      Y.add(0, 600); 
     } 
    } 
} 

class Mane extends B_Part{ 


    @Override 
    public void Drow(Canvas canvas) { 
     GraphicsContext gc = canvas.getGraphicsContext2D(); 
     for (int i = 0 ; i < Mane_x.size() ; i++) { 
       gc.setFill(Color.GRAY); 
       gc.fillRect(Mane_x.get(i), Mane_y.get(i), 9, 9); 
      } 
      //System.out.println(Mane_x.get(i)+" "+Mane_y.get(i));} 
     } 


    @Override 
    public void Move(Scene scene) { 
     if (j == 0) { // ye sib bede ke ru mar nabashe (rasmesh tu rasme) 
      do { 
       Mx = (int) (Math.random() * 390 + 1); 
       My = (int) (Math.random() * 590 + 1); 

      } while (Mx == x && My == y || 
        Mane_x.indexOf(Mx) != -1 && Mane_y.get(Mane_x.indexOf(Mx)) == My || 
        X.indexOf(Mx) != -1 && Y.get(X.indexOf(Mx)) == My || 
        Mx % 10 != 0 || My % 10 != 0 
        /* Mx == X.get(0) + 10 && My == Y.get(0) || // yeki joloye saresh nayofte (vaghti rast mire) 
        Mx == X.get(0) - 10 && My == Y.get(0) || // (vaghti chap mire) 
        Mx == X.get(0) && My == Y.get(0) + 10 || // yek ta jolo tar az saresh nayofte vaghtti payi 
        Mx == X.get(0) && My == Y.get(0) - 10*/); // vaghti bala 
//sharte chek kardane in ke har maneye random rooye mar ya maneye ghablia nayofte (sib hamintor) 
      Mane_x.add(Mx); 
      Mane_y.add(My); 
     } 
    } 
} 

class Game_Over_Exception extends Exception{ 
    public Game_Over_Exception (String s){ 
     super(s); 
    } 


} 

回答

0

交出重启方法来警告处理。你可以直接或通过界面来做到这一点,摹:

public interface GameManager { 
    public void restart(); 
} 

主类必须实现该接口:

public class Main_Snake extends Application implements GameManager { 

    public void restart() { 
     // TODO: reset playfield & restart game 
    } 

    public void play() { 
       ... 
       try { 
        snake.Move(canvas.getScene()); 

       } catch (Game_Over_Exception e) { 
        stop(); 
        alart.Game_over_alart(snake.X.size(), Main_Snake.this); 

       } 
       ... 
    } 
} 

而在你alart类,你调用该方法:

class alart { 
    public static void Game_over_alart(int dom, GameManager gameManager) { 
     ... 
     newgame.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() { 


      @Override 
      public void handle(MouseEvent event) { 

       // TODO: close dialog 

       // restart game 
       gameManager.restart(); 

      } 

     }); 
     ... 
    } 
} 
+0

谢谢了很多东西。现在我不知道的是我在重新开始我的动画制作工具时重新写入了什么(你是说todo)@Roland – nidia95

+0

只需使用stop()和start()。查看[AnimationTimer](https://docs.oracle.com/javase/8/javafx/api/javafx/animation/AnimationTimer.html)类。 – Roland