while循环执行一次(?)
While loop executing once(?)
我一直在用 Pascal 编写这个 hangman 程序,我研究这个问题已经有一段时间了,但一无所获。我最初认为输入也在读取 \n
,但稍后 write()
一点点,情况并非如此。当我输入 a
时会发生什么,它通过循环并正确执行所有操作,但随后它再次通过时没有任何内容或换行符或不可见的内容。我试过确保 guess
只得到一个字符,但这使得它用不可见的字符循环了很多次。
如果有人可以就这里出现的问题提供任何类型的意见,那就太好了。 Google 一次实际上帮助不大
无论如何,感谢您提供的一切。
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.
如果将 read(guess); 行替换为 readln(guess);,则每个循环只会得到一个字符。
如果你得到 word = array[0 .. 11] of char; 替换为 word = array[1 .. 11] of char ;(或者完全删除不必要的 'word' 类型并将猜测设置为字符串),运行 从 1 到 11 的循环,并替换行 guesses[counter-1] := guess; 和 guesses[counter] := guess;,你的程序不会出现访问越界的错误数组位置。
另外(当您最终退出重复循环时)提供一些输出文本告诉玩家他们是赢了还是输了游戏可能会很好...
...你也可以替换三行 write('You have ');写(6错); writeln('还剩下错误的猜测!');,单行 writeln('You have ', 6 - wrong, '还剩下错误的猜测!');
我一直在用 Pascal 编写这个 hangman 程序,我研究这个问题已经有一段时间了,但一无所获。我最初认为输入也在读取 \n
,但稍后 write()
一点点,情况并非如此。当我输入 a
时会发生什么,它通过循环并正确执行所有操作,但随后它再次通过时没有任何内容或换行符或不可见的内容。我试过确保 guess
只得到一个字符,但这使得它用不可见的字符循环了很多次。
如果有人可以就这里出现的问题提供任何类型的意见,那就太好了。 Google 一次实际上帮助不大
无论如何,感谢您提供的一切。
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.
如果将 read(guess); 行替换为 readln(guess);,则每个循环只会得到一个字符。
如果你得到 word = array[0 .. 11] of char; 替换为 word = array[1 .. 11] of char ;(或者完全删除不必要的 'word' 类型并将猜测设置为字符串),运行 从 1 到 11 的循环,并替换行 guesses[counter-1] := guess; 和 guesses[counter] := guess;,你的程序不会出现访问越界的错误数组位置。
另外(当您最终退出重复循环时)提供一些输出文本告诉玩家他们是赢了还是输了游戏可能会很好...
...你也可以替换三行 write('You have ');写(6错); writeln('还剩下错误的猜测!');,单行 writeln('You have ', 6 - wrong, '还剩下错误的猜测!');