0基础学python(九) |
|
P2P
L3
• 2020-11-03 • 回复 6 • 只看楼主
• 举报
|
今天做个打飞机的小游戏??
首先安装pygame模块,win+r打开管理器输入cmd进入一个黑黑的窗口,(确保python加入环境变量)输入pip install pygame
首先导入需要的模块
import pygame
from pygame.locals import *
然后我们去网上找一些图片,己方飞机,敌方飞机,背景图,自家子弹,敌方子弹。
我们首先要创建一个窗口,看一下你们找的背景图的尺寸
#1. 创建窗口
screen = pygame.display.set_mode((480,852),0,32)
#2. 创建一个背景图片
background = pygame.image.load("填写背景图片存放的路径")
创建窗口后他就是那个黑黑的窗口,需要把背景图片填充进去,不然看着太黑了??接着我们进行背景填充,这里注意要加一个死循环,不然那个界面闪一下就结束了,因为代码执行完了就关闭了
while True:
screen.blit(background, (0,0))#填充背景图片
这样简单的背景就做好了,现在我们开始创建玩家控制的飞机,这边引入一下类,大家都吃过月饼吧,?上面有很多花纹,花纹怎么来的?靠模具对吧,模具就相当于类,月饼就相当于实例对象,一个模具可以做很多个月饼,同样一个类可以有很多的实例对象,简单介绍一下类的写法
class Plane():#Plane是类的名字
def __init__(self,name):
'''初始化'''
self.name = name
def fly():#方法(在类里面定义的函数叫方法)
print('%s正在飞'%(self.name))
#实例化对象
feiji = Plane('阿飞')
#调用类里面的方法
feiji.fly()
__init__前后都是两个下划线,起到初始化的作用,例如打游戏时像cf,lol每局游戏的开始的时候位置都一样的,可以加载一些信息,实例对象时会自动调用__init__方法self必须写,后面就是一些属性可以由用户输入就像上面的name
我们现在就可以开始创建玩家飞机了,这里注意一下游戏窗口的左上角为(0,0)建立直角坐标系向右x逐渐变大向下y逐渐变大,玩家飞机图片实际上是一个矩形的图片,看好玩家飞机图片的尺寸合理设置x,y坐标
class HeroPlane():
def __init__(self, screen_temp):
self.x = 210#x坐标
self.y = 700#y的坐标
self.screen = screen_temp#让玩家飞机出现在屏幕上
self.image = pygame.image.load("玩家飞机图片路径")
self.bullet_list = []#存储发射出去的子弹对象引用
hero = HeroPlane(screen)#实例对象
我们这里就简单想一下我们这个飞机要干啥首先就是出现在屏幕上,其次尽量放在中间靠下的位置这个坐标大家自己去试,然后飞机需要移动和发射子弹
先做一个移动的方法,这边不需要大家去理解,这个东西比较死板
def key_control(hero_temp):
#获取事件,比如按键等
for event in pygame.event.get():
#判断是否是点击了退出按钮
if event.type == QUIT:
print("exit")
exit()
#判断是否是按下了键
elif event.type == KEYDOWN:
#检测按键是否是a或者left
if event.key == K_a or event.key == K_LEFT:
hero_temp.move_left()
#检测按键是否是d或者right
elif event.key == K_d or event.key == K_RIGHT:
hero_temp.move_right()
#检测按键是否是空格键
elif event.key == K_SPACE:
hero_temp.fire()
key_control(hero)
这边就是方向键和射击以及退出就写好了,然后我们在己方飞机的类里面定义一下移动就行了
def move_left(self):
self.x -= 5
def move_right(self):
self.x += 5
然后就是发射子弹的问题了
def display(self):
self.screen.blit(self.image, (self.x, self.y))#让子弹显示在窗口上
for bullet in self.bullet_list:
bullet.display()
bullet.move()
if bullet.judge():#判断子弹是否越界
self.bullet_list.remove(bullet)
子弹只是进行一个上下移动的问题我们让它出边界删除就行了,我们现在创建一个子弹类
class Bullet():
def __init__(self, screen_temp, x, y):
'''x,y为飞机坐标子弹的坐标应该在飞机头上所以要进行偏移'''
self.x = x+40
self.y = y-20
self.screen = screen_temp
self.image = pygame.image.load("子弹图片路径")
def display(self):#子弹显示在屏幕上
self.screen.blit(self.image, (self.x, self.y))
def move(self):
self.y-=20
def judge(self):#判断是否出界
if self.y<0:
return True
else:
return False
然后创建敌方飞机的类,比较简单也不需要玩家控制方向,让它左右来回飘就行了,我就讲一下敌方的子弹发射问题,可以让一个变量储存一个随机数,当随机数等于几的时候就发射子弹
def fire(self):
#产生一个随机数
random_num = random.randint(1,100)
#当随机数为10或99时敌机发射子弹
if random_num == 10 or random_num == 99:
self.bullet_list.append(EnemyBullet(self.screen, self.x, self.y))
接下来我就把完整的代码发一下
import pygame
from pygame.locals import *
import random
class HeroPlane():
def __init__(self, screen_temp):
self.x = 210
self.y = 700
self.screen = screen_temp
self.image = pygame.image.load("玩家飞机图片路径")
self.bullet_list = []#存储发射出去的子弹对象引用
def display(self):
#图片显示在窗口上
self.screen.blit(self.image, (self.x, self.y))
for bullet in self.bullet_list:
bullet.display()#显示子弹
bullet.move()#子弹移动
if bullet.judge():#判断子弹是否越界
self.bullet_list.remove(bullet)
def move_left(self):
self.x -= 5
def move_right(self):
self.x += 5
def fire(self):
self.bullet_list.append(Bullet(self.screen, self.x, self.y))
class EnemyPlane(object):
"""敌机的类"""
def __init__(self, screen_temp):
self.x = 0#敌机位置
self.y = 0
self.screen = screen_temp
self.image = pygame.image.load("敌机图片路径")
self.bullet_list = []#存储发射出去的子弹对象引用
self.direction = "right"#用来存储飞机默认的显示方向
def display(self):
#显示图片
self.screen.blit(self.image, (self.x, self.y))
for bullet in self.bullet_list:
bullet.display()#显示敌方子弹
bullet.move()#子弹移动
if bullet.judge():#判断子弹是否越界
self.bullet_list.remove(bullet)
def move(self):
if self.direction=="right":
self.x += 5
elif self.direction=="left":
self.x -= 5
'''由于图片也有大小所以边界应该是背景的x轴长度减去飞机x轴长度
if self.x>480-50:
self.direction = "left"
elif self.x<0:
self.direction = "right"
def fire(self):
random_num = random.randint(1,100)
if random_num == 8 or random_num == 20:
self.bullet_list.append(EnemyBullet(self.screen, self.x, self.y))
class Bullet():
def __init__(self, screen_temp, x, y):
self.x = x+40
self.y = y-20
self.screen = screen_temp
self.image = pygame.image.load("子弹图片路径")
def display(self):
self.screen.blit(self.image, (self.x, self.y))
def move(self):
self.y-=20
def judge(self):
if self.y<0:
return True
else:
return False
class EnemyBullet(object):
#敌方子弹类
def __init__(self, screen_temp, x, y):
self.x = x+25
self.y = y+40
self.screen = screen_temp
self.image = pygame.image.load("./feiji/bullet1.png")
def display(self):
self.screen.blit(self.image, (self.x, self.y))
def move(self):
self.y+=5
def judge(self):
if self.y>852:
return True
else:
return False
def key_control(hero_temp):
#获取事件,比如按键等
for event in pygame.event.get():
#判断是否是点击了退出按钮
if event.type == QUIT:
print("exit")
exit()
#判断是否是按下了键
elif event.type == KEYDOWN:
#检测按键是否是a或者left
if event.key == K_a or event.key == K_LEFT:
print('left')
hero_temp.move_left()
#检测按键是否是d或者right
elif event.key == K_d or event.key == K_RIGHT:
print('right')
hero_temp.move_right()
#检测按键是否是空格键
elif event.key == K_SPACE:
print('space')
hero_temp.fire()
def main():
#1. 创建窗口
screen = pygame.display.set_mode((480,852),0,32)
#2. 创建一个背景图片
background = pygame.image.load("./feiji/background.png")
#3. 创建一个飞机对象
hero = HeroPlane(screen)
#4. 创建一个敌机
enemy = EnemyPlane(screen)
while True:
screen.blit(background, (0,0))
hero.display()
enemy.display()
enemy.move()#调用敌机的移动方法
enemy.fire()#敌机开火
pygame.display.update()#更新图片
key_control(hero)
if __name__ == "__main__":
main()
就讲到这里了,点赞30出个完整版的坦克大战包括坦克爆炸效果