使用python的pygame做一个简易的坦克大战

Source

以下代码单纯是个简易的没有完全完成的代码,主坦克单纯只能进行移动的操作,其他攻击类以及敌方坦克的移动攻击均未设置。

(精灵图可以到bilibili或者网上找精灵图,只需要改一下以下代码的文件位置就行)

import pygame.display

import pygame, time, random

SCREEN_WIDTH = 1000

SCREEN_HEIGHT = 800

COLRE = pygame.Color(0, 0, 0)

TEXT_COLOR = pygame.Color(255, 0, 0)

# 导入模块

class Maingame():

    window = None

    my_tank = None

    # 创建存储敌方坦克的列表

    enemytanklist = []

    enemytankcount = 5

 

    def __init__(self):

        pass

 

    def startgame(self):

        # 加载一个主窗口

        pygame.display.init() # 初始化窗口

        # 设置窗口的大小及其显示

        Maingame.window = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])

        # 初始化坦克的位置

        Maingame.my_tank = Tanke(350, 250)

        # 初始化敌方的坦克,并且添加到列表当中

        self.createenemy()

        # 对标题方面进行设置

        pygame.display.set_caption('坦克大作战')

        while True:

            # 使用time模块的时侯让坦克速度慢一些

            time.sleep(0.001)

            # 给窗口设置填充的颜色

            Maingame.window.fill(COLRE)

            self.getevent()

            # 绘制文字

            Maingame.window.blit(self.getText('敌方坦克剩余的数量%d' % 6), (10, 10))

            # 调用坦克的显示方法

            Maingame.my_tank.displayTake()

            #循环遍历敌方的坦克的列表,展示敌方的坦克

            self.blitenemytake()

            # 调用移动的方法

            # 如果坦克的开关是开启,才可以移动

            if not Maingame.my_tank.stop:

                Maingame.my_tank.move()

            pygame.display.update()

 

    def createenemy(self):

        top = 100

        # 循环生成敌方的坦克

        for i in range(Maingame.enemytankcount):

            left = random.randint(0, 600)

            speed = random.randint(1, 4)

            enemy = EnemyTanke(left, top, speed)

            Maingame.enemytanklist.append(enemy)

    def blitenemytake(self):

        for enemytake in Maingame.enemytanklist:

            enemytake.displayTake()

 

    def endgame(self):

        print('谢谢使,欢迎再一次进行使用')

        exit()

 

    # 对左上角的文字进行绘制

    def getText(self, text):

        # 设置初始化字体的模块

        pygame.font.init()

        # 获取字体FONT对象

        font = pygame.font.SysFont('kaiti', 18)

        # 绘制文字的信息

        textSurface = font.render(text, True, TEXT_COLOR)

        return textSurface

 

    # 获取时间

    def getevent(self):

        eventlist = pygame.event.get()

        for event in eventlist:

            # 判断按下的键位是关闭还是键盘按下

            # 代表的意思是如果按下的键位是退出那么就关闭窗口

            if event.type == pygame.QUIT:

                self.endgame()

            # 如果是键盘的按下键位

            if event.type == pygame.KEYDOWN:

                # 用来判断是否是上下左右

                # 判断按下的是上下左右键位

                if event.key == pygame.K_LEFT:

                    Maingame.my_tank.direction = 'L'

                    # 修改坦克的开关状态

                    Maingame.my_tank.stop = False

                    Maingame.my_tank.move()

                    print('按下左键,坦克向左方向进行移动')

                elif event.key == pygame.K_RIGHT:

                    Maingame.my_tank.direction = 'R'

                    Maingame.my_tank.stop = False

                    Maingame.my_tank.move()

                    print('按下右键,坦克向右移动')

                elif event.key == pygame.K_UP:

                    Maingame.my_tank.direction = 'U'

                    Maingame.my_tank.stop = False

                    Maingame.my_tank.move()

                    print('按下上键,坦克向上移动')

                elif event.key == pygame.K_DOWN:

                    Maingame.my_tank.direction = 'D'

                    Maingame.my_tank.stop = False

                    Maingame.my_tank.move()

                    print('按下下键,坦克向下移动')

                elif event.key == pygame.K_SPACE:

                    print('发射子弹')

                # 松开方向键的时侯停止坦克的移动,修改坦克的开关状态

            if event.type == pygame.KEYUP:

                Maingame.my_tank.stop = True

 

 

class Tanke():

    # 添加距离左边left距离上边top

    def __init__(self, left, top):

        self.images = {

            'U': pygame.image.load('坦克2/p1tankU.gif'),

            'D': pygame.image.load('坦克2/p1tankD.gif'),

            'L': pygame.image.load('坦克2/p1tankL.gif'),

            'R': pygame.image.load('坦克2/p1tankR.gif'),

        }

        # 加载方向

        self.direction = 'U'

        # 根据当前的图片的方向获取图片 surface

        self.image = self.images[self.direction]

        # 获取区域根据图片

        self.rect = self.image.get_rect()

        # 设置区域的left 和 top

        self.rect.left = left

        self.rect.top = top

        # 调整速度,决定移动速度的快慢

        self.speed = 1

        # 坦克移动的开关

        self.stop = True

 

    def move(self):

        # 判断坦克的方向进行移动

        if self.direction == 'L':

            if self.rect.left > 0:

                self.rect.left -= self.speed

        elif self.direction == 'U':

            if self.rect.top > 0:

                self.rect.top -= self.speed

        elif self.direction == 'D':

            if self.rect.top + self.rect.height < SCREEN_HEIGHT:

                self.rect.top += self.speed

        elif self.direction == 'R':

            if self.rect.top + self.rect.height < SCREEN_WIDTH:

                self.rect.left += self.speed

 

    def shot(self):

        pass

 

    # 展示坦克的方法

 

    def displayTake(self):

        # 获取展示的对象

        self.image = self.images[self.direction]

        # 调用blit方法

        Maingame.window.blit(self.image, self.rect)

 

 

# 我方的坦克

class MyTanke(Tanke):

    def __init__(self):

        pass

 

 

# 敌方的坦克

class EnemyTanke(Tanke):

    def __init__(self, left, top, speed):

        # 坦克是需要加载图片的

        self.images = {

            'U': pygame.image.load('坦克2/enemy1U.gif'),

            'D': pygame.image.load('坦克2/enemy1D.gif'),

            'L': pygame.image.load('坦克2/enemy1L.gif'),

            'R': pygame.image.load('坦克2/enemy1R.gif'),

        }

        # 需要定义一个方向

        self.direction = self.randDirection()

        # 根据方向获取image获取当前的图片

        self.image = self.images[self.direction]

        # 区域

        self.rect = self.image.get_rect()

        # 对left以及top进行赋值

        self.rect.left = left

        self.rect.top = top

        # 速度

        self.speed = speed

        # 移动开关

        self.flag = True

 

    def randDirection(self):

        num = random.randint(1, 4)

        if num == 1:

            return 'U'

        elif num == 2:

            return 'D'

        elif num == 3:

            return 'L'

        elif num == 4:

            return 'R'

 

 

class Bullet():

    def __init__(self):

        pass

 

    def move(self):

        pass

 

    def displayBullet(self):

        pass

 

 

class Wall():

    def __init__(self):

        pass

 

    def displayWall(self):

        pass

 

 

class Explode():

    def __init__(self):

        pass

 

    def displayExplore(self):

        pass

 

 

class Music():

    def __init__(self):

        pass

 

    # 播放音乐

    def play(self):

        pass

 

 

if __name__ == '__main__':

    Maingame().startgame()