IPB
ЛогинПароль:

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Игра Лабиринт, Не могу найти ошибку
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 50
Пол: Женский
Реальное имя: Сафиуллина Алёна

Репутация: -  1  +


Помогите пожалуйста найти ошибку в игре, мне её сдать завтра надо. Она сначала запускается, а потом вылетает. И, если можете, подскажите как сделать отсчёт таймера от начала игры.
Вот текст игры:

program LABIRINT;
uses graph,wincrt;
type
Ttab=array[1..10,1..10] of integer;
var

grdriver, grmode, errcode:integer;
count:integer;
key:char;
p:pointer;
Prize:integer;
nx,ny,dx,dy,ik,jk,i,j:integer;
gd,gm:integer;


const
Left=#75;
Up=#72;
Down=#80;
Right=#77;
Esc=#27;
Enter=#13;
Tab1: Ttab=
((0,0,0,0,4,0,0,0,0,0),
(0,3,0,0,1,0,0,0,3,4),
(0,1,0,1,1,0,3,1,1,0),
(0,1,1,1,0,0,0,0,1,0),
(0,0,0,3,0,0,0,1,1,0),
(0,1,1,1,1,0,1,1,0,0),
(0,3,0,0,1,3,1,0,0,0),
(0,1,1,0,0,1,0,0,1,0),
(0,0,1,1,0,1,1,3,1,0),
(0,0,0,2,0,0,0,0,0,0));
Tab2: Ttab=
((0,0,0,0,0,4,0,0,0,0),
(0,0,0,0,0,1,0,0,0,0),
(4,1,1,1,1,1,1,1,0,0),
(0,1,0,0,0,0,0,1,0,0),
(0,1,0,1,1,1,3,1,0,0),
(0,3,0,1,0,0,0,0,0,0),
(0,0,0,1,1,1,1,1,0,0),
(0,0,0,3,0,1,0,1,0,0),
(0,0,0,0,0,3,0,1,1,3),
(0,0,0,0,0,0,0,2,0,0));



Procedure help;
var
f:text;
s:string;
y:integer;
begin
assign(f,'help.pas');
reset(f);
setcolor(15);
settextstyle(0,0,1);
y:=20;
cleardevice;
while not(eof(f)) do
begin
readln(f,s);
outtextxy(50,y,s);
y:=y+20;
end;
close(f);
readkey;
cleardevice;
end;

Procedure AnalyseKey(Var Key:char; Var i,j,ik,jk:integer);
begin
key:=readkey;
if key=#0 then
begin
key:=readkey;
case key of
left:j:=jk-1;
right:j:=jk+1;
up:i:=ik-1;
down:i:=ik+1;
end;
end;
setcolor(0);
settextstyle(0,0,3);
outtextxy(450,200,'Стена');
end;


Procedure Init;
Begin
count:=0;
Prize:=0;
dx:=40;
dy:=30;
nx:=30;
ny:=5;
end;


Procedure PrCount(count:integer);
Var
st:string[3];
begin
setcolor(14);
STR(count,st);
setfillstyle(1,0);
bar(370,310,640,340);
settextstyle(0,0,2);
outtextxy(400,320,'‚ иЁ ®зЄЁ-'+st);
end;

Procedure DrawCol;
var
size:integer;
begin
setcolor(Yellow);
setfillstyle(1,Yellow);
circle(round(dx/2),round(dy/2),round(dx/4));
floodfill(round(dx/2),round(dy/2),Yellow);
size:=imagesize(0,0,dx,dy);
getmem(p,size);
getimage(0,0,dx,dy,p^);
end;


Procedure DrawLab(var ik,jk:integer);
Var
i,j:integer;
x,y:integer;
begin
x:=nx+dx*10+5;
y:=ny+dy*10+5;
setfillstyle(1,Cyan);
bar(nx-5,ny-5,x,y);
for i:=1 to 10 do
for j:=1 to 10 do
begin
x:=(j-1)*dx+nx;
y:=(i-1)*dy+ny;
case tab1[i,j] of

0:begin
setfillstyle(8,brown);
bar(x,y,x+dx,y+dy);
end;

1:begin
setfillstyle(1,White);
bar(x,y,x+dx,y+dy);
end;

2:begin
setfillstyle(i,White);
bar(x,y,x+dx,y+dy);
ik:=i;
jk:=j;
putimage(x,y,p^,xorput);
end;

3:begin
setfillstyle(1,LightGray);
bar(x,y,x+dx,y+dy);
Prize:=Prize+1;
end;

4:begin
setfillstyle(1,Yellow);
bar(x,y,x+dx,y+dy);
end;
end;
end;
end;

Procedure MoveLab(Var i,j,ik,jk:integer);
Var
x,y,xk,yk:integer;
Begin
if (i=ik) and(j=jk) then Exit;
x:=(j-1)*dx+nx;
y:=(i-1)*dy+ny;
xk:=(jk-1)*dx+nx;
yk:=(ik-1)*dy+ny;
case tab1[i,j] of
0:begin
sound(500);
delay(20);
count:=count-2;
PrCount(count);
setcolor(12);
settextstyle(0,0,3);
outtextxy(450,200,'Стена');
i:=ik;
j:=jk;
nosound;
end;

1:begin
putimage(x,y,p^,xorput);
putimage(xk,yk,p^,xorput);
tab1[ik,jk]:=1;
tab1[i,j]:=2;
ik:=i;
jk:=j;
end;

3:begin
count:=count+10;
PrCount(count);
setfillstyle(1,White);
bar(x,y,x+dx-1,y+dy-1);
putimage(x,y,p^,xorput);
putimage(xk,yk,p^,xorput);
tab1[ik,jk]:=1;
tab1[i,j]:=2;
ik:=i;
jk:=j;
end;

4:begin
putimage(x,y,p^,xorput);
putimage(xk,yk,p^,xorput);
setcolor(13);
settextstyle(0,0,3);
if count<Prize*9 then
begin
outtextxy(30,70,'Вы проиграли!');
outtextxy(30,70,'Вы не набрали очки!');
end
else
begin
outtextxy(30,70,'Вы выиграли!');
outtextxy(30,70,'Нажмите клавишу Esc');
end;
end;
end;
tab1:=tab2;
end;


Procedure game;
begin
init;
DrawCol;
cleardevice;
PrCount(count);
DrawLab(ik,jk);
repeat
i:=ik;
j:=jk;
AnalyseKey(Key,i,j,ik,jk);
MoveLab(i,j,ik,jk);
until key=Esc;
closegraph;
end;

Procedure zastavka;
Var c,n:integer;
Begin
Cleardevice;
repeat
c:=random(15)+1;
n:=random(500)+500;
sound(n);
setcolor©;
Settextstyle(0,0,3);
Outtextxy(250,40,'‹ ЎЁаЁ­в');
Outtextxy(250,100,' ўв®а ‘ дЁг««Ё­  Ђ«с­ ');
Outtextxy(250,150,'ЇаҐЇ®¤ ў вҐ«м ‡ «ҐўбЄЁ© Ђавс¬ Ђ«ҐЄб ­¤а®ўЁз');
Outtextxy(250,300, '­ ¦¬ЁвҐ «оЎго Є« ўЁиг');
delay(500);
Nosound;
Until keypressed;
Cleardevice;
End;


Procedure menu;
var
np:integer;
begin
setcolor(12);
settextstyle(0,0,3);
outtextxy(250,40,'Меню');
outtextxy(50,200,'1. Игра');
outtextxy(50,240,'2. Помощь');
outtextxy(50,280,'3. Выход');
setcolor(14);
settextstyle(0,0,2);
outtextxy(150,400,'‚Выберите нужный пункт и нажмите enter');
np:=1;
putimage(400,200+(np-1)*40,p^,1);
repeat
key:=readkey;
if key=#0 then
begin
key:=readkey;
putimage(400,200+(np-1)*40,p^,1);
case key of
up:if np>1 then np:=np-1;
down:if np<3 then np:=np+1;
end;
putimage(400,200+(np-1)*40,p^,1);
end;
until key=enter;
case np of
1:game;
2:help;
3:halt;
end;
end;


begin

initgraph(grdriver,grmode,'c:\bgi');
Randomize;
zastavka;
init;
repeat
menu;
until 1=2;

End.




Сообщение отредактировано: Eichhorn -


--------------------
Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Она сначала запускается, а потом вылетает.
Разумеется. Вот тут вылет происходит:

Цитата
        outtextxy(150,400,'‚Выберите нужный пункт и нажмите enter');
np:=1;
putimage(400,200+(np-1)*40,p^,1); { <--- Вот в этой самой строке }
А теперь - почему он происходит. Потому что ДО вызова Menu с указателем ничего не делалось, память не выделялась, новое значение указателю p не присваивалось. То есть, он равен nil... Итого, у тебя в программе одна из самых частых ошибок - "разыменование нулевого указателя". Вот как-то так ты делаешь:
Цитата
putimage(400, 200+(np-1)*40, nil^, 1);

Этого делать нельзя. В программе присутствует процедура DrawCol, в которой под p выделяется память, тебе надо вызвать ее перед обращением к меню...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 50
Пол: Женский
Реальное имя: Сафиуллина Алёна

Репутация: -  1  +


Спасибо!


--------------------
Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> setcolor©;

Кстати, как от этой замены избавиться?
На юкозе та же проблема.

Автору - если это для ТурбоПаса, то используй русские шрифты, а то я запустил и не понял, что надо делать. Смена шрифта на векторный делается, кажись, через SetTextStyle, файлы с русскими векторными шрифтами можно найти, можно скачать редактор векторных шрифтов с моего сайта.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 50
Пол: Женский
Реальное имя: Сафиуллина Алёна

Репутация: -  1  +


Это free paskal.
У меня он тоже язык искажает при загрузке..(
И не знаю как исправить..


--------------------
Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> И не знаю как исправить..

Я же сказал, что делать.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Цитата
Кстати, как от этой замены избавиться?
Не понял...
Прикрепленное изображение

А. Ну да. Пользуюсь FF со своей подсветкой синтаксиса, проблемы как не бывало... Если интересно - скажу, как установить такую подсветку. Возможно, и на Опере будет работать...

Цитата
Смена шрифта на векторный делается, кажись, через SetTextStyle
Для FPC это может не заработать. Там скорее всего придется идти другим путем. Чуть позже проверю...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Ну да. Пользуюсь FF со своей подсветкой синтаксиса, проблемы как не бывало...

Это делает браузер?
Я думал, сайт.

Кстати, кнопка отправки не нажимается. И только тогда, когда я отрубаю жабаскрипт, сразу страница оживает.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 50
Пол: Женский
Реальное имя: Сафиуллина Алёна

Репутация: -  1  +


А меню игры почему не открывается? Или там чего-то не хватает? Я просто сижу сейчас с методичкой в руках, там больше ничего не написано... Только то, что у меня в программе..


--------------------
Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Цитата
А меню игры почему не открывается? Или там чего-то не хватает?
Там слишком большие для FPC задержки. Попробуй уменьшить. Значит, смотри, для FPC последовательность такая:

0) вместо IDE Фри-Паскаля используем любой продвинутый текстовый редактор (у меня - SciTE);
1) исходник программы сохраняем в новый файл, в кодировке "UTF8 with BOM" (посмотри скриншот, я специально показал это меню) и правим текст сообщений (убираем кракозябры и пишем нормальные русские буквы smile.gif );
2) в самое начало кода пишем {$codepage utf8}
3) меняем устаревший Graph на более современный WinGraph, который абсолютно корректно работает с Юникодом, но его инициализацию придется сделать по-другому:
	grdriver := nopalette;
grmode := m800x600;
initgraph(grdriver, grmode, 'Alena');
;
4) не пользуемся "магическими константами" цветов (я же говорил об этом десятки раз, нет опять все пользуются 12 вместо LightRed. Ну, и к чему кроме проблем это приведет? WinGraph не будет работать с 12, зато будет с LightRed);
5) компилируем, запускаем и получаем вот такую картинку:
Прикрепленное изображение

Вот сам исходник в архиве:
Прикрепленный файл  lab_uni.zip ( 2.17 килобайт ) Кол-во скачиваний: 592

Я там пока просто поставил паузу при отрисовке меню, перед строкой где возникала ошибка, и закомментировал заставку.

(возражения вида "там где я буду сдавать нет этого редактора") - не принимаются smile.gif Вместо жмаканья по F7 в редакторе можно набрать fpc -B "F:\Programs\Pascal\lab_uni.pas" в командной строке, результат будет абсолютно тот же.

Как добиться аналогичного результата, используя только среду FPC - не знаю, у меня не русская Windows, так что проверить не смогу... Мой вариант работает везде (где есть юникод), независимо от настроек системы...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 50
Пол: Женский
Реальное имя: Сафиуллина Алёна

Репутация: -  1  +


Возражений вида "там где я буду сдавать нет этого редактора" и не будет) Я сдаю со своего ноутбука. Мне разрешили с него сдавать, тк я к нему долго паскаль найти не могла под Windows7. В итоге пишу на виртуальной ХР. Только я с редактором пока не могу разобраться... Он ошибку выдаёт при запуске этой программы..


--------------------
Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 50
Пол: Женский
Реальное имя: Сафиуллина Алёна

Репутация: -  1  +


Я тут с уровнями ещё косяки пытаюсь исправить. Программа не выходит с последнего уровня.
Вот что я исправила:

Procedure MoveLab(Var i,j,ik,jk:integer);
Var
x,y,xk,yk:integer;
Begin
if (i=ik) and(j=jk) then
Exit;
x:=(j-1)*dx+nx;
y:=(i-1)*dy+ny;
xk:=(jk-1)*dx+nx;
yk:=(ik-1)*dy+ny;
case tab[i,j] of
0:begin
sound(500);
delay(20);
count:=count-2;
PrCount(count);
setcolor(12);
settextstyle(0,0,3);
outtextxy(450,200,'Stena');
i:=ik;
j:=jk;
nosound;
end;

1:begin
putimage(x,y,p^,xorput);
putimage(xk,yk,p^,xorput);
tab[ik,jk]:=1;
tab[i,j]:=2;
ik:=i;
jk:=j;
end;

3:begin
count:=count+10;
PrCount(count);
setfillstyle(1,White);
bar(x,y,x+dx-1,y+dy-1);
putimage(x,y,p^,xorput);
putimage(xk,yk,p^,xorput);
tab[ik,jk]:=1;
tab[i,j]:=2;
ik:=i;
jk:=j;
end;

4:begin
putimage(x,y,p^,xorput);
putimage(xk,yk,p^,xorput);
setcolor(13);
settextstyle(0,0,3);
if count<Prize*9 then
begin
outtextxy(30,70,'Vi proigrali!');
outtextxy(30,70,'Vi ne nabrali ochki!');
end
else
begin
outtextxy(30,70,'Vi viygrali!!');
outtextxy(30,70,'nazhmite Esc');
cleardevice;
case uroven of
1:begin
tab:=tab2;
uroven:=2;
end;
end;
drawlab(ik,jk);
i:=ik;
j:=jk;
end;
end;
end;
end;


Procedure game;
begin

init;
uroven:=1;
tab:=tab1;
cleardevice;
PrCount(count);
DrawLab(ik,jk);
repeat
i:=ik;
j:=jk;
AnalyseKey(Key,i,j,ik,jk);
MoveLab(i,j,ik,jk);
until key=Esc;
closegraph;
end;



--------------------
Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Цитата
Только я с редактором пока не могу разобраться... Он ошибку выдаёт при запуске этой программы..
Показывай скриншот ошибки.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Пионер
**

Группа: Пользователи
Сообщений: 50
Пол: Женский
Реальное имя: Сафиуллина Алёна

Репутация: -  1  +


Вот:


Эскизы прикрепленных изображений
Прикрепленное изображение

--------------------
Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


"Не удаётся найти указанный файл".
Это означает, что программе не удалось найти указанный файл.
Вот и ищи строку, на которой вылетает, и исправь имя файла на существующее.
А если посмотреть на вывод ошибок, то видно, что это не ошибка, выдываемая при запуске, а ошибка компиляции - не удаётся найти модуль wingraph.
Программу сама писала?
Откуда относительно адекватный стиль кода в сочетании с неумением читать ответ компилятора?

Сообщение отредактировано: TarasBer -


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 50
Пол: Женский
Реальное имя: Сафиуллина Алёна

Репутация: -  1  +


Программу сама пишу. А с текстовыми редакторами я никогда не работала. Я вижу, что он файл найти не может, но не знаю почему... А программу пишу по методичкам, которые нам в библиотеке дали...


--------------------
Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Цитата
Я вижу, что он файл найти не может, но не знаю почему...
Вот этот самый WinGraph:
Прикрепленный файл  wingraph.zip ( 20.58 килобайт ) Кол-во скачиваний: 588


(тут мной было внесено несколько исправлений, люди на форумах жаловались, что модуль не всегда корректно работал. То, на что жаловались - пофиксил)

Распакуй этот файл туда же, в ту папку где лежит исходник, и перекомпилируй. Предупреждаю сразу: из-за кириллицы в пути тоже может возникнуть проблема. Нельзя положить исходники в другую папку, куда-нибудь в C:\MyProgs ?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Пионер
**

Группа: Пользователи
Сообщений: 50
Пол: Женский
Реальное имя: Сафиуллина Алёна

Репутация: -  1  +


Что значит эта ошибка?:


Эскизы прикрепленных изображений
Прикрепленное изображение

--------------------
Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гость






Где-то End пропущен, и по мнению компилятора ты внутрь одной процедуры пытаешься вставить другую...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Пионер
**

Группа: Пользователи
Сообщений: 50
Пол: Женский
Реальное имя: Сафиуллина Алёна

Репутация: -  1  +


О! Прогресс пошёл! Меню появилось! Только пока не работает...


--------------------
Жизнь похожа на собачью упряжку: если не идёшь впереди, то всё время видишь одно и то же...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 23.01.2022 4:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name