Demo Game Snake

L

lamdetien36

[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
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 :p
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.
Vì đây chỉ là Demo (viết trong 45 phút) nên chắc chắn là bug tùm lum :D 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 :D
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 :p
 
Last edited by a moderator:
A

abluediamond

Có triển vọng cho tương lai sau này làm game :cool:.

Hãy về đội của ta sau này ta sẽ cho ngươi làm tên chăn vịt &gt;:).
 
Top Bottom