一篇文章教你Python做一个飞机大战(超详细)(一听就懂)

前言

最近在学习Python,便用Pygame做了一个经典游戏——飞机大战。有兴趣的朋友可以参考一下。



注:本文很长,若只是想要代码或已经学会pygame的朋友只要看图片资源、代码、文件目录、实现效果


运行环境

1.一台可以使用的windows电脑
2.含有python运行环境(安装了python编译器)


安装Pygame

1.打开命令提示符

点击快捷键win+r,进入运行界面:
在这里插入图片描述
输入“cmd”,单击确定:
在这里插入图片描述

会出现类似这样的一个黑窗口(当然我演示的系统是win7,其他win版本可能略有不同)
在这里插入图片描述

pip安装pygame

输入命令“pip install pygame”,点击回车

稍等片刻即可完成

如果速度太慢,可以输入pip install pygame -i http://pypi.mirrors.ustc.edu.cn/simple/ 来临时更换pip源,加快pip速度,详见:让你的pip从龟速到豹速


图片资源

链接:https://pan.baidu.com/s/1pMM0beb


游戏原理&注意事项

玩过飞机大战的朋友应该都知道,自己通过方向键来控制飞机,发射炮弹摧毁敌机,若敌机碰到自己的飞机,自己牺牲。
通过玩法,可以写出这样的一个大if:
在这里插入图片描述
这个大if就是游戏的根本思想。
根据用户按键控制飞机左右移动,我们要捕获用户按键,改变飞机位置;

英雄子弹碰撞敌机敌机牺牲或英雄碰到敌机英雄牺牲,我们要进行碰撞检测;

为了更好的控制敌机、英雄、子弹,我们要建立精灵组;

代码采用面向对象的编写方式,要有类/对象基础;

代码分两个文件编写,一个叫Plane_Game(游戏主程序),一个叫PlaneSprite(负责游戏精灵和工具编写)

这是游戏的精髓。如果你对这几种都掌握了,了解目标后,我们开始编写代码吧!

编写代码

1.导入模块

Plane_Game.py

#导入pygame和工具文件
import pygame
from PlaneSprites import *

PlaneSprite.py

import random,pygame

2.完成框架

(1)确定职责

我们在主文件中,根据要实现的不同目标,设立了几个方法,避免某一个方法的代码写得太过冗长:

游戏初始化 —— init() 会调用以下方法:

方法 职责
__create_sprites(self) 创建所有精灵和精灵组

主循环 start_game() 会调用以下方法:

方法 职责
__event_handler(self) 事件监听
__check_collide(self) 碰撞检测 —— 子弹销毁敌机、敌机撞毁英雄
__update_sprites(self) 精灵组更新和绘制
__game_over() 游戏结束

完成类的创建

if name == 'main’的意思是:当.py文件被直接运行时,if name == 'main’之下的代码块将被运行;当.py文件以模块形式被导入时,if name == 'main’之下的代码块不被运行。

#类继承自object基类
class PlaneGame(object):
    """飞机大战主游戏"""
    #完成初始化方法框架
    def __init__(self):
        print("游戏初始化")
    #完成开始游戏框架
    def start_game(self):
        print("开始游戏...")

#if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。
if __name__ == '__main__':
    # 创建游戏对象
    game = PlaneGame()

    # 启动游戏
    game.start_game()

完成__init__()创建

self.clock = pygame.time.Clock() 创建时钟对象,用来设置刷新帧率,60就能达到非常好的效果了

def __init__(self):
    print("游戏初始化")
    
    # 1. 创建游戏的窗口
    self.screen = pygame.display.set_mode((480, 700))
    # 2. 创建游戏的时钟
    self.clock = pygame.time.Clock()
    # 3. 调用私有方法,精灵和精灵组的创建
    self.__create_sprites()

def __create_sprites(self):
    pass

把固定数值设为常量

  • 代码调整

plane_sprites.py 中增加常量定义

import pygame
# 游戏屏幕大小
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)

修改 plane_main.py 中的窗口大小

#矩形对象的size就是它的宽和高(x,y)
self.screen = pygame.display.set_mode(SCREEN_RECT.size)

完善游戏循环框架

pygame.event.get()是获取到当前事件的队列 因为我们要处理这个队列的所有事件,
一般我们都会设置一个循环,就可以去处理内部一个一个的event

def start_game(self):
        """开始游戏"""
        while True:
            #1.设置刷新帧率
            self.clock.tick(60)
            #2.事件监听
            self.__event_handler()
            #3.碰撞检测
            self.__check_collide()
            #4.更新/绘制精灵组
            self.__update_sprite()
            #5.更新显示
            pygame.display.update()
    def __event_handler(self):
        #事件监听
        for event in pygame.event.get():
            #判断是否退出游戏
            if event.type == pygame.QUIT:
                PlaneGame.__game_over()
    def __check_collide(self):
    """碰撞检测"""
    pass

	def __update_sprites(self):
    """更新精灵组"""
    pass
    
	@staticmethod
	def __game_over():
	   """游戏结束"""
	
	   print("游戏结束")
	   pygame.quit()
	   exit()

确定精灵组

创建精灵组方法
Plane_Game.py

def __create_sprites(self):
    """创建精灵组"""
    
    # 背景组
    self.back_group = pygame.sprite.Group()
    # 敌机组
    self.enemy_group = pygame.sprite.Group()
    # 英雄组
    self.hero_group = pygame
  • 23
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值