MẤY BẠN GHÊ GIỎI GHÊ NHA
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
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.
- hxthanh yêu thích