Problem z Timerem

0

Piszę gierkę Memory. Ma ona działać następująco: Gracz klika - odkrywa dwie karty na planszy i jeśli są one identyczne, pozostają odkryte a gracz zdobywa punkt. Jeśli natomiast są różne, zakrywają się ponownie.
Za klikanie i okrywanie kart odpowiada metoda setOnAction na buttonie.
W pierwszym ifie danej tury: (w metodzie setOnAction)
1.Klikniętemu przyciskowi kasowana jest klasa(StyleClass) odpowiadająca za wygląd karty nieodkrytej i dodawana jest klasa odpowiadająca za wygląd karty odkrytej
2.W polach obiektów gracz1 lub gracz2 zapisywane są potrzebne parametry wybranej pierwszej karty(buttona) oraz w przypadku gracza 2, którym jest komputer, uruchamiana jest metoda odpowiedzialna za 2 ruch - odkrycie drugiej karty.

W drugim ifie:
1.Klikniętemu przyciskowi kasowana jest klasa(StyleClass) odpowiadająca za wygląd karty nieodkrytej i dodawana jest klasa odpowiadająca za wygląd karty odkrytej
2.Do kolejnych pól obiektów gracz1 lub gracz2 zapisywane są potrzebne parametry wybranej drugiej karty
3.Uruchamiana jest metoda Tura(), która sprawdza czy karty są identyczne i w zależności od wyniku dolicza graczowi punkt lub nie i zakrywa ponownie karty lub pozostawia odkryte.

I właśnie w punkcie 3 jest problem. Metoda Tura(); uruchamiana jest przez timer(ponowne zakrywanie kart musi być uruchamiane z opóźnieniem, inaczej zakrywane są szybciej niż zdążą się wyświetlić odkryte). W przypadku gracza - człowieka działa prawidłowo, ale w przypadku komputera działa prawidłowo TYLKO w pierwszej kolejce a w kolejnych wygląda jakby ten Timer się wyłączył, przestał działać - ruch wykonywany jest poprawnie, o czym świadczą komunikaty w konsoli, ale odkryte karty się nie wyświetlają, co sugeruje sytuację opisaną w poprzednim zdaniu - karty zakrywane są szybciej niż zdążą się wyświetlić odkryte, więc z Timerem jest coś nie tak.
Proszę o pomoc

	  private Button getButtonFromGridPane(GridPane gridPane, int col, int row) {
		    for (Node node : gridPane.getChildren()) {
		        if (node instanceof Button 
		         && GridPane.getColumnIndex(node) == col 
		         && GridPane.getRowIndex(node) == row) {
		            return (Button) node;
		        }
		    }
		    return null;
		}

Tura

 public void Tura(String w1, String w2, int w1_col, int w1_row, int w2_col, int w2_row, String w1_id, String w2_id) {
	   
	  boolean sprawdzenie = nowagra.Sprawdz(w1, w2);
	  boolean enabled = false; 
	  boolean disabled = true; 
	  int wynik = gracz1.getWynik();
	  String styleClass_close = "btnRev";
	  String styleClass_open = "btn_open";
	  
	 
		
		if(tura == "g1") {
			
			  if(sprawdzenie == true) {
				  
				  System.out.println("Gracz1 -> Identyczne!" + "\n");
				 wynik++;
				  gracz1.setWynik(wynik);
				 
				  gridPane2.getChildren().remove(getButtonFromGridPane(gridPane2, w1_col, w1_row));
				  GPaddButton(gridPane2,w1_col,w1_row,styleClass_open,w1_id, disabled);
				  
				  gridPane2.getChildren().remove(getButtonFromGridPane(gridPane2, w2_col, w2_row));
				  GPaddButton(gridPane2,w2_col,w2_row,styleClass_open,w2_id, disabled);
				  
				  gracz1.setWybor1("");
				  gracz1.setWybor2("");
				  System.out.print("Gracz 1: " + gracz1.getNazwa() + " Wynik: " + gracz1.getWynik() + "\n" + "\n");
				 // timer.cancel();	  
			  }
			  if(sprawdzenie == false) {
				  
				  System.out.println("Gracz1 -> Różne!" + "\n" /*+"Col1: " + w1_col + " Row1: " + w1_row + "\n" + "Col2: " + w2_col + " Row2: " + w2_row */ + "\n");
				  
			  
				/*  gridPane2.getChildren().remove(getButtonFromGridPane(gridPane2, w1_col, w1_row));
				  GPaddButton(gridPane2,w1_col,w1_row,styleClass_close,w1_id, enabled);
				  
				  gridPane2.getChildren().remove(getButtonFromGridPane(gridPane2, w2_col, w2_row));
				  GPaddButton(gridPane2,w2_col,w2_row,styleClass_close,w2_id, enabled);*/
				  
				  getButtonFromGridPane(gridPane2, gracz1.getWybor1_col(), gracz1.getWybor1_row()).getStyleClass().removeAll(styleClass_open);
				  getButtonFromGridPane(gridPane2, gracz1.getWybor2_col(), gracz1.getWybor2_row()).getStyleClass().removeAll(styleClass_open);
				  getButtonFromGridPane(gridPane2, gracz1.getWybor1_col(), gracz1.getWybor1_row()).getStyleClass().add(styleClass_close);
				  getButtonFromGridPane(gridPane2, gracz1.getWybor2_col(), gracz1.getWybor2_row()).getStyleClass().add(styleClass_close);
				  
				  //gracz1.setWybor1("");
				  //gracz1.setWybor2("");
				  System.out.print("Gracz 1: " + gracz1.getNazwa() + " Wynik: " + gracz1.getWynik() + "\n" + "\n");
				  timer.cancel();
				  tura = "g2";
				  Ruch_Gracz2();
				 
			  }
			
			
		}
		if(tura == "g2") {
			
			  if(sprawdzenie == true) {
				  
				  System.out.println("Gracz 2 -> Identyczne!" + "\n");
				 wynik++;
				  gracz2.setWynik(wynik);
				 
				  gridPane2.getChildren().remove(getButtonFromGridPane(gridPane2, w1_col, w1_row));
				  GPaddButton(gridPane2,w1_col,w1_row,styleClass_open,w1_id, disabled);
				  
				  gridPane2.getChildren().remove(getButtonFromGridPane(gridPane2, w2_col, w2_row));
				  GPaddButton(gridPane2,w2_col,w2_row,styleClass_open,w2_id, disabled);
				  
				  gracz2.setWybor1("");
				  gracz2.setWybor2("");
				  System.out.print("Gracz 2: " + gracz2.getNazwa() + " Wynik: " + gracz2.getWynik() + "\n" + "\n");
				 // timer.cancel();
				  Ruch_Gracz2();
				  
				  	  
			  }
			  if(sprawdzenie == false) {
				  
			  System.out.println("Gracz 2 -> Różne!" + "\n" /*+ "Col1: " + w1_col + " Row1: " + w1_row + "\n" + "Col2: " + w2_col + " Row2: " + w2_row */);
				  
			  System.out.print("Gracz 2 -> Wybor 1 Col: "+ w1_col + " Wybor 1 Row: " + w1_row + "\n");
			  System.out.print("Gracz 2 -> Wybor 2 Col: "+ w2_col + " Wybor 2 Row: " + w2_col + "\n");
				 
			  System.out.print("Gracz 2 -> Wybór 2 id: " + getButtonFromGridPane(gridPane2, gracz2.getWybor1_col(), gracz2.getWybor1_row()).getId() + "\n");
				 
			 // getButtonFromGridPane(gridPane2, gracz2.getWybor1_col(), gracz2.getWybor1_row()).getStyleClass().removeAll(styleClass_open);
			// getButtonFromGridPane(gridPane2, gracz2.getWybor2_col(), gracz2.getWybor2_row()).getStyleClass().removeAll(styleClass_open);
				  
		           getButtonFromGridPane(gridPane2, gracz2.getWybor1_col(), gracz2.getWybor1_row()).getStyleClass().add(styleClass_close);
			   getButtonFromGridPane(gridPane2, gracz2.getWybor2_col(), gracz2.getWybor2_row()).getStyleClass().add(styleClass_close);
				  
				 
				  gracz2.setTemp1(gracz1.getWybor1());
				  gracz2.setTemp2(gracz1.getWybor2());
				  gracz2.setTemp1_col(gracz1.getWybor1_col());
				  gracz2.setTemp1_row(gracz1.getWybor1_row());
				  gracz2.setTemp2_col(gracz1.getWybor2_col());
				  gracz2.setTemp2_row(gracz1.getWybor2_row());
				  gracz2.setWybor1("");
				  gracz2.setWybor2("");
				  gracz1.setWybor1("");
				  gracz1.setWybor2("");
				  
				  tura = "g1";
				
				  System.out.print("Gracz 2: " + gracz2.getNazwa() + " Wynik: " + gracz2.getWynik() + "\n" + "\n");
				  timer2.cancel();
				//  timer2.purge();
				//  timer2 = null;
			  } 
		}
   }	  

Button.setOnAction


   button.setOnAction(e -> {
	        	
	            System.out.printf("Mouse enetered cell [%d, %d]%n", colIndex, rowIndex);
	           
	    			
	    			if(tura == "g1" ) {
	    				
	    				 if(gracz1.getWybor1() == "" && gracz1.getWybor2() == "") {
	    	    			 
	    	    			 button.getStyleClass().removeAll("btnRev");
	    	    			 button.getStyleClass().add("btn_open");
	    	    			 Label centeredNode = (Label) getCenteredNodeGridPane(gridPane2, colIndex, rowIndex);
	    	    			 gracz1.setWybor1(centeredNode.getText());
	    	    			 gracz1.setWybor1_col(colIndex);
	    	    			 gracz1.setWybor1_row(rowIndex);
	    	    			 gracz1.setWybor1_id(button.getId());
	    	    			 System.out.print("Gracz 1 -> Clicked Label1: " + centeredNode.getText() + "\n");
	    	    			 System.out.print("Gracz 1 -> Wybor1: "+gracz1.getWybor1()  + "\n");
	    	    		 }
	    	    		 else if(gracz1.getWybor1() != "" && gracz1.getWybor2() == "") {
	                    	 
	    	    			 button.getStyleClass().removeAll("btnRev");
	    	    			 button.getStyleClass().add("btn_open");
	    	    			 Label centeredNode = (Label) getCenteredNodeGridPane(gridPane2, colIndex, rowIndex);
	    	    			 gracz1.setWybor2(centeredNode.getText());
	    	    			 gracz1.setWybor2_col(colIndex);
	    	    			 gracz1.setWybor2_row(rowIndex);
	    	    			 gracz1.setWybor2_id(button.getId());
	    	    			 System.out.print("Gracz1 -> Clicked Label2: " + centeredNode.getText() + "\n");	 
	                    	 System.out.print("Gracz1 -> Wybór 1: " + gracz1.getWybor1() + " Wybór 2: "+gracz1.getWybor2() +"\n");
	                    
	                    	  
	                          timer = new Timer();
	                          timer.schedule(new TimerTask() {
	                              @Override
	                              public void run() {
	                            	 
	                                  Platform.runLater(new Runnable() {
	                                      @Override
	                                      public void run() {
	                                    Tura(gracz1.getWybor1(), gracz1.getWybor2(), gracz1.getWybor1_col(), gracz1.getWybor1_row(),           gracz1.getWybor2_col(),gracz1.getWybor2_row(),gracz1.getWybor1_id(), gracz1.getWybor2_id());
	                      	    			
	                                      }
	                                  });
	                              }
	                          }, 3000); 
	                      }
	    			}
	    			if(tura == "g2") {
	    			
	    				
	    				 if(gracz2.getWybor1() == "" && gracz2.getWybor2() == "") {
	    	    			 
	    					// System.out.println("Gracz 2 -> Ekran: ["+colIndex+"]"+"["+rowIndex+"]"+" X:" +x + " Y: "+y);
	    	    			 button.getStyleClass().removeAll("btnRev");
	    	    			 button.getStyleClass().add("btn_open");
	    	    			 Label centeredNode = (Label) getCenteredNodeGridPane(gridPane2, colIndex, rowIndex);
	    	    			 gracz2.setWybor1(centeredNode.getText());
	    	    			 gracz2.setWybor1_col(colIndex);
	    	    			 gracz2.setWybor1_row(rowIndex);
	    	    			 gracz2.setWybor1_id(button.getId());
	    	    			 System.out.print("Gracz 2 -> Clicked Label1: " + centeredNode.getText() + "\n");
	    	    			 System.out.print("Gracz 2 -> Wybor1: "+gracz2.getWybor1() + "\n");
	    	    			 Ruch2_Gracz2();
	    	    		 }
	    	    		 else if(gracz2.getWybor1() != "" && gracz2.getWybor2() == "") {
	    	    			 
	    	    			 //System.out.println("Gracz 2 -> Ekran: ["+colIndex+"]"+"["+rowIndex+"]"+" X:" +x + " Y: "+y);
	    	    			 button.getStyleClass().removeAll("btnRev");
	    	    			 button.getStyleClass().add("btn_open");
	    	    			 Label centeredNode = (Label) getCenteredNodeGridPane(gridPane2, colIndex, rowIndex);
	    	    			 gracz2.setWybor2(centeredNode.getText());
	    	    			 gracz2.setWybor2_col(colIndex);
	    	    			 gracz2.setWybor2_row(rowIndex);
	    	    			 gracz2.setWybor2_id(button.getId());
	    	    			 System.out.print("Gracz 2 -> Clicked Label2: " + centeredNode.getText() + "\n");	 
	                    	 System.out.print("Gracz 2 -> Wybór 1: " + gracz2.getWybor1() + " Wybór 2: "+gracz2.getWybor2() +"\n");
	                    
	                    	timer2 = new Timer();
	                          timer2.schedule(new TimerTask() {
	                            @Override
	                              public void run() {
	                            	 
	                                  Platform.runLater(new Runnable() {
	                                      @Override
	                                      public void run() {
	                                    	  Tura(gracz2.getWybor1(), gracz2.getWybor2(), gracz2.getWybor1_col(), gracz2.getWybor1_row(), gracz2.getWybor2_col(),gracz2.getWybor2_row(),gracz2.getWybor1_id(), gracz2.getWybor2_id());
	                      	    			
	                                      }
	                                  });
	                              }
	                          }, 4000); 
	                         
	    				
	    			}		
	    			
	    		}
	    	
	        });

1

Jak najszybciej usuń cały ten kod, puść CHKDSK, żeby się upewnić, że czegoś jeszcze nie zepsuł, umyj ręce i zacznij jeszcze raz.
Uczysz się - bardzo fajnie, piszesz kod zamiast robić 256 dniowy challange albo robić o tym videoblog - jeszcze lepiej. Ale wygląda na to, że zabierasz się już za rzeczy które wymagają, żeby 10 minut pomyśleć zanim zacznie się pisać. Więc zanim zaczniesz pisać to najpierw to zaprojektuj. Zastanów się nad dziedziną problemu, opisz ją w kodzie a potem wykorzystaj do rozwiązania problemu. Możesz to zrobić na przykład poprzez analizę top-down:

Na górze mamy jakąś abstrakcję gry (klasa Game). Ta gra ma planszę (klasa Board) i tablicę wyników (LeaderBoard). W grę gra gracz (interface Player), "ludzki" (HumanPlayer) albo komputer (ComputerPlayer). Oczywiście w grę może grać jeden gracz, lub wielu, część z nich to mogą być komuterowi gracze więc gra będzie trzymałą sobie kolekcję graczy (Collection<Player>) Twoja gra to memory więc plansza to jakaś kolekcja kwadracików z obrazkami (Collection<Tile>).

Teraz, co ta gra ma robić? Grę trzeba stworzyć na bazie jakiejśc konfiguracji (Game game = new Game(gameConfiguration);) a ta konfiguracja to nic innego jak specyfikacja graczy i tych obrazków. Grę można też rozegrać i wyciągnąć z niej rezultat (GameResult result = game.play();)
Taka metoda play to nic innego jak pętla (while(!finished()) { playRound();}) A metoda playRound() to kolejne ruchy graczy (for (Player p : gamePlayers) { player.playTurn();}), metoda playTurn() dla gracza to z kolei modyfikacja stanu gra na bazie akcji z przycisków itd, itd.

JavaFX średnio się nadaje do robienia gier ale da się to co chcesz zrobić ładnie ogarnąć. Jak już napiszesz kod logiki samej gry (np tak jak opisałem powyżej) to połącz go z kodem UI w jakiś sensowny sposób. No bo przecież klasa Tile to tak naprawdę może być Button albo jakiś inny Node a klasa Board to jakiś GridPane. Możesz to rozwiązać albo przez dziedziczenie albo przez kompozycję (ja bym wybrał ten sposób). Możesz wtedy stworzyć graficzne komponenty w SceneBuildrze a w kontrolerze do danego widoku opakujesz je w obiekty dziedzinowe (Board b = new Board(gridPane);)

Dodatkowo - nie używaj ifów jak da się inaczej (wzorzec Strategia), nie używaj zagnieżdżonych ifów, do celów diagnostycznych używaj loggera a nie System.out, pisz funkcje tak krótkie i proste jak się da. I do przodu ;)

0

W zasadzie @dymul już wszystko zajebiście opisał. Od siebie dodam tylko tyle, że jak zabieramy się za coś, o czym nie mamy pojęcia, to dobrze jest obejrzeć sobie jakiś tutorial, który traktuje o czymś podobnym. Chcesz zrobić memory? Popatrz jak się robi jakieś inne, łatwe planszówki w Javie. Dzięki temu będziesz miał ogólne pojęcie jak można rozplanować swój kod. Z tą wiedzą znacznie łatwiej będzie Ci napisać później coś swojego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1