因为基本知识已经学习的差不多了,做三个实例更加上手学习,第一个实例是游戏开发,外星人,第二个是数据处理,第三个是web开发,这一个月尽量完成第一个实例。
首先对于游戏开发,会经常使用pygame模块,安装教程我已经在前面提到过了。
1.第一步先创建一个空的游戏窗口,用于后面的外星人,飞船等
import sys #退出时需要这个模块
import pygame #导入游戏模块
def run_game():
pygame.init() #初始化,创建屏幕对象
screen=pygame.display.set_mode((800,800)) #创建一个800*800的屏幕
pygame.display.set_caption("Alien Invasion") #对于这个窗口的命名为Alien Invasion
"开始游戏的主代码循环"
while True:
for event in pygame.event.get(): #监听键盘和鼠标,规定退出的情况
if event.type==pygame.QUIT:
sys.exit()
pygame.display.flip() #让屏幕可见
run_game()
首先导入sys、pygame 模块 ,定义运行函数,初始化,定义游戏屏幕的大小以及名称,然后再开始编写游戏代码,刚开始最简单的情况,监听键盘和鼠标的动作,退出情况的编程,这就搭建好了一个简单的游戏框架,现在就是需要把刚刚做的屏幕可见,能运行出来让用户看到。最后运行程序。
输出如下:
对于屏幕,我们也可以修改屏幕背景颜色:
import sys #退出时需要这个模块
import pygame #导入游戏模块
def run_game():
pygame.init() #初始化,创建屏幕对象
screen=pygame.display.set_mode((800,800)) #创建一个800*800的屏幕
pygame.display.set_caption("Alien Invasion") #对于这个窗口的命名为Alien Invasion
bg_color=(230,230,230) #设置背景颜色,红绿蓝,0——255的取值范围
"开始游戏的主代码循环"
while True:
for event in pygame.event.get(): #监听键盘和鼠标,规定退出的情况
if event.type==pygame.QUIT:
sys.exit()
screen.fill(bg_color)
pygame.display.flip() #让屏幕可见,刷新屏幕
run_game()
首先在初始化里设置背景颜色,采用红绿蓝RGB,每个值得取值范围在0-255,其次在刷新屏幕的时候接受背景颜色的实参,填充屏幕。
输出如下:这里我修改了代码,是
如何简化 代码,我们可以把设置。功能分模块;这样也好维护,利于程序员修改程序:
把游戏里设置放在setting类里,我们创建一个Setting:
#存储外星人游戏开发的设置
class Setting():
def __init__(self):
self.screen_width=800 #设置屏幕高度宽度,背景颜色
self.screen_height=800
self.bg_color=(230,230,230)
在主程序里修改代码:
import sys #退出时需要这个模块
import pygame #导入游戏模块
from setting import Setting #导入设置类
def run_game():
pygame.init() #初始化,创建屏幕对象
ai_settings=Setting() #创建一个800*800的屏幕
screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion") #对于这个窗口的命名为Alien Invasion
"开始游戏的主代码循环"
while True:
for event in pygame.event.get(): #监听键盘和鼠标,规定退出的情况
if event.type==pygame.QUIT:
sys.exit()
screen.fill(ai_settings.bg_color)
pygame.display.flip() #让屏幕可见,刷新屏幕
run_game()
输出如下:
2.在第一步绘制好的屏幕里添加图像
在游戏里最好再用位图(.bmp),这是Python默认的加载方法,一般图片资源文件建立一个文件夹,放在项目文件夹下。我们来创建一个Ship的类,用于表示飞船的图片。
#创建飞船类
import pygame
class Ship():
def __init__(self,screen):
self.screen=screen
#图片存在images文件夹下,名字是ship.bmp
self.image=pygame.image.load('images/ship.bmp')
self.rect=self.image.get_rect()
self.screen_rect=screen.get_rect()
self.rect.centerx=self.screen_rect.centerx
self.rect.bottom=self.screen_rect.bottom
def blitme(self):
self.screen.blit(self.image,self.rect)
对于这个类,首先我们通过pygame.image.load()加载图像,然后定义屏幕的rect和图片的rect,在定义图片的rect位于屏幕的rect哪里。
接着编写主程序
import sys #退出时需要这个模块
import pygame #导入游戏模块
from setting import Setting #导入设置类
from ship import Ship #导入飞船类
def run_game():
pygame.init() #初始化,创建屏幕对象
ai_settings=Setting() #创建一个800*800的屏幕
screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion") #对于这个窗口的命名为Alien Invasion
ship=Ship(screen) #创建飞船
"开始游戏的主代码循环"
while True:
for event in pygame.event.get(): #监听键盘和鼠标,规定退出的情况
if event.type==pygame.QUIT:
sys.exit()
screen.fill(ai_settings.bg_color)
ship.blitme()
pygame.display.flip() #让屏幕可见,刷新屏幕
run_game()
输出如下:
3.完全重构整个函数:
发现主程序里有很多功能函数,我们可以创建一个功能的模块game_functions
#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等
import sys
import pygame
def check_events(): #响应键盘和鼠标事件
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
def update_screen(ai_settings,screen,ship): # 更新屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
pygame.display.flip()
创建了两个功能函数,一个响应键盘和鼠标事件,一个更新屏幕。
编写主程序:
import pygame
from settings import Setting
from ship import Ship
import game_functions as gf
def run_game():
pygame.init() #初始化,创建屏幕对象
ai_settings=Setting() #创建一个800*800的屏幕
screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion") #对于这个窗口的命名为Alien Invasion
ship=Ship(screen) #创建飞船
while True:
gf.check_events()
gf.update_screen(ai_settings,screen,ship)
run_game()
输出如下:
4.驾驶飞船
前面我们已将简单搭建好游戏屏幕以及飞船,现阶段就是移动飞船,实现动态过程。
先简单的右移动,每当用户点击键盘的时候都会在pygame里注册一个事件,事件是通过pygame.event.get()获取的,在功能模块监听键盘事件:
#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等
import sys
import pygame
def check_events(ship): #响应键盘和鼠标事件
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN: #监测是否为右键
if event.key==pygame.K_RIGHT:
ship.rect.centerx+=1
def update_screen(ai_settings,screen,ship): # 更新屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
pygame.display.flip()
主程序如下:
import pygame
from setting import Setting
from ship import Ship
import game_functions as gf
def run_game():
pygame.init() #初始化,创建屏幕对象
ai_settings=Setting() #创建一个800*800的屏幕
screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion") #对于这个窗口的命名为Alien Invasion
ship=Ship(screen) #创建飞船
while True:
gf.check_events(ship)
gf.update_screen(ai_settings,screen,ship)
run_game()
输出如下:这是我按下右键后的位置
但是这只能一点一点移动,不能长按右键移动,可以这样想,既然按下键盘就注册一个事件,那么我长按右键盘,当我放开键盘是就是一个状态,在我不放开的键盘的这段时间里可以一直循环。所以建立一个标志moving_right,在飞船不动的时候,设为False,在按下右键盘的时候设为True,在松开的时候设为FALSE,因为这是飞船的特性,我们把代码写入Ship类
#创建飞船类
import pygame
class Ship():
def __init__(self,screen):
self.screen=screen
#图片存在images文件夹下,名字是ship.bmp
self.image=pygame.image.load('images/ship.bmp')
self.rect=self.image.get_rect()
self.screen_rect=screen.get_rect()
self.rect.centerx=self.screen_rect.centerx
self.rect.bottom=self.screen_rect.bottom
self.moving_right=False #设置移动标志
def update(self):
if self.moving_right: #根据移动标志,来调整位置
self.rect.centerx+=1
def blitme(self):
self.screen.blit(self.image,self.rect)
接下来再把按下键盘的一系列代码写入功能类:
#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等
import sys
import pygame
def check_events(ship): #响应键盘和鼠标事件
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN: #监测是否为右键
if event.key==pygame.K_RIGHT:
ship.moving_right=True #改变标志位
elif event.type==pygame.KEYUP: #监测是否放开键盘
if event.key==pygame.K_RIGHT:
ship.moving_right=False
def update_screen(ai_settings,screen,ship): # 更新屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
pygame.display.flip()
接下来是主程序:
import pygame
from setting import Setting
from ship import Ship
import game_functions as gf
def run_game():
pygame.init() #初始化,创建屏幕对象
ai_settings=Setting() #创建一个800*800的屏幕
screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion") #对于这个窗口的命名为Alien Invasion
ship=Ship(screen) #创建飞船
while True:
gf.check_events(ship)
ship.update()
gf.update_screen(ai_settings,screen,ship)
run_game()
输出如下:当我按下右键盘,持续移动。
之前都是右移动,那么左移动也是一样的,现在完成左右移动的方法
A.修改Ship类:
#创建飞船类
import pygame
class Ship():
def __init__(self,screen):
self.screen=screen
#图片存在images文件夹下,名字是ship.bmp
self.image=pygame.image.load('images/ship.bmp')
self.rect=self.image.get_rect()
self.screen_rect=screen.get_rect()
self.rect.centerx=self.screen_rect.centerx
self.rect.bottom=self.screen_rect.bottom
self.moving_right=False #设置移动标志
self.moving_left=False
def update(self):
if self.moving_right: #根据移动标志,来调整位置
self.rect.centerx+=1
if self.moving_left:
self.rect.centerx-=1
def blitme(self):
self.screen.blit(self.image,self.rect)
再修改功能类:
#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等
import sys
import pygame
def check_events(ship): #响应键盘和鼠标事件
for event in pygame.event.get():
if event.type==pygame.QUIT:
sys.exit()
elif event.type==pygame.KEYDOWN: #监测是否为右键
if event.key==pygame.K_RIGHT:
ship.moving_right=True #改变标志位
elif event.key==pygame.K_LEFT:
ship.moving_left=True
elif event.type==pygame.KEYUP: #监测是否放开键盘
if event.key==pygame.K_RIGHT:
ship.moving_right=False
elif event.key==pygame.K_LEFT:
ship.moving_left=False
def update_screen(ai_settings,screen,ship): # 更新屏幕
screen.fill(ai_settings.bg_color)
ship.blitme()
pygame.display.flip()
主程序不变:
import pygame
from setting import Setting
from ship import Ship
import game_functions as gf
def run_game():
pygame.init() #初始化,创建屏幕对象
ai_settings=Setting() #创建一个800*800的屏幕
screen=pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion") #对于这个窗口的命名为Alien Invasion
ship=Ship(screen) #创建飞船
while True:
gf.check_events(ship)
ship.update()
gf.update_screen(ai_settings,screen,ship)
run_game()
因为这是动态效果,就不截图了,自己验证过是OK的。
这是一次简单的移动效果。接下来的放入下节。