2

Стараюсь сделать,что бы кружки спавнились и шли по своей траектории. Для этого сделал координаты x и y массивами, но выдаёт ошибку.

До этого я x1 не представлял как массив, из-за чего кружки спавнились почти друг на друге. Помогите решить проблему.

В 129-й строке выдаёт ошибку №122 (ошибочная ссылка на переменную). Также, ошибка в 134-й, 143-й и 148-й строке.

В процедуре DVIG и GVIG_2 не могу обратиться к элементам массива(возможно неправильно указал) в строках кода "pologitel(630 - 15*nom);" и "otrec(630 - 15*nom);" выдаёт ошибку 122

program Kolobok;
uses crt, graph;
const n = 20;
var
y1:array[1..n] of integer;
x1:array[1..n] of integer;
x,y,p,o,i,nom,k,l,q:integer;
bool:boolean;
c:string;

procedure grafika;
var gd,gm:integer;
begin
     gd:=detect;
     gm:=0;
     Initgraph(gd,gm,'');
end;

procedure Solnce;
begin
     setfillstyle(1,9);
     bar(0,0,800,350);
     setfillstyle(1,10);
     bar(0,351,640,640);
     setcolor(14);
     circle(0,0,50);
     setfillstyle(1,14);
     floodfill(0,0,14);
end;

procedure POLOGITEL_spawn;
begin
     randomize;
     y1[q]:=250+random(50);
     setcolor(2);
     circle(630,y1[q],10);
     SetFillStyle(1,2);
     floodfill(630,y1[q],2);
end;

procedure pologitel(x1:array of integer);
begin
     setcolor(2);
     circle(x1[q],y1[q],10);
     setfillstyle(1,2);
     floodfill(x1[q],y1[q],2);
end;

procedure OTREC_spawn;
begin
     randomize;

     y1[q]:=250+random(50);
     setcolor(4);
     circle(630,y1[q],10);
     SetFillStyle(1,4);
     floodfill(630,y1[q],4);
end;

procedure otrec(x1:array of integer);
begin
     setcolor(4);
     circle(x1[q], y1[q], 10);
     setfillstyle(1, 4);
     floodfill(x1[q], y1[q], 4);
end;

procedure FON;
begin
     setfillstyle(1, 9);
     bar(0, 0, 800, 350);
     SetFillStyle(1, 10);
     bar(0, 351, 1000, 1000);
end;

procedure OLOBOK(y:integer);
begin
     y := 330;
     setcolor(14);
     circle(20, y, 20);
     SetFillStyle(1, 14);
     floodfill(20, y, 14);
end;

procedure random_spawn;
begin
     i := random(2);

     if i=1 then
     begin
          pologitel_spawn;
          p := p+1;
     end
     else
     begin
          otrec_spawn;
          o := o+1;
     end;

     k := k+1;
end;

procedure random_spawn_2;
begin
     l := random(2);

     if l=1 then
     begin
          pologitel_spawn;
          p := p+1;
     end
     else
     begin
          otrec_spawn;
          o := o+1;
     end;
     k := k+1;
end;

procedure DVIG;
begin
     if i=1 then
     begin
          pologitel(630 - 15*nom);
          K := k+1
     end
     else
     begin
          otrec(630 - 15*nom);
          k:=k+1;
     end;
end;

procedure DVIG_2;
begin
     if L=1 then
     begin
          pologitel(630 - 15*nom);
          K := k+1
     end
     else
     begin
         otrec(630 - 15*nom);
         k := k+1;
     end;
end;

begin
     grafika;

     Solnce;
     randomize;
     olobok(y);

     k := 0;
     q := 1;
     random_spawn;
     nom := 0;
     bool := true;

     while bool do
     begin
          delay(100);
          cleardevice;
          Solnce;
          olobok(y);
          nom:=nom+1;
          DVIG;

          if k = 3 then
          begin
               q := q+1;
               random_spawn_2;
               dvig_2;
               k := 0;
          end;

          if (630 - 15*nom < 30) then
             bool := false;

     end;
     readln;
end.
СOM
  • 61
  • Стараюсь сделать,что бы кружки спавнились и шли по своей траектории,для этого сделал координаты x и y массивами,но выдаёт ошибку. до этого я x1 не представлял как массив,из-за чего кружки спавнились почти друг на друге,помогите решить проблему. Так же,ошибка в 134,143 и 148 строке – СOM Jun 16 '18 at 08:42
  • А в каком именно месте ошибка? – gil9red Jun 16 '18 at 09:01
  • @gil9red , я указал,129,134,143 и 148 строка,там где происходит движение объектов(вычитается координата Х) – СOM Jun 16 '18 at 09:03
  • 1
    Вы серьезно думаете что я сейчас побегу искать все эти строки? Читайте про отладку – JVic Jun 16 '18 at 09:43
  • @JVic процедура DVIG и DVIG_2: pologitel(630 - 15nom); otrec(630 - 15nom); – СOM Jun 16 '18 at 09:53
  • Простите,что не отписал конкретно строку,раньше сидел на киберфоруме...привычка – СOM Jun 16 '18 at 09:59
  • @COM, На ruSO довольно много правил и по-началу тяжело ориентироваться. Поэтому, пожалуйста, прочтите (для начала) этот пункт справки — «Как задать хороший вопрос». – eanmos Jun 16 '18 at 10:12
  • 4
    @COM, пара слов о том, как вы можете улучшить вопрос... Во-первых, совсем не понятно, что делает ваша программа (что за кружочки?). Во-вторых, очень много непонятного кода, всем просто лень разбираться в этой простыне. Ну и в-третьих, как вы могли заметить, на этом сайте в листингах нет нумерации строк, поэтому сообщения типа «ошибка в n-ой строке» несколько неинформативны. – eanmos Jun 16 '18 at 10:32
  • @eanmos ,спасибо,дам ответ,я пишу игру на паскале(курсовая работа),суть такова-есть жёлтый круг(колобок) он стоит на месте,а ему на встречу должны лететь "очки",эти самые кружки(красные и зелёные),они "спавнятся" и при своём спавне должны изменять свою координату "Х"(для каждого индивидуально),я для этого создал массив,но воспользоваться им не могу,при попытке пишет данную ошибку(122) в следующий раз буду корректнее задавать вопрос,спасибо за совет – СOM Jun 16 '18 at 10:39
  • @СOM, все это вам нужно добавить в ваш вопрос. Под вопросом есть кнопка-ссылка «править». Я так понимаю, ваш вопрос в том, как обратиться к элементам этого массива? Напишите, в какой процедуре выходит ошибка, а то в 122-й строке я не вижу ничего связанного с массивами. – eanmos Jun 16 '18 at 10:44
  • @eanmos,спасибо,корректировку сделал – СOM Jun 16 '18 at 10:53

1 Answers1

1

Посмотрите на объявление процедур pologitel и otrec. Им парметром должен передаваться массив целых чисел array of integer.

procedure pologitel(x1:array of integer);
begin
     setcolor(2);
     circle(x1[q],y1[q],10);
     setfillstyle(1,2);
     floodfill(x1[q],y1[q],2);
end;

procedure otrec(x1:array of integer);
begin
     setcolor(4);
     circle(x1[q], y1[q], 10);
     setfillstyle(1, 4);
     floodfill(x1[q], y1[q], 4);
end;

Теперь посмотрите как вы их вызываете:

procedure DVIG;
begin
     if i=1 then
     begin
          pologitel(630 - 15*nom); // ???
          K := k+1
     end
     else
     begin
          otrec(630 - 15*nom); // ???
          k:=k+1;
     end;
end;

procedure DVIG_2;
begin
     if L=1 then
     begin
          pologitel(630 - 15*nom); // ???
          K := k+1
     end
     else
     begin
         otrec(630 - 15*nom); // ???
         k := k+1;
     end;
end;

Ничего не смущает?

Результатом вычисления значения выражения 630 - 15*nom будет целое число, а никак не массив. Таким образом, вместо массива целых чисел, вы пытаетесь передать целое число. Отсюда и все ваши ошибки.

kot-da-vinci
  • 3,610