版权声明:本文为博主原创文章,未经博主允许不得转载。
一、项目步骤
1.1 结构图
1.2 代码实现
1.2.1 01_坦克大战.py
# coding:utf-8
import pygame, sys,time
from random import randint
from pygame.locals import *
"""坦克大战的主窗口"""
class TankMain(object):
width = 600
height= 500
my_tank_missile_list = []
my_tank = None
enemy_list = []
# 开始游戏的方法
def startGame(self):
pygame.init() #模块初始化:加载系统的资源
# 创建一个屏幕,屏幕的大小((宽,高),窗口的特性[0,RESIZEBLE,FULLSCREEM],颜色位数)
screem = pygame.display.set_mode((TankMain.width,TankMain.height), 0, 32) # 0:窗口不可变
# 给窗口设置一个标题
pygame.display.set_caption("坦克大战")
# my_tank = Tank(screem,275,400) 创建一个我方坦克,坦克显示在屏幕的中下部位置
TankMain.my_tank = My_Tank(screem)
for i in range(1,6):
TankMain.enemy_list.append(Enemy_Tank(screem))
while True:
# color RGB(0,0,0),(255,255,255)
# 设置屏幕的背景色为黑色
screem.fill((0, 0, 0))
# 显示左上角的文字
for i, text in enumerate(self.write_test(), 0):
screem.blit(text, (0, 5+(15*i)))
# screem.blit(self.write_test(),(0,5))
# 获取事件:根据获取的事件处理
self.get_event(TankMain.my_tank)
TankMain.my_tank.display() # 在屏幕上显示我方坦克
TankMain.my_tank.move() # 在屏幕行移动我方坦克
# 显示和随机移动 所有的敌方敌方坦克
for enemy in TankMain.enemy_list:
enemy.display()
enemy.random_move()
# 显示所有的我方炮弹
for m in TankMain.my_tank_missile_list:
if m.live:
m.display()
m.move()
else:
TankMain.my_tank_missile_list.remove(m)
# 显示重置
time.sleep(0.05) # 多少秒画一帧 —— 每次休眠0.05秒
pygame.display.update()
# 获取所有的事件:敲击键盘,鼠标点击
def get_event(self,my_tank):
for event in pygame.event.get():
if event.type == QUIT:
self.stopGame() # 程序退出
if event.type == KEYDOWN: # 键盘事件
if event.key == K_LEFT or event.key == K_a:
my_tank.direction ="L" # 仅仅改变坦克的方向:左
my_tank.stop = False
# my_tank.move()
if event.key == K_RIGHT or event.key == K_d:
my_tank.direction = "R"
my_tank.stop = False
# my_tank.move()
if event.key == K_UP or event.key == K_w:
my_tank.direction = "U"
my_tank.stop = False
# my_tank.move()
if event.key == K_DOWN or event.key == K_s:
my_tank.direction = "D"
my_tank.stop = False
# my_tank.move()
if event.key == K_ESCAPE: # 敲击键盘的Esc键
self.stopGame() # 程序退出
if event.key == K_SPACE: # 敲击键盘的空格键,发射炮弹
TankMain.my_tank_missile_list.append(my_tank.fire())
if event.type == KEYUP:
if event.key == K_LEFT or event.key == K_RIGHT or event.key == K_UP or event.key == K_DOWN:
my_tank.stop = True
if event.type == MOUSEBUTTONUP: # 鼠标事件
pass
# 关闭游戏
def stopGame(self):
sys.exit()
# 在屏幕的左上角显示文字内容
def write_test(self):
font = pygame.font.SysFont("simsunnsimsun",20) # 定义一个字体
text_sf1 = font.render("敌方坦克数量为:%d"%len(TankMain.enemy_list),True,(255,0,0)) # 根据字体创建一个文字的图像
text_sf2 = font.render("我方坦克炮弹的数量为:%d"%len(TankMain.my_tank_missile_list), True, (255, 0, 0))
return text_sf1, text_sf2
# 设计游戏窗口的标题
def set_title(self):
pass
# 坦克大战游戏中所有对象的父类
class BaseItem(pygame.sprite.Sprite):
def __init__(self,screem):
pygame.sprite.Sprite.__init__(self)
# 所有对象共享的属性
self.screem = screem
# 在游戏屏幕中显示当前游戏对象
def display(self):
if self.live:
self.image = self.images[self.direction] # 把图象赋值 设置坦克的图像
self.screem.blit(self.image,self.rect) # 画图像
# 坦克的公共父类
class Tank(BaseItem):
# 定义类属性,所有坦克对象高和宽都是一样的(类属性:所有对象可以共享)
width = 60
height = 60
def __init__(self,screem,left,top): # 表示坐标的意思 left:x top:y
super().__init__(screem)
#self.screem = screem # 坦克在移动或显示过程中需要用到当前游戏的屏幕
self.direction = "D" # 坦克的方向,默认方向向下(上下左右)
self.speed = 5 # 坦克移动的(默认)速度
self.stop = False # 坦克移动,停止的初始值
self.images = {
} # 坦克的所有图片(key:方向 value:图片 surface)
self.images["L"] = pygame.image.load("images/enemy1L.gif")
self.images["R"] = pygame.image.load("images/enemy1R.gif")
self.images["U"] = pygame.image.load("images/enemy1U.gif")
self.images["D"] = pygame