L
lamdetien36
Chắc suất Đại học top - Giữ chỗ ngay!! ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.
Chiều nay rảnh rỗi quá, không có gì làm nên mình ngồi code cái game này chơi vậy
Code trên Free Pascal:
Vì đây chỉ là Demo (viết trong 45 phút) nên chắc chắn là bug tùm lum Nên hy vọng các ACE rảnh rỗi thì chạy test hộ mình, có bug gì thì post ở đây để mình về sửa chữa
Mình đang tính hoàn thiện cái này trên Console rồi chuyển sang WinForm làm cái Game đầu tay luôn
Code trên Free Pascal:
Mã:
uses crt, windows;
const
MaxLength = 150;
Top = 1;
Left = 1;
Bottom = 25;
Right = 80;
type
Point = record
x, y: byte;
end;
Snake = record
Position: array [1..MaxLength] of Point;
Length: byte;
end;
var
Sn: Snake;
status, c: char;
Die: boolean;
St, En: longint;
Apple, P: Point;
procedure Init;
begin
randomize;
CursorOff;
Sn.Length := 3;
with Sn do
begin
Position[1].x := 38; Position[1].y := 12;
Position[2].x := 39; Position[2].y := 12;
Position[3].x := 40; Position[3].y := 12;
end;
status := #77;
Die := false;
Apple.x := random(80) + 1;
Apple.y := random(25) + 1;
end;
procedure DisplayApple; inline;
begin
gotoxy(Apple.x, Apple.y);
write('*');
end;
procedure DisplaySnake; inline;
begin
gotoxy(Sn.Position[Sn.Length].x, Sn.Position[Sn.Length].y);
write(chr(233));
end;
procedure RemoveSnake; inline;
begin
gotoxy(Sn.Position[1].x, Sn.Position[1].y);
write(' ');
end;
function isDie: boolean;
var
Lx, Ly, i: byte;
begin
Lx := Sn.Position[Sn.Length].x; Ly := Sn.Position[Sn.Length].y;
if (Lx < Left) or (Lx > Right) or (Ly < Top) or (Ly > Bottom) then exit(true) else
begin
for i := 1 to Sn.Length - 1 do
if (Lx = Sn.Position[i].x) and (Ly = Sn.Position[i].y) then exit(true);
end;
isDie := false;
end;
procedure AddNode(P: Point); inline;
var
i: byte;
begin
for i := Sn.Length + 1 downto 2 do Sn.Position[i] := Sn.Position[i - 1];
Sn.Position[1] := P;
Sn.Length := Sn.Length + 1;
end;
procedure Move;
var
i: byte;
begin
RemoveSnake;
for i := 1 to Sn.Length - 1 do Sn.Position[i] := Sn.Position[i + 1];
case status of
#72: dec(Sn.Position[Sn.Length].y);
#75: dec(Sn.Position[Sn.Length].x);
#77: inc(Sn.Position[Sn.Length].x);
#80: inc(Sn.Position[Sn.Length].y);
end;
if (Sn.Position[Sn.Length].x = Apple.x) and (Sn.Position[Sn.Length].y = Apple.y) then
begin
Apple.x := random(80) + 1;
Apple.y := random(25) + 1;
P := Sn.Position[1];
end;
if isDie then Die := true else DisplaySnake;
end;
begin
Init;
DisplaySnake;
repeat
St := GetTickCount;
Move;
DisplayApple;
if (P.x <> 0) and (P.y <> 0) then
begin
AddNode(P);
P.x := 0; P.y := 0;
end;
repeat
if keypressed then
begin
c := ReadKey;
if c = #0 then
begin
c := ReadKey;
if not (((c = #72) and (status = #80)) or ((c = #75) and (status = #77))
or ((c = #77) and (status = #75)) or ((c = #80) and (status = #72))) then status := c;
end;
end;
until GetTickCount - St > 200;
until Die;
readln
end.
Mình đang tính hoàn thiện cái này trên Console rồi chuyển sang WinForm làm cái Game đầu tay luôn
Last edited by a moderator: