Build a Simple 2D Tank Battle Game with Pygame – Step‑by‑Step Guide
This tutorial walks you through installing Pygame, setting up the game window, loading assets, defining tank and bullet sprites, implementing the main loop, and running a complete Python‑based 2D tank battle game with full source code.
Step 1: Install Pygame
Open a terminal and run:
pip install pygameStep 2: Import the library
import pygameStep 3: Initialize Pygame
pygame.init()Step 4: Create the game window
Set the window size to 800×600 and give the game a title.
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Tank Battle")Step 5: Load game resources
Load background, tank, and bullet images.
background_image = pygame.image.load("images/bg.jpg").convert()
tank_image = pygame.image.load("images/tank.png").convert_alpha()
bullet_image = pygame.image.load("images/bullet.png").convert_alpha()Step 6: Define game sprites
Three sprite classes are created – Tank for the player, EnemyTank for opponents, and Bullet for projectiles. Each class inherits from pygame.sprite.Sprite and overrides the constructor and movement methods.
class Tank(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = tank_image
self.rect = self.image.get_rect()
self.rect.left = x
self.rect.top = y
self.speed = 5
def move_left(self):
if self.rect.left > 0:
self.rect.left -= self.speed
def move_right(self):
if self.rect.right < 800:
self.rect.right += self.speed
def move_up(self):
if self.rect.top > 0:
self.rect.top -= self.speed
def move_down(self):
if self.rect.bottom < 600:
self.rect.bottom += self.speed
class EnemyTank(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = tank_image
self.rect = self.image.get_rect()
self.rect.left = x
self.rect.top = y
self.speed = 3
def move(self):
self.rect.top += self.speed
class Bullet(pygame.sprite.Sprite):
def __init__(self, tank):
pygame.sprite.Sprite.__init__(self)
self.image = bullet_image
self.rect = self.image.get_rect()
self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2
self.rect.top = tank.rect.top
self.speed = 10
def move(self):
self.rect.top -= self.speedStep 7: Create the game loop
The loop processes events, updates sprite positions, draws the background and all sprites, and flips the display.
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player_tank.move_left()
elif event.key == pygame.K_RIGHT:
player_tank.move_right()
elif event.key == pygame.K_UP:
player_tank.move_up()
elif event.key == pygame.K_DOWN:
player_tank.move_down()
elif event.key == pygame.K_SPACE:
player_bullets.add(Bullet(player_tank))
screen.blit(background_image, (0, 0))
for enemy_tank in enemy_tanks:
enemy_tank.move()
if enemy_tank.rect.top > 600:
enemy_tank.kill()
player_tank_group.draw(screen)
enemy_tank_group.draw(screen)
player_bullets.draw(screen)
pygame.display.flip()Step 8: Run the game
if __name__ == "__main__":
main()Full source code
import pygame
import sys
import random
def main():
pygame.init()
screen = pygame.display.set_mode((800, 600))
pygame.display.set_caption("Tank Battle")
background_image = pygame.image.load("images/bg.jpg").convert()
tank_image = pygame.image.load("images/tank.png").convert_alpha()
bullet_image = pygame.image.load("images/bullet.png").convert_alpha()
class Tank(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = tank_image
self.rect = self.image.get_rect()
self.rect.left = x
self.rect.top = y
self.speed = 5
def move_left(self):
if self.rect.left > 0:
self.rect.left -= self.speed
def move_right(self):
if self.rect.right < 800:
self.rect.right += self.speed
def move_up(self):
if self.rect.top > 0:
self.rect.top -= self.speed
def move_down(self):
if self.rect.bottom < 600:
self.rect.bottom += self.speed
class EnemyTank(pygame.sprite.Sprite):
def __init__(self, x, y):
pygame.sprite.Sprite.__init__(self)
self.image = tank_image
self.rect = self.image.get_rect()
self.rect.left = x
self.rect.top = y
self.speed = 3
def move(self):
self.rect.top += self.speed
class Bullet(pygame.sprite.Sprite):
def __init__(self, tank):
pygame.sprite.Sprite.__init__(self)
self.image = bullet_image
self.rect = self.image.get_rect()
self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2
self.rect.top = tank.rect.top
self.speed = 10
def move(self):
self.rect.top -= self.speed
player_tank = Tank(400, 500)
player_tank_group = pygame.sprite.Group(player_tank)
enemy_tanks = []
enemy_tank_group = pygame.sprite.Group()
for i in range(5):
enemy = EnemyTank(random.randint(0, 700), random.randint(-300, 0))
enemy_tanks.append(enemy)
enemy_tank_group.add(enemy)
player_bullets = pygame.sprite.Group()
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
player_tank.move_left()
elif event.key == pygame.K_RIGHT:
player_tank.move_right()
elif event.key == pygame.K_UP:
player_tank.move_up()
elif event.key == pygame.K_DOWN:
player_tank.move_down()
elif event.key == pygame.K_SPACE:
player_bullets.add(Bullet(player_tank))
screen.blit(background_image, (0, 0))
for enemy in enemy_tanks:
enemy.move()
if enemy.rect.top > 600:
enemy.kill()
player_tank_group.draw(screen)
enemy_tank_group.draw(screen)
player_bullets.draw(screen)
pygame.display.flip()
if __name__ == "__main__":
main()Following these steps produces a functional 2‑D tank battle game built entirely with Pygame.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
