Python编写微信打飞机小游戏(一)

  最近开始学习Python语言,发现Python有一个神奇的Pygame模块,在编写小游戏时显得非常方便,于是参照教学视频编写了一个微信打飞机的小游戏,网上有很多相关的博客,但都不是很详细,大都是直接贴代码,于是决定沉下心来把编写程序的过程记录下来,与大家分享。

  首先声明一点,这篇博客完全参照了小甲鱼的《零基础入门学习Python》教学视频,为了尊重原创,特将原作者的视频地址公布如下:《零基础入门学习Python》

  Python编译器和Pygame模块的安装网上的教程很多,这里不再赘述,需要强调的一点是,两者之前不仅要求版本一致,所对应操作系统位数也应该一致,例如32位的Pygame模块必须对应32位的Python编译器,我采用的是Python3.4(32位),所用Python的IDE为Pycharm。

  在编写游戏的过程中需要用到大量图片和声音资源,如背景图片、背景音乐等,这里将相关资源统一打包,供大家下载:《微信打飞机图片音效资源》

  1、导入相关模块。

  创建主函数文件,如“mian.py”,在程序开始前将用到的Python模块导入:

# 导入相关模块
# coding: utf-8
import pygame
import sys
import tracebackfrom random import *
from pygame.locals import *

  这里有几个问题需要解释一下:(1)如果Python不能正常打印中文字符,需要在文件开头加上“# coding: utf-8”来指定对应的编码类型;(2)“sys”为系统模块,“traceback”为Python用来捕获异常的模块,“random”为随机数生成模块,“pygame.locals”则包含了Pygame中的一些固定的标志常量,在下面的程序中将会用到。(3)这里涉及了Python两种导入模块的方式,一种是形如“import pygame”,这种方法表示声明一个模块,如果需要使用其中的元素,应采用“模块名.变量名”的格式;另一种形如“from random import *”,表示将模块中的所有元素全部导入当前工程,在使用时直接使用元素名称即可。

  2、加载相关资源

  将下载得到的资源(一个image文件夹,一个sound文件夹)放入工程目录下(与mian.py相同的文件夹中),之后在主程序中加载这些资源。在加载之前,需要对pygame的相关功能进行初始化:

# ==================初始化==================
pygame.init()
pygame.mixer.init()  # 混音器初始化
bg_size = width, height = 480, 852  # 设计背景尺寸
screen = pygame.display.set_mode(bg_size)  # 设置背景对话框
pygame.display.set_caption("飞机大战……FishC Demo")
background = pygame.image.load("image/background.png")  # 加载背景图片,并设置为不透明

  注意:(1)mixer为pygame模块的声音控制对象(俗称混音器),在涉及到与声音有关的操作时会用到。(2)bg_size取决于背景图片的尺寸

  在完成相关初始化后,可以正式的加载背景图片和相关音效了:

# ==========载入游戏音乐====================
pygame.mixer.music.load("sound/game_music.wav")
pygame.mixer.music.set_volume(0.2)
bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
bullet_sound.set_volume(0.2)
big_enemy_flying_sound = pygame.mixer.Sound("sound/big_spaceship_flying.wav")
big_enemy_flying_sound.set_volume(0.2)
enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
enemy1_down_sound.set_volume(0.2)
enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
enemy2_down_sound.set_volume(0.2)
enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
enemy3_down_sound.set_volume(0.2)
me_down_sound = pygame.mixer.Sound("sound/game_over.wav")
me_down_sound.set_volume(0.2)
button_down_sound = pygame.mixer.Sound("sound/button.wav")
button_down_sound.set_volume(0.2)
level_up_sound = pygame.mixer.Sound("sound/achievement.wav")
level_up_sound.set_volume(0.2)
bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
bomb_sound.set_volume(0.2)
get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
get_bomb_sound.set_volume(0.2)
get_bullet_sound = pygame.mixer.Sound("sound/get_double_laser.wav")
get_bullet_sound.set_volume(0.2)

  注意,由于pygame音频处理能力有限,在读取音频信息时,需要将音频文件转换成wav格式,普通的MP3格式一般情况下是无法正常读取的,更多pygame有关音频文件的操作可以参考下面的博客:《Pygame音频操作》

  3、游戏主进程,循环播放背景音乐

  在加载完相关资源之后,开始编写游戏的主函数。由于还没有定义相关的模块,这里显示编写一个最简单的框架,让程序能够循环运行起来。

if __name__ == ‘__main__‘:
    try:
        main()
    except SystemExit:
        pass
    except:
        traceback.print_exc()
        pygame.quit()
        input()

  这是Python的主程序入口,如果我们运行mian.py文件,程序则自动开始运行。如果只是将mian.py作为一个模块import到其他工程中,则不会触发这个函数的运行。注意在这里我们使用了try语句来捕获程序运行时出现的异常,如果mian()函数在运行过程中抛出任何异常,除了系统正常退出(SystemExit)的异常外,其他异常都通过“traceback.print_exc()”来打印异常信息,同时调用“pygame.quit()”退出程序。

  由于还没有编写其他代码,在此处我们只编写一个最简单的main()函数来保证程序的正常运行,即简单的显示背景图片并循环播放背景音乐:

def main():
    pygame.mixer.music.play(-1)
    running = True
    while running:
        screen.blit(background, (0, 0))
        pygame.display.flip()

  这里对混音器mixer的成员函数play()赋值为-1代表循环播放该音乐,如果形参为空,则只播放一次该音乐。注意Python采用了一种双缓冲的屏幕刷新机制,即先通过blit()函数将一个图片(统称为surface对象)绘制在内存中,最后统一用pygame.display.flip()函数将绘制好的surface对象一次全部刷新到屏幕上。至于什么是surface对象,可以暂时理解为Python世界中的所有的图形图像吧。ok,第一部分就先介绍这些。

时间: 2024-10-14 17:59:47

Python编写微信打飞机小游戏(一)的相关文章

Python编写微信打飞机小游戏(十一)

在这篇博文中,我们准备为打飞机小游戏添加一个暂停的功能,即用户在游戏过程中随时可以通过单击屏幕右上方的一个暂停按钮来暂停和恢复游戏.这个功能看似比较简单,但其中涉及了鼠标操作.图片切换.代码结构的重置等等,接下来我们一一进行介绍. 1.加载暂停按钮图标 在image文件夹下一共有四张暂停按钮的图片,分别为深色和浅色两组,首先在main()函数中加载相关图片资源并初始化暂停/开始标志位: paused = False # 标志是否暂停游戏 pause_nor_image = pygame.imag

Python编写微信打飞机小游戏(四)

之前的工作已经基本上将我方飞机的图形显示工作做的差不多了,这篇博客中我们将开始添加敌方飞机——小型敌机.中型敌机(直升机)和大型敌机(坦克).新建一个enemy.py文件,导入pygame和random模块,开始编写吧(还是要注意文件编码问题,以后就不再啰嗦了). 敌方飞机类与我方飞机模块有一定的相似性,但不会左右移动,不会发射子弹等等.小型敌机是敌方飞机中最基本的类型,一击毙命,没有血量.没有出场音效.中型敌机有一定血量,损毁时附带特殊音效.大型敌机血量最多,出场和损毁时都有特殊音效,游戏中中

Python编写微信打飞机小游戏(八)

现在飞机已经能够带着血条突突突飞下来让玩家虐,于是我们给用户一点打飞机的成就感——计分系统以及难度递增机制. 1.计分系统 首先,我们在main()函数中添加全局变量(score)并初始化为零用以统计当前用户的打飞机得分: score = 0 # 统计用户得分 接下来只需要在敌机销毁时对score进行累加就可以了,我们在这里先给敌机标个价:小型敌机一架值500分,中型敌机一架值2000分,大型敌机一架值6000分,然后在敌机损毁时根据敌机类型选择加多少分,对于小型敌机: for each in

Python编写微信打飞机小游戏(三)

通过之前的任务,我们已经能够实现小飞机在屏幕上自由移动了,这次博客的任务是是的我们的小飞机看起来更有灵性——尾部喷气特效的绘制. 1.帧率 说道帧率,玩游戏的人可能并不陌生.如果你是一个lol的玩家,那你肯定最关心两件事,一是帧率(FPS),二是延迟.延迟取决于网络性能,而帧率则取决于电脑的硬件配置,自然是帧率越高游戏画面就越流畅.帧率,简单老理解就是游戏在一秒钟进行多少次画面刷新.Pygame支持的帧率大约是从30到120,为了避免游戏程序因为电脑性能的差异出现太大差别,我们在此为程序指定一个

Python编写微信打飞机小游戏(七)

这边博客我们为大型敌机和中型敌机设置血量并以血槽的形式显示出来,同时解决之前遇到的声道阻塞的BUG(声道阻塞的问题详见之前的博文). 1.为敌机添加表示血量的成员变量 所谓敌机血量,就是指敌机在挂掉之前能够挨几发子弹,这是敌机对象的一个成员属性,因此我们在中型敌机(MidEnemy)和大型敌机(BigEnemy)中添加energy成员变量: class MidEnemy(pygame.sprite.Sprite): energy = 5 def __init__(self, bg_size):

10分钟教你用Python做个打飞机小游戏超详细教程

更多精彩尽在微信公众号[程序猿声] 我知道你们一定想先看效果如何 00 目录 整体框架 开始之前-精灵类Sprite 子弹类class Bullet 玩家飞机类class Player 敌机类class Enemy 游戏主体循环以及帧率设置 让子弹飞 刷出敌机 打怪 把飞机敌机子弹都画出来 处理键盘事件 分数显示 和 GameOver 最终代码 01 前言 这次还是用python的pygame库来做的游戏.关于这个库的内容,读者可以上网了解一下.本文只讲解用到的知识.代码参考自网上,自己也做了一

C语言射击类打飞机小游戏

使用c语言编写一个打飞机小游戏,使用键盘按键来进行游戏,击中敌机可获得积分,被敌机撞中死亡一次,每次游戏有3次机会. 在网上查询资料并且和同学讨论之后,对原来的代码有了一些改进, 改进:增加了颜色函数,在你所需要改变窗口颜色的位置调用函数 system("color xx") xx分别指的是背景颜色和文字(前景)颜色.x为一位16进制数,即1-f都可以使用.可以随意组合.增加了终止函数,使游戏在死亡三次后自动结束游戏,并且可以选择是否重新开始游戏:另外增添了设置函数,使得可以对游戏进行

python编写微信公众号首图思路详解

前言 之前一直在美图秀秀调整自己的微信公众号首图,效果也不尽如人意,老是调来调去,最后发出来的图片被裁剪了一大部分,丢失部分关键信息,十分恼火,于是想着用python写一个程序,把微信公众号首图的模式固定下来,方便以后写公众号. 思路 根据微信公众号首图要求,可以上传一个不超过5M的图片,且图片尺寸要是2.35:1的尺寸,换算成像素是900:383,有了这些参数就可以做文章了,这里有两种思路 把今天推文的标题(文字)用图片展示出来,使得文字排列错落有致,简单粗暴,而又不失美感,这里可以利用mat

原生js打飞机小游戏

最近为了巩固一下原生的知识,然后拿了一个js小游戏来入手.主要也是为了学习和练手. js代码如下: 1 window.onload = function(){ 2 var oBtn = document.getElementById('gameBtn'); 3 oBtn.onclick = function(){ 4 this.style.display = 'none'; 5 Game.init('div1');//把父级传进去 6 }; 7 }; 8 //创建Game单体 9 10 var