python飞机大战代码(面向过程)持续更新中

飞机大战代码

    • 1、游戏基本框架
    • 2、添加玩家飞机,并控制飞机左右移动
    • 3、让玩家飞机喷火和发射子弹
    • 4、添加敌方飞机,让敌方飞机移动

我写的这个代码是递进式的,下一个代码包含前一个需求的代码,为了方便新手理解(我自己也是个新手哈)。可以比较前后两个代码的不同,能够看出这个游戏的开发思路,思路不唯一哈。

1、游戏基本框架

导入pygame模块
窗口的一些设置
screen = pygame.display.set_mode() 设置窗口大小
pygame.display.set_caption() 设置游戏窗口标题
pygame.display.set_icon() 设置窗口左上角图标
注:必须使用变量记录set_mode方法的返回窗口对象,因为:后续所有的图像绘制都基于这个返回结果
screen.blit(background,(x,y))向窗口中粘贴背景图片,(x,y)对应的是图片左上角的坐标
pygame.display.update() # 更新屏幕显示

V1.0版本
import pygame

window = pygame.display.set_mode((480,500)) # 设置游戏窗口大小
pygame.display.set_caption('飞机大战') # 设置游戏窗口标题
icon = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\icon72x72.png')
pygame.display.set_icon(icon)# 设置窗口左上角图标


background = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\background.png')# 设置窗口背景图片


# 游戏循环,进入游戏循环就意味着游戏的开始
while True:
    window.blit(background,(0,0)) # 将背景图片粘贴到窗口
    # 获取事件并逐类响应
    for event in pygame.event.get():

        if event.type == pygame.QUIT: # 如果事件的类型是退出(点击退出按钮触发)
            print('退出了')
            exit(0)

    pygame.display.update() # update更新屏幕显示

2、添加玩家飞机,并控制飞机左右移动

需求:加载玩家飞机图片,并控制飞机左右移动
1.加载玩家飞机图片
pygame.image.load(‘图片路径’)
将玩家飞机图片粘贴到窗口上
2.控制飞机左右移动
导入模块from pygame.locals import *
触发事件KEYDOWN
(1)如果控制飞机左移,触发事件K_LEFT
飞机左移,横坐标减小
控制飞机移动范围,防止飞机跑丢了
(2)如果控制飞机右移,触发事件K_RIGHT
飞机右移,横坐标增加
控制飞机移动范围,防止飞机跑丢了

import pygame
from pygame.locals import *


window = pygame.display.set_mode((480,500)) # 设置游戏窗口大小
pygame.display.set_caption('飞机大战') # 设置游戏窗口标题
icon = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\icon72x72.png')
pygame.display.set_icon(icon)# 设置窗口左上角图标
playerPlane = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\hero.gif') # 加载玩家飞机图片,图片尺寸100×124
player_x = (480-100)//2 # 飞机左上角坐标,横坐标
player_y = 500-124 # 纵坐标


background = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\background.png')# 设置窗口背景图片


# 游戏循环,进入游戏循环就意味着游戏的开始
while True:
    window.blit(background,(0,0)) # 将背景图片粘贴到窗口
    window.blit(playerPlane,(player_x,player_y)) # 将玩家飞机粘贴到窗口上
    # 获取事件并逐类响应
    for event in pygame.event.get(): # 循环获取事件(尤其是鼠标、键盘事件)

        if event.type == pygame.QUIT: # 如果事件的类型是退出(点击退出按钮触发)
            print('退出了')
            exit(0)
        elif event.type == KEYDOWN:
            # 控制飞机左右移动
            if event.key == K_LEFT: # 飞机
                player_x = player_x - 5 if player_x>0 else 0 # 防止飞机移出窗口,如果没有这条语句的话,飞机会移出窗口
            elif event.key == K_RIGHT:
                player_x = player_x + 5 if player_x<480-100-5 else (480-100) # 控制飞机移动范围

    pygame.display.update() # update更新屏幕显示

3、让玩家飞机喷火和发射子弹

需求:让玩家飞机喷火和发射子弹
1.让玩家飞机喷火(本质就是两张图片的切换)
2.飞机发射子弹
封装一个玩家飞机子弹类
触发事件:按下空格键发射子弹
(1)按下空格键,创建一个子弹对象
(2)将子弹添加到子弹列表中
(3)遍历列表中的子弹
(4)发射子弹,即将子弹图片粘贴到窗口上
(5)如果子弹移动范围超出窗口,则将子弹从子弹列表中移出

import pygame
from pygame.locals import *

# 封装玩家飞机子弹类
class PlayerBullet():
    def __init__(self,x,y,window):
        self.x = x
        self.y = y
        self.window = window
        self.picture = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\bullet.png') # 子弹图片,图片尺寸(22×22)
    def draw(self):
        self.window.blit(self.picture,(self.x,self.y)) # 向窗口粘贴子弹图片
        self.move()
    def move(self): # 子弹移动
        self.y -= 5 # 子弹向上移动
window = pygame.display.set_mode((480,500)) # 设置游戏窗口大小


pygame.display.set_caption('飞机大战') # 设置游戏窗口标题
icon = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\icon72x72.png')
pygame.display.set_icon(icon)# 设置窗口左上角图标

playerPlaneIndex = 0
playerPlane1 = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\hero1.png') # 加载玩家飞机图片,图片尺寸100×124
playerPlane2 = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\hero2.png') # 加载玩家飞机图片,图片尺寸100×124

player_x = (480-100)//2 # 飞机左上角坐标,横坐标
player_y = 500-124 # 纵坐标
playerPlaneBulletList = [] # 玩家飞机子弹列表为空

background = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\background.png')# 设置窗口背景图片
# 第一个参数是,按下键盘30毫秒后开始反应,第二个参数是按下30毫秒未抬起,触发一次新的按键事件
pygame.key.set_repeat(30,120)

# 游戏循环,进入游戏循环就意味着游戏的开始
while True:
    window.blit(background,(0,0)) # 将背景图片粘贴到窗口
    if playerPlaneIndex == 0:
        window.blit(playerPlane1,(player_x,player_y)) # 将玩家飞机粘贴到窗口上
        playerPlaneIndex = 1
    else:
        window.blit(playerPlane2,(player_x,player_y)) # 将玩家飞机粘贴到窗口上
        playerPlaneIndex = 0
    # for zd in playerPlaneBulletList:
    #     zd.draw()
    #     playerPlaneBulletList.remove(zd) if zd.y < 0 else ''
    # 获取事件并逐类响应
    for event in pygame.event.get(): # 循环获取事件(尤其是鼠标、键盘事件)

        if event.type == pygame.QUIT: # 如果事件的类型是退出(点击退出按钮触发)
            print('退出了')
            exit(0)
        elif event.type == KEYDOWN:
            # 控制飞机左右移动
            if event.key == K_LEFT: # 飞机
                player_x = player_x - 5 if player_x>0 else 0 # 防止飞机移出窗口,如果没有这条语句的话,飞机会移出窗口
            elif event.key == K_RIGHT:
                player_x = player_x + 5 if player_x<480-100-5 else (480-100) # 控制飞机移动范围
            # 设置按下空格键 发射子弹
            elif event.key == K_SPACE:
                zd = PlayerBullet(player_x + 100/2 - 22/2,player_y - 22,window) # 创建玩家飞机子弹对象
                playerPlaneBulletList.append(zd) # 向子弹列表中添加子弹
    for zd in playerPlaneBulletList:
        zd.draw()
        playerPlaneBulletList.remove(zd) if zd.y < 0 else '' # 如果子弹纵坐标小于0,说明子弹已经移出窗口,则移出列表中的子弹
    pygame.display.update() # update更新屏幕显示

4、添加敌方飞机,让敌方飞机移动

需求:添加敌方飞机,让敌方飞机移动
1.添加敌方飞机
2.让敌方飞机移动
设置初始移动方向
如果走到窗口边界,则调换方向

import pygame
from pygame.locals import *


# 封装玩家飞机子弹类
class PlayerBullet():
    def __init__(self,x,y,window):
        self.x = x
        self.y = y
        self.window = window
        self.picture = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\bullet.png') # 子弹图片,图片尺寸(22×22)
    def draw(self):
        self.window.blit(self.picture,(self.x,self.y)) # 向窗口粘贴子弹图片
        self.move()
    def move(self): # 子弹移动
        self.y -= 5 # 子弹向上移动
window = pygame.display.set_mode((480,500)) # 设置游戏窗口大小


pygame.display.set_caption('飞机大战') # 设置游戏窗口标题
icon = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\icon72x72.png')
pygame.display.set_icon(icon)# 设置窗口左上角图标

playerPlaneIndex = 0
playerPlane1 = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\hero1.png') # 加载玩家飞机图片,图片尺寸100×124
playerPlane2 = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\hero2.png') # 加载玩家飞机图片,图片尺寸100×124

player_x = (480-100)//2 # 飞机左上角坐标,横坐标
player_y = 500-124 # 纵坐标
playerPlaneBulletList = [] # 玩家飞机子弹列表为空

enemyPlane = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\enemy1.png') # 加载敌军飞机图片,图片尺寸(69×89)
enemy_x = (480-69)//2
enemy_y = 0
direct = '左'

background = pygame.image.load(r'C:\Users\Administrator\Desktop\0715系统班\飞机大战\img\background.png')# 设置窗口背景图片
# 第一个参数是,按下键盘30毫秒后开始反应,第二个参数是按下30毫秒未抬起,触发一次新的按键事件
pygame.key.set_repeat(30,120)

# 游戏循环,进入游戏循环就意味着游戏的开始
while True:
    window.blit(background,(0,0)) # 将背景图片粘贴到窗口
    window.blit(enemyPlane,(enemy_x,enemy_y)) # 将敌军飞机粘贴到窗口
    if direct == '左':
        enemy_x = enemy_x - 3
        if enemy_x<=0:
            direct = '右'
    else:
        enemy_x = enemy_x + 3
        if enemy_x>=480 - 69:
            direct = '左'
    if playerPlaneIndex == 0:
        window.blit(playerPlane1,(player_x,player_y)) # 将玩家飞机粘贴到窗口上
        playerPlaneIndex = 1
    else:
        window.blit(playerPlane2,(player_x,player_y)) # 将玩家飞机粘贴到窗口上
        playerPlaneIndex = 0
    # for zd in playerPlaneBulletList:
    #     zd.draw()
    #     playerPlaneBulletList.remove(zd) if zd.y < 0 else ''
    # 获取事件并逐类响应
    for event in pygame.event.get(): # 循环获取事件(尤其是鼠标、键盘事件)

        if event.type == pygame.QUIT: # 如果事件的类型是退出(点击退出按钮触发)
            print('退出了')
            exit(0)
        elif event.type == KEYDOWN:
            # 控制飞机左右移动
            if event.key == K_LEFT: # 飞机
                player_x = player_x - 5 if player_x>0 else 0 # 防止飞机移出窗口,如果没有这条语句的话,飞机会移出窗口
            elif event.key == K_RIGHT:
                player_x = player_x + 5 if player_x<480-100-5 else (480-100) # 控制飞机移动范围
            # 设置按下空格键 发射子弹
            elif event.key == K_SPACE:
                zd = PlayerBullet(player_x + 100/2 - 22/2,player_y - 22,window) # 创建玩家飞机子弹对象
                playerPlaneBulletList.append(zd) # 向子弹列表中添加子弹
    for zd in playerPlaneBulletList:
        zd.draw()
        playerPlaneBulletList.remove(zd) if zd.y < 0 else '' # 如果子弹纵坐标小于0,说明子弹已经移出窗口,则移出列表中的子弹
    pygame.display.update() # update更新屏幕显示

你可能感兴趣的:(Python第一阶段)