Pygame库200行代码实现简易飞机大战的小游戏 您所在的位置:网站首页 window10光标一直转圈 Pygame库200行代码实现简易飞机大战的小游戏

Pygame库200行代码实现简易飞机大战的小游戏

2023-04-13 12:13| 来源: 网络整理| 查看: 265

Pygame库实现200行代码简易飞机大战的小游戏安装使用库pygame简介pgame中主要模块介绍pygame的安装验证安装程序原理程序升级设置飞机大战的精灵类和常量背景类和敌机类主机类和子弹类主游戏类事件监听方法碰撞检测精灵组更新显示程序总结 写在开头,因为这个小游戏的实验主要是帮助我熟悉pygame库的使用,所以游戏的一些地方可能存在不完善处,还望包涵。 在这里插入图片描述

安装使用库 pygame简介

pygame是跨平台python模块,专为电子游戏设计,包括图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言束缚, 开发者可以把精力放在游戏的架构上。

pgame中主要模块介绍

(1) pygame

pygame模块会自动导入其它的pygame相关模块。

pygame模块包括surface函数, 可以返回一个新的surface 对象。 init()函数是pygame游戏的核心,必须在进入游戏的主循环之前调用。init()会自动初始化其它所有模块。

(2) pygame.locals

包括在你自己的模块作用域内使用的名字(变量)。包括事件类型、键和视频模式等的名字。

(3) pygame.display

包括处理pygame显示方式的函数。包括普通窗口和全屏模式。 pygame.display中一些常用的方法如下:

flip:更新显示。

update:更新一部分时候使用update。

set_mode:设定显示的类型和尺寸。

set_caption:设定pygame程序的标题。

get_surface:调用flip和blit前返回一个可用于画图的surface对象。

(4) pygame.font

包括font函数,用于表现不同的字体。

(5) pygame.sprite

游戏精灵,Group用做sprite对象的容器。调用group对象的update对象,会自动调用所有sprite对象的update方法。

(6) pygame.mouse

隐藏鼠标光标,获取鼠标位置。

(7) pygame.event

追踪鼠标单击、按键按下和释放等事件。

(8) pygame.image

用于处理保存在GIF、PNG或者JPEG文件内的图像。

注:程序中除了local模块和font模块没有使用,其他模块均有涉及。

pygame的安装

你可以选择使用pycharm中工具栏下方的python packages搜索pygame进行安装,当然也可以使用cmd命令符中常用的pip install pygame 的方法。

安装超时网速慢,直接超时,可以指定国内源镜像。

pip install -i 国内镜像地址 包名

例如: pip install -i https://mirrors.aliyun.com/pypi/simple/ numpy

国内常用源镜像地址:

清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣:http://pypi.douban.com/simple/ 验证安装

验证pygame是否安装成功,在cmd命令符中使用 pip list 语句,如果安装成功,我们可以在下方结果中找到。 在这里插入图片描述

程序原理

首先创建游戏的主窗体,主窗体的大小就是你背景图片的大小。

import pygame #游戏初始化 pygame.init() #创建游戏主窗口 screen = pygame.display.set_mode((480,700)) #绘制背景图香 #1 加载图像数据 background = pygame.image.load('./image/background.png') #2 blit绘制图像 #从左上角绘制 screen.blit(background,(0,0)) pygame.display.update() #卸载所有的模块 pygame.quit()

绘制图像时的方向,后面我们主机、敌机、背景、子弹的方向都需要注意这一点。 在这里插入图片描述 背景图像绘制完之后就是我们主机、敌机的绘制,我们可以在所有的绘制工作完成后再统一调用update方法

#绘制飞机图片 hero = pygame.image.load('./image/hero2.png') screen.blit(hero,(150,300)) pygame.display.update()

其实飞机大战的原理和动画片的原理一致,我们需要对一个个按下的指令进行反应,从而形成一个连贯的画面,这里我们就需要使用到pygame库中的time模块

#创造时钟对象 屏幕绘制速率 clock = pygame.time.Clock() #游戏循环 while True:#指定循环体内部代码的执行频率 每秒重复60次clock.tick(60)#将移动前飞机进行遮挡 达到动画效果screen.blit(background, (0, 0))screen.blit(hero,hero_rect)

如果你想停止程序,发现点击窗体右上角的关闭并无反应,因为你还未在循环体内进行事件监听,然后对时间进行判断

event_list = pygame.event.get() for event in event_list:#判断是否为退出事件if event.type == pygame.QUIT:print("退出游戏...")#卸载所有模块pygame.quit()exit()

关于敌机的生成我们需要使用到sprite精灵和精灵组模块,创建两个一样的敌机,但是敌机的飞行速度不一样,然后将敌机精灵添加至敌机精灵组中,然后在循环体中我们不断将敌机精灵组进行绘制即可

enemy = GameSprite("./image/enemy0.png") enemy1 = GameSprite("./image/enemy0.png",2) enemy_group = pygame.sprite.Group(enemy,enemy1)#精灵组调用方法 enemy_group.update() enemy_group.draw(screen)

对上述部分代码进行整理简化,最后我们可以得到这样的效果图,主机和敌机都可以移动

import pygame from plane_sprites import *#游戏初始化 pygame.init() #创建游戏主窗口 screen = pygame.display.set_mode((480,700))#绘制背景图香 #1 加载图像数据 background = pygame.image.load('./image/background.png') #2 blit绘制图像 #从左上角绘制 screen.blit(background,(0,0)) #3 update更新屏幕显示 # pygame.display.update()#绘制飞机图片 hero = pygame.image.load('./image/hero2.png') screen.blit(hero,(150,300))#可以在所有绘制工作完成后,统一调用update方法 pygame.display.update()#创造时钟对象 屏幕绘制速率 clock = pygame.time.Clock()#定义飞机初始位置 hero_rect = pygame.Rect(150,300,100,122)#敌机精灵创建 enemy = GameSprite("./image/enemy0.png") enemy1 = GameSprite("./image/enemy0.png",2) enemy_group = pygame.sprite.Group(enemy,enemy1)#游戏循环 while True:#指定循环体内部代码的执行频率 每秒重复60次clock.tick(60)#监听时间event_list = pygame.event.get()# if len(event_list)>0:# print(event_list)for event in event_list:#判断是否为退出事件if event.type == pygame.QUIT:print("退出游戏...")#卸载所有模块pygame.quit()exit()hero_rect.y -= 1if hero_rect.y = SCREEN_RECT.height:self.rect.y = -self.rect.height class Enemy(GameSprite):#敌机精灵def __init__(self):#1 调用父类方法 创建敌机精灵super().__init__("./image/enemy0.png")#2 指定敌机初始随机速度self.speed = random.randint(1,2)#3 指定敌机初始随机位置self.rect.bottom = 0max_x = SCREEN_RECT.width - self.rect.widthself.rect.x = random.randint(0,max_x)def update(self):#!调用父类方法 垂直方向飞行super().update()#2 判断是否飞出屏幕 如果是,需要从精灵组中删除if self.rect.y >= SCREEN_RECT.height:print("飞出屏幕,需要从精灵组中删除...")#kill方法可以将精灵从精灵族中移出,精灵自动销毁self.kill()def __del__(self):print("敌机死亡 %s" % self.rect) 主机类和子弹类

SCREEN_RECT.centerx是用来保证一开始主机初始在屏幕中央部分,关于主机的y因为在一开始画了一张绘制示意图所以这里应该为屏幕的SCREEN_RECT.bottom减去部分距离。

子弹类中和敌机类同理需要判断是否飞出屏幕范围,如果超过使用kill()方法从精灵组中删除,子弹的初始位置应该是主机的上方,既子弹的x等于主机的x 在这里插入图片描述

#主角飞机 class Hero(GameSprite):def __init__(self):# 调用父类 设置英雄图像和速度super().__init__("./image/hero2.png",0)# 设置主机位置self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 50# 子弹精灵组self.bullet_group = pygame.sprite.Group()def update(self):#水平方向移动self.rect.x += self.speed#控制英雄不能为0if self.rect.x SCREEN_RECT.right:self.rect.right = SCREEN_RECT.right#子弹发射def fire(self):print("发射子弹...")#创建子弹精灵bullet = Bullet()#设置子弹位置bullet.rect.bottom = self.rect.y-20bullet.rect.centerx = self.rect.centerx#添加到子弹精灵组中self.bullet_group.add(bullet) #子弹类 class Bullet(GameSprite):def __init__(self):#调用父类方法 设置子弹图片速度super().__init__("./image/bullet1.png",-2)def update(self):#调用父类方法 让子弹垂直飞行super().update()#判断子弹是否飞出if self.rect.bottom 0:self.hero.kill()PlaneGame.__game_over() 精灵组更新显示 #精灵更新显示 def __update_sprites(self):#背景精灵组self.back_group.update()self.back_group.draw(self.screen)#敌机精灵组self.enemy_group.update()self.enemy_group.draw(self.screen)#主机精灵组self.hero_group.update()self.hero_group.draw(self.screen)#子弹精灵组self.hero.bullet_group.update()self.hero.bullet_group.draw(self.screen)

游戏的开始与结束

def start_game(self):print("游戏开始...")while True:#1 设置刷新帧率self.clock.tick(SCREEN_PER_SEC)#2 时间监听self.__event_handler()#3 碰撞检测self.__check_collide()#4 更新敌机self.__update_sprites()#5 更新显示pygame.display.update() @staticmethod def __game_over():print("游戏结束")pygame.quit()exit() 程序总结

程序中print语句是为了我在运行中进行功能的检测,可以直接注释掉,对于整个程序的运行并无影响。游戏只是简单的规则,主机可以左右移动,敌机会随机从上方垂直下来,敌机撞到主机之后就会游戏结束直接关闭游戏窗体,比如击毁敌机也没有得分这一设置,这些都是可以再对规则进行优化的部分,因为只是为了帮助我熟悉pygame库的功能,所以代码并未写的更加详细,感兴趣的话你可以对代码部分进行更改达到你想要的效果,程序升级部分并未进行太多的文字解释部分,在代码中我保留了我的注释部分方便你对代码进行解读。总结不易麻烦给个点赞收藏! 在这里插入图片描述在这里插入图片描述在这里插入图片描述

程序中用到的素材以及未使用到的音乐都在链接中。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有