Python执行坦克大战遇到的一些问题

1、我执行之后突然出现了一个fps的窗口

img
然后点击右上角的叉号才能进入自己创建的窗口,然后点击叉号 就捕捉不到自己的这个动作进行结束游戏的操作

2、这边捕捉自己的动作的时候,打印出来的动作不是一次,而是点击上键打印出来10个print内容

img

代码如下:

# -*- coding: utf-8 -*-
# @Time : 2021/7/27 7:49
# @Author : wl
# @File : Tank_game_04.py
import pygame
from pygame.examples.sprite_texture import img

_display = pygame.display
# 定义一个颜色变量(全局)
Color = pygame.Color(0, 0, 0)
COLOR_RED = pygame.Color(255, 0, 0)
version = 'V 1.0.6'
'''
V 1.0.6
    官方开发文档:https://www.pygame.org/docs
    新增功能
        加载我方坦克(主坦克)
        考虑点:
        1、坦克实际上是一个图片,需要做的是,将图片加载到窗口
        2、坦克可以上下左右转动(方向)
        3、坦克出现的位置(左上角,x,y)(x,y)用元组表示,(left,top)表示据2个点之间的坐标
'''


# 主逻辑类

class MainGame():

    # 游戏主窗口
    window = None
    screen_height = 500  # 高
    screen_width = 800  # 宽
    # 创建我方坦克
    Tank_P1 = None

    def __init__(self):
        pass

    # 开始游戏
    def startGame(self):
        # 初始化显示模块
        _display.init()
        # 创建窗口,加载窗口
        MainGame.window = _display.set_mode([MainGame.screen_width, MainGame.screen_height])
        # 创建我方坦克
        MainGame.Tank_P1 = Tank(300, 450)
        # 设置一下游戏标题
        _display.set_caption('坦克大战' + version)
        # self.getTextSurface('13')
        # 界面刷新(让窗口持续 )
        while True:
            # 给窗口完成一个填充颜色
            MainGame.window.fill(Color)
            # 在循环中持续的完成事件的获取
            self.getEvent()
            # 将绘制文字得到的小画布贴到窗口中
            MainGame.window.blit(self.getTextSurface('剩余坦克数量是:%d' % 5), (5, 5))
            # 将我方坦克加入到窗口中
            MainGame.Tank_P1.dispiayTank()
            # 持续刷新
            _display.update()

    # 获取程序运行期间所有事件(鼠标事件,键盘事件)

    def getEvent(self):

        # 1、获取所有事件(看官方文档)
        eventlist = pygame.event.get()
        # 2、对事件进行判断处理(1、点击关闭按钮 2、按下键盘上的某个按钮)
        for event in eventlist:
            # 判断event.type是否是QUIT(退出),如果是退出的话,直接调用程序结束方法
            if event.type == pygame.QUIT:
                self.endgame()
            # 判断事件类型是否是按键按下,如果是,继续判断按键是哪一个按键,来进行对应处理
            elif event.type == pygame.KEYDOWN:
                # 判断具体是哪一个按键,进行对应处理
                if event.key == pygame.K_LEFT:
                    print('坦克向左掉头,移动')
                elif event.key == pygame.K_RIGHT:
                    print('坦克向右掉头,移动')
                elif event.key == pygame.K_UP:
                    print('坦克向上掉头,移动')
                elif event.key == pygame.K_DOWN:
                    print('坦克向下掉头,移动')
                elif event.key == pygame.K_SPACE:
                    print(11111111)
                    print('发射子弹')
                    print(22222222)


    # 左上角文字绘制的功能
    def getTextSurface(self, text):
        # 1、字体初始化
        pygame.font.init()
        # 1、1 查看系统所支持的所有字体
        # fontlist = pygame.font.get_fonts()
        # print(fontlist)
        # 2、选中一个合适的字体
        # font = pygame.font.SysFont('字体名称',字号大小)
        font = pygame.font.SysFont('kaiti', 18)
        # 3、使用对应字体完成相关内容的绘制
        textSurface = font.render(text, True, COLOR_RED)
        return textSurface
        # 下一步要做的事情是,把返回的小画布贴到窗口中的做上角,而且需要持续刷新

    # 结束游戏
    def endgame(self):
        print('使用')
        #   结束Python解释器
        exit()


# 坦克类
class Tank():
    def __init__(self, left, top):  # left,top 代表坐标
        # 将坦克这个图片放到对应的坐标中(不同的坐标具有不同的坦克图片)
        # 坦克图片是要从文件夹中取得(从磁盘加载到的图片中获取)
        self.images = {
            # 'U': 从磁盘中加载文档,
            'U': pygame.image.load('img/Tank-U.gif'),
            'D': pygame.image.load('img/Tank-D.gif'),
            'L': pygame.image.load('img/Tank-L.gif'),
            'R': pygame.image.load('img/Tank-R.gif')

        }
        # 坦克默认的方向 UP
        self.direction = 'U'
        # 根据方向 来取对应的坦克图片 从images中取得

        self.image = self.images[self.direction]
        # 坦克所在的区域 rect->
        self.rect = self.image.get_rect()
        # 指定坦克初始位置,分别距x,y轴的位置
        self.rect.left = left
        self.rect.top = top

    # 移动
    def move(self):
        pass

    # 射击
    def shot(self):
        pass

    # 展示坦克(将坦克这个surface绘制到窗口中 blit())反复展示
    def dispiayTank(self):
        # 1、重新设置坦克的图片
        self.image = self.images[self.direction]
        # 2、将坦克加入到窗口中
        MainGame.window.blit(self.image, self.rect)


# 我方坦克
class MyTank(Tank):
    def __init__(self):
        pass


# 敌方坦克
class EnemyTank(Tank):
    def __init__(self):
        pass


# 子弹类
class Bullet():
    def __init__(self):
        pass

    # 移动方法
    def move(self):
        pass

    # 子弹的展示方法
    def displayBullet(self):
        pass


# 爆炸效果类
class Explode():
    def __init__(self):
        pass

    # 展示爆炸效果方法
    def displayExplode(self):
        pass


# 墙壁类
class Wall():
    def __init__(self):
        pass

    # 展示墙壁的方法
    def displayWall(self):
        pass


# 音效类
class Music():
    def __init__(self):
        pass

    # 开始播放音乐
    def play(self):
        pass


MainGame().startGame()


其他问题我暂时没看出来
但是结束程序难道不应该用sys.exit()吗
这个需要导入sys,就像下面这样

import sys
def endgame(self):
        print('使用')
        #   结束Python解释器
        sys.exit()