Đến nội dung

huynhthanhloc

huynhthanhloc

Đăng ký: 08-03-2017
Offline Đăng nhập: 08-03-2017 - 22:08
-----

Trong chủ đề: [Pascal] Game: Banh nảy

08-03-2017 - 22:01

MẤY BẠN GHÊ GIỎI GHÊ NHA :like  :like  :like  :like  :like  :like  :like  :ukliam2:  :ukliam2:  :ukliam2:  :ukliam2:

MÌNH LÀ THÀNH VIÊN MỚI CỦNG XIN GÓP TÍ MÃ NGUỒN GAME PASCAL DO MÌNH VIẾT

 

ĐÂY LÀ MÃ NGUỒN CỦA GAME 

CÁC BẠN CÓ THỂ BIÊN DỊCH NÓ BẰNG LAZARUS IDE HOẶC FREE PASCAL IDE 

 

CÁC BẠN DÙNG PHÍM UP, DOWN, LEFT, RIGHT ĐỂ DUY CHUYỂN, PHÍM PASPACE ĐỂ BẮN

VÌ GAME ĐANG TRONG THỜI GIAN THỬ NGHIỆM NÊN CÒN NHIỀU LỔI VÀ CHƯA ĐẸP NÊN CÁC BẠN CỨ CHO Ý KIẾN ĐÓNG GÓP 

GIÚP MÌNH HOÀNG THIỆN GAME NÀY NHA

THANK NHIỀU  :D  :D  :D  :D  :D  :D  :D  :D  :D  :D

program Tank_Game;

uses Tools, Windows;

Var
  Game : TGame;
begin
  Game := TGame.Create;
  Game.Init;
  While True do
   begin
     Game.UpDate;
     Game.ClearnCreen;
     Game.Render;
     Game.Delays;
   end;
  Game.Destroy;
end.
 

CÒN ĐÂY LÀ THƯ VIÊN TOOLS.PAS

unit Tools;

interface

uses
 SysUtils, Crt, Windows;

Const
  // TÊN CỬA SỔ
  CAPTION = ' MY TANK GAME ';
  // THÔNG SÔ CỬA SỔ
  MAXCOLUM = 70;
  MAXCELL = 30;
  // CÁC CHAR HÌNH ẢNH
  IMAGETANK1 = #179;
  IMAGETANK2 = #2;
  IMAGETANK3 = #196;

  IMAGEAMMO = #1;

  IMAGELINE = #220;

  MAXENEMYTANK = 2;


Type
  // LƯU VỊ TRÍ CỦA CÁC ĐỐI TƯƠNG TRONG KHÔNG GAN 2D
  TPoint = Record Colum, Cell : Byte; end;
  // HƯỚNG ĐI CỦA CÁC ĐỐI TƯỢNG
  TDirection = (NODIRECTION = 0, UP = 1, DOWN = 2, LEFT = 3, RIGHT = 4);
  //CÁC PHE PHÁI TRONG GAME
  TFaction = (NOFACTION, PLAYER, ENEMY);
  // CÁC LỆNH TRONG GAME
  TCommand = (NOCOMMAND, TANKUP, TANKRIGHT, TANKLEFT, TANKDOWN, TANKFIRE);



  TTank = Record
    T_Point : TPoint;
    T_Direction : TDirection;
    T_Faction :  TFaction;
    T_Death : Boolean;
    T_Fire : Boolean;
  end;

  TTankEnemy = Record
    TE_Point : TPoint;
    TE_Direction : TDirection;
    TE_Faction :  TFaction;
    TE_Death,
    TE_AtTheEnd: Boolean;
    //TE_Fire : Boolean;
    TE_End : TPoint;
  end;


  TAmmo = Record
    A_Point : TPoint;
    A_Direction : TDirection;
    A_Death : Boolean;
  end;

  TTankEnemys = TTankEnemy;

  { TGame }

  TGame = Class
    Private
      Command : TCommand;
      Tank : TTank;
      TankEnemy : TTankEnemys;
      Ammo : TAmmo;
      Score : Integer;
    Protected
      //CẬP NHẬT CÁC LỆNH TRONG GAME
      Procedure UpDateCommand;
      // XE TANH NGƯỜI CHƠI NHẬN LỆNH TRONG GAME
      Procedure TankUpDateCommand;
      Procedure TankMove;
      Procedure TankDraw;
      Procedure TankEnemyCreate;
      Procedure TankEnemyMove;
      Procedure TankEnemyDraw;
      //KIỂM TRA ĐẠN BẮN TRÚNG XE TANK ĐỊCH
      Procedure CheckAmmoHitTankEnemy;
      Procedure AmmoMove;
      Procedure AmmoDraw;
      //THIẾT LẬP THÔNG SỐ CHO CỦA SỔ CONSOLE
      Procedure SetWindowConsole;
      Procedure DrawLine;
    Public
      Procedure Init;
      Procedure UpDate;
      Procedure ClearnCreen;
      Procedure Render;
      Procedure Delays;
  end;


implementation

{ TGame }

Procedure DrawImage(Colum, Cell : Byte; Image : Char);
begin
    Gotoxy(Colum, Cell);
    Write(Image);
end;

procedure TGame.Init;
begin
  Score := 0;
  Randomize;
  Command := NOCOMMAND;
  With Tank do
   begin
    T_Point.Colum:=10;
    T_Point.Cell:=10;
    T_Direction := NODIRECTION;
    T_Faction := NOFACTION;
    T_Fire := False;
   end;

  With Ammo do
   begin
    A_Death := True;
   end;
   SetWindowConsole;

    With TankEnemy Do
     Begin
      //TE_Point.Cell:=16;
      //TE_Point.Colum:=16;
      //TE_Direction := NODIRECTION;
      TE_Faction := ENEMY;
      TE_Death := True;
     end;
end;

procedure TGame.UpDateCommand;
begin
  Command := NOCOMMAND;
  If GetAsyncKeyState(VK_UP) <> 0 Then
   Command := TANKUP;
  If GetAsyncKeyState(VK_DOWN) <> 0 Then
   Command := TANKDOWN;
  If GetAsyncKeyState(VK_LEFT) <> 0 Then
   Command := TANKLEFT;
  If GetAsyncKeyState(VK_RIGHT) <> 0 Then
   Command := TANKRIGHT;
  If GetAsyncKeyState(VK_SPACE) <> 0 Then
   Command := TANKFIRE;
  If GetAsyncKeyState(VK_ESCAPE) <> 0 Then
   Halt;
end;

procedure TGame.TankUpDateCommand;
begin
  Case Command Of
    TANKUP:Tank.T_Direction:=UP;
    TANKDOWN:Tank.T_Direction:=DOWN;
    TANKLEFT:Tank.T_Direction:=LEFT;
    TANKRIGHT:Tank.T_Direction:=RIGHT;
    TANKFIRE:
      begin
       IF Ammo.A_Death = True Then
        Begin
         Ammo.A_Point := Tank.T_Point;
         Ammo.A_Direction:= Tank.T_Direction;
         Ammo.A_Death := False;
        end;
      end;
  end;
end;

procedure TGame.TankMove;
begin
  If Tank.T_Point.Cell < 2 Then
   Tank.T_Point.Cell:=2
  Else
    If Tank.T_Point.Cell > MAXCELL Then
     Tank.T_Point.Cell:=MAXCELL
    Else
      If Tank.T_Point.Colum < 2 Then
       Tank.T_Point.Colum:=2
      Else
        If Tank.T_Point.Colum > MAXCOLUM Then
         Tank.T_Point.Colum:= MAXCOLUM
        Else
          Case Tank.T_Direction Of
            UP:Dec(Tank.T_Point.Cell);
            DOWN:Inc(Tank.T_Point.Cell);
            LEFT:Dec(Tank.T_Point.Colum);
            RIGHT:Inc(Tank.T_Point.Colum);
          end;
end;

procedure TGame.TankDraw;
begin
  With Tank Do
  Case T_Direction OF
    UP:
      Begin
       DrawImage(T_Point.Colum,T_Point.Cell,IMAGETANK2);
       DrawImage(T_Point.Colum+1,T_Point.Cell,IMAGETANK2);
       DrawImage(T_Point.Colum-1,T_Point.Cell,IMAGETANK2);
       DrawImage(T_Point.Colum+1,T_Point.Cell-1,IMAGETANK2);
       DrawImage(T_Point.Colum,T_Point.Cell-1,IMAGETANK1);
       DrawImage(T_Point.Colum-1,T_Point.Cell-1,IMAGETANK2);
       DrawImage(T_Point.Colum+1,T_Point.Cell+1,IMAGETANK2);
       DrawImage(T_Point.Colum-1,T_Point.Cell+1,IMAGETANK2);
      End;
    DOWN:
      Begin
       DrawImage(T_Point.Colum,T_Point.Cell,IMAGETANK2);
       DrawImage(T_Point.Colum+1,T_Point.Cell,IMAGETANK2);
       DrawImage(T_Point.Colum-1,T_Point.Cell,IMAGETANK2);
       DrawImage(T_Point.Colum+1,T_Point.Cell+1,IMAGETANK2);
       DrawImage(T_Point.Colum,T_Point.Cell+1,IMAGETANK1);
       DrawImage(T_Point.Colum-1,T_Point.Cell+1,IMAGETANK2);
       DrawImage(T_Point.Colum+1,T_Point.Cell-1,IMAGETANK2);
       DrawImage(T_Point.Colum-1,T_Point.Cell-1,IMAGETANK2);
      End;
    LEFT:
      Begin
       DrawImage(T_Point.Colum,T_Point.Cell,IMAGETANK2);
       DrawImage(T_Point.Colum,T_Point.Cell-1,IMAGETANK2);
       DrawImage(T_Point.Colum,T_Point.Cell+1,IMAGETANK2);
       DrawImage(T_Point.Colum-1,T_Point.Cell-1,IMAGETANK2);
       DrawImage(T_Point.Colum-1,T_Point.Cell,IMAGETANK3);
       DrawImage(T_Point.Colum-1,T_Point.Cell+1,IMAGETANK2);
       DrawImage(T_Point.Colum+1,T_Point.Cell-1,IMAGETANK2);
       DrawImage(T_Point.Colum+1,T_Point.Cell+1,IMAGETANK2);
      End;
    RIGHT:
      Begin
       DrawImage(T_Point.Colum,T_Point.Cell,IMAGETANK2);
       DrawImage(T_Point.Colum,T_Point.Cell-1,IMAGETANK2);
       DrawImage(T_Point.Colum,T_Point.Cell+1,IMAGETANK2);
       DrawImage(T_Point.Colum+1,T_Point.Cell-1,IMAGETANK2);
       DrawImage(T_Point.Colum+1,T_Point.Cell,IMAGETANK3);
       DrawImage(T_Point.Colum+1,T_Point.Cell+1,IMAGETANK2);
       DrawImage(T_Point.Colum-1,T_Point.Cell-1,IMAGETANK2);
       DrawImage(T_Point.Colum-1,T_Point.Cell+1,IMAGETANK2);
      End;
  end;
end;

procedure TGame.TankEnemyCreate;
Var
  Point : TPoint;

Function PointInGame(Point : TPoint): Boolean;
begin
  Result := False;
  IF Point.Cell >2 Then
   IF Point.Cell < MAXCELL Then
    IF Point.Colum > 2 Then
     IF Point.Colum < MAXCOLUM Then
      Result := True;
end;

begin
  IF TankEnemy.TE_Death = True Then
   Begin
    Point.Colum:=Random(MAXCOLUM);
    Point.Cell:=Random(MAXCELL);
    IF PointINGame(Point) = True Then
     Begin
      Tankenemy.TE_Point := Point;
      TankEnemy.TE_Faction:=ENEMY;
      TankEnemy.TE_Direction:=TDirection(Random(4));
      Case TankEnemy.TE_Direction OF
        UP, DOWN:
          Begin
           Point.Cell:=Random(MAXCELL);
           Point.Colum:=TankEnemy.TE_Point.Colum;
           IF PointInGame(Point) = True Then
            Begin
             TankEnemy.TE_End := Point;
             TankEnemy.TE_AtTheEnd:=False;
            End;

          End;
        LEFT, RIGHT:
          Begin
           Point.Colum:=Random(MAXCOLUM);
           Point.Cell:=TankEnemy.TE_Point.Cell;
           IF PointInGame(Point) = True Then
            Begin
             TankEnemy.TE_End := Point;
             TankEnemy.TE_AtTheEnd:=False;
            End;
          End;
      End;
      TankEnemy.TE_Death:=False;
     End
    Else
     TankEnemy.TE_Death:=True;
   End
  Else
   Begin
    IF TankEnemy.TE_AtTheEnd = True Then
     Begin
       TankEnemy.TE_Direction:=TDirection(Random(4));
    Case TankEnemy.TE_Direction OF
      UP, DOWN:
        Begin
         Point.Cell:=Random(MAXCELL);
         Point.Colum:=TankEnemy.TE_Point.Colum;
         IF PointInGame(Point) = True Then
          Begin
           TankEnemy.TE_End := Point;
           TankEnemy.TE_AtTheEnd:=False;
          End;

        End;
      LEFT, RIGHT:
        Begin
         Point.Colum:=Random(MAXCOLUM);
         Point.Cell:=TankEnemy.TE_Point.Cell;
         IF PointInGame(Point) = True Then
          Begin
           TankEnemy.TE_End := Point;
           TankEnemy.TE_AtTheEnd:=False;
          End;
        End;
      NODIRECTION : TankEnemy.TE_AtTheEnd:=True;
     End;
   End;
end;
end;

procedure TGame.TankEnemyMove;
begin
  With TankEnemy Do
   Begin
    IF (TE_Death <> True) And (TE_AtTheEnd <> True) Then
     Begin
      Case TE_Direction OF
        UP, DOWN:
          Begin
           IF TE_End.Cell > TE_Point.Cell Then
            Inc(TE_Point.Cell)
           Else
             IF TE_End.Cell < TE_Point.Cell Then
              Dec(TE_Point.Cell)
             Else
               TE_AtTheEnd:=True;
          End;
        LEFT, RIGHT:
          Begin
           IF TE_End.Colum > TE_Point.Colum Then
            Inc(TE_Point.Colum)
           Else
             IF TE_End.Colum < TE_Point.Colum Then
              Dec(TE_Point.Colum)
             Else
               TE_AtTheEnd:=True;
          End;
        NODIRECTION:TE_AtTheEnd:=True;
      End;
     End;
   End;
end;

procedure TGame.TankEnemyDraw;
begin
  TextColor(Red);
    With TankEnemy Do
     IF TankEnemy.TE_Death=False Then
      Begin
        Case TE_Direction OF
          UP:
            Begin
             DrawImage(TE_Point.Colum,TE_Point.Cell,IMAGETANK2);
             DrawImage(TE_Point.Colum+1,TE_Point.Cell,IMAGETANK2);
             DrawImage(TE_Point.Colum-1,TE_Point.Cell,IMAGETANK2);
             DrawImage(TE_Point.Colum+1,TE_Point.Cell-1,IMAGETANK2);
             DrawImage(TE_Point.Colum,TE_Point.Cell-1,IMAGETANK1);
             DrawImage(TE_Point.Colum-1,TE_Point.Cell-1,IMAGETANK2);
             DrawImage(TE_Point.Colum+1,TE_Point.Cell+1,IMAGETANK2);
             DrawImage(TE_Point.Colum-1,TE_Point.Cell+1,IMAGETANK2);
            End;
          DOWN:
            Begin
             DrawImage(TE_Point.Colum,TE_Point.Cell,IMAGETANK2);
             DrawImage(TE_Point.Colum+1,TE_Point.Cell,IMAGETANK2);
             DrawImage(TE_Point.Colum-1,TE_Point.Cell,IMAGETANK2);
             DrawImage(TE_Point.Colum+1,TE_Point.Cell+1,IMAGETANK2);
             DrawImage(TE_Point.Colum,TE_Point.Cell+1,IMAGETANK1);
             DrawImage(TE_Point.Colum-1,TE_Point.Cell+1,IMAGETANK2);
             DrawImage(TE_Point.Colum+1,TE_Point.Cell-1,IMAGETANK2);
             DrawImage(TE_Point.Colum-1,TE_Point.Cell-1,IMAGETANK2);
            End;
          LEFT:
            Begin
             DrawImage(TE_Point.Colum,TE_Point.Cell,IMAGETANK2);
             DrawImage(TE_Point.Colum,TE_Point.Cell-1,IMAGETANK2);
             DrawImage(TE_Point.Colum,TE_Point.Cell+1,IMAGETANK2);
             DrawImage(TE_Point.Colum-1,TE_Point.Cell-1,IMAGETANK2);
             DrawImage(TE_Point.Colum-1,TE_Point.Cell,IMAGETANK3);
             DrawImage(TE_Point.Colum-1,TE_Point.Cell+1,IMAGETANK2);
             DrawImage(TE_Point.Colum+1,TE_Point.Cell-1,IMAGETANK2);
             DrawImage(TE_Point.Colum+1,TE_Point.Cell+1,IMAGETANK2);
            End;
          RIGHT:
            Begin
             DrawImage(TE_Point.Colum,TE_Point.Cell,IMAGETANK2);
             DrawImage(TE_Point.Colum,TE_Point.Cell-1,IMAGETANK2);
             DrawImage(TE_Point.Colum,TE_Point.Cell+1,IMAGETANK2);
             DrawImage(TE_Point.Colum+1,TE_Point.Cell-1,IMAGETANK2);
             DrawImage(TE_Point.Colum+1,TE_Point.Cell,IMAGETANK3);
             DrawImage(TE_Point.Colum+1,TE_Point.Cell+1,IMAGETANK2);
             DrawImage(TE_Point.Colum-1,TE_Point.Cell-1,IMAGETANK2);
             DrawImage(TE_Point.Colum-1,TE_Point.Cell+1,IMAGETANK2);
            End;
      end;
     End;
  TextColor(White);
end;

procedure TGame.CheckAmmoHitTankEnemy;
begin
  IF (Ammo.A_Point.Cell >= TankEnemy.TE_Point.Cell-1) Then
   IF (Ammo.A_Point.Cell <= TankEnemy.TE_Point.Cell+1) Then
    IF (Ammo.A_Point.Colum >= TankEnemy.TE_Point.Colum-1) Then
     IF (Ammo.A_Point.Cell <= TankEnemy.TE_Point.Cell+1) Then
      Begin
       TankEnemy.TE_Death:=True;
       Ammo.A_Death:=True;
       Inc(Score,10);
      End;
end;

procedure TGame.AmmoMove;
begin
  IF (Ammo.A_Point.Cell < 1) Then
   Ammo.A_Death:=True
  Else
   IF (Ammo.A_Point.Cell > MAXCELL) Then
    Ammo.A_Death:=True
   Else
    IF (Ammo.A_Point.Colum < 1) Then
     Ammo.A_Death:=True
    Else
     IF (Ammo.A_Point.Colum > MAXCOLUM) Then
      Ammo.A_Death:=True
     Else
       Case Ammo.A_Direction of
         UP:Dec(Ammo.A_Point.Cell,2);
         DOWN:Inc(Ammo.A_Point.Cell,2);
         LEFT:Dec(Ammo.A_Point.Colum,2);
         RIGHT:Inc(Ammo.A_Point.Colum,2);
       end;
end;

procedure TGame.AmmoDraw;
begin
  IF Ammo.A_Death = False Then
   DrawImage(Ammo.A_Point.Colum, Ammo.A_Point.Cell,IMAGEAMMO);
end;

procedure TGame.SetWindowConsole;
Var
  IHand, OHand : HANDLE;
  Res : SMALL_RECT;
  ConsoleSize : COORD;
begin
  IHand := GetStdHandle(STD_INPUT_HANDLE);
  OHand := GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTitle(CAPTION);
  ConsoleSize.X:=MAXCOLUM;
  ConsoleSize.Y:=MAXCELL+10;
  SetConsoleScreenBufferSize(IHand,ConsoleSize);
  Res.Top:=10;
  Res.Left:=10;
  Res.Right:=MAXCOLUM;
  Res.Bottom:=MAXCELL+10;
end;

procedure TGame.DrawLine;
Var
  I : Byte;
begin
  GoToXy(1,MAXCELL + 3);
  Writeln('DIEM SO CUA BAN LA : ',Score);

end;

procedure TGame.UpDate;
begin
  UpDateCommand;
  TankUpDateCommand;
  TankMove;
  AmmoMove;
  TankEnemyCreate;
  TankEnemyMove;
  CheckAmmoHitTankEnemy;
end;

procedure TGame.ClearnCreen;
begin
  Clrscr;
end;

procedure TGame.Render;
begin
  TankDraw;
  AmmoDraw;
  TankEnemyDraw;
  DrawLine;
end;

procedure TGame.Delays;
begin
  Sleep(80);
end;

end.