【项目实战】Python —— 一:坦克大战

本文介绍了一个使用Python和Pygame开发的坦克大战项目。文章详细阐述了项目的步骤,包括结构图的设计和代码实现。在代码实现部分,分别讲解了01_坦克大战.py和02_炸弹爆炸.py的实现细节,特别提到了在02_炸弹爆炸.py中遇到的闪退问题,即当子弹碰到坦克时会导致程序异常退出。
摘要由CSDN通过智能技术生成

版权声明:本文为博主原创文章,未经博主允许不得转载。



一、项目步骤

1.1 结构图

  • 在这里插入图片描述
    在这里插入图片描述

1.2 代码实现

1.2.1 01_坦克大战.py

# coding:utf-8
import pygame, sys,time
from random import randint
from pygame.locals import *

"""坦克大战的主窗口"""
class TankMain(object):
    width = 600
    height= 500
    my_tank_missile_list = []
    my_tank = None
    enemy_list = []

    # 开始游戏的方法
    def startGame(self):
        pygame.init()  #模块初始化:加载系统的资源
        # 创建一个屏幕,屏幕的大小((宽,高),窗口的特性[0,RESIZEBLE,FULLSCREEM],颜色位数)
        screem = pygame.display.set_mode((TankMain.width,TankMain.height), 0, 32)  # 0:窗口不可变
        # 给窗口设置一个标题
        pygame.display.set_caption("坦克大战")
        # my_tank = Tank(screem,275,400)  创建一个我方坦克,坦克显示在屏幕的中下部位置
        TankMain.my_tank = My_Tank(screem)

        for i in range(1,6):
            TankMain.enemy_list.append(Enemy_Tank(screem))
        while True:
            # color RGB(0,0,0),(255,255,255)
            # 设置屏幕的背景色为黑色
            screem.fill((0, 0, 0))
            # 显示左上角的文字
            for i, text in enumerate(self.write_test(), 0):
                screem.blit(text, (0, 5+(15*i)))
            # screem.blit(self.write_test(),(0,5))
            # 获取事件:根据获取的事件处理
            self.get_event(TankMain.my_tank)

            TankMain.my_tank.display() # 在屏幕上显示我方坦克
            TankMain.my_tank.move()  # 在屏幕行移动我方坦克

            # 显示和随机移动 所有的敌方敌方坦克
            for enemy in TankMain.enemy_list:
                enemy.display()
                enemy.random_move()

            # 显示所有的我方炮弹
            for m in TankMain.my_tank_missile_list:
                if m.live:
                    m.display()
                    m.move()
                else:
                    TankMain.my_tank_missile_list.remove(m)
            # 显示重置
            time.sleep(0.05) # 多少秒画一帧  ——  每次休眠0.05秒
            pygame.display.update()
    # 获取所有的事件:敲击键盘,鼠标点击
    def get_event(self,my_tank):
        for event in pygame.event.get():
            if event.type == QUIT:
                self.stopGame()  # 程序退出
            if event.type == KEYDOWN:  # 键盘事件
                if event.key == K_LEFT or event.key == K_a:
                    my_tank.direction ="L"  # 仅仅改变坦克的方向:左
                    my_tank.stop = False
                    # my_tank.move()
                if event.key == K_RIGHT or event.key == K_d:
                    my_tank.direction = "R"
                    my_tank.stop = False
                    # my_tank.move()
                if event.key == K_UP or event.key == K_w:
                    my_tank.direction = "U"
                    my_tank.stop = False
                    # my_tank.move()
                if event.key == K_DOWN or event.key == K_s:
                    my_tank.direction = "D"
                    my_tank.stop = False
                    # my_tank.move()
                if event.key == K_ESCAPE:  # 敲击键盘的Esc键
                    self.stopGame()  # 程序退出
                if event.key == K_SPACE:   # 敲击键盘的空格键,发射炮弹
                    TankMain.my_tank_missile_list.append(my_tank.fire())
            if event.type == KEYUP:
                if event.key == K_LEFT or event.key ==  K_RIGHT or event.key == K_UP or event.key == K_DOWN:
                    my_tank.stop = True


            if event.type == MOUSEBUTTONUP:  # 鼠标事件
                pass
    # 关闭游戏
    def stopGame(self):
        sys.exit()

    # 在屏幕的左上角显示文字内容
    def write_test(self):
        font = pygame.font.SysFont("simsunnsimsun",20)  # 定义一个字体
        text_sf1 = font.render("敌方坦克数量为:%d"%len(TankMain.enemy_list),True,(255,0,0))  # 根据字体创建一个文字的图像
        text_sf2 = font.render("我方坦克炮弹的数量为:%d"%len(TankMain.my_tank_missile_list), True, (255, 0, 0))
        return text_sf1, text_sf2

    # 设计游戏窗口的标题
    def set_title(self):
        pass

# 坦克大战游戏中所有对象的父类
class BaseItem(pygame.sprite.Sprite):
    def __init__(self,screem):
        pygame.sprite.Sprite.__init__(self)
        # 所有对象共享的属性
        self.screem = screem

    # 在游戏屏幕中显示当前游戏对象
    def display(self):
        if self.live:
            self.image = self.images[self.direction]  # 把图象赋值  设置坦克的图像
            self.screem.blit(self.image,self.rect)  # 画图像

# 坦克的公共父类
class Tank(BaseItem):
    # 定义类属性,所有坦克对象高和宽都是一样的(类属性:所有对象可以共享)
    width = 60
    height = 60
    def __init__(self,screem,left,top):  # 表示坐标的意思  left:x  top:y
        super().__init__(screem)
        #self.screem = screem  # 坦克在移动或显示过程中需要用到当前游戏的屏幕
        self.direction = "D"  # 坦克的方向,默认方向向下(上下左右)
        self.speed = 5  # 坦克移动的(默认)速度
        self.stop = False  # 坦克移动,停止的初始值
        self.images = {
   } # 坦克的所有图片(key:方向  value:图片  surface)
        self.images["L"] = pygame.image.load("images/enemy1L.gif")
        self.images["R"] = pygame.image.load("images/enemy1R.gif")
        self.images["U"] = pygame.image.load("images/enemy1U.gif")
        self.images["D"] = pygame
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

InitialHeart2021

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值