feat/TD-003-simple-movement

This commit is contained in:
gre-ilya 2026-02-28 15:16:21 +05:00
parent c900189c59
commit b8b4e6801c

View File

@ -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.