1. 程式人生 > >外星人大戰---------------------遊戲開發

外星人大戰---------------------遊戲開發

因為基本知識已經學習的差不多了,做三個例項更加上手學習,第一個例項是遊戲開發,外星人,第二個是資料處理,第三個是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的。

這是一次簡單的移動效果。接下來的放入下節。