Код
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.
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 - ' ') то ничего не работает, или глючит. Когда как. Кстати, код КРАЙНЕ сырой, так что мелкие недочеты не считать (как то: при прыжке не просчитывается что сверху тоже может быть препятствие!!) Ну воть, все вроде.