我正在帕斯卡(一个真正的初学者)制作一个简单的文字游戏。有一个常规例程,重复几次( cycle 变量,表示级别)。在例程的开头,有一个部分要求提供字符的名称。如果一般重复循环完成或在某个级别(1-4)中止,则游戏返回到第一种菜单。我希望这个名字只是第一次被问到,但是,当然,我得到“变量”周期“似乎没有被初始化”警告。有没有办法重构代码以避免它? 感谢。
代码摘录(留下不必要的细节):
program rpg_text_game;
var
game_action:char;
name:string;
cycles:1..5;
begin
repeat
writeln('Welcome to the game.');
writeln('To continue press "g",');
writeln('to read the license of this game press "i",');
writeln('and to quit press "q" and "enter": ');
readln(game_action);
case game_action of
'i', 'I':
{shows license}
'g', 'G':
{game begins}
if not (cycles in [2,3,4,5]) then
begin
writeln('Please enter your name: ');
readln(name);
end;
repeat
cycles:=1; //is initialized here
{actual game process - score is calculated based on *cycles* amount, that adds +1 with each tick ("if success then cycles:=cycles+1")}
{cycles - 1,2,3,4,5}
writeln('Do you want to try again, y/n?');
readln(game_action);
until(game_action='n') or (game_action='N');
until (game_action='q') or (game_action='Q');
writeln();
writeln('Press enter to quit');
readln();
end.
那么,如何初始化/更改 cycles 变量(甚至是其他任何变量)以避免该消息而不是通过关闭编译器提示选项来作弊?
答案 0 :(得分:3)
如果cycle是一个全局变量,就像你的示例代码一样,那么在你开始任何事情之前,只需在程序的主程序块中执行:
begin
cycles := 1;
game_action := Chr(0);
{ etc... }
...
end.
这就是您通常初始化全局变量的方式:在主begin
/ end.
块中。某些版本的Pascal也允许(对于全局变量):
var
cycles: 1..5 = 1;
{ etc... }
但其他人不知道。我不知道你的Pascal是否允许它。如果是这样,您将不再需要在主块中初始化。但请注意,这可能不适用于function
或procedure
的局部变量。在那里,您可能必须使用函数或过程的(外部)begin
/ end;
块。
FWIW,程序的主要部分通常可以在程序的最后找到const
,type
,var
,{{1 }和procedure
声明,以点(function
)结尾。
另请注意,评论是正确的:将您的程序拆分为单独的函数和过程,每个函数和过程都有自己的单个任务,并传递所需的任何信息。不要编写单片代码块。这很难阅读,难以维护。例如,对于每个(或大多数)案例项,使用必要的参数创建一个单独的过程,并从case语句中调用它们。这使您的代码更容易阅读,也适合您。
答案 1 :(得分:2)
在代码循环的第一次迭代中,在初始化之前读取循环(通过IF NOT(在[]中循环))。编译器正确地发出警告。
解决方案很简单,在第一次REPEAT之前初始化它,或者如果你更加反对帕斯卡风格,就像Rudy说的那样。