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

> Игра с корабликами, графический режим
сообщение
Сообщение #1





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

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


Привета!
Задача формулировалась преподом довольно размыто, поэтому может присутствовать некоторая вольность в выполнении, что не может не радовать. Смысл в том, чтоб написать на Pascal (к сожалению) игру, в которой есть кораблики, соревнующиеся между собой Препод седой уже, кстати. Он хотел там видеть возможность выбора направления ветра и хода корабликов галсами при встречном ветре, но реализовать управление парусами, по-моему, слишком сложно, а как без этого галсами ходить? Поэтому реализация мне видится так: вид сверху на остров либо замкнутый кольцевой канал, один кораблик с мотором, цель игры - управляя корабликом стрелками пройти дистанцию за наименьшее время. Если у кого-то возникнет желание помочь или вдруг есть какие-то наработки, буду очень признателен.
Вот код:
program MAPA3M;
uses crt, graph;
var
Gd,Gm:integer;
posX,posY:integer;
ch:char;

procedure bereg;
begin
setcolor(yellow);
setfillstyle(7,yellow);
sector(280,200,0,360,100,50);
sector(360,200,0,360,80,80);
sector(280,280,0,360,120,70);
sector(360,280,0,360,60,75);
sector(15,450,0,360,55,80);
sector(260,460,0,360,60,30);
sector(600,470,0,360,150,30);
sector(15,410,0,360,20,80);
sector(30,20,0,360,40,25);
sector(500,0,0,360,90,50);
sector(600,15,0,360,80,50);
sector(630,230,0,130,50,100);
sector(610,160,0,120,50,120);
sector(610,450,0,110,75,100);
sector(650,350,0,220,60,100);
sector(140,15,0,200,80,30);
sector(200,20,0,360,100,50);
sector(60,150,60,220,150,200);
sector(150,30,0,360,100,100);
sector(5,240,30,330,40,90);
sector(630,240,0,360,70,100);
sector(360,5,0,360,100,30);
sector(630,240,110,300,70,100);
sector(0,280,0,360,80,100);
sector(100,470,360,360,120,60);
pieslice(380,420,200,340,100);
end;
begin
clrscr;
Gd:=VGA;
Gm:=VGAhi;
initgraph(Gd,Gm,'');
if graphresult=grok then
begin
bereg;
setcolor(brown);
setfillstyle(1,brown);
posX:=500;
posY:=250;
fillellipse(posX,posY,1,1);
repeat
ch:=readkey;
case ch of
#72:begin posY:=posY-5; fillellipse(posX,posY,1,1);setcolor(black);
setfillstyle(0,black);fillellipse(posX,posY+5,1,1);setcolor(brown);
setfillstyle(1,brown); end;
#75:begin posX:=posX-5; fillellipse(posX,posY,1,1);setcolor(black);
setfillstyle(0,black);fillellipse(posX+5,posY,1,1); setcolor(brown);
setfillstyle(1,brown); end;
#77:begin posX:=posX+5; fillellipse(posX,posY,1,1);setcolor(black);
setfillstyle(0,black);fillellipse(posX-5,posY,1,1);setcolor(brown);
setfillstyle(1,brown); end;
#80:begin posY:=posY+5; fillellipse(posX,posY,1,1);setcolor(black);
setfillstyle(0,black);fillellipse(posX,posY-5,1,1);setcolor(brown);
setfillstyle(1,brown); end;
#27:halt;
end;{case}
until ch=#27;
closegraph;
end
else
writeln(grapherrormsg(graphresult));
end.
Тут нарисованы берега "лагуны" с островом посередине, вид сверху. Кораблик обозначен коричневой точкой и управляется с клавиатуры, это пока все =/ Как видите, нету навыка работы с процедурами, пишется сложно =/
Что конкретно неясно как реализовать:
Как сделать чтоб кораблик при нажатиии клавиши начинал двигаться в направлении нажатой стрелки и не прекращал движение? Сейчас он двигается только, когда стрелка нажата.
Можно ли сделать движение по диагонали? Сейчас судно движется только в четырех направлениях.
Как реализовать крушение кораблика при столкновении с берегом? (Видимо, нужно написать функцию, возвращающую значение цвета пикселов вокруг кораблика, и если эти значения равны значению цвету берега - корабль тонет)
Как с помощью Pascal реализовать счетчик времени? Ведь цель игры - пройти дистанцию за наименьшее время. Искал в учебниках, а там работа только с временем системы. Как сделать, чтоб игрок вводил свое имя и результаты записывались в текстовый файл?
Как сделать скорость кораблика независимой от тактовой частоты? Ведь delay зависит, если не ошибаюсь, от этого параметра, значит на разных компьютерах игра с этой процедурой будет иметь разную скорость?

Заранее спасибо.
Файл pas в аттаче.


Прикрепленные файлы
Прикрепленный файл  _.PAS ( 2.16 килобайт ) Кол-во скачиваний: 537
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2





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

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


Вот что получилось - корабль нарисован из круга, прямоугольника и треугольника. Анимация реализована максимально просто - экран каждый раз очищается полностью. Константы s, v, c позволяют менять соответственно размер, скорость и цвет кораблика.
Код:
uses crt,graph;
var
Gd,Gm:integer;
x,y,dx,dy,ds,alpha:real;
ch:char;
const
s=10; {size}
v=3; {speed}
c=white; {colour}
procedure kvad(x,y:integer;a:real);
var s1,s2,s3:real;
begin
s1:=s/2;
s2:=s*(1+sqrt(3))/2;
s3:=s2/3;
line(round(x-s1*cos(a)-s1*sin(a)),round(y+s1*sin(a)-s1*cos(a))
,round(x-sin(a)*s2),round(y-cos(a)*s2));
line(round(x-sin(a)*s2),round(y-cos(a)*s2),
round(x+s1*cos(a)-s1*sin(a)),round(y-s1*sin(a)-s1*cos(a)));

line(round(x-s1*cos(a)+s1*sin(a)),round(y+s1*sin(a)+s1*cos(a)),
round(x-s1*cos(a)-s1*sin(a)),round(y+s1*sin(a)-s1*cos(a)));

line(round(x+s1*cos(a)+s1*sin(a)),round(y-s1*sin(a)+s1*cos(a)),
round(x+s1*cos(a)-s1*sin(a)),round(y-s1*sin(a)-s1*cos(a)));

circle(round(x+s1*sin(a)),round(y+s1*cos(a)),
round(s1));
floodfill(round(x+s1*sin(a)),round(y+s1*cos(a)),c);
floodfill(round(x-sin(a)*s3),round(y-cos(a)*s3),c);
end;
{********main*******}
begin
ClrScr;
Gd:=detect;
InitGraph(Gd,Gm,'');
if GraphResult = GrOk then
begin
x:=GetMaxX div 2;
y:=GetMaxY div 2;
ds:=1;
alpha:=0;
SetBkColor(Blue);
ClearDevice;
repeat
if KeyPressed then
begin
ch:=readkey;
case ch of
#77: alpha:=alpha-0.1;
#75: alpha:=alpha+0.1;
#27: begin CloseGraph; halt; end;
end; {case}
end;
{SetColor(Blue);
SetFillStyle(1,blue);
kvad(round(x),round(y),alpha-pi/2);}
dx:=ds*cos(alpha); dy:=ds*sin(alpha);
x:=x+dx;
y:=y-dy;
ClearDevice;
SetColor©;
SetFillStyle(1,c);
kvad(round(x),round(y),alpha-pi/2);
Delay(round(10/v)*200);
until ch = #27;
end
else WriteLn(GraphErrorMsg(GraphResult));
end.

Спасибо еще раз!

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

Сообщений в этой теме
Lazzy   Игра с корабликами   15.12.2007 21:37
andriano   >Как сделать чтоб кораблик при нажатиии клавиши…   15.12.2007 22:06
Lazzy   andriano, спасибо за обстоятельный ответ. Я попроб…   16.12.2007 7:28
andriano   Именно в этом случае и нужна переменная - в ней бу…   16.12.2007 14:39
Lazzy   andriano, спасибо больщущее! :cool: Благодаря…   19.12.2007 3:19
Lapp   P.S. Как репутацию подымать? :cool: Есть два спо…   19.12.2007 11:20
andriano   По поводу ошибки - ничего сказать не могу, нет у м…   19.12.2007 13:06
spill   Да, Delay зависит от производительности ЦП. Вот мо…   19.02.2008 18:07
andriano   Вообще-то это не очень хороший вариант. Начиная с …   20.02.2008 0:35
spill   Вопрос в том, как проверить, пропаченый модуль или…   20.02.2008 17:34
andriano   Если на компе с тактовой частотой 200 МГц и выше р…   20.02.2008 23:08
Lazzy   Прошу прощения за долгое отсутствие. Причина ошиб…   24.03.2008 23:10
Lazzy   Я поискал по форуму меню, наткнулся на такую верси…   25.03.2008 23:42
Гость   Программа была мною еще доработана - появилась ани…   22.06.2008 16:58
Lazzy   Предыдущее сообщение мое.   22.06.2008 17:02
renesko1   Поставь 2 задержки подряд...   22.06.2008 17:16
andriano   1. Если планируется отрабатывать несколько различн…   22.06.2008 20:29
Lazzy   Вот что получилось - корабль нарисован из круга, п…   10.10.2008 4:30


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

 





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