2017-03-25 4 views
-2

J'ai écrit ce programme de pendu en Pascal et j'ai regardé ce problème pendant un certain temps et n'aboutissant à rien. J'ai d'abord pensé que l'entrée lisait un \n aussi, mais un peu de write() plus tard et ce n'était pas le cas. ce qui se passe lorsque je tape a, il passe par la boucle et fait tout correctement, mais il passe ensuite à nouveau avec rien ou un nouveau caractère de ligne ou quelque chose qui n'est pas visible. J'ai essayé de m'assurer que guess obtient seulement un caractère, mais cela l'a fait boucler plusieurs fois avec le caractère non-visible.Alors que la boucle s'exécutait une fois (?)

Si quelqu'un peut vous donner une idée de ce qui ne va pas ici, ce serait génial. Google n'était en fait pas une très grande aide pour une fois

de toute façon, merci pour tout ce que vous pouvez offrir.

program p1; 
const 
    MAX_GUESSES = 6; 
    mysteryWord = 'abomination'; 
    //comparetext(str1,str2); 
type 
    word = array[0 .. 11] of char; 
var 
    guesses : word; 
    counter : integer;//for multipurpose counting ;) 
    wrong : integer; 
    keepGoing : boolean; 
    guess : char; 
    exists : boolean; 
begin 
    guesses := '***********'; 
    wrong := 0; 
    keepGoing := true; 
    repeat 
    keepGoing := false; 
    exists := false; 
    writeln('your word is ' + guesses + '.'); 
    write('You have ');   //this one line is separated into 3 
    write(6-wrong);    //because it wont allow (6-wrong) to 
    writeln(' wrong guesses left!');//be put in line with strings. 
    write('Guess a letter: '); 
    read(guess); 
    for counter := 0 to 11 do 
    begin 
     if (guess = mysteryWord[counter]) then 
     begin 
     guesses[counter-1] := guess; 
     exists := true; 
     end; 
    end; 
    if(exists = false) then wrong := wrong + 1; 
    for counter := 0 to 11 do 
    begin 
     if(guesses[counter] = '*') then keepGoing := true; 
    end; 
    until ((wrong >= 6) or (keepGoing = false)); 

end. 
+2

"pour compteur: = 0 à 11". Les chaînes sont basées sur "1". –

+0

Cela ne change rien. – roflcopter1101

+1

Ok. Ensuite, continuez d'accéder aux 0ème et -1ème éléments de votre chaîne. –

Répondre

1

Si vous remplacez la ligne lire (deviner); avec readln (deviner); vous obtiendrez seulement un caractère par boucle.

Si vous obtenez remplacer la ligne word = array [0 .. 11] de char; avec word = array [1 .. 11] de char; (ou bien se débarrasser complètement du type 'mot' inutile et définir des suppositions sous la forme d'une chaîne), exécutez vos boucles de 1 à 11 et remplacez la ligne devesses [counter-1]: = guess; avec devine [compteur]: = deviner;, votre programme n'aura pas l'erreur d'accéder à des emplacements de tableau hors-limites.

En outre, il peut être agréable (quand vous enfin sortir de la boucle de répétition) pour fournir un texte de sortie indiquant le joueur s'ils ont gagné ou perdu le match ...

... et vous pouvez également remplacer les trois les lignes écrivent ('Vous avez'); écrire (6-faux); writeln ('mauvaises suppositions à gauche!');, avec la seule ligne writeln ('Vous avez', 6 - faux, 'devinez fausses!');

+0

MERCI !!! Dans tous les sites de didacticiels que j'ai regardés, rien n'a rien dit à propos de la fonction readln(), je n'ai même jamais pensé à essayer de faire quelque chose comme ça. Je prévois d'avoir les choses à la fin de la boucle, je voulais juste corriger cette erreur. – roflcopter1101