Merge pull request 'feat/TD-003-simple-movement' (#2) from dev into main
Reviewed-on: #2
This commit is contained in:
commit
6ce097c771
@ -1,41 +1,58 @@
|
|||||||
program go_hamster;
|
program go_hamster;
|
||||||
|
|
||||||
uses crt;
|
uses crt;
|
||||||
|
|
||||||
|
{ Implement come back }
|
||||||
|
{ Implement death on trace cross }
|
||||||
|
{ Implement }
|
||||||
|
|
||||||
const
|
const
|
||||||
FieldSize = 82;
|
GameFieldH = 33; { 33 }
|
||||||
InterfaceHeight = 14;
|
GameFieldW = 40; { 40 }
|
||||||
MinScreenH = FieldSize;
|
CellSize = 2;
|
||||||
|
BorderSize = 1;
|
||||||
|
ScreenW = GameFieldW * CellSize + BorderSize * 2; { 82 }
|
||||||
|
FieldHeight = ScreenW - 3; {wtf? why? maybe later}
|
||||||
|
MinScreenH = FieldHeight;
|
||||||
WidthCoefficient = 2;
|
WidthCoefficient = 2;
|
||||||
MinScreenW = FieldSize * WidthCoefficient;
|
MinScreenW = ScreenW * WidthCoefficient;
|
||||||
|
InterfaceBarH = ScreenW - GameFieldH * CellSize - BorderSize * 2; { 14 }
|
||||||
FieldBorder = '#';
|
FieldBorder = '#';
|
||||||
BorderWidth = 2;
|
HamsterSymbol = '*';
|
||||||
DelaySizeMs = 50;
|
DelaySizeMs = 100;
|
||||||
EscCode = 27;
|
EscCode = 27;
|
||||||
CtrlCCode = 3;
|
CtrlCCode = 3;
|
||||||
|
ArrowLeftOrd = -75;
|
||||||
|
ArrowRightOrd = -77;
|
||||||
|
ArrowDownOrd = -80;
|
||||||
|
ArrowUpOrd = -72;
|
||||||
|
|
||||||
function IsScreenValid: boolean;
|
type
|
||||||
|
character = record
|
||||||
|
curX, curY, dX, dY: integer;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function IsTerminalValid: boolean;
|
||||||
begin
|
begin
|
||||||
IsScreenValid :=
|
IsTerminalValid :=
|
||||||
(ScreenWidth >= MinScreenW) and (ScreenHeight >= MinScreenH)
|
(ScreenWidth >= MinScreenW) and (ScreenHeight >= MinScreenH)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure PrintScreenHelp;
|
procedure PrintTerminalHelp;
|
||||||
begin
|
begin
|
||||||
writeln('Increase your screen size and try again.');
|
writeln('Increase your terminal size and try again.');
|
||||||
if ScreenWidth < MinScreenW then
|
if ScreenWidth < MinScreenW then
|
||||||
begin
|
begin
|
||||||
writeln('Your screen width: ', ScreenWidth,
|
writeln('Your terminal width: ', ScreenWidth,
|
||||||
'. Required: ', MinScreenW, '.')
|
'. Required: ', MinScreenW, '.')
|
||||||
end;
|
end;
|
||||||
if ScreenHeight < MinScreenH then
|
if ScreenHeight < MinScreenH then
|
||||||
begin
|
begin
|
||||||
writeln('Your screen height: ', ScreenHeight,
|
writeln('Your terminal height: ', ScreenHeight,
|
||||||
'. Required: ', MinScreenH, '.')
|
'. Required: ', MinScreenH, '.')
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure GetKey(var code: integer);
|
procedure GetKey(var keyCode: integer);
|
||||||
var
|
var
|
||||||
c: char;
|
c: char;
|
||||||
begin
|
begin
|
||||||
@ -43,15 +60,15 @@ begin
|
|||||||
if c = #0 then
|
if c = #0 then
|
||||||
begin
|
begin
|
||||||
c := ReadKey;
|
c := ReadKey;
|
||||||
code := -ord(c)
|
keyCode := -ord(c)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
code := ord(c)
|
keyCode := ord(c)
|
||||||
end
|
end
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DrawLine(x, y, len: integer);
|
procedure DrawLineX(x, y, len: integer);
|
||||||
var
|
var
|
||||||
i: integer;
|
i: integer;
|
||||||
begin
|
begin
|
||||||
@ -61,50 +78,152 @@ begin
|
|||||||
GotoXY(1, 1)
|
GotoXY(1, 1)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DrawInterface;
|
procedure DrawLineY(x, y, len: integer);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
begin
|
begin
|
||||||
DrawLine(1, InterfaceHeight, FieldSize * WidthCoefficient)
|
for i := 1 to len do
|
||||||
|
begin
|
||||||
|
GotoXY(x, y + i - 1);
|
||||||
|
write(FieldBorder)
|
||||||
|
end;
|
||||||
|
GotoXY(1, 1)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure DrawField(x0, y0, size: integer);
|
procedure DrawRectangle(x0, y0, h, w: integer);
|
||||||
var
|
var
|
||||||
i: integer;
|
i: integer;
|
||||||
begin
|
begin
|
||||||
clrscr;
|
clrscr;
|
||||||
DrawLine(x0, y0, size * WidthCoefficient);
|
DrawLineX(x0, y0, w);
|
||||||
for i := 1 to size - 2 do
|
for i := 1 to h - 2 do
|
||||||
begin
|
begin
|
||||||
GotoXY(x0, y0 + i);
|
GotoXY(x0, y0 + i);
|
||||||
write(FieldBorder);
|
write(FieldBorder);
|
||||||
GotoXY(x0 + size * WidthCoefficient - 1, y0 + i);
|
GotoXY(x0 + w - 1, y0 + i);
|
||||||
write(FieldBorder)
|
write(FieldBorder)
|
||||||
end;
|
end;
|
||||||
DrawLine(x0, y0 + size - 1, size * WidthCoefficient);
|
DrawLineX(x0, y0 + h - 1, w);
|
||||||
GotoXY(1, 1);
|
GotoXY(1, 1)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure DrawInterface;
|
||||||
|
var
|
||||||
|
cellW: integer = ScreenW div 3;
|
||||||
|
begin
|
||||||
|
DrawLineX(1, InterfaceBarH, ScreenW * WidthCoefficient);
|
||||||
|
DrawLineY(cellW * WidthCoefficient, 1, InterfaceBarH);
|
||||||
|
DrawLineY(cellW * 2 * WidthCoefficient + 1, 1, InterfaceBarH)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure DrawArena(ScreenW, FieldHeight: integer);
|
||||||
|
begin
|
||||||
|
DrawRectangle(1, 1, FieldHeight, ScreenW * WidthCoefficient);
|
||||||
DrawInterface
|
DrawInterface
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function Clamp(val, min, max: integer): integer;
|
||||||
|
begin
|
||||||
|
Clamp := val;
|
||||||
|
if val < min then
|
||||||
|
Clamp := min;
|
||||||
|
if val > max then
|
||||||
|
Clamp := max
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure DrawCell(fieldX, fieldY: integer);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
GotoXY(fieldX, fieldY);
|
||||||
|
for i := 1 to CellSize * WidthCoefficient do
|
||||||
|
write(HamsterSymbol);
|
||||||
|
GotoXY(fieldX, fieldY + 1);
|
||||||
|
for i := 1 to CellSize * WidthCoefficient do
|
||||||
|
write(HamsterSymbol)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure DrawHamster(var hamster: character);
|
||||||
|
var
|
||||||
|
fieldX, fieldY: integer;
|
||||||
|
begin
|
||||||
|
hamster.curX := Clamp(hamster.curX, 1, GameFieldW + 1);
|
||||||
|
hamster.curY := Clamp(hamster.curY, 1, GameFieldH);
|
||||||
|
fieldX := 1 + (hamster.curX - 1) * CellSize * WidthCoefficient;
|
||||||
|
fieldY := InterfaceBarH + (hamster.curY - 1) * CellSize;
|
||||||
|
DrawCell(fieldX, fieldY)
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure UpdateDelta(keyCode: integer; var hamster: character);
|
||||||
|
begin
|
||||||
|
case keyCode of
|
||||||
|
ArrowLeftOrd:
|
||||||
|
begin
|
||||||
|
hamster.dX := -1;
|
||||||
|
hamster.dY := 0
|
||||||
|
end;
|
||||||
|
ArrowRightOrd:
|
||||||
|
begin
|
||||||
|
hamster.dX := 1;
|
||||||
|
hamster.dY := 0
|
||||||
|
end;
|
||||||
|
ArrowUpOrd:
|
||||||
|
begin
|
||||||
|
hamster.dX := 0;
|
||||||
|
hamster.dY := -1
|
||||||
|
end;
|
||||||
|
ArrowDownOrd:
|
||||||
|
begin
|
||||||
|
hamster.dX := 0;
|
||||||
|
hamster.dY := 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
{
|
||||||
|
procedure ShowHamster(var hamster: character);
|
||||||
|
begin
|
||||||
|
GotoXY()
|
||||||
|
end;
|
||||||
|
}
|
||||||
|
|
||||||
var
|
var
|
||||||
code: integer;
|
keyCode: integer;
|
||||||
|
hamster: character;
|
||||||
begin
|
begin
|
||||||
|
if not IsTerminalValid then
|
||||||
if not IsScreenValid then
|
|
||||||
begin
|
begin
|
||||||
PrintScreenHelp;
|
PrintTerminalHelp;
|
||||||
exit
|
exit
|
||||||
end;
|
end;
|
||||||
DrawField(1, 1, FieldSize);
|
hamster.curX := 1;
|
||||||
|
hamster.curY := 1;
|
||||||
|
DrawArena(ScreenW, FieldHeight);
|
||||||
while true do
|
while true do
|
||||||
begin
|
begin
|
||||||
delay(DelaySizeMs);
|
delay(DelaySizeMs);
|
||||||
if keypressed then
|
if keypressed then
|
||||||
begin
|
begin
|
||||||
GetKey(code);
|
GetKey(keyCode);
|
||||||
writeln(code);
|
{ writeln(keyCode); }
|
||||||
if (code = EscCode) or (code = CtrlCCode) then
|
if (keyCode = ArrowLeftOrd) or (keyCode = ArrowRightOrd) or
|
||||||
|
(keyCode = ArrowUpOrd) or (keyCode = ArrowDownOrd) then
|
||||||
|
begin
|
||||||
|
UpdateDelta(keyCode, hamster)
|
||||||
|
end;
|
||||||
|
if (keyCode = EscCode) or (keyCode = CtrlCCode) then
|
||||||
break
|
break
|
||||||
end
|
end;
|
||||||
|
DrawHamster(hamster);
|
||||||
|
{
|
||||||
|
if (hamster.curX <> 1) and (hamster.curY <> GameFieldW) and
|
||||||
|
(hamster.curY <> 1) and (hamster.curY <> GameFieldH) then
|
||||||
|
begin
|
||||||
|
DrawHamster(hamster)
|
||||||
|
end;
|
||||||
|
}
|
||||||
|
hamster.curX := hamster.curX + hamster.dX;
|
||||||
|
hamster.curY := hamster.curY + hamster.dY
|
||||||
end
|
end
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user