Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Написание игр _ 2д ходилка, первая, по сути, моя игра

Автор: Alien 13.12.2003 12:40

Привет люди! Давно я тут не появлялся... да вот с инетом были проблемы. Да не в этом суть. Написал простенькую игру. Пока без оформления, зато играет :) Но с багом. Ниже идет Код игры:
 

Код
program first_game;
uses crt;
const
    n=10;{Размер игрового поля}
var
    pol:array[1..n,1..n] of shortint;{игровое поле}
    {i,g:integer;                     {счетчики( не нужны)}
       a:char; {кнопка передвижений по полю}
     i,x,y:integer;

label m3;

Procedure draw_pol;
var i,g:integer;
Begin

 for i:=1 to n do
  begin
   for g:=1 to n do
    write(pol[i,g]);
   writeln;
  end;
  gotoxy(1,1);{Переходим в "угол", чтоб массив рисовался на старом}

End;

Procedure jump(gravity:byte);
var a:char;
 label p_3,p_3_2;

Begin
   p_3:
 repeat
   pol[i,x]:=0;
   dec(i);
 pol[i,x]:=1;
  dec(gravity);
draw_pol;
delay(20000)
 until (gravity=0) or keypressed;

 if keypressed then begin
 a:=readkey;
 if gravity>0 then
  begin
   pol[i,x]:=0;
  if (a='s') or (a='ы') then inc(x);    {передвижение по полю}
  if (a='a') or (a='ф') then dec(x);    {в право-лево}
   pol[i,x]:=1;
   goto p_3;
  end
 else
    end;
End;

Procedure move_l_r;
var g:integer;
    a:char;

Begin

repeat
if keypressed then begin
a:=readkey;
pol[i,x]:=0;
if ((a='a') or (a='ф')) and (pol[i,x-1]<>2)  then dec(x); {Сдвигаем в лево перса}
if x<1 then x:=n;
if ((a='s') or (a='ы')) and (pol[i,x+1]<>2) then inc(x);  {Сдвигаем вправо перса}
if x>n then x:=1;
if (a='w') or (a='ц') then jump(3);   {Прыжок}



pol[i,x]:=1;
draw_pol;

end;
until (a=#27) or (pol[i+1,x]=0);
End;


Procedure go_down; {Падение игрока, основная программа}
label p_1,p_2;

Begin

 i:=0;
 p_1:
 repeat

 {inc(g);}
{  if g>n then g:=1;}

  inc(i);   {Увеличиваем падение(i) на 1}
  if i>n then
   begin
    i:=1; { Если падение больше размера массива то переносим в самый вверх!}
    pol[n,x]:=0;{и присваиваем нулю(пустому полю) место конца}
   end;

  pol[i-1,x]:=0;
  pol[i,x]:=1;

  draw_pol;

  delay(20000);

 until (pol[i+1,x]=2) or keypressed;

         a:=readkey;

  if pol[i+1,x]=2 then move_l_r;   {Если препятствие встречается ниже, тогд выход}
  if pol[i+1,x-1]=2 then  goto p_2; {Если препятствие левее и ниже(когда пререходишь по диоганали)}
  if pol[i+1,x+1]=2 then goto p_2; {Если препятствие правее и ниже(когда пререходишь по диоганали)}
  if pol[i,x-1]=2 then goto p_2;    {когда на равне с препятствием переходишь в лево}
  if pol[i,x+1]=2 then goto p_2;    {тоже самое но с права}

   pol[i,x]:=0;

  if (a='s') or (a='ы') then inc(x);    {передвижение по полю при падении}
  if (a='a') or (a='ф') then dec(x);    {в право-лево}


  if pol[i,x+1]=0 then goto p_1;
  p_2:
  if x<1 then x:=n;{Если левее грани поля, тогда переносим в правый конец}
  if x>n then x:=1;{аналогично, но влево}

  if a<>#27 then goto p_1 else exit;

End;

BEGIN
clrscr;

pol[4,1]:=2;  {устанавливаем препятствия}
pol[4,2]:=2;
pol[4,3]:=2;
pol[4,4]:=2;
pol[4,2]:=2;
pol[5,5]:=2;   {--||--}

x:=round(n/2);{по умолчанию начинаем падать с центра поля}

go_down;  {Выполням основную процедуру}

    {
readkey;}
END.


В общем все работает, но когда падает, то все работает хорошо, а когда стоит на препятствии, то ждет двойного нажатия клавиши. Тоесть один раз в основной процедуре, а потом в процедуре move_l_r . Как от этого избавиться не знаю. Мож кто подскажет? И еще, если все значения массива перевести в char (2 - '-', 1 -'*' 0 - ' ') то ничего не работает, или глючит. Когда как. Кстати, код КРАЙНЕ сырой, так что мелкие недочеты не считать (как то: при прыжке не просчитывается что сверху тоже может быть препятствие!!) Ну воть, все вроде.

Автор: Vbif 13.12.2003 15:40

Я понял, в чём проблема. Просто у тебя лишний раз используется
'READKEY' в игре. Я кое-что исправил:

Код
program first_game;
uses crt;
const
    n=10;{Размер игрового поля}
var
    pol:array[1..n,1..n] of shortint;{игровое поле}
    {i,g:integer;      {счетчики( не нужны)}
  a:char; {кнопка передвижений по полю}
i,x,y:integer;

label m3;

Procedure draw_pol;
var i,g:integer;
Begin

 for i:=1 to n do
  begin
   for g:=1 to n do
    write(pol[i,g]);
   writeln;
  end;
  gotoxy(1,1);{Переходим в "угол", чтоб массив рисовался на старом}

End;

Procedure jump(gravity:byte);
var a:char;
 label p_3,p_3_2;

Begin
   p_3:
 repeat
   pol[i,x]:=0;
   dec(i);
 pol[i,x]:=1;
  dec(gravity);
draw_pol;
delay(20000)
 until (gravity=0) or keypressed;

 if keypressed then begin
 a:=readkey;
 if gravity>0 then
  begin
   pol[i,x]:=0;
  if (a='s') or (a='ы') then inc(x);    {передвижение по полю}
  if (a='a') or (a='ф') then dec(x);    {в право-лево}
   pol[i,x]:=1;
   goto p_3;
  end
 else
    end;
End;

Procedure move_l_r;
var g:integer;
    a:char;

Begin
repeat

if keypressed then begin
a:=readkey;
pol[i,x]:=0;
if ((a='a') or (a='ф')) and (pol[i,x-1]<>2)  then dec(x); {Сдвигаем в лево перса}
if x<1 then x:=n;
if ((a='s') or (a='ы')) and (pol[i,x+1]<>2) then inc(x);  {Сдвигаем вправо перса}
if x>n then x:=1;
if (a='w') or (a='ц') then jump(2);   {Прыжок}


pol[i,x]:=1;
draw_pol;
end;

until (a=#27) or (pol[i+1,x]=0);
End;


Procedure go_down; {Падение игрока, основная программа}
label p_1,p_2;

Begin

 i:=0;
 p_1:
 repeat

 {inc(g);}
{  if g>n then g:=1;}

  inc(i);   {Увеличиваем падение(i) на 1}
  if i>n then
   begin
    i:=1; { Если падение больше размера массива то переносим в самый вверх!}
    pol[n,x]:=0;{и присваиваем нулю(пустому полю) место конца}
   end;

  pol[i-1,x]:=0;
  pol[i,x]:=1;

  draw_pol;

  delay(20000);

 until (pol[i+1,x]=2) or keypressed;



  if pol[i+1,x]=2 then move_l_r;   {Если препятствие встречается ниже, тогд выход}
  if pol[i+1,x-1]=2 then  goto p_2; {Если препятствие левее и ниже(когда пререходишь по диоганали)}
  if pol[i+1,x+1]=2 then goto p_2; {Если препятствие правее и ниже(когда пререходишь по диоганали)}
  if pol[i,x-1]=2 then goto p_2;    {когда на равне с препятствием переходишь в лево}
  if pol[i,x+1]=2 then goto p_2;    {тоже самое но с права}

   pol[i,x]:=0;
    If keypressed then
    begin
        a:=readkey;
  if (a='s') or (a='ы') then inc(x);    {передвижение по полю при падении}
  if (a='a') or (a='ф') then dec(x);    {в право-лево}
    end;

  if pol[i,x+1]=0 then goto p_1;
  p_2:
  if x<1 then x:=n;{Если левее грани поля, тогда переносим в правый конец}
  if x>n then x:=1;{аналогично, но влево}

  if a<>#27 then goto p_1 else exit;

End;

BEGIN
clrscr;

pol[5,1]:=2;  {устанавливаем препятствия}
pol[5,2]:=2;
pol[5,3]:=2;
pol[5,4]:=2;
pol[5,5]:=2;
pol[6,5]:=2;   {--||--}

x:=round(n/2);{по умолчанию начинаем падать с центра поля}

go_down;  {Выполням основную процедуру}

    {
readkey;}
END.


А вообще я советую использовать все считывания с клавиатуры в одной процедуре.

Автор: AlaRic 13.12.2003 16:54

Alien: спасибо за код, но мог бы его оформить правильно  ;)

Автор: Alien 21.12.2003 2:08

=))) Ок, на будущее учту.