大学最后的考试终于结束了,迎来了暑假和大四的漫长的“自由”假期。当然要自己好好“玩玩”了。
我最近在学习Python,本意是在机器学习深度学习上使用Python进行编程的而学习的。偶然接触了pygame,觉得很感兴趣,所以打算使用pygame制作一个小游戏作为对Python学习和练习。
废话不多说了,先介绍一下pygame。

简要介绍:

请原谅本人比较懒,直接上百度百科进行介绍:(点我打开链接)

Pygame是跨平台Python模块,专为电子游戏设计。
包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。基于这样一个设想,所有需要的游戏功能和理念都(主要是图像方面)都完全简化为游戏逻辑本身,所有的资源结构都可以由高级语言提供,如Python。
Pygame 原为代替突然停止的 pySDL
Pygame 作者是 Pete Shinners 协议为 GNU Lesser General Public License

简单点概括,pygame是个专门用来做游戏开发的库,提供了一些较方便的API。

设计目标:

1、设计一个飞机大战的游戏,玩家能控制一架飞机在游戏界面内通过界面上下左右移动;
2、飞机能发射子弹,自动前进,当走出游戏界面之外时,其自动删除;
3、敌机随机产生,并自动前进,当走出游戏界面之外时,其自动删除;
4、如果敌机碰到子弹则,敌机破坏;
5、如果敌机碰到我方飞机,则游戏结束;

游戏运行截图:

源码下载:

网友分享的打飞机小游戏源码:打开链接(不需要积分)
我自己写的小游戏源码:打开链接(功能稍微要简单一些,收1分的积分做辛苦费╮(╯▽╰)╭)

环境搭建:

我是在Ubuntu环境下进行开发的,所以使用以下指令既可以自动安装配置好环境:

sudo apt-get install python-pygame

安装完成后,为检验是否配置成功。先进入Python交互环境,试着import pygame看看会不会报错。

程序架构构思:

1、首先,可以想到程序中可以分为3个类,即:玩家的飞机、敌机、子弹,所以功能都可以在这几个类中定义方法来实现;
2、背景可以调用pygame中的相关类和方法读出图片,随后在其上添加飞机、敌机、子弹的贴图即可,效果音也可以调用相关类和方法实现;
3、由于存在复数个敌机和子弹,所以分别建立一个列表变量来管理,比如说,如果发生碰撞就要破坏,即从列表中删除对应的元素;
4、建立一个死循环不断重复检测状态并刷新显示,为了控制帧率,还需要适当的延时,而不是一直运行程序。

代码讲解:

我在上传的程序中分为了两个文件:

myGame.py:主程序
myGameRole.py:定义相关的类,供myGame.py调用
resources:使用到的图片以及音频文件

myGame.py:

1、音频文件的初始化:

a、首先是对pygame进行初始化。

pygame.init()

b、随后调用pygame.mixer中的方法读入音频wav文件。

bullet_sound = pygame.mixer.Sound('resources/sound/bullet.wav')
enemy_down_sound = pygame.mixer.Sound('resources/sound/enemy1_down.wav')
game_over_sound = pygame.mixer.Sound('resources/sound/game_over.wav')

c、设置音量大小,参数范围从0~1。

bullet_sound.set_volume(0.3)
enemy_down_sound.set_volume(0.3)
game_over_sound.set_volume(0.3)

d、游戏背景音载入后循环播放。还有pygame.mixer.music.play()中第一个参数表示播放次数,选择-1表示循环播放,其后的参数表示播放起始和结束位置,可以用它预设的参数,即全部播放。

# 载入游戏音乐并循环播放
pygame.mixer.music.load('resources/sound/game_music.wav')
pygame.mixer.music.play(-1, 0)
pygame.mixer.music.set_volume(0.25)

2、图片的初始化


以上的程序实现创建窗口并贴图上去和显示刷新。

a、创建一个窗口,SCREEN_WIDTHSCREEN_HEIGHT 指定窗口大小,后面的图片都在这个窗口内显示。

SCREEN_WIDTH = 480
SCREEN_HEIGHT = 800
# 创建窗口
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

b、指定图片存放的路径,读出图片。

# 读出背景图片
background = pygame.image.load('resources/image/background.png').convert()

c、指定图片的位置,将之前读出的图片贴在指定位置上,坐标表示图片的左上角位置。程序中放在死循环内,让其不断刷新。

screen.blit(background,(0, 0))

d、更新图片显示,把所有贴图后最后的结果显示。

# 整个界面刷新
pygame.display.update()

3、按键检测:

从下面的方法中可以得到返回值,其中包含了按键的键值。

pygame.event.get()

程序中通过遍历比较得到的键值是多少,一系列的if…elif…就是这个目的。如果检测到了对应的按键,就调用类中的相关方法执行相应的操作。

myGameRole.py

1、飞机类:(截图太大了,所以直接贴上代码了)

# 玩家飞机类
class Player(object):def __init__(self, screen):# 储存子弹列表self.bulletList = []# 飞机图片planeImageName = 'resources/image/hero1.png'# 导入飞机图片self.image = pygame.image.load(planeImageName)# 图片大小self.image_width = 100self.image_height = 124# 设置默认坐标self.x = 180self.y = 600# 设置速度self.speed = 20self.window =  screen# 设置飞机名称self.name = 'player'def getPos(self):return [self.x, self.y, self.image_width, self.image_height]def crash(self):# 图片crashImageName = 'resources/image/hero_blowup_n3.png'# 导入图片self.image = pygame.image.load(crashImageName)# 发射子弹,创建一个新的子弹对象def shoot(self):bullet = Bullet(self.window, self)self.bulletList.append(bullet)# 清除不使用的子弹列表元素def bulletClear(self):num = len(self.bulletList)for i in range(0,num):if self.bulletList[i].y <= 0:del  self.bulletList[i]break# 飞机上移def moveUp(self):if self.y <= 0:self.y = 0else:self.y -= self.speed# 飞机下移def moveDown(self):if self.y >= SCREEN_HEIGHT - self.image_height:self.y = SCREEN_HEIGHT - self.image_heightelse:self.y += self.speed# 飞机左移def moveLeft(self):if self.x <= 0:self.x = 0else:self.x -= self.speed# 飞机右移def moveRight(self):if self.x >= SCREEN_WIDTH - self.image_width:self.x = SCREEN_WIDTH - self.image_widthelse:self.x += self.speed# 绘制图形def draw(self):self.window.blit(self.image, (self.x, self.y))# 按键操作处理def keyHandle(self, keyValue):if keyValue == 'left':self.moveLeft()elif keyValue == 'right':self.moveRight()elif keyValue == 'up':self.moveUp()elif keyValue == 'down':self.moveDown()elif keyValue == 'space':# bullet = Bullet(self.x, self.y)self.shoot()

一个一个方法来介绍,不重复贴太多代码了,可以在前面查看:

a、其中建立了一些初始化用的变量,比如用来保存读入的图片,初始的坐标位置等等,其中都有注释。传入的screen参数就是之前创建的游戏运行的窗口,为方便操作,建立玩家类时就传入,以后直接在内部方法中调用而不需从外部获取。

def __init__(self, screen):

b、返回当前的位置坐标。

def getPos(self):

c、飞机破坏,读取对应图片,并贴在窗口中响应的位置上。

def crash(self):

d、实际中就是新建一个子弹类的对象,并添加到一个列表中,此后对于子弹对象通过列表管理。

# 发射子弹,创建一个新的子弹对象
def shoot(self):

e、检测子弹列表中的所有子弹对象是否出界,若出界直接从列表中删除。

# 清除不使用的子弹列表元素
def bulletClear(self):

f、飞机上下左右移动,实质就是操作该player对象的x,y坐标。

# 飞机上移
def moveUp(self):
# 飞机下移
def moveDown(self):
# 飞机左移
def moveLeft(self):
# 飞机右移
def moveRight(self):

g、绘制player对象,即调用前面所说的screen.blit方法更新(这里的screen代表前面实例化的窗口)。

# 绘制图形
def draw(self):

h、根据键值处理,调用前面的几个方法,诸如:上下左右移动、发射子弹等等方法。

# 按键操作处理
def keyHandle(self, keyValue):

2、子弹类:

# 子弹类
class Bullet(object):def __init__(self, screen, plane):# 子弹图片bulletImageName = 'resources/image/bullet1.png'# 导入子弹图片self.image = pygame.image.load(bulletImageName)# 图片大小self.image_width = 9self.image_height = 21# 图片位置self.x = plane.x + plane.image_width // 2 - self.image_width // 2self.y = plane.y + self.image_height # 设置速度self.speed = 12self.window = screendef getPos(self):return [self.x, self.y, self.image_width, self.image_height]def move(self):self.y -= self.speeddef draw(self):self.window.blit(self.image, (self.x, self.y))

a、设置一些变量和参数,screen是窗口的实例化对象,plane表示飞机对象。

def __init__(self, screen, plane):

b、获取子弹对象的坐标(图片的左上角位置坐标)

def getPos(self):

c、子弹移动,实际操作它的位置坐标变化。不断在程序的循环中调用,使其创建后自动移动。

def move(self):

d、绘制bullet对象,即调用前面所说的screen.blit方法更新(这里的screen代表前面实例化的窗口)。

def draw(self):

3、敌机类:

class Enemy(object):def __init__(self, screen, x=0, y=0):# 图片enemyImageName = 'resources/image/enemy1.png'# 导入图片self.image = pygame.image.load(enemyImageName)# 图片大小self.image_width = 51self.image_height = 39self.speed = 3# 图片位置self.x = xself.y = yself.window =  screenself.direction = 'right'self.name = 'enemy'def getPos(self):return [self.x, self.y, self.image_width, self.image_height]# 检测是否出界def checkOut(self):if self.y >= SCREEN_HEIGHT - self.image_height:return Trueelse:return Falsedef move(self):self.y += self.speeddef crash(self):# 图片crashImageName = 'resources/image/enemy1_down3.png'# 导入图片self.image = pygame.image.load(crashImageName)def draw(self):self.window.blit(self.image, (self.x, self.y))

a、screen跟前面一样,是为了后续程序调用方便而传入的;x、y表示敌机的坐标,默认都取0。

def __init__(self, screen, x=0, y=0):

b、获取位置坐标

def getPos(self):

c、判断是够移动出了窗口的界面范围,若出去了返回True;若否,则返回False。

# 检测是否出界
def checkOut(self):

d、实际是操作enemy对象的坐标变化,以使其移动。不断调用,实现自动移动。

def move(self):

e、与前面一样,飞机破坏时导入图片,并刷新,表示爆炸效果。

def crash(self):

f、在窗口上刷新enemy对象的图片。

def draw(self):

小结:

就介绍这么多了,这里只是大概介绍了一下程序大概的思想和一些需要注意的地方。编写程序时的思路与此完全不同,随着功能的不断实现,类的方法、成员等等都是同步改变的。在我上传的程序中也有注释,可以到其中查看完整的程序。(打开链接)

Pygame:编写一个小游戏相关推荐

  1. 用C语言编写一个小游戏

    这是一个比较通用的方法来编写一个小游戏用 C 语言: 首先,确定游戏的目标和规则.这可能包括游戏的玩法.胜负条件.游戏元素和游戏流程等. 其次,确定游戏的用户界面.这可能包括游戏的菜单.按钮.文本框. ...

  2. 使用pygame开发一个小游戏

    学习了pygame,身为一个IKUN所以,做了一个简单的小游戏.游戏规则是,使用键盘的方向键控制坤坤,当坤坤触碰到篮球,就会爆发出音乐"只因你太美".代码如下: import ra ...

  3. 用pygame编写一个跑酷游戏

    奔跑吧~小忍者 游戏运行后的效果 游戏初始运行状态 运行时候的状态 结束状态 初始化创建游戏界面 from loadImg import * import random# 窗口大小 SCREENSIZ ...

  4. C#编写一个扫雷游戏

    基础思路 像原版一样把扫雷分为三个难度:初级难度9*9,中级难度16*16,高级难度16*30 做一个游戏需要图片资源,去网上下载了关于 扫雷的有关文件,放在了项目中 扫雷的核心是用一个二维数组存储游 ...

  5. python手机版做小游戏代码大全-Python大牛手把手教你做一个小游戏,萌新福利!...

    原标题:Python大牛手把手教你做一个小游戏,萌新福利! 引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规 ...

  6. python写游戏脚本-使用Python写一个小游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...

  7. python编程小游戏-使用Python写一个小游戏

    引言 最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下 ...

  8. 使用python制作聊天框解谜游戏_使用Python写一个小游戏alien invasion!

    最近python语言大火,除了在科学计算领域python有用武之地之外,在游戏.后台等方面,python也大放异彩,本篇博文将按照正规的项目开发流程,手把手教大家写个python小游戏,来感受下其中的 ...

  9. 手机版python3h如何自制游戏_教你如何用 Python 写一个小游戏

    教你如何用 Python 写一个小游戏 引言 最近 python 语言大火, 除了在科学计算领域 python 有用武之地之外, 在游戏后台等方面, python 也大放异彩, 本篇博文将按照正规的项 ...

最新文章

  1. 编译mysql4.0时候出现错误提示checking LinuxThreads... Not found
  2. 浅谈代码的执行效率(3):缓存与局部性
  3. zookeeper安装笔记
  4. VC++ CFileDialog文件选择对话框的构造和文件操作
  5. nginx php重定向,Thinkphp linux nginx重定向配置
  6. 调用语音验证码的接口与图形验证码框架
  7. MinIO环境搭建及使用
  8. Vue中使用定时器setInterval和延迟执行setTimeout
  9. 2019杭电多校第九场 Rikka with Cake (hdu6681)
  10. Atitit 图像处理类库 halcon11  安装与环境搭建attilax总结
  11. sql 更改Table 字段名称 长度 类型
  12. 社区医疗管理系统方案/案列/APP/软件/小程序/网站
  13. 微软开启imap服务器,连接到 IMAP 或 SMTP 服务器
  14. FileZilla Server目录显示失败的处理方法
  15. 我的第一个游戏FoodieThebug完成之后的心得体会--子龙山人
  16. Macbook Pro touch bar 设置小tips
  17. python的pyautogui的函数,实现按键精灵
  18. 阿里云推出高效病毒基因序列检索功能,它的底层逻辑原来是这样的
  19. Flutter 关于计步(一)
  20. 密码学之数字信封 Digital_Envelope

热门文章

  1. 3.在slave1机器下载3个安装包解压后,复制给master机器
  2. IntelliJ IDEA - 热部署插件JRebel 安装使用教程
  3. 【年度技术观点合集】计算机视觉,自然语言,机器学习…看看顶级科学家们怎么说
  4. Python和OpenCV环境配置
  5. Ubuntu在当前目录下右键直接打开terminal终端
  6. 1、集合--相关概述
  7. 第 10 章 容器监控 - 078 - Docker 最常用的监控方案
  8. 微信支付在巴黎发布“智慧生活零时差”全球战略
  9. AI 芯片让你升级智能手机,IoT计算智能革命爆发
  10. sqlserver阻止保存要求重新建立表的更改