Game Development 10 min read

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.

Test Development Learning Exchange
Test Development Learning Exchange
Test Development Learning Exchange
Build a Simple 2D Tank Battle Game with Pygame – Step‑by‑Step Guide

Step 1: Install Pygame

Open a terminal and run:

pip install pygame

Step 2: Import the library

import pygame

Step 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.speed

Step 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.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

PythonGame DevelopmentPygame2D GameTank Battle
Test Development Learning Exchange
Written by

Test Development Learning Exchange

Test Development Learning Exchange

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.