外星人大戰---------------------遊戲開發
因為基本知識已經學習的差不多了,做三個例項更加上手學習,第一個例項是遊戲開發,外星人,第二個是資料處理,第三個是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的。
這是一次簡單的移動效果。接下來的放入下節。