2017-03-25 130 views
-2

我一直在Pascal編寫這個hang子手程序,我一直在看這個問題一段時間,並且無處可去。我原本以爲輸入內容也是\n,但後來有點write(),事實並非如此。當我輸入a時,會發生什麼情況,它會經過循環並執行正確的操作,但隨後它會再次通過任何內容或新的行字符或不可見的內容。我試過確保guess只能得到一個字符,但這使得它與無法看到的字符無數次循環。雖然循環執行一次(?)

如果任何人都可以提供任何關於哪裏出錯的信息,那就太棒了。谷歌其實不是一個非常大的幫助,一旦

無論如何,謝謝你可以提供的任何東西。

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

「for counter:= 0 to 11 do」。字符串是「1」的。 –

+0

這不會改變任何東西。 – roflcopter1101

+1

好的。然後繼續訪問字符串的第0個和第-1個元素。 –

回答

1

如果更換線讀(猜測);readln(guess);每個循環只能得到一個字符。

如果你得到替換行char = array [0..11] char;char =數組[1..11];(或交替擺脫不必要的'單詞'類型,並設置猜測作爲一個字符串),運行你的循環從1到11,並替換行猜測[counter-1]:= guess;猜測[counter]:= guess;,你的程序不會有訪問超出範圍數組位置的錯誤。

此外,它可能是好的,(當你終於退出重複循環)提供一些輸出文本告訴球員,如果他們贏了還是輸了比賽......

...你也可以更換三行write('You have');寫(6-錯); writeln('錯誤的猜測離開!');,單行writeln('你有',6 - 錯誤,'錯誤的猜測離開!');

+0

謝謝!在我看到的所有教程網站中,沒有任何關於readln()函數的內容,我從來沒有想過要嘗試這樣做。我打算在循環結束時使用這些東西,我只是想修正這個錯誤。 – roflcopter1101