2016-01-06 36 views
-1

我想用javaFX编写代码(贪吃蛇游戏),但现在它尚未完成,因为它不考虑game Over呢。我写了这个,它不是面向对象的。当我对它进行排序并尝试使其面向对象时(正确地使用正确运行的最后一个代码),它会抛出Exception in Application constructor在应用程序Cunstructor中的例外

的例外是:

Exception in Application constructor 
Exception in thread "main" java.lang.NoSuchMethodException: Main_Snake.main([Ljava.lang.String;) 
    at java.lang.Class.getMethod(Class.java:1819) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:125) 

有人说我补充:

public static void main(String[] args) { 
    launch(args); 
} 

补充说,我得到一个新的异常后:

Exception in Application constructor 
Exception in thread "main" java.lang.RuntimeException: Unable to construct Application instance: class Main_Snake 
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:910) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$156(LauncherImpl.java:187) 
    at java.lang.Thread.run(Thread.java:747) 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:426) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$162(LauncherImpl.java:822) 
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$176(PlatformImpl.java:326) 
    at com.sun.javafx.application.PlatformImpl.lambda$null$174(PlatformImpl.java:295) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$175(PlatformImpl.java:294) 
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
    ... 1 more 
Caused by: java.lang.StackOverflowError 
    at javafx.scene.Node.setTreeVisible(Node.java:8028) 
    at javafx.scene.Node.updateTreeVisible(Node.java:8021) 
    at javafx.scene.Node.<init>(Node.java:2372) 
    at javafx.scene.canvas.Canvas.<init>(Canvas.java:100) 
    at Main_Snake.<init>(Main_Snake.java:30) 
    at Snake.<init>(Main_Snake.java:164) 

有人可以检查我的代码请?

import javafx.animation.AnimationTimer; 
import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.canvas.Canvas; 
import javafx.scene.canvas.GraphicsContext; 
import javafx.scene.input.KeyEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

import java.util.ArrayList; 

/** 
* Created by Nadia on 1/5/2016. 
*/ 



public class Main_Snake extends Application{ 



    Canvas canvas = new Canvas(800, 600); 
    boolean goNorth = true, goSouth, goWest, goEast; 
    int x, y = 0; // marbut be apple 
    boolean j = false; 
    // int gm_ov = 0; // vase game over shodan 
    ArrayList<Integer> X = new ArrayList<Integer>(); 
    ArrayList<Integer> Y = new ArrayList<>(); 


    Snake snake = new Snake(); 
    Apple apple = new Apple(); 


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



     BorderPane b = new BorderPane(canvas); 
     Scene scene = new Scene(b, 800, 600); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 

     //KeyBoard(scene); 

     scene.setOnKeyPressed(new EventHandler<KeyEvent>() { 
      @Override 
      public void handle(KeyEvent e) { 
       switch (e.getText()) { 
        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 "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; 

       } 
      } 
     }); 


     play(snake,apple); 
    } 

    public void play(Snake snake , Apple apple) { 
     AnimationTimer timer = new AnimationTimer() { 


      private long lastUpdate = 0; 

      @Override 
      public void handle(long now) { 

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

        snake.pos_S(); // 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 
        apple.pos_A(); 
        apple.random_Pos(); 
        snake.Move(apple); 

        lastUpdate = now; // [email protected] 
       } 

      } 
     }; 

     timer.start(); 

    } 
    /* public void KeyBoard(Scene scene) { 
    }*/ 
} 

class Apple extends Main_Snake { 


    public void random_Pos() { 
     if (j == false) { // ye sib bede ke ru mar nabashe (rasmesh tu rasme) 
      do { 
       x = (int) (Math.random() * 790 + 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 = true; 
     } 

    } 

    public void pos_A() { 
     GraphicsContext gc = canvas.getGraphicsContext2D(); 
     gc.setFill(Color.BLACK); 
     gc.fillRect(x, y, 10, 10); 

    } 

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

class Snake extends Main_Snake { 
    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); 
    } 

    public void pos_S(){ 
     GraphicsContext gc = canvas.getGraphicsContext2D(); 
     gc.setFill(Color.WHITE); 
     gc.fillRect(0, 0, canvas.getWidth(), canvas.getHeight()); 
     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), 10, 10); 

    } 
    public void Move(Apple apple){ 

     int Px = X.get(X.size() - 1); 
     int Py = 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); 

     } 

     apple.Point();  // emtiaz gerefte 
     if (j == false) { 
      X.add(Px); 
      Y.add(Py); 
     } 

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

    } 
} 

回答

2

当你启动应用程序,它创建的Main_Snake一个实例(因为这是Application类。

Main_Snake类有一个字段(实例变量)称为Snakesnake,这是初始化内联到一个新的Snake实例:

public class Main_Snake extends Application { 

    Snake snake = new Snake(); 

    // ... 
} 

Snake类是子类(为什么?):

public class Snake extends Main_Snake { ... } 

这意味着它继承了所有领域和Main_Snake方法。因此,当您创建新的Snake实例时,它会初始化Snake中定义的所有字段以及从Main_Snake继承的所有字段。特别是,它创建一个名为snake的新对象,其类型为Snake(因为该字段在超类Main_Snake中定义)。

所以,到目前为止,我们有:

的JavaFX在启动时创建一个Main_Snake。作为创建Main_Snake的过程的一部分,创建了一个Snake(因为Main_Snake有一个Snake)。

作为创建Snake的过程的一部分,新的Snake创建(从Main_Snake所述一个Snake继承)。

作为创建Snake对象(其记住从Main_Snake继承)的过程的一部分,创建了一个新的Snake

作为创建Snake对象(其记住从Main_Snake继承)的过程的一部分,创建了一个新的Snake

而且我觉得现在你开始看到这个问题...

我真的不能告诉你如何解决这个问题,因为我没有真正知道为什么你想Snake是的Main_Snake一个子类。但是你不能同时使用Main_Snake初始化一个新的SnakeSnakeMain_Snake的一个子类。

+0

谢谢你的明确解释。你知道,我有一些像x,y,我的Arraylists和canvas这样的静态变量,我需要在Snake和Apple Class中访问它们,使用它们检查它们或者更改它们以及它们。所以我只记得遗传。如果我将他们单独设置在他们的课堂上,我认为他们会与彼此分歧,我想如果我知道这样做的方式,我可以解决你所说的问题。 – nidia95