小时候玩的“坦克大战”,你还记得吗?
满满的回忆
!
今天,我们使用Python以及强大的第三方库来实现一个简单的坦克大战游戏。
整体效果
环境依赖
-
python3.7
-
pygame1.9.6
-
urllib
-
内置库,如random、sys、time、os等
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 - 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()
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__()
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 = 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.