手把手教你用Python实现“坦克大战”,附详细代码!

Damara ·
更新时间:2024-11-13
· 986 次阅读

小时候玩的“坦克大战”,你还记得吗?

640?wx_fmt=jpeg
满满的回忆

今天,我们使用Python以及强大的第三方库来实现一个简单的坦克大战游戏。【文中代码点击阅读原文下载,可直接运行】

640?wx_fmt=gif

整体效果

环境依赖

pygame介绍
Pygame被设计用来写游戏的python模块集合,基于SDL库开发。使用python可以导入pygame来开发具有全部特性的游戏和多媒体软件,Pygame是极度轻便的并且可以运行在几乎所有的平台和操作系统上。

1. 导入依赖 & 通用配置

1import random 2import sys 3import time 4from urllib.request import urlretrieve 5import os 6import pygame 7 8 9SCREEN_WIDTH, SCREEN_HEIGHT = 1200, 700  # 画面大小10MY_BIRTH_LEFT, MY_BIRTH_TOP = SCREEN_WIDTH / 2, SCREEN_HEIGHT - 6011DIRECTION = [U, D, L, R] = [ U ,  D ,  L ,  R ]  # 控制键12Tank_IMAGE_POSITION = r D:/tank_img 13URL =  https://gitee.com/tyoui/logo/raw/master/img/ import random
2import sys
3import time
4from urllib.request import urlretrieve
5import os
6import pygame
7
8
9SCREEN_WIDTH, SCREEN_HEIGHT = 1200, 700  # 画面大小
10MY_BIRTH_LEFT, MY_BIRTH_TOP = SCREEN_WIDTH / 2, SCREEN_HEIGHT - 60
11DIRECTION = [U, D, L, R] = [ U ,  D ,  L ,  R ]  # 控制键
12Tank_IMAGE_POSITION = r D:/tank_img
13URL =  https://gitee.com/tyoui/logo/raw/master/img/

 2. 通用加载函数

1# 加载图片 2def load_img(name_img): 3    save = Tank_IMAGE_POSITION + os.sep + name_img +  .gif 4    if not os.path.exists(save): 5        urlretrieve(URL + name_img +  .gif , save) 6    return pygame.image.load(save) 7 8# 加载背景音乐 9def load_music(name_music):10    save = Tank_IMAGE_POSITION + os.sep + name_music +  .wav 11    if not os.path.exists(save):12        urlretrieve(URL + name_music +  .wav , save)13    pygame.mixer.music.load(save)14    pygame.mixer.music.play()# 加载图片
2def load_img(name_img):
3    save = Tank_IMAGE_POSITION + os.sep + name_img +  .gif
4    if not os.path.exists(save):
5        urlretrieve(URL + name_img +  .gif , save)
6    return pygame.image.load(save)
7
8# 加载背景音乐
9def load_music(name_music):
10    save = Tank_IMAGE_POSITION + os.sep + name_music +  .wav
11    if not os.path.exists(save):
12        urlretrieve(URL + name_music +  .wav , save)
13    pygame.mixer.music.load(save)
14    pygame.mixer.music.play()

3. 通 用基础类

1 2* pygame.sprite模块,官方文档上说这个模块是轻量级的,在游戏开发中也未必要使用。3* sprite翻译为精灵,在游戏动画一般是指一个独立运动的画面元素,在pygame中,4就可以是一个带有图像(Surface)和大小位置(Rect)的对象。5* pygame.sprite.Sprite是pygame精灵的基类,一般来说,需要写一个自己的精灵类继承一下它然后加入自己的代码。6 7class BaseItem(pygame.sprite.Sprite):8    def __init__(self):9        super().__init__()
2* pygame.sprite模块,官方文档上说这个模块是轻量级的,在游戏开发中也未必要使用。
3* sprite翻译为精灵,在游戏动画一般是指一个独立运动的画面元素,在pygame中,
4就可以是一个带有图像(Surface)和大小位置(Rect)的对象。
5* pygame.sprite.Sprite是pygame精灵的基类,一般来说,需要写一个自己的精灵类继承一下它然后加入自己的代码。
6
7class BaseItem(pygame.sprite.Sprite):
8    def __init__(self):
9        super().__init__()

4. 定义bullet类

1class Bullet(BaseItem): 2    # 参数初始化 3    def __init__(self, tank, window): 4        super().__init__() 5        self.direction = tank.direction 6        self.speed = tank.speed * 3 7        self.img = load_img( bullet ) 8        self.rect = self.img.get_rect() 9        self.window = window10        self.live = True11        if self.direction == U:12            self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 213            self.rect.top = tank.rect.top - self.rect.height14        elif self.direction == D:15            self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 216            self.rect.top = tank.rect.top + tank.rect.height17        elif self.direction == L:18            self.rect.left = tank.rect.left - self.rect.width / 2 - self.rect.width / 219            self.rect.top = tank.rect.top + tank.rect.height / 2 - self.rect.height / 220        else:21            self.rect.left = tank.rect.left + tank.rect.width22            self.rect.top = tank.rect.top + tank.rect.height / 2 - self.rect.height / 22324    # 子弹显示25    def display_bullet(self):26        self.window.blit(self.img, self.rect)2728    # 通过按键控制子弹移动29    def bullet_move(self):30        if self.direction == U:31            if self.rect.top > 0:32                self.rect.top -= self.speed33                return34        elif self.direction == D:35            if self.rect.top  0:40                self.rect.left -= self.speed41                return42        else:43            if self.rect.left < SCREEN_WIDTH:44                self.rect.left += self.speed45                return46        self.live = False4748    # 我方坦克子弹击中对方坦克49    def hit_enemy_tank(self):50        for enemy in TankGame.enemy_tank_list:51            hit = pygame.sprite.collide_rect(self, enemy)52            if hit:53                self.live = False54                if enemy.click_count == 1:55                    enemy.live = False56                    return None57                enemy.click_count -= 158                if enemy.click_count  == 2:59                    enemy.load_image = enemy.img3260                if enemy.click_count == 1:61                    enemy.load_image = enemy.img3162                load_music( hit )6364    # 对方坦克子弹击中我方坦克65    def hit_my_tank(self, tank):66        hit = pygame.sprite.collide_rect(self, tank)67        if hit:68            self.live = False69            tank.live = False7071    # 子弹击中围墙72    def bullet_collide_wall(self):73        for wall in TankGame.wall_list:74            result = pygame.sprite.collide_rect(self, wall)75            if result:76                self.live = False77                if wall.count == 1:78                    wall.live = False79                else:80                    load_music( hit )8182    # 子弹击中子弹83    def bullet_collide_bullet(self):84        for bullet in TankGame.enemy_bullet_list:85            if pygame.sprite.collide_rect(bullet, self):86                bullet.live = False87                self.live = Falseclass Bullet(BaseItem):
2    # 参数初始化
3    def __init__(self, tank, window):
4        super().__init__()
5        self.direction = tank.direction
6        self.speed = tank.speed * 3
7        self.img = load_img( bullet )
8        self.rect = self.img.get_rect()
9        self.window = window
10        self.live = True
11        if self.direction == U:
12            self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2
13            self.rect.top = tank.rect.top - self.rect.height
14        elif self.direction == D:
15            self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2
16            self.rect.top = tank.rect.top + tank.rect.height
17        elif self.direction == L:
18            self.rect.left = tank.rect.left - self.rect.width / 2 - self.rect.width / 2
19            self.rect.top = tank.rect.top + tank.rect.height / 2 - self.rect.height / 2
20        else:
21            self.rect.left = tank.rect.left + tank.rect.width
22            self.rect.top = tank.rect.top + tank.rect.height / 2 - self.rect.height / 2
23
24    # 子弹显示
25    def display_bullet(self):
26        self.window.blit(self.img, self.rect)
27
28    # 通过按键控制子弹移动
29    def bullet_move(self):
30        if self.direction == U:
31            if self.rect.top > 0:
32                self.rect.top -= self.speed
33                return
34        elif self.direction == D:
35            if self.rect.top < SCREEN_HEIGHT:
36                self.rect.top += self.speed
37                return
38        elif self.direction == L:
39            if self.rect.left > 0:
40                self.rect.left -= self.speed
41                return
42        else:
43            if self.rect.left < SCREEN_WIDTH:
44                self.rect.left += self.speed
45                return
46        self.live = False
47
48    # 我方坦克子弹击中对方 克
49    def hit_enemy_tank(self):
50        for enemy in TankGame.enemy_tank_list:
51            hit = pygame.sprite.collide_rect(self, enemy)
52            if hit:
53                self.live = False
54                if enemy.click_count == 1:
55                    enemy.live = False
56                    return None
57                enemy.click_count -= 1
58                if enemy.click_count == 2:
59                    enemy.load_image = enemy.img32
60                if enemy.click_count == 1:
61                    enemy.load_image = enemy.img31
62                load_music( hit )
63
64    # 对方坦克子弹击中我方坦克
65    def hit_my_tank(self, tank):
66        hit = pygame.sprite.collide_rect(self, tank)
67        if hit:
68            self.live = False
69            tank.live = False
70
71    # 子弹击中围墙
72    def bullet_collide_wall(self):
73        for wall in TankGame.wall_list:
74            result = pygame.sprite.collide_rect(self, wall)
75            if result:
76                self.live = False
77                if wall.count == 1:
78                    wall.live = False
79                else:
80                    load_music( hit )
81
82    # 子弹击中子弹
83    def bullet_collide_bullet(self):
84        for bullet in TankGame.enemy_bullet_list:
85            if pygame.sprite.collide_rect(bullet, self):
86                bullet.live = False
87                self.live = False

5. 定义tank类

1class Tank(BaseItem): 2    # 参数初始化 3    def __init__(self, left, top, window, image, direction, speed): 4        super().__init__() 5        self.window = window 6        self.load_image = image 7        self.direction = direction 8        self.img = self.load_image[self.direction] 9        self.rect = self.img.get_rect()10        self.rect.left = left11        self.rect.top = top12        self.speed = speed13        self.tank_width = self.rect.width14        self.tank_height = self.rect.height15        self.wall_switch = False16        self.move_stop = True17        self.live = True18        self.old_left = 019        self.old_top = 02021    # 开火22    def fire(self):23        return Bullet(self, self.window)2425    # 显示26    def display(self):27        self.img = self.load_image[self.direction]28        self.window.blit(self.img, self.rect)2930    def wall_not(self, direction):31        if direction == U:32            return self.rect.top > 033        elif direction == D:34            return self.rect.top  037        else:38            return self.rect.left <= SCREEN_WIDTH - self.tank_width3940    def wall_yes(self, direction):41        if direction == U:42            if self.rect.top < 0:43                self.rect.top = SCREEN_HEIGHT44        elif direction == D:45            self.rect.top %= SCREEN_HEIGHT46        elif direction == L:47            if self.rect.l eft < 0:48                self.rect.left = SCREEN_WIDTH49        else:50            self.rect.left %= SCREEN_WIDTH5152    def move(self, direction):53        self.old_left = self.rect.left54        self.old_top = self.rect.top55        if self.wall_switch:56            self.wall_yes(direction)57        elif not self.wall_not(direction):58            return None59        if direction == U:60            self.rect.top -= self.speed61        elif direction == D:62            self.rect.top += self.speed63        elif direction == L:64            self.rect.left -= self.speed65        else:66            self.rect.left += self.speed6768    def stay(self):69        self.rect.left = self.old_left70        self.rect.top = self.old_top7172    def tank_collide_wall(self):73        for wall in TankGame.wall_list:74            if pygame.sprite.collide_rect(self, wall):75                self.stay()7677    def tank_collide_tank(self):78        for tank in TankGame.enemy_tank_list:79            if pygame.sprite.collide_rect(self, tank):80                self.stay()class Tank(BaseItem):
2    # 参数初始化
3    def __init__(self, left, top, window, image, direction, speed):
4        super().__init__()
5        self.window = window
6        self.load_image = image
7        self.direction = direction
8        self.img = self.load_image[self.direction]
9        self.rect = self.img.get_rect()
10        self.rect.left = left
11        self.rect.top = top
12        self.speed = speed
13        self.tank_width = self.rect.width
14        self.tank_height = self.rect.height
15        self.wall_switch = False
16        self.move_stop = True
17        self.live = True
18        self.old_left = 0
19        self.old_top = 0
20
21    # 开火
22    def fire(self):
23        return Bullet(self, self.window)
24
25    # 显示
26    def display(self):
27        self.img = self.load_image[self.direction]
28        self.window.blit(self.img, self.rect)
29
30    def wall_not(self, direction):
31        if direction == U:
32            return self.rect.top > 0
33        elif direction == D:
34            return self.rect.top <= SCREEN_HEIGHT - self.tank_height
35        elif direction == L:
36            return self.rect.left > 0
37        else:
38            return self.rect.left <= SCREEN_WIDTH - self.tank_width
39
40    def wall_yes(self, direction):
41        if direction == U:
42            if self.rect.top < 0:
43                self.rect.top = SCREEN_HEIGHT
44        elif direction == D:
45            self.rect.top %= SCREEN_HEIGHT
46        elif direction == L:
47            if self.rect.left < 0:
48                self.rect.left = SCREEN_WIDTH
49        else:
50            self.rect.left %= SCREEN_WIDTH
51
52    def move(self, direction):
53        self.old_left = self.rect.left
54        self.old_top = self.rect.top
55        if self.wall_switch:
56            self.wall_yes(direction)
57        elif n ot self.wall_not(direction):
58            return None
59        if direction == U:
60            self.rect.top -= self.speed
61        elif direction == D:
62            self.rect.top += self.speed
63        elif direction == L:
64            self.rect.left -= self.speed
65        else:
66            self.rect.left += self.speed
67
68    def stay(self):
69        self.rect.left = self.old_left
70        self.rect.top = self.old_top
71
72    def tank_collide_wall(self):
73        for wall in TankGame.wall_list:
74            if pygame.sprite.collide_rect(self, wall):
75                self.stay()
76
77    def tank_collide_tank(self):
78        for tank in TankGame.enemy_tank_list:
79            if pygame.sprite.collide_rect(self, tank):
80                self.stay()

6. 定义我方 & 对方tank类

1class MyTank(Tank): 2    def __init__(self, left, top, window): 3        self.img = dict(U=load_img( p2tankU ), D=load_img( p2tankD ), L=load_img( p2tankL ), R=load_img( p2tankR )) 4        self.my_tank_speed = 4 5        super().__init__(left, top, window, self.img, U, self.my_tank_speed) 6 7 8class EnemyTank(Tank): 9    def __init__(self, left, top, window):10        self.img1 = dict(U=load_img( enemy1U ), D=load_img( enemy1D ), L=load_img( enemy1L ), R=load_img( enemy1R ))11        self.img2 = dict(U=load_img( enemy2U ), D=load_img( enemy2D ), L=load_img( enemy2L ), R=load_img( enemy2R ))12        self.img3 = dict(U=load_img( enemy3U ), D=load_img( enemy3D ), L=load_img( enemy3L ), R=load_img( enemy3R ))13        self.img31 = dict(U=load_img( enemy3U_1 ), D=load_img( enemy3D_1 ), L=load_img( enemy3L_1 ),14                          R=load_img( enemy3R_1 ))15        self.img32 = dict(U=load_img( enemy3U_2 ), D=load_img( enemy3D_2 ), L=load_img( enemy3L_2 ),16                          R=load_img( enemy3R_2 ))17        # 不同的坦克击中的次数不一样18        image, self.click_count, speed = random.choice([(self.img1, 1, 4), (self.img3, 3, 3), (self.img2, 1, 5)])19        super().__init__(left, top, window, image, self.random_direction(), speed)20        self.step = 1002122    @staticmethod23    def random_direction():24        n = random.randint(0, 3)25        return DIRECTION[n]2627    def random_move(self):28        if self.step == 0:29            self.direction = self.random_direction()30            self.step = random.randint(10, 100)31        else:32            self.move(self.direction)33            self.step -= 13435    def random_fire(self):36        if random.randint(0, 50) == 1 and len(TankGame.enemy_bullet_list) < 30:37            enemy_bullet = self.fire()38            TankGame.enemy_bullet_list.append(enemy_bullet)class MyTank(Tank):
2    def __init__(self, left, top, window):
3        self.img = dict(U=load_img( p2tankU ), D=load_img( p2tankD ), L=load_img( p2tankL ), R=load_img( p2tankR ))
4        self.my_tank_speed = 4
5        super().__init__(left, top, window, self.img, U, self.my_tank_speed)
6
7
8class EnemyTank(Tank):
9    def __init__(self, left, top, window):
10        self.img1 = dict(U=load_img( enemy1U ), D=load_img( enemy1D ), L=load_img( enemy1L ), R=load_img( enemy1R ))
11        self.img2 = dict(U=load_img( enemy2U ), D=load_img( enemy2D ), L=load_img( enemy2L ), R=load_img( enemy2R ))
12        self.img3 = dict(U=load_img( enemy3U ), D=load_img( enemy3D ), L=load_img( enemy3L ), R=load_img( enemy3R ))
13        self.img31 = dict(U=load_img( enemy3U_1 ), D=load_img( enemy3D_1 ), L=load_img( enemy3L_1 ),
14                          R=load_img( enemy3R_1 ))
15        self.img32 = dict(U=load_img( enemy3U_2 ), D=load_img( enemy3D_2 ), L=load_img( enemy3L_2 ),
16                          R=load_img( enemy3R_2 ))
17        # 不同的坦克击中的次数不一样
18        image, self.click_count, speed = random.choice([(self.img1, 1, 4), (self.img3, 3, 3), (self.img2, 1, 5)])
19        super().__init__(left, top, window, image, self.random_direction(), speed)
20        self.step = 100
21
22    @staticmethod
23    def random_direction():
24        n = random.randint(0, 3)
25        return DIRECTION[n]
26
27    def random_move(self):
28        if self.step == 0:
29            self.direction = self.random_direction()
30            self.step = random.randint(10, 100)
31        else:
32            self.move(self.direction)
33            self.step -= 1
34
35    def random_fire(self):
36        if random.randint(0, 50) == 1 and len(TankGame.enemy_bullet_list) < 30:
37            enemy_bullet = self.fire()
38            TankGame.enemy_bullet_list.append(enemy_bullet)

7. 爆炸动作类

1class Explode(BaseItem): 2    def __init__(self, tank, window): 3        super().__init__() 4        self.img = [load_img( blast0 ), load_img( blast1 ), load_img( blast2 ), load_img( blast3 ), load_img( blast4 ), 5                    load_img( blast5 ), load_img( blast6 )] 6        self.rect = tank.rect 7        self.stop = 0 8        self.window = window 9        self.rect.left = tank.rect.left - tank.rect.width / 210    def display_explode(self):11        load_music( blast )12        while self.stop < len(self.img):13            self.window.blit(self.img[self.stop], self.rect)14            self.stop += 1class Explode(BaseItem):
2    def __init__(self, tank, window):
3        super().__init__()
4        self.img = [load_img( blast0 ), load_img( blast1 ), load_img( blast2 ), load_img( blast3 ), load_img( blast4 ),
5                    load_img( blast5 ), load_img( blast6 )]
6        self.rect = tank.rect
7        self.stop = 0
8        self.window = window
9        self.rect.left = tank.rect.left - tank.rect.width / 2
10    def display_explode(self):
11        load_music( blast )
12        while self.stop < len(self.img):
13            self.window.blit(self.img[self.stop], self.rect)
14            self.stop += 1

8. 定义wall类

1class Wall(BaseItem): 2    def __init__(self, left, top, window): 3        super().__init__() 4        self.count = random.randint(0, 1) 5        self.img = [load_img( steels ), load_img( walls )][self.count] 6        self.rect = self.img.get_rect() 7        self.rect.left = left 8        self.rect.top =  top 9        self.window = window10        self.live = True1112    def display_wall(self):13        self.window.blit(self.img, self.rect)class Wall(BaseItem):
2    def __init__(self, left, top, window):
3        super().__init__()
4        self.count = random.randint(0, 1)
5        self.img = [load_img( steels ), load_img( walls )][self.count]
6        self.rect = self.img.get_rect()
7        self.rect.left = left
8        self.rect.top = top
9        self.window = window
10        self.live = True
11
12    def display_wall(self):
13        self.window.blit(self.img, self.rect)

9. 定义坦克大战类

1class TankGame: 2    my_bullet_list = list() 3    enemy_bullet_list = list() 4    enemy_tank_list = list() 5    wall_list = list() 6 7    def __init__(self): 8        if not os.path.exists(Tank_IMAGE_POSITION): 9            os.makedirs(Tank_IMAGE_POSITION) 10        pygame.init() 11        pygame.font.init() 12        self.display = pygame.display 13        self.window = self.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT], pygame.RESIZABLE, 32) 14        self.display.set_caption( 坦克世界 ) 15        self.my_tank = MyTank(MY_BIRTH_LEFT, MY_BIRTH_TOP, self.window) 16        self.creat_enemy_number = 10 17        self.my_tank_lift = 3 18        self.creat_enemy(self.creat_enemy_number) 19        self.creat_walls() 20        self.font = pygame.font.SysFont( kai_ti , 18) 21        self.number = 1 22 23    def creat_enemy(self, number): 24        for _ in range(number): 25            left = random.randint(0, SCREEN_WIDTH - self.my_tank.tank_width) 26            enemy_tank = EnemyTank(left, 20, self.window) 27            TankGame.enemy_tank_list.append(enemy_tank) 28 29    def creat_walls(self): 30        for i in range(SCREEN_WIDTH // 60 + 1): 31            wall_h = random.randint(100, 500) 32            w = Wall(60 * i, wall_h, self.window) 33            TankGame.wall_list.append(w) 34 35    @staticmethod 36    def show_walls(): 37        for w in TankGame.wall_list: 38            if w.live: 39                w.display_wall() 40            else: 41                TankGame.wall_list.remove(w) 42 43    def start_game(self): 44        load_music( start ) 45        while True: 46            self.window.fill([0, 0, 0]) 47            self.get_event() 48            len_enemy = len(TankGame.enemy_tank_list) 49            self.window.blit( 50                self.draw_text( 敌方坦克*{0},我方生命值*{1},当前{2}关 .format(len_enemy, self.my_tank_lift, self.number)), (10, 10)) 51            if len_enemy == 0: 52                self.creat_enemy_number += 10 53                self.number += 1 54                self.my_tank_lift += 1 55                self.creat_enemy(self.creat_enemy_number) 56                self.wall_list.clear() 57                self.creat_walls() 58            self.show_my_tank() 59            self.show_enemy_tank() 60            self.show_bullet(TankGame.enemy_bullet_list) 61            self.show_bullet(TankGame.my_bullet_list) 62            self.show_walls() 63            self.display.update() 64            time.sleep(0.02) 65 66    def show_my_tank(self): 67        if self.my_tank.live: 68            self.my_tank.display() 69            self.my_tank.tank_collide_tank() 70            self.my_tank.tank_collide_wall() 71        else: 72            Explode(self.my_tank, self.window).display_explode() 73            del self.my_tank 74            if self.my_tank_lift == 0: 75                self.end_game() 76            self.my_tank_lift -= 1 77            load_music( add ) 78            self.my_tank = MyTank(MY_BIRTH_LEFT, MY_BIRTH_TOP, self.window) 79        if not self.my_tank.move_stop: 80            self.my_tank.move(self.my_tank.direction) 81 82    def show_enemy_tank(self): 83        for e in TankGame.enemy_tank_list: 84            e.random_move() 85            e.tank_collide_wall() 86            if e.live: 87                e.display() 88            else: 89                TankGame.enemy_tank_list.remove(e) 90                Explode(e, self.window).display_explode() 91            e.random_fire() 92 93    def show_bullet(self, ls): 94        for b in ls: 95            b.bullet_move() 96            b.bullet_collide_wall() 97            if ls is TankGame.my_bullet_list: 98                b.hit_enemy_tank() 99                b.bullet_collide_bullet()100            else:101                b.hit_my_tank(self.my_tank)102            if b.live:103                b.display_bullet()104            else:105                ls.remove(b)106107    def get_event(self):108        global SCREEN_WIDTH, SCREEN_HEIGHT109        event_list = pygame.event.get()110        for event in event_list:111            if event.type == pygame.VIDEORESIZE:112                SCREEN_WIDTH, SCREEN_HEIGHT = event.size113                self.window = self.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT], pygame.RESIZABLE, 32)114115            if event.type == pygame.QUIT:116                self.end_game()117            if event.type == pygame.KEYDOWN:118                if event.key == pygame.K_w:119                    self.my_tank.direction = U120                elif event.key == pygame.K_s:121                    self.my_tank.direction = D122                elif event.key == pygame.K_a:123                    self.my_tank.direction = L124                elif event.key == pygame.K_d:125                    self.my_tank.direction = R126                else:127                    return None128                self.my_tank.move_stop = False129            elif event.type == pygame.MOUSEBUTTONDOWN:130                if len(TankGame.my_bullet_list) < 3:131                    bullet = self.my_tank.fire()132                    load_music( fire )133                    TankGame.my_bullet_list.append(bullet)134            elif event.type == pygame.KEYUP:135                self.my_tank.move_stop = True136137    def end_game(self):138        self.display.quit()139        sys.exit()140141    def draw_text(self, content):142        text_sf = self.font.render(content, True, [255, 0, 0])143        return text_sfclass TankGame:
2    my_bullet_list = list()
3    enemy_bullet_list = list() 4    enemy_tank_list = list()
5    wall_list = list()
6
7    def __init__(self):
8        if not os.path.exists(Tank_IMAGE_POSITION):
9            os.makedirs(Tank_IMAGE_POSITION)
10        pygame.init()
11        pygame.font.init()
12        self.display = pygame.display
13        self.window = self.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT], pygame.RESIZABLE, 32)
14        self.display.set_caption( 坦克世界 )
15        self.my_tank = MyTank(MY_BIRTH_LEFT, MY_BIRTH_TOP, self.window)
16        self.creat_enemy_number = 10
17        self.my_tank_lift = 3
18        self.creat_enemy(self.creat_enemy_number)
19        self.creat_walls()
20        self.font = pygame.font.SysFont( kai_ti , 18)
21        self.number = 1
22
23    def creat_enemy(self, number):
24        for _ in range(number):
25            left = random.randint(0, SCREEN_WIDTH - self.my_tank.tank_width)
26            enemy_tank = EnemyTank(left, 20, self.window)
27            TankGame.enemy_tank_list.append(enemy_tank)
28
29    def creat_walls(self):
30        for i in range(SCREEN_WIDTH // 60 + 1):
31            wall_h = random.randint(100, 500)
32            w = Wall(60 * i, wall_h, self.window)
33            TankGame.wall_list.append(w)
34
35    @staticmethod
36    def show_walls():
37        for w in TankGame.wall_list:
38            if w.live:
39                w.display_wall()
40            else:
41                TankGame.wall_list.remove(w)
42
43    def start_game(self):
44        load_music( start )
45        while True:
46            self.window.fill([0, 0, 0])
47            self.get_event()
48            len_enemy = len(TankGame.enemy_tank_list)
49            self.window.blit(
50                self.draw_text( 敌方坦克*{0},我方生命值*{1},当前{2}关 .format(len_enemy, self.my_tank_lift, self.number)), (10, 10))
51            if len_enemy == 0:
52                self.creat_enemy_number += 10
53                self.number += 1
54                self.my_tank_lift += 1
55                self.creat_enemy(self.creat_enemy_number)
56                self.wall_list.clear()
57                self.creat_walls()
58            self.show_my_tank()
59            self.show_enemy_tank()
60            self.show_bullet(TankGame.enemy_bullet_list)
61            self.show_bullet(TankGame.my_bullet_list)
62            self.show_walls()
63            self.display.update()
64            time.sleep(0.02)
65
66    def show_my_tank(self):
67        if self.my_tank.live:
68            self.my_tank.display()
69            self.my_tank.tank_collide_tank()
70            self.my_tank.tank_collide_wall()
71        else:
72            Explode(self.my_tank, self.window).display_explode()
73            del self.my_tank
74            if self.my_tank_lift == 0:
75                self.end_game()
76            self.my_tank_lift -= 1
77            load_ music( add )
78            self.my_tank = MyTank(MY_BIRTH_LEFT, MY_BIRTH_TOP, self.window)
79        if not self.my_tank.move_stop:
80            self.my_tank.move(self.my_tank.direction)
81
82    def show_enemy_tank(self):
83        for e in TankGame.enemy_tank_list:
84            e.random_move()
85            e.tank_collide_wall()
86            if e.live:
87                e.display()
88            else:
89                TankGame.enemy_tank_list.remove(e)
90                Explode(e, self.window).display_explode()
91            e.random_fire()
92
93    def show_bullet(self, ls):
94        for b in ls:
95            b.bullet_move()
96            b.bullet_collide_wall()
97            if ls is TankGame.my_bullet_list:
98                b.hit_enemy_tank()
99                b.bullet_collide_bullet()
100            else:
101                b.hit_my_tank(self.my_tank)
102            if b.live:
103                b.display_bullet()
104            else:
105                ls.remove(b)
106
107    def get_event(self):
108        global SCREEN_WIDTH, SCREEN_HEIGHT
109        event_list = pygame.event.get()
110        for event in event_list:
111            if event.type == pygame.VIDEORESIZE:
112                SCREEN_WIDTH, SCREEN_HEIGHT = event.size
113                self.window = self.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT], pygame.RESIZABLE, 32)
114
115            if event.type == pygame.QUIT:
116                self.end_game()
117            if event.type == pygame.KEYDOWN:
118                if event.key == pygame.K_w:
119                    self.my_tank.direction = U
120                elif event.key == pygame.K_s:
121                    self.my_tank.direction = D
122                elif event.key == pygame.K_a:
123                    self.my_tank.direction = L
124                elif event.key == pygame.K_d:
125                    self.my_tank.direction = R
126                else:
127                    return None
128                self.my_tank.move_stop = False
129            elif event.type == pygame.MOUSEBUTTONDOWN:
130                if len(TankGame.my_bullet_list) < 3:
131                    bullet = self.my_tank.fire()
132                    load_music( fire )
133                    TankGame.my_bullet_list.append(bullet)
134            elif event.type == pygame.KEYUP:
135                self.my_tank.move_stop = True
136
137    def end_game(self):
138        self.display.quit()
139        sys.exit()
140
141    def draw_text(self, content):
142        text_sf = self.font.render(content, True, [255, 0, 0])
143        return text_sf

10. 入口

1if __name__ ==  __main__ :2    g = TankGame()3    g.start_game()if __name__ ==  __main__ :
2    g = TankGame()
3    g.start_game( )

执行界面

640?wx_fmt=jpeg
熟悉不

到这儿我们的这个小游戏基本完成了,完整代码请点击原文提取

推荐阅读

24岁被委以重任、35岁破格晋升,41岁他候选中国工程院院士

关于Python导入模块,你可能没学透?!

北漂5年程序员现状:有人年薪百万,有人基层搬砖

不吹不擂,你想要的Python面试都在这里了【315+道题】


640?wx_fmt=png

喜欢就点击“在看”吧!
作者:机器学习算法与Python学习-公众号



Python 用python 坦克大战

需要 登录 后方可回复, 如果你还没有账号请 注册新账号