![]() |
![]() ![]() |
![]() |
Alien |
![]()
Сообщение
#1
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 14 Репутация: ![]() ![]() ![]() |
Привет люди! Давно я тут не появлялся... да вот с инетом были проблемы. Да не в этом суть. Написал простенькую игру. Пока без оформления, зато играет :) Но с багом. Ниже идет Код игры:
Код 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 |
![]()
Сообщение
#2
|
Гость ![]() |
Я понял, в чём проблема. Просто у тебя лишний раз используется
'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 |
![]()
Сообщение
#3
|
... ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 347 Пол: Мужской Репутация: ![]() ![]() ![]() |
Alien: спасибо за код, но мог бы его оформить правильно ;)
|
Alien |
![]()
Сообщение
#4
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 14 Репутация: ![]() ![]() ![]() |
=))) Ок, на будущее учту.
-------------------- В любом из нас спит гений. И с каждым днем все крепче...
|
![]() ![]() |
![]() |
Текстовая версия | 23.06.2024 16:24 |