一。步骤思考
1.创建一个游戏窗口,这里采用pygame来完成游戏的编写,包括游戏窗口的宽和高,游戏的背景图。实际游戏界面是通过在游戏窗口进行贴图片和控制图片的位置来完成。
2.既然是游戏,那么就由键盘控制,当然也就有了键盘的检测。
3.游戏的角色设置,打飞机游戏的角色包括玩家飞机,敌机,玩家子弹,和敌机子弹。这些角色的设置即通过python里面的类来完成,也就是面向对象编程。
4.角色分析
(1)玩家角色:首先,玩家的初始化设置,包括玩家的子弹,玩家飞机的图片以及嵌入游戏窗口,这就涉及到玩家飞机的位置。然后涉及到的操作有玩家按下的键盘检测以及对应的飞机位置的移动。最后,飞机发射子弹,这就涉及到子弹类的调用。
(2)敌机:首先,敌机的初始化设置,包括敌机的子弹,敌机飞机的图片以及嵌入游戏窗口,这就涉及到敌机的位置。然后涉及到的操作有敌机的位置的移动,与玩家飞机不同,敌机飞机的移动是左右自动移动。接下来,敌机发射子弹,涉及到子弹类的调用,与玩家不同的是,敌机的子弹与敌机位置移动相关,这里就会需要随机数产生,控制当飞机移动多少位置之后随机发射多少子弹。最后,敌机和子弹移动之后必须刷新显示到游戏窗口上面。
(3)子弹:子弹分为敌机子弹和玩家子弹,需要判断子弹类型。首先,子弹的图片位置以及嵌入游戏窗口,此处需要注意,子弹的位置需要根据飞机的位置来设置,因为子弹是由飞机来发射。还有就是子弹的显示,通过一个显示方法来将子弹显示到游戏界面。
5.完成了游戏的分析之后,就是创建相关的类,并且调用。
二。代码实现
#encoding=utf-8
import pygame
#导入按键检测
from pygame.locals import *
#导入延时
import time
#导入随机
import random
#创建玩家飞机类
class playerPlane(object):
#初始化,默认设置
def __init__(self):
#存储子弹列表
self.bullList = []
#飞机图片
planeImageName = './1.jpg'
self.image = pygame.image.load(planeImageName).convert()
#设置默认坐标(左上角(0,0))
self.x = 220
self.y = 240
#添加子弹属性
self.bullet = []
#设置速度
self.speed = 5
#设置飞机名字
self.planeName = 'player'
self.screen = screen
#将飞机显示出来
def draw(self):
self.screen.blit(self.image,(self.x,self.y))
for temp in self.bullet:
temp.draw()
#控制飞机左右移动,键盘按下的处理方法
def keyHandle(self,keyValue):
global g_bullet
if keyValue == 'left':
#print('--按下左键--')
self.x -=20
elif keyValue == 'right':
#print('--按下右键--')
self.x +=20
elif keyValue == 'space':
#print('--按下空格键--')
self.bullet.append( Bullet(self.planeName,self.x +27,self.y))
#创建子弹类
class Bullet(object):
#初始化,默认设置
def __init__(self,planeName,x,y):
#print('调用子弹')
if planeName == 'player':
bulletImageName = './4.jpg'
elif planeName == 'enemyer':
bulletImageName = './5.jpg'
self.image = pygame.image.load(bulletImageName).convert()
self.screen = screen
self.x = x
self.y = y
self.planeName = planeName
#将子弹显示出来
def draw(self):
if self.planeName == 'player':
self.y -=2
elif self.planeName == 'enemyer':
self.y +=2
self.screen.blit(self.image,(self.x,self.y))
#定义敌机的类
class enemy(object):
def __init__(self,x=0,y=0):
self.x = x
self.y = y
enemyImageName = './2.jpg'
self.image = pygame.image.load(enemyImageName).convert()
self.screen = screen
self.fangxiang = 'right'
self.name = 'enemyer'
self.bullet = []
def draw(self):
self.screen.blit(self.image,(self.x,self.y))
for temp in self.bullet:
temp.draw()
def move(self):
if self.fangxiang == 'right':
self.x +=2
elif self.fangxiang == 'left':
self.x -=2
if self.x > 460:
self.fangxiang = 'left'
elif self.x <= 0:
self.fangxiang = 'right'
#print(self.x)
randomNum = random.randint(1,100)
if randomNum in [50,70]:
self.bullet.append(Bullet(self.name,self.x +30,self.y+24))
#代码
if __name__ == '__main__':
screen = pygame.display.set_mode((480,300),0,32)
bgImageFile ='./3.jpg'
background = pygame.image.load(bgImageFile).convert()
#1.显示背景
#screen.blit(background,(0,0))
#pygame.display.update()
#创建玩家
player = playerPlane()
#创建敌机
enemyer = enemy()
while True:
#如果在里面创建玩家,则会创建无数个,故玩家创建在外面
screen.blit(background,(0,0))
#判断是否点了退出按钮
for event in pygame.event.get():
#print(event.type)
if event.type == QUIT:
print('exit')
exit()
elif event.type == KEYDOWN:
if event.key == K_a or event.key == K_LEFT:
#print('left')
player.keyHandle('left')
elif event.key == K_d or event.key == K_RIGHT:
#print('right')
player.keyHandle('right')
elif event.key == K_SPACE:
#print('space')
player.keyHandle('space')
#调用类,且把screen传进去
player.draw()
enemyer.move()
enemyer.draw()
pygame.display.update()
#延时
time.sleep(0.01)