fpc:如何初始化全局变量

时间:2017-06-01 22:35:14

标签: pascal freepascal 2d-games text-based

我正在帕斯卡(一个真正的初学者)制作一个简单的文字游戏。有一个常规例程,重复几次( 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 变量(甚至是其他任何变量)以避免该消息而不是通过关闭编译器提示选项来作弊?

2 个答案:

答案 0 :(得分:3)

如果cycle是一个全局变量,就像你的示例代码一样,那么在你开始任何事情之前,只需在程序的主程序块中执行:

begin
  cycles := 1;
  game_action := Chr(0);
  { etc... }
  ...
end.

这就是您通常初始化全局变量的方式:在主begin / end.块中。某些版本的Pascal也允许(对于全局变量):

var
  cycles: 1..5 = 1;
  { etc... }

但其他人不知道。我不知道你的Pascal是否允许它。如果是这样,您将不再需要在主块中初始化。但请注意,这可能不适用于functionprocedure局部变量。在那里,您可能必须使用函数或过程的(外部)begin / end;块。

FWIW,程序的主要部分通常可以在程序的最后找到consttypevar,{{1 }和procedure声明,以点(function)结尾。

另请注意,评论是正确的:将您的程序拆分为单独的函数和过程,每个函数和过程都有自己的单个任务,并传递所需的任何信息。不要编写单片代码块。这很难阅读,难以维护。例如,对于每个(或大多数)案例项,使用必要的参数创建一个单独的过程,并从case语句中调用它们。这使您的代码更容易阅读,也适合您。

答案 1 :(得分:2)

在代码循环的第一次迭代中,在初始化之前读取循环(通过IF NOT(在[]中循环))。编译器正确地发出警告。

解决方案很简单,在第一次REPEAT之前初始化它,或者如果你更加反对帕斯卡风格,就像Rudy说的那样。