Python实现飞机大战游戏(后附完整代码文件和素材) - Go语言中文社区

Python实现飞机大战游戏(后附完整代码文件和素材)


前言

自学Python的记录,不喜勿喷!
本程序的代码是以B站黑马程序员的视频代码为基础,个人加以总结思考,写就的博文,纯属记录自己的学习历程!

当初想到要用Python的pygame模块开发飞机大战游戏的时候,顿时就兴奋了,毕竟学以致用是最好的学习方式,何况是做一个游戏,但是当我真正上手的时候发现并没有想象中的那么轻松。当然万事开头难,有了一定的经验之后,后面的路就会轻松许多了。

pygame模块安装

开发这个游戏的第一步是安装pygame模块,当初我完全按照老师的要求在终端中使用命令行来安装好了pygame,并且也能运行其内置的小游戏,但是打开文件import pygame模块的时候,不管我咋个弄永远都是“NO module named pygame”,我是装了卸,卸了装,捣鼓过来捣鼓过去,总是弄不好,心态崩了。于是我放弃了,但是心有不甘,查阅了多方资料,功夫不负有心人,最后无意中发现了我前面博客中的解决方法。https://blog.csdn.net/qq_43779324/article/details/104594396,当然其他大佬还有更好的解决方式,怪我当初没搜到,顺便吐槽一下CSDN的搜索功能,经常搜的是牛头不对马嘴,我谷歌啥的都能搜到CSDN博客内容,软件内就搜不到?具体安装方式大家可以看这个:https://blog.csdn.net/sinat_40043477/article/details/78276460?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

pygame入门

在完成好pygame模块安装之后,就要正式开始我们的游戏开发了!在这之前,我们先来认识一下Python中的pygame模块,pygame是Python中的一个2D游戏开发库,支持声音和图像的编辑,当然在现在的3D游戏的普及下,pygame逐渐没落了,但是这不妨碍我们从中学到一些东西。pygame程序的大体结构就是下面这个样子,init()函数开始,quit()函数退出,中间就是具体的游戏代码。

import pygame
pygame.init()
# 编写游戏的代码
print("游戏的代码...")
pygame.quit()

使用Rect来描述矩形区域

Python游戏中以坐标系来描述游戏中各个组件的位置,原点在左上角,x轴水平向右、y轴水平向下。描述一个矩形区域还要有宽度和高度,因为一个坐标只能表示其左上角的位置,加上宽度和高度之后位置就定死了。

import pygame
hero_rect = pygame.Rect(100, 500, 120, 125)
print("英雄的原点%d %d" % (hero_rect.x, hero_rect.y))
print("英雄的尺寸%d %d" % (hero_rect.width, hero_rect.height))
print("%d %d" % hero_rect.size)

创建游戏窗口

pygame中专门提供了一个模块pygame.display用于创建、管理游戏窗口。其中有两个方法:

  • pygame.display.set_moudle():用于初始化游戏窗口。里面有四个参数,窗口的宽和高,是否全屏,窗口的颜色。
  • pygame.display.update():用于刷新屏幕内容显示,稍后使用。
import pygame
pygame.init()
# 创建游戏的窗口
pygame.display.set_mode((480, 700))
while True:
    pass
pygame.quit()

游戏窗口宽480,高700,单位是像素,这个设定是我们后面的背景图片一致。while循环是主游戏循环,只要没有命令退出游戏,就要一直执行下去。

绘制图像

游戏窗口创建完成之后,就要来放东西了,不然你就盯着一个黑麻麻的窗口看啥呢!pygame中的load()函数加载图像数据,blit()函数绘制图像,update()函数更新屏幕显示,每绘制一次图像就要调用一次update方法,当然也可以放在最后只调用一次update方法。

import pygame
pygame.init()
# 创建游戏的窗口
screen = pygame.display.set_mode((480, 700))
# 绘制背景图像
# 1.加载图像数据
bg = pygame.image.load("./images/background.png")
# 2.blit绘制图像
screen.blit(bg, (0, 0))
# 3.update更新屏幕显示
pygame.display.update()
# 绘制英雄的飞机
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (180,500))
pygame.display.update()
while True:
    pass
pygame.quit()

这些弄完之后就是下面这个样子:
在这里插入图片描述

游戏循环

游戏循环意味着游戏的开始,游戏循环的作用是保证游戏不会直接退出,变换图像位置来实现动画效果并检测与用户的交互内容。具体包括设置刷新帧率,检测用户交互,更新图像位置,更新屏幕显示等等。

while True:
	pass

游戏时钟

pygame中专门提供了一个类pygame.time.Clock可以非常方便的设置屏幕绘制速度——刷新帧率。在游戏初始化创建一个时钟对象,并在游戏循环中让时钟对象调用tick()方法,tick()方法会根据上次被调用的时间,自动设置游戏循环中的延时。

......
# 创建时钟对象
clock = pygame.time.Clock()
while True:
    # 可以指定循环体内部的代码执行频率
    clock.tick(60)
......

监听事件

事件就是游戏启动后,用户针对游戏所做的操作。例如:用户点击鼠标,按动键盘等等。
监听则是判断用户的具体操作,只有捕获用户具体的操作,才能针对性的做出响应。
pygame中通过pygame.event.get()可以获得当前用户所做操作的事件列表

import pygame
pygame.init()
# 创建游戏的窗口
screen = pygame.display.set_mode((480, 700))
# 绘制背景图像
bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))
#  pygame.display.update()
# 绘制英雄的飞机
hero = pygame.image.load("./images/me1.png")
# screen.blit(hero, (180,500))
# 可以在所有绘制工作完成之后统一调用update方法
pygame.display.update()
# 创建时钟对象
clock = pygame.time.Clock()
# 1.定义rect记录飞机的初始位置
hero_rect = pygame.Rect(150, 300, 102, 126)
# 游戏循环->意味着游戏的正式开始
while True:
    # 可以指定循环体内部的代码执行频率
    clock.tick(60)
    # 监听事件
    event_list = pygame.event.get()
    if len(event_list) > 0:
        print(event_list)
        # 判断飞机的位置
    if hero_rect.y <= 0:
        hero_rect.y = 700
        # 2.修改飞机的位置
    hero_rect.y -= 1
    # 3.调用blit方法绘制图像
    screen.blit(bg, (0, 0))
    screen.blit(hero, hero_rect)
    # 4.调用update方法更新显示
    pygame.display.update()
pygame.quit()

在这里插入图片描述
MouseMotion就是鼠标移动,KeyDown就是按下键盘,KeyUp就是松开键盘。

精灵和精灵组

我不是在讲数码宝贝啊!精灵和精灵组是pygame中提供的两个类,是为了简化图像加载、位置变化、绘制图像等功能的开发步骤。
pygame.sprite.Sprite——用于存储图像image和位置rect的对象。
pygame.sprite.Group——包含多个精灵的对象。
精灵类中有两个属性image记录图像数据和rect位置信息,update()方法更新位置信息。
精灵组类add()方法向组中增加精灵;sprites()方法返回所用精灵列表;update()方法让组中的所有精灵调用update方法;draw()将组中所用精灵的image绘制到Surface的rect位置。

class GameSprite(pygame.sprite.Sprite):
    """飞机大战游戏精灵"""
    def __init__(self, image_name, speed=1):
        # 调用父类的初始化方法
        super().__init__()
        # 定义对象的属性
        self.image = pygame.image.load(image_name)
        self.rect = self.image.get_rect()
        self.speed = speed
    def update(self):
        # 在屏幕的垂直方向上移动
        self.rect.y += self.speed

框架搭建

借用一下黑马的图片。以下就是这个游戏的大体框架:首先是游戏初始化,设置游戏窗口,创建游戏时钟,创建精灵和精灵组。再就是在游戏循环中设置刷新帧率,进行事件监听、碰撞检测、更新绘制精灵组、更新屏幕显示等等。
在这里插入图片描述
存储各种精灵的文件:
在这里插入图片描述
主程序:
在这里插入图片描述
最后的游戏窗口就是这个样子,感觉我能玩一年。
在这里插入图片描述

最后

我还找到了一个B站小甲鱼出品的飞机大战,他里面有分数,可以捡武器啥的,比这个要好玩多了,但是程序非常的复杂,一般人是看不懂的,还是黑马讲的仔细好懂一些,强烈建议大家学Python的去看看。
黑马的代码链接:https://pan.baidu.com/s/1-Lh9dW1haDjnOKjIC3yAXA
提取码:w36i
小甲鱼的代码链接:https://pan.baidu.com/s/10P6xM1yPQlueO9Xy-boCtg
提取码:uicm
如不能运行,欢迎私信我。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_43779324/article/details/104730181
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢