2011-09-16 6 views
1

J'essaie de comprendre pourquoi mon programme imprime la même instruction à plusieurs reprises. Je suis capable de faire fonctionner cette méthode correctement quand je mets de bonnes valeurs, mais j'ai une autre instruction mise en place pour attraper les sélections invalides. Quand mon instruction else s'exécute, elle imprime infiniment et la boucle while ne commence jamais. Je ne peux pas comprendre. Je vais coller toute la méthode, mais en gras la zone à problème. J'espère que ceci est clair.Alors que la boucle est bloquée en boucle infinie

public static int[][] placeCheese(int [][] gameBoard, String Player1Name) 
{ 
    Scanner console = new Scanner(System.in); 
    int turnTaker = 0; 
    int validRow = 0; 
    int validCol = 0; 
    int RowIndex = -1; 
    int ColIndex = -1; 
    while(turnTaker == 0) 
    { 
     while(validRow == 0) 
     { 
      System.out.println(Player1Name + ", please place your cheese by choosing a row, or choose -1 to exit."); 
      RowIndex = console.nextInt() -1; 
      if(RowIndex < gameBoard.length && RowIndex >=0) 
      { 
       validRow++; 
      } 
      else if(RowIndex == -2) 
      { 
       System.out.println("Thanks for playing, " + Player1Name + " has forfeited!"); 
       System.exit(0); 
      } 
     } 
     while(validCol == 0){ 
      System.out.println(Player1Name + ", please place your cheese by choosing a column, or choose -1 to exit."); 
      ColIndex = console.nextInt() -1; 
      if(ColIndex < gameBoard.length && ColIndex >=0) 
      { 
       validCol++; 
      } 
      else if(RowIndex == -2) 
      { 
       System.out.println("Thanks for playing, " + Player1Name + " has forfeited!"); 
       System.exit(0); 
      } 
     } 
    if(gameBoard[RowIndex][ColIndex] == 0) 
    { 
     gameBoard[RowIndex][ColIndex] = 1; 
     turnTaker++; 
     numPieces1--; 
    } 
    else 
    { 
     System.out.println("this space is already occupied, please choose again."); 
    } 
    return gameBoard; 
} 
+1

S'il vous plaît essayer de formater le code en quelque chose de plus lisible .. – nfechner

+0

Gah J'étais en train de l'édition et il ne m'a pas permis de le sauvegarder. –

+0

Que voyez-vous si vous déboguez quand il est entré dans une boucle infinie? Cet outil est susceptible de vous aider à résoudre le problème car c'est ce à quoi il sert. –

Répondre

2

La première fois que cette fonction est appelée, elle vous oblige à fournir des numéros de colonne et de ligne valides. le carré sera réglé, turnTaker sera incrémenté, et la boucle se terminera.

La deuxième fois est appelée, si les numéros de ligne et de colonne choisis sont les mêmes, alors turnTaker sera pas être incrémentée parce que l'endroit choisi dans le tableau n'est pas 0. Comme validRow et validCol ne sont pas 0, en outre, il ne vous demandera jamais plus de numéros - il va juste aller dans une boucle sans fin d'imprimer le message sans jamais demander à nouveau! Votre clause "else" qui imprime le message peut résoudre ce problème en définissant validRow et validCol à 0 à nouveau. Comme quelqu'un d'autre l'a souligné, il vaudrait mieux que ces variables et turnTaker soient aussi des booléens, et non des ints.

+0

Je viens de remarquer la même chose. Je vous remercie! – madamsmall

+0

Alors peut-être upvote/accepter, puisque j'ai pris le temps? –

+0

Oh désolé pas sûr de savoir comment faire cela, va le comprendre :) – madamsmall

0

Vous ne changez pas la valeur de TurnTaker, donc il restera toujours nul.

+0

Oh whoops! Je l'ai posté avant la modification, et maintenant je vois le reste du code – CamelBlues

1

Votre code est illisible mais si je devais deviner je dirais que vous ne changiez pas TurnTaker dans votre déclaration else. Boucle infinie!