2010-10-20 4 views
-1

Hé les gars, merci pour l'aide précédente Avant d'essayer d'expliquer mon problème, vous devez savoir de quoi parle le code. C'est à peu près "Pour écrire un jeu dans lequel un utilisateur doit deviner un nombre aléatoire entre 1 et 1000. Le programme devrait lire un nombre du clavier, et imprimer si la supposition était trop haute, trop basse ou correcte. a deviné correctement, le programme imprime le nombre de devinettes faites et le temps et le nom de joueur.Quand un jeu est lancé le programme doit imprimer la liste entière des meilleurs scores, triés par le nombre de suppositions en ascendant "Problèmes liés à l'utilisation d'une minuterie en Java. Le minuteur ne mettra pas à jour

Le problème est lorsque vous jouez le jeu et quand vous parvenez à obtenir la bonne réponse, il ne montre pas l'heure, mais quand le highscore est imprimé, il montre là, Whats up avec cela parce que essayé de changer la déclaration booléenne, mais cela ne fonctionne pas. Voici une illustration du problème:

You guessed 2 times in 0 seconds. 
Please enter your name. 
gert 
Want to go again?(y/n).....n 
HighScore: 
Tries  Time  Name 
1    35  b 
2    6   gert 

donc en gros je suis assez coincé, j'espérais que les gars u pourrait me donner quelques conseils ou une sorte d'aide pour que je puisse résoudre le problème ,,,,, Toute aide est appréciée .... BTW c'est mon premier programme, fondamentalement encore dans la phase d'apprentissage Alors, prenez-le facile avec les commentaires. Le code est fourni ci-dessous:

import java.util.*; 
import java.util.Scanner.*; 
import java.util.ArrayList.*; 
import java.util.Collections.*; 


public class Main { 
private static void start() { 


int tries = 0 ; 

int guess = -1; 
String name ; 
String quit = "quit"; 
String y = "yes"; 
String n = "no"; 
String currentGuess; 


String another = ("y") ; 
Scanner input = new Scanner (System.in); 

ArrayList<Integer> score = new ArrayList<Integer>(); 
ArrayList<Long> tg = new ArrayList<Long>(); 
ArrayList<String> playern = new ArrayList<String>(); 



boolean a=false; 

    do { 
     a=false; 
    int answer = (int) (Math.random() * 1000 + 1) ; 
    System.out.println(" Welcome to Guessing Game ") ; 
    System.out.print("Please enter a number between 1 and 1000 : "); 
        currentGuess = input.nextLine(); 
      long startTime = System.currentTimeMillis(); 


     do 
     { 


       if (currentGuess.equalsIgnoreCase(quit)) 
     { 
      System.out.println("Leaving Us So Soon?"); 
      System.exit(0); 
     } 

       try { 
      guess = Integer.parseInt(currentGuess); 
       } catch (NumberFormatException nfe) 
         { 
      System.out.println(" Dude Can You Read, Only Digits "); 
         currentGuess = input.nextLine(); 
         continue; 



      } 

     if (guess < 1 || guess > 1000) 
     { 
      System.out.println("Stupid Guess I Wont Count That."); 
         currentGuess = input.nextLine(); 
         continue; 
     } 

     if (guess < answer) 
      { 
      System.out.println("too low "+answer); 
      currentGuess = input.nextLine(); 
         tries++; 
     } 


    else if(guess > answer) 
     { 
      System.out.println("too high "+answer); 
      currentGuess = input.nextLine(); 
         tries++; 
     } 


    else if (guess == answer) 
     {  
      //stop stop watch 
      long endTime = System.currentTimeMillis(); 
      //calculate game time 
      long gameTime = endTime - startTime; 
         gameTime = (gameTime/1000); 
      System.out.println("You Rock Dude, Good Job!"); 


         System.out.println("You guessed " + tries + " times in " + (int)(gameTime/1000) + " seconds."); 
         System.out.println("Please enter your name."); 
          name = input.nextLine(); 

          score.add(tries) ; 
          playern.add(name); 
          tg.add(gameTime); 

          for (int g=0; g < score.size()-1; g++){ 
           for (int b=g+1; b < score.size(); b++){ 
            if (score.size()>1){ 
            if (score.get (g) > score.get (b)){ 
            Collections.swap(score, g, b); 
            Collections.swap(playern, g, b); 
            Collections.swap(tg, g, b); 

            } 
            } 
            if (score.get (g)==score.get(b) && tg.get (g) > tg.get(b)) 
            { 
            Collections.swap(score, g, b); 
            Collections.swap(playern, g, b); 
            Collections.swap(tg, g, b); 
            } 
           } 

          } 



      boolean s = false ; 
      while (s==false) 
       { 


        System.out.print("Want to go again?(y/n)....."); 
        currentGuess = input.nextLine(); 
         if (currentGuess.matches("y")) 
      { 

         System.out.println("HighScore:"); 
         System.out.println("Tries\tTimentName"); 
        for (int j=0; j<score.size(); j++){ 
        System.out.println(score.get(j) +"\t"+tg.get(j)+ "\t"+playern.get(j)); 
          } 


       } 

        s=true; 

      } 

        //if user doesn't want to play again 

          if (currentGuess.matches("n")) 
          { System.out.println("HighScore:"); 
           System.out.println("Tries\tTime\t\tName"); 
       for (int j=0; j<score.size(); j++){ 
       System.out.println(score.get(j) +"\t"+tg.get(j)+ "\t"+playern.get(j)); 
          } 


           System.out.println("Thanx For Playing."); 
       a=true; 

           s=true; 
           System.exit(0); 
        } 
     } 



     } while (guess != answer); 

    }while(a==false); 

} 

public static void main(String[] args) { 
    Main.start(); 
    } 
} 
+9

Existe-t-il une option «fermer pour un titre ennuyeux»? –

+0

Pouvez-vous haz le debugz mon codez? –

+0

Il a été édité avec reconnaissance. – Jivings

Répondre

7

d'abord vous diviser le temps ici

long gameTime = endTime - startTime; 
gameTime = (gameTime/1000); 

puis à nouveau ici

System.out.println("You guessed " + tries + " times in " + (int)(gameTime/1000) + " seconds."); 

pas étonnant que vous obtenez 0 :). donc, ne divisez pas à nouveau, mettez simplement gameTime

puis lorsque vous ajoutez à la liste Array tg vous ajoutez tg.add(gameTime); qui est l'heure correcte, c'est pourquoi lorsque vous listez les scores, cela fonctionne.

1

Un certain nombre de choses ici.

D'abord, il n'y a pas de Timer utilisé ici. Vous synchronisez quelque chose en termes de temps réel, mais en Java, un Timer (tel que java.util.Timer) est un objet qui planifie une tâche répétée. Deuxièmement, vous devriez essayer de diviser votre code en plus petites méthodes. Ces longues boucles do/while imbriquées sont très difficiles à lire car vous ne pouvez pas voir la boucle entière sans défilement. Essayez de raccourcir vos méthodes et utilisez plusieurs méthodes. Mais, pour répondre à votre question sur l'heure, vous divisez l'heure par 1000 deux fois lorsque vous essayez de l'afficher. Votre ligne d'affichage est

System.out.println("You guessed " + tries + " times in " + (int)(gameTime/1000) + " seconds."); 

Mais vous avez déjà divisé gameTime ci-dessus

long gameTime = endTime - startTime; 
gameTime = (gameTime/1000); 

donc à l'écran, vous n'êtes pas réellement modifier à nouveau gameTime (ce qui est la raison pour laquelle il stocke la valeur correcte), mais vous affichez gameTime/1000 (même si elle a déjà été divisée par 1000 une fois).

0

C'est également une bonne chose pour un développeur débutant de suivre les règles d'indentation simples que vous avez (heureusement) appris.

De même, vous ne devriez pas écrire quelque chose comme while(a==false); si a est un booléen, écrivez juste (a).

Dans ce cas, vous n'avez pas non plus besoin d'utiliser une boucle do - while. Une boucle while sera plus adaptée.

Questions connexes