python图形界面化编程GUI(八)坦克大战(四)完整代码

坦克大战(四)完整代码

import pygame
import time
import random
from pygame.sprite import Sprite
# 定义全局变量
SCREEN_WIDTH = 900 # 窗口的宽度
SCREEN_HEIGHT = 700 # 窗口的高度
BG_COLOR = pygame.Color(0, 0, 255) # 设置背景颜色
TEXT_COLOR = pygame.Color(255, 0, 0) # 设置字体颜色

class BaseItem(Sprite):
    def __init__(self, color, width, height):
        pygame.sprite.Sprite.__init__(self)


# 主类
class MainGame():
    window = None
    my_tank = None
    # 存储敌方坦克的列表
    enemyTankList = []
    # 定义敌方坦克的数量
    enemyTankCount = 5
    # 存储我方子弹的列表
    myBulletList = []
    # 存储敌方子弹的列表
    enemyBulletList = []
    # 存储爆炸对象的列表
    explodeList = []
    # 存储障碍物的列表
    walllist = []

    def __init__(self):  # 属性
        pass

    # 开始游戏
    def startGame(self): # 方法
        # 加载主窗口、初始化
        pygame.display.init()
        # 设置窗口大小以及显示窗口,用类属性进行接收
        MainGame.window = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])
        # 初始化我方坦克
        # self.creatMyTank()
        MainGame.my_tank = Tank(450,400)
        # 初始化敌方坦克
        self.creatEnemyTank()
        # 初始化墙壁
        self.createWall()
        # 设置窗口的标题
        pygame.display.set_caption('坦克大战')
        # 此时的窗口一闪而过,可以用死循环的方法进行窗口的显示
        while True:
            # 让移动速度慢一点,调用时间延迟
            time.sleep(0.02)
            # 给窗口添加颜色
            MainGame.window.fill(BG_COLOR)
            # 获取监听事件
            self.getEvent()
            # 获取文本的绘制,显示文本和出现的位置
            # 敌方坦克的数量用 坦克列表的长度表示
            MainGame.window.blit(self.getTextSurface('敌方坦克的数量:%s'% len(MainGame.enemyTankList)),(10,10))
            if MainGame.my_tank and MainGame.my_tank.live:
                MainGame.my_tank.displayTank()  # 显示我方坦克
            else:
                # 删除我方坦克
                del MainGame.my_tank
                MainGame.my_tank = None
            # 调用显示敌方坦克的方法
            self.showEnemyTank()
            # 调用显示子弹的方法
            self.showBullet()
            # 展示爆炸效果的方法
            self.showExplode()
            # 调用显示敌方子弹的方法
            self.showEnemyBullet()
            # 调用展示墙壁的方法
            self.showWall()
            # 根据坦克的状态进行判断,如果当前坦克移动的开关是开启的才能移动
            if MainGame.my_tank and MainGame.my_tank.live:  # 我方坦克存在且存活的状态下
                if not MainGame.my_tank.stop:
                    # 调用坦克移动的方法,实现按下移动,松开停止
                    MainGame.my_tank.move()
                    MainGame.my_tank.hitWall()
                    MainGame.my_tank.myTank_hit_enemyTank()
            # 让页面一直刷新
            pygame.display.update()

    # 创建我方坦克,在固定坐标处生成我方坦克
    def creatMyTank(self):
        MainGame.my_tank = Tank(450, 500)
        music = Music('img/start.wav')
        music.play()
    # 初始化敌方坦克方法
    def creatEnemyTank(self):
        top = 100 # 坦克出现的上方位置
        # 循环生成坦克
        for i in range(MainGame.enemyTankCount):
            left = random.randint(0, 600) # 坦克出现的左侧位置
            speed = random.randint(1, 4)  # 坦克的速度
            enemy = EnemyTank(left, top, speed)
            MainGame.enemyTankList.append(enemy) # 生成的坦克添加到列表里
    # 展示子弹的方法
    def showBullet(self):
        for myBullet in MainGame.myBulletList:
            # 增加对子弹状态的判断,是否应该消失
            if myBullet.live: # 如果子弹存活,就正常显示
                myBullet.displayBullet()
                myBullet.move()
                # 调用我方子弹碰撞敌方坦克的方法
                myBullet.myBullet_hit_enemyTank()
                myBullet.hitWall()  # 我方子弹击中墙壁
            else:
                # 否则,子弹碰到窗口边界,就从列表中删除子弹
                MainGame.myBulletList.remove(myBullet)
    # 展示敌方坦克子弹的方法
    def showEnemyBullet(self):
        for enemyBullet in MainGame.enemyBulletList:
            # 如果子弹的存活状态为真
            if enemyBullet.live:
                enemyBullet.displayBullet(
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值