引言
最近 python 语言大火, 除了在科学计算领域 python 有用武之地之外, 在游戏后台等方面, python 也大放异彩, 本篇博文将按照正规的项目开发流程, 手把手教大家写个 python 小游戏, 来感受下其中的有趣之处本次开发的游戏叫做 alien invasion
安装 pygame 并创建能左右移动的飞船
安装 pygame
本人电脑是 windows 10python3.6,pygame 下载地址: 传送门 https://pypi.python.org/pypi/Pygame/1.9.3
请自行下载对应 python 版本的 pygame
运行以下命令
- $ pip install wheel
- $ pip install pygame1.9.3cp36cp36mwin_amd64.whl
创建 Pygame 窗口及响应用户输入
新建一个文件夹 alien_invasion, 并在文件夹中新建 alien_invasion.py 文件, 输入如下代码
- import sys
- import pygame
- def run_game():
- #initialize game and create a dispaly object
- pygame.init()
- screen = pygame.display.set_mode((1200,800))
- pygame.display.set_caption("Alien Invasion")
- # set backgroud color
- bg_color = (230,230,230)
- # game loop
- while True:
- # supervise keyboard and mouse item
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- sys.exit()
- # fill color
- screen.fill(bg_color)
- # visualiaze the window
- pygame.display.flip()
- run_game()
运行上述代码, 我们可以得到一个灰色界面的窗口:
$ python alien_invasion.py
创建设置类
为了在写游戏的过程中能便捷地创建一些新功能, 下面额外编写一个 settings 模块, 其中包含一个 Settings 类, 用于将所有设置存储在一个地方这样在以后项目增大时修改游戏的外观就更加容易
我们首先将 alien_invasion.py 中的显示屏大小及显示屏颜色进行修改
首先在 alien_invasion 文件夹下新建 python 文件 settings.py, 并向其中添加如下代码:
- class Settings(object):
- """docstring for Settings"""
- def __init__(self):
- # initialize setting of game
- # screen setting
- self.screen_width = 1200
- self.screen_height = 800
- self.bg_color = (230,230,230)
然后再 alien_invasion.py 中导入 Settings 类, 并使用相关设置, 修改如下:
- import sys
- import pygame
- from settings import Settings
- def run_game():
- #initialize game and create a dispaly object
- pygame.init()
- ai_settings = Settings()
- screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
- pygame.display.set_caption("Alien Invasion")
- # set backgroud color
- bg_color = (230,230,230)
- # game loop
- while True:
- # supervise keyboard and mouse item
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- sys.exit()
- # fill color
- screen.fill(ai_settings.bg_color)
- # visualiaze the window
- pygame.display.flip()
- run_game()
添加飞船图像
接下来, 我们需要将飞船加入游戏中为了在屏幕上绘制玩家的飞船, 我们将加载一幅图像, 再使用 Pygame()方法 blit()绘制它
在游戏中几乎可以使用各种类型的图像文件, 但是使用位图 (.bmp) 文件最为简单, 这是因为 Pygame 默认加载位图虽然其他类型的图像也能加载, 但是需要安装额外的库我们推荐去免费的图片素材网站上去找图像: 传送门 https://pixabay.com/ 我们在主项目文件夹 (alien_invasion) 中新建一个文件夹叫 images, 将如下 bmp 图片放入其中
接下来, 我们创建飞船类 ship.py:
- import pygame
- class Ship():
- def __init__(self,screen):
- #initialize spaceship and its location
- self.screen = screen
- # load bmp image and get rectangle
- self.image = pygame.image.load('image/ship.bmp')
- self.rect = self.image.get_rect()
- self.screen_rect = screen.get_rect()
- #put spaceship on the bottom of window
- self.rect.centerx = self.screen_rect.centerx
- self.rect.bottom = self.screen_rect.bottom
- def blitme(self):
- #buld the spaceship at the specific location
- self.screen.blit(self.image,self.rect)
最后我们在屏幕上绘制飞船, 即在 alien_invasion.py 文件中调用 blitme 方法:
- import sys
- import pygame
- from settings import Settings
- from ship import Settings
- def run_game():
- #initialize game and create a dispaly object
- pygame.init()
- ai_settings = Settings()
- screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
- ship = Ship(screen)
- pygame.display.set_caption("Alien Invasion")
- # set backgroud color
- bg_color = (230,230,230)
- # game loop
- while True:
- # supervise keyboard and mouse item
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- sys.exit()
- # fill color
- screen.fill(ai_settings.bg_color)
- ship.blitme()
- # visualiaze the window
- pygame.display.flip()
- run_game()
重构: 模块 game_functions
在大型项目中, 经常需要在添加新代码前重构既有代码重构的目的是为了简化代码的结构, 使其更加容易扩展我们将实现一个 game_functions 模块, 它将存储大量让游戏 Alien invasion 运行的函数通过创建模块 game_functions, 可避免 alien_invasion.py 太长, 使其逻辑更容易理解
函数 check_events()
首先我们将管理事件的代码移到一个名为 check_events()的函数中, 目的是为了隔离事件循环
- import sys
- import pygame
- def check_events():
- #respond to keyboard and mouse item
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- sys.exit()
然后我们修改 alien_invasion.py 代码, 导入 game_functions 模块, 并将事件循环替换成对函数 check_events()的调用:
- import sys
- import pygame
- from settings import Settings
- from ship import Ship
- import game_functions as gf
- def run_game():
- #initialize game and create a dispaly object
- pygame.init()
- ai_settings = Settings()
来源: https://cloud.tencent.com/developer/article/1023469?fromSource=waitui