Задача формулировалась преподом довольно размыто, поэтому может присутствовать некоторая вольность в выполнении, что не может не радовать. Смысл в том, чтоб написать на 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 в аттаче.