Free Pascal中的退出代码201是什么?

时间:2018-03-16 07:28:29

标签: pascal freepascal

我尝试用Free Pascal制作一个简单的蛇游戏,当我启动程序时,它完全按照我想要的方式绘制了地图但是之后,我按下了我设置的按钮来控制蛇并退出退出代码201.

我对退出代码了解不多,你能解释一下程序的问题吗?这是我用Pascal做过的最长的程序。

以下是代码:

    uses crt;

    type 
      ran=record
        x:byte;
        y:byte;
      end;

    var 
      f:ran;
      s:array[1..1000] of ran;
      i,j:longint;
      st,l:byte;

    function getkey:integer;
    var 
      k:integer;
    begin
      k:=ord(readkey);
      if k=0 then k:=-ord(readkey);
      getkey:=k;
    end;

    procedure fa;
    begin
      randomize;
      f.x:=random(98)+1;
      f.y:=random(23)+1;
      gotoxy(f.x,f.y);
      writeln('o');
    end;

    procedure draw;
    begin
      gotoxy(1,1);
      st:=1;
      for i:=1 to 25 do begin
        for j:=1 to 100 do write('X');
        writeln
      end;
      gotoxy(st+1,st+1);
      for i:=1 to 23 do begin
        for j:=1 to 98 do write(' ');
        gotoxy(st+1,i+2);
      end;
    end;

    procedure sts;
    begin
      s[1].x:=19;
      s[1].y:=6;
      gotoxy(s[1].x,s[1].y);
      writeln('@');
    end;

    procedure fa1;
    begin
      f.x:=29;
      f.y:=5;
      gotoxy(f.x,f.y);
      writeln('o');
    end;

    procedure eat;
    begin
      if (s[1].x=f.x) and (s[1].y=f.y) then begin
        l:=l+1;
        fa;
      end;
    end;

    function die:boolean;
    begin
      die:=false;
      if (s[1].x=1) or (s[1].x=100) or (s[1].y=1) or (s[1].y=25) then 
        die:=true;
      if l>=5 then
        for i:=5 to l do
          if (s[1].x=s[i].x) and (s[1].y=s[i].y) then 
            die:=true;
    end;

    procedure up;
    begin
      for i:=l downto 2 do begin
        s[i].y:=s[i-1].y;
        gotoxy(s[i].x,s[i].y);
        writeln('+');
      end;
      gotoxy(s[l].x,s[l].y+1);
      writeln(' ');
      s[1].y:=s[1].y-1;
      gotoxy(s[1].x,s[1].y);
      writeln('@');
    end;

    procedure down;
    begin
      for i:=l downto 2 do begin
        s[i].y:=s[i-1].y;
        gotoxy(s[i].x,s[i].y);
        writeln('+');
      end;
      gotoxy(s[l].x,s[l].y-1);
      writeln(' ');
      s[1].y:=s[1].y+1;
      gotoxy(s[1].x,s[1].y);
      writeln('@');
    end;

    procedure left;
    begin
      for i:=l downto 2 do begin
        s[i].x:=s[i-1].x;
        gotoxy(s[i].x,s[i].y);
        writeln('+');
      end;
      gotoxy(s[l].x+1,s[l].y);
      writeln(' ');
      s[1].x:=s[1].x-1;
      gotoxy(s[1].x,s[1].y);
      writeln('@');
    end;

    procedure right;
    begin
      for i:=l downto 2 do begin
        s[i].x:=s[i-1].x;
        gotoxy(s[i].x,s[i].y);
        writeln('+');
      end;
      gotoxy(s[l].x-1,s[l].y);
      writeln(' ');
      s[1].x:=s[1].x+1;
      gotoxy(s[1].x,s[1].y);
      writeln('@');
    end;

    procedure auto(k:integer);
    begin
      case k of
        -72:up;
        -80:down;
        -75:left;
        -77:right;
        119:up;
        115:down;
        97:left;
        100:right;
      end;
    end;

    procedure ingame(t:integer);
    var 
      d,e:boolean;
    begin
      repeat
        auto(t);
        d:=die;
        if d=true then exit;
        eat;
      until (keypressed);
      if keypressed then t:=getkey;
      case t of
        -72:up;
        -80:down;
        -75:left;
        -77:right;
        119:up;
        115:down;
         97:left;
        100:right;
      end;
      eat;
      d:=die;
      if d=true then exit;
    end;

    procedure first;
    var
      k:integer;
    begin
      draw;
      fa1;
      sts;
      if keypressed then k:=getkey;
      ingame(k);
    end;

    BEGIN
      clrscr;
      first;
      readln
    END.

2 个答案:

答案 0 :(得分:1)

我用Google搜索了这个:201 : range error,所以你可能会超出数组边界。唯一的数组s由依赖于l值(奇怪的名称,BTW)的变量索引。但是我看到一个地方你改变(递增)这个变量,并没有看到任何l初始化。所以你使用任意起始值(这里可能为零,因为l是全局的)。

请注意,您可以通过简单的调试发现此错误(可能还有其他错误)。

答案 1 :(得分:0)

代码201似乎在这里解释:Runtime Error 201 at fpc

究竟为什么会在你的代码中发生这种情况,我不知道。