因为基本知识已经学习的差不多了,做三个实例更加上手学习,第一个实例是游戏开发,外星人,第二个是数据处理,第三个是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 Invasionbg_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=800self.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 pygameclass 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.centerxself.rect.bottom=self.screen_rect.bottomdef 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 Invasionship=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 pygamedef 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 pygamefrom settings import Setting
from ship import Ship
import game_functions as gfdef 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 Invasionship=Ship(screen) #创建飞船while True:gf.check_events()gf.update_screen(ai_settings,screen,ship)run_game()
输出如下:
4.驾驶飞船
前面我们已将简单搭建好游戏屏幕以及飞船,现阶段就是移动飞船,实现动态过程。
先简单的右移动,每当用户点击键盘的时候都会在pygame里注册一个事件,事件是通过pygame.event.get()获取的,在功能模块监听键盘事件:
#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等import sys
import pygamedef 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 pygamefrom setting import Setting
from ship import Ship
import game_functions as gfdef 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 Invasionship=Ship(screen) #创建飞船while True:gf.check_events(ship)gf.update_screen(ai_settings,screen,ship)run_game()
输出如下:这是我按下右键后的位置
但是这只能一点一点移动,不能长按右键移动,可以这样想,既然按下键盘就注册一个事件,那么我长按右键盘,当我放开键盘是就是一个状态,在我不放开的键盘的这段时间里可以一直循环。所以建立一个标志moving_right,在飞船不动的时候,设为False,在按下右键盘的时候设为True,在松开的时候设为FALSE,因为这是飞船的特性,我们把代码写入Ship类
#创建飞船类
import pygameclass 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.centerxself.rect.bottom=self.screen_rect.bottomself.moving_right=False #设置移动标志def update(self):if self.moving_right: #根据移动标志,来调整位置self.rect.centerx+=1def blitme(self):self.screen.blit(self.image,self.rect)
接下来再把按下键盘的一系列代码写入功能类:
#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等import sys
import pygamedef 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=Falsedef update_screen(ai_settings,screen,ship): # 更新屏幕screen.fill(ai_settings.bg_color)ship.blitme()pygame.display.flip()
接下来是主程序:
import pygamefrom setting import Setting
from ship import Ship
import game_functions as gfdef 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 Invasionship=Ship(screen) #创建飞船while True:gf.check_events(ship)ship.update()gf.update_screen(ai_settings,screen,ship)run_game()
输出如下:当我按下右键盘,持续移动。
之前都是右移动,那么左移动也是一样的,现在完成左右移动的方法
A.修改Ship类:
#创建飞船类
import pygameclass 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.centerxself.rect.bottom=self.screen_rect.bottomself.moving_right=False #设置移动标志self.moving_left=Falsedef update(self):if self.moving_right: #根据移动标志,来调整位置self.rect.centerx+=1if self.moving_left:self.rect.centerx-=1def blitme(self):self.screen.blit(self.image,self.rect)
再修改功能类:
#游戏的功能模块,包括响应键盘鼠标事件,移动飞船等import sys
import pygamedef 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=Trueelif event.type==pygame.KEYUP: #监测是否放开键盘if event.key==pygame.K_RIGHT:ship.moving_right=Falseelif event.key==pygame.K_LEFT:ship.moving_left=Falsedef update_screen(ai_settings,screen,ship): # 更新屏幕screen.fill(ai_settings.bg_color)ship.blitme()pygame.display.flip()
主程序不变:
import pygamefrom setting import Setting
from ship import Ship
import game_functions as gfdef 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 Invasionship=Ship(screen) #创建飞船while True:gf.check_events(ship)ship.update()gf.update_screen(ai_settings,screen,ship)run_game()
因为这是动态效果,就不截图了,自己验证过是OK的。
这是一次简单的移动效果。接下来的放入下节。