Python3+pygame实现的90坦克大战 代码完整 有演示效果

我是一个典型的80后,年轻时玩过了特别多的游戏,所以这几天用Python3+pygame实现了一个另外小游戏”坦克大战“(其他的游戏,请翻阅我的博客)

本实例代码量有些多,完整的版本在1000行左右(当然了如果再次优化的话 会减少一部分)

分享出来,希望能帮助到大家,毕竟自己做教育行业做了这么多年,还是教育情怀的,哈哈哈哈哈

一、显示效果

Python3+pygame实现的90坦克大战 代码完整 有演示效果_第1张图片

Python3+pygame实现的90坦克大战 代码完整 有演示效果_第2张图片

Python3+pygame实现的90坦克大战 代码完整 有演示效果_第3张图片

二、代码

下面代码用到了一些素材(游戏背景音乐、图片等等),可以到 https://www.itprojects.cn/detail.html?example_id=869a7cbfd9bd4d9b23e61a4d88e39b1c 下载,谢谢大家的支持

完整代码如下(注意:为了方便下载以及编写更简单,没有采用多模块的方式,全部代码全部放到main.py文件中)


import random
import sys

import pygame

# 屏幕的宽、高
WIDTH = 630
HEIGHT = 630
# 边界值
BORDER_LEN = 3
# 字体
FONTPATH = 'resources/font/font.ttf'


class Iron(pygame.sprite.Sprite):
    """
    铁墙类
    """
    # 定义精灵组,将所有的砖墙实例对象添加到里面
    group = pygame.sprite.Group()

    def __init__(self, position):
        # 调用父类的初始化方法,这样才能够实现必要的初始化操作
        super().__init__()
        self.image = pygame.image.load("resources/images/scene/iron.png")
        # 当使用碰撞判断方法时,pygame就需要知道当前要检测的物体的位置,所以这个rect属性一定要设置
        self.rect = self.image.get_rect()
        self.rect.topleft = position

        # 添加到精灵组
        self.group.add(self)

    @classmethod
    def show(cls, screen):
        for temp in cls.group:
            screen.blit(temp.image, temp.rect)


class Ice(pygame.sprite.Sprite):
    """
    冰类
    """
    # 定义精灵组,将所有的实例对象添加到里面
    group = pygame.sprite.Group()

    def __init__(self, position):
        # 调用父类的初始化方法,这样才能够实现必要的初始化操作
        super().__init__()
        # 因为是12x12的小图片,所以需要制作一个24x24的image
        image = pygame.Surface((24, 24))
        for i in range(2):
            for j in range(2):
                image.blit(pygame.image.load("resources/images/scene/ice.png"), (12 * i, 12 * j))
        self.image = image
        # 当使用碰撞判断方法时,pygame就需要知道当前要检测的物体的位置,所以这个rect属性一定要设置
        self.rect = self.image.get_rect()
        self.rect.topleft = position

        # 添加到精灵组
        self.group.add(self)

    @classmethod
    def show(cls, screen):
        for temp in cls.group:
            screen.blit(temp.image, temp.rect)


class River(pygame.sprite.Sprite):
    """
    河流类
    """
    # 定义精灵组,将所有的实例对象添加到里面
    group = pygame.sprite.Group()

    def __init__(self, position):
        # 调用父类的初始化方法,这样才能够实现必要的初始化操作
        super().__init__()
        # 因为是12x12的小图片,所以需要制作一个24x24的image
        image = pygame.Surface((24, 24))
        for i in range(2):
            for j in range(2):
                image.blit(pygame.image.load("resources/images/scene/river1.png"), (12 * i, 12 * j))
        self.image = image
        # 当使用碰撞判断方法时,pygame就需要知道当前要检测的物体的位置,所以这个rect属性一定要设置
        self.rect = self.image.get_rect()
        self.rect.topleft = position

        # 添加到精灵组
        self.group.add(self)

    @classmethod
    def show(cls, screen):
        for temp in cls.group:
            screen.blit(temp.image, temp.rect)


class Tree(pygame.sprite.Sprite):
    """
    树类
    """
    # 定义精灵组,将所有的实例对象添加到里面
    group = pygame.sprite.Group()

    def __init__(self, position):
        # 调用父类的初始化方法,这样才能够实现必要的初始化操作
        super().__init__()
        # 因为是12x12的小图片,所以需要制作一个24x24的image
        image = pygame.Surface((24, 24))
        for i in range(2):
            for j in range(2):
                image.blit(pygame.image.load("resources/images/scene/tree.png"), (12 * i, 12 * j))
        self.image = image
        # 当使用碰撞判断方法时,pygame就需要知道当前要检测的物体的位置,所以这个rect属性一定要设置
        self.rect = self.image.get_rect()
        self.rect.topleft = position

        # 添加到精灵组
        self.group.add(self)

    @classmethod
    def show(cls, screen):
        for temp in cls.group:
            screen.blit(temp.image, temp.rect)


class Brick(pygame.sprite.Sprite):
    """
    砖墙类
    """

    # 定义精灵组,将所有的砖墙实例对象添加到里面
    group = pygame.sprite.Group()

    def __init__(self, position):
        # 调用父类的初始化方法,这样才能够实现必要的初始化操作
        super().__init__()
        self.image = pygame.image.load("resources/images/scene/brick.png")
        # 当使用碰撞判断方法时,pygame就需要知道当前要检测的物体的位置,所以这个rect属性一定要设置
        self.rect = self.image.get_rect()
        self.rect.topleft = position

        # 添加到精灵组
        self.group.add(self)

    @classmethod
    def show(cls, screen):
        for temp in cls.group:
            screen.blit(temp.image, temp.rect)


class Bullet(pygame.sprite.Sprite):
    """
    子弹类
    """
    # 定义精灵组,将所有的砖墙实例对象添加到里面
    group = pygame.sprite.Group()
    group_enemy = pygame.sprite.Group()

    def __init__(self, _type, direction, position):
        super().__init__()
        # 子弹图片
        if direction == "up":
            image_path = "resources/images/bullet/bullet_up.png"
        elif direction == "down":
            image_path = "resources/images/bullet/bullet_down.png"
        elif direction == "left":
            image_path = "resources/images/bullet/bullet_left.png"
        elif direction == "right":
            image_path = "resources/images/bullet/bullet_right.png"
        self.image = pygame.image.load(image_path)
        # 子弹位置
        self.rect = self.image.get_rect()
        self.rect.center = position  # 设置子弹的初始位置的中心点
        # 子弹方向
        self.direction = direction
        # 子弹移动速度
        self.speed = 8

        # 将子弹添加到精灵组
        if _type == "player":
            self.group.add(self)
        else:
            self.group_enemy.add(self)

    @classmethod
    def auto_move(cls):
        for temp in cls.group:
            if temp.rect.x < BORDER_LEN or temp.rect.x > WIDTH - BORDER_LEN or temp.rect.y < BORDER_LEN or temp.rect.y > HEIGHT - BORDER_LEN:
                cls.group.remove(temp)
                print("子弹超出边界,移除子弹")
                continue

            if temp.direction == "up":
                temp.rect = temp.rect.move((0, -temp.speed))
            elif temp.direction == "down":
                temp.rect = temp.rect.move((0, temp.speed))
            elif temp.direction == "left":
                temp.rect = temp.rect.move((-temp.speed, 0))
            elif temp.direction == "right":
                temp.rect = temp.rect.move((temp.speed, 0))

        for temp in cls.group_enemy:
            if temp.rect.x < BORDER_LEN or temp.rect.x > WIDTH - BORDER_LEN or temp.rect.y < BORDER_LEN or temp.rect.y > HEIGHT - BORDER_LEN:
                cls.group_enemy.remove(temp)
                print("子弹超出边界,移除子弹")
                continue

            if temp.direction == "up":
                temp.rect = temp.rect.move((0, -temp.speed))
            elif temp.direction == "down":
                temp.rect = temp.rect.move((0, temp.speed))
            elif temp.direction == "left":
                temp.rect = temp.rect.move((-temp.speed, 0))
            elif temp.direction == "right":
                temp.rect = temp.rect.move((temp.speed, 0))

        # 子弹碰砖墙(如果相碰,那么就移除当前子弹以及砖墙)
        pygame.sprite.groupcollide(cls.group, Brick.group, True, True)
        pygame.sprite.groupcollide(cls.group_enemy, Brick.group, True, True)
        # 子弹碰铁墙(如果相碰,那么只移除子弹)
        for bullet in cls.group:
            if pygame.sprite.spritecoll

你可能感兴趣的:(pygame,python,开发语言)