Pygame:编写一个小游戏
大學最后的考試終于結束了,迎來了暑假和大四的漫長的“自由”假期。當然要自己好好“玩玩”了。
我最近在學習Python,本意是在機器學習深度學習上使用Python進行編程的而學習的。偶然接觸了pygame,覺得很感興趣,所以打算使用pygame制作一個小游戲作為對Python學習和練習。
廢話不多說了,先介紹一下pygame。
簡要介紹:
請原諒本人比較懶,直接上百度百科進行介紹:(點我打開鏈接)
Pygame是跨平臺Python模塊,專為電子游戲設計。
包含圖像、聲音。建立在SDL基礎上,允許實時電子游戲研發而無需被低級語言(如機器語言和匯編語言)束縛。基于這樣一個設想,所有需要的游戲功能和理念都(主要是圖像方面)都完全簡化為游戲邏輯本身,所有的資源結構都可以由高級語言提供,如Python。
Pygame 原為代替突然停止的 pySDL
Pygame 作者是 Pete Shinners 協議為 GNU Lesser General Public License
簡單點概括,pygame是個專門用來做游戲開發的庫,提供了一些較方便的API。
設計目標:
1、設計一個飛機大戰的游戲,玩家能控制一架飛機在游戲界面內通過界面上下左右移動;
2、飛機能發射子彈,自動前進,當走出游戲界面之外時,其自動刪除;
3、敵機隨機產生,并自動前進,當走出游戲界面之外時,其自動刪除;
4、如果敵機碰到子彈則,敵機破壞;
5、如果敵機碰到我方飛機,則游戲結束;
游戲運行截圖:
源碼下載:
網友分享的打飛機小游戲源碼:打開鏈接(不需要積分)
我自己寫的小游戲源碼:打開鏈接(功能稍微要簡單一些,收1分的積分做辛苦費╮(╯▽╰)╭)
環境搭建:
我是在Ubuntu環境下進行開發的,所以使用以下指令既可以自動安裝配置好環境:
sudo apt-get install python-pygame安裝完成后,為檢驗是否配置成功。先進入Python交互環境,試著import pygame看看會不會報錯。
程序架構構思:
1、首先,可以想到程序中可以分為3個類,即:玩家的飛機、敵機、子彈,所以功能都可以在這幾個類中定義方法來實現;
2、背景可以調用pygame中的相關類和方法讀出圖片,隨后在其上添加飛機、敵機、子彈的貼圖即可,效果音也可以調用相關類和方法實現;
3、由于存在復數個敵機和子彈,所以分別建立一個列表變量來管理,比如說,如果發生碰撞就要破壞,即從列表中刪除對應的元素;
4、建立一個死循環不斷重復檢測狀態并刷新顯示,為了控制幀率,還需要適當的延時,而不是一直運行程序。
代碼講解:
我在上傳的程序中分為了兩個文件:
myGame.py:主程序
myGameRole.py:定義相關的類,供myGame.py調用
resources:使用到的圖片以及音頻文件
myGame.py:
1、音頻文件的初始化:
a、首先是對pygame進行初始化。
b、隨后調用pygame.mixer中的方法讀入音頻wav文件。
bullet_sound = pygame.mixer.Sound('resources/sound/bullet.wav') enemy_down_sound = pygame.mixer.Sound('resources/sound/enemy1_down.wav') game_over_sound = pygame.mixer.Sound('resources/sound/game_over.wav')c、設置音量大小,參數范圍從0~1。
bullet_sound.set_volume(0.3) enemy_down_sound.set_volume(0.3) game_over_sound.set_volume(0.3)d、游戲背景音載入后循環播放。還有pygame.mixer.music.play()中第一個參數表示播放次數,選擇-1表示循環播放,其后的參數表示播放起始和結束位置,可以用它預設的參數,即全部播放。
# 載入游戲音樂并循環播放 pygame.mixer.music.load('resources/sound/game_music.wav') pygame.mixer.music.play(-1, 0) pygame.mixer.music.set_volume(0.25)2、圖片的初始化
以上的程序實現創建窗口并貼圖上去和顯示刷新。
a、創建一個窗口,SCREEN_WIDTH 和SCREEN_HEIGHT 指定窗口大小,后面的圖片都在這個窗口內顯示。
SCREEN_WIDTH = 480 SCREEN_HEIGHT = 800 # 創建窗口 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))b、指定圖片存放的路徑,讀出圖片。
# 讀出背景圖片 background = pygame.image.load('resources/image/background.png').convert()c、指定圖片的位置,將之前讀出的圖片貼在指定位置上,坐標表示圖片的左上角位置。程序中放在死循環內,讓其不斷刷新。
screen.blit(background,(0, 0))d、更新圖片顯示,把所有貼圖后最后的結果顯示。
# 整個界面刷新 pygame.display.update()3、按鍵檢測:
從下面的方法中可以得到返回值,其中包含了按鍵的鍵值。
pygame.event.get()程序中通過遍歷比較得到的鍵值是多少,一系列的if…elif…就是這個目的。如果檢測到了對應的按鍵,就調用類中的相關方法執行相應的操作。
myGameRole.py
1、飛機類:(截圖太大了,所以直接貼上代碼了)
# 玩家飛機類 class Player(object):def __init__(self, screen):# 儲存子彈列表self.bulletList = []# 飛機圖片planeImageName = 'resources/image/hero1.png'# 導入飛機圖片self.image = pygame.image.load(planeImageName)# 圖片大小self.image_width = 100self.image_height = 124# 設置默認坐標self.x = 180self.y = 600# 設置速度self.speed = 20self.window = screen# 設置飛機名稱self.name = 'player'def getPos(self):return [self.x, self.y, self.image_width, self.image_height]def crash(self):# 圖片crashImageName = 'resources/image/hero_blowup_n3.png'# 導入圖片self.image = pygame.image.load(crashImageName)# 發射子彈,創建一個新的子彈對象def shoot(self):bullet = Bullet(self.window, self)self.bulletList.append(bullet)# 清除不使用的子彈列表元素def bulletClear(self):num = len(self.bulletList)for i in range(0,num):if self.bulletList[i].y <= 0:del self.bulletList[i]break# 飛機上移def moveUp(self):if self.y <= 0:self.y = 0else:self.y -= self.speed# 飛機下移def moveDown(self):if self.y >= SCREEN_HEIGHT - self.image_height:self.y = SCREEN_HEIGHT - self.image_heightelse:self.y += self.speed# 飛機左移def moveLeft(self):if self.x <= 0:self.x = 0else:self.x -= self.speed# 飛機右移def moveRight(self):if self.x >= SCREEN_WIDTH - self.image_width:self.x = SCREEN_WIDTH - self.image_widthelse:self.x += self.speed# 繪制圖形def draw(self):self.window.blit(self.image, (self.x, self.y))# 按鍵操作處理def keyHandle(self, keyValue):if keyValue == 'left':self.moveLeft()elif keyValue == 'right':self.moveRight()elif keyValue == 'up':self.moveUp()elif keyValue == 'down':self.moveDown()elif keyValue == 'space':# bullet = Bullet(self.x, self.y)self.shoot()一個一個方法來介紹,不重復貼太多代碼了,可以在前面查看:
a、其中建立了一些初始化用的變量,比如用來保存讀入的圖片,初始的坐標位置等等,其中都有注釋。傳入的screen參數就是之前創建的游戲運行的窗口,為方便操作,建立玩家類時就傳入,以后直接在內部方法中調用而不需從外部獲取。
def __init__(self, screen):b、返回當前的位置坐標。
def getPos(self):c、飛機破壞,讀取對應圖片,并貼在窗口中響應的位置上。
def crash(self):d、實際中就是新建一個子彈類的對象,并添加到一個列表中,此后對于子彈對象通過列表管理。
# 發射子彈,創建一個新的子彈對象 def shoot(self):e、檢測子彈列表中的所有子彈對象是否出界,若出界直接從列表中刪除。
# 清除不使用的子彈列表元素 def bulletClear(self):f、飛機上下左右移動,實質就是操作該player對象的x,y坐標。
# 飛機上移 def moveUp(self): # 飛機下移 def moveDown(self): # 飛機左移 def moveLeft(self): # 飛機右移 def moveRight(self):g、繪制player對象,即調用前面所說的screen.blit方法更新(這里的screen代表前面實例化的窗口)。
# 繪制圖形 def draw(self):h、根據鍵值處理,調用前面的幾個方法,諸如:上下左右移動、發射子彈等等方法。
# 按鍵操作處理 def keyHandle(self, keyValue):2、子彈類:
# 子彈類 class Bullet(object):def __init__(self, screen, plane):# 子彈圖片bulletImageName = 'resources/image/bullet1.png'# 導入子彈圖片self.image = pygame.image.load(bulletImageName)# 圖片大小self.image_width = 9self.image_height = 21# 圖片位置self.x = plane.x + plane.image_width // 2 - self.image_width // 2self.y = plane.y + self.image_height # 設置速度self.speed = 12self.window = screendef getPos(self):return [self.x, self.y, self.image_width, self.image_height]def move(self):self.y -= self.speeddef draw(self):self.window.blit(self.image, (self.x, self.y))a、設置一些變量和參數,screen是窗口的實例化對象,plane表示飛機對象。
def __init__(self, screen, plane):b、獲取子彈對象的坐標(圖片的左上角位置坐標)
def getPos(self):c、子彈移動,實際操作它的位置坐標變化。不斷在程序的循環中調用,使其創建后自動移動。
def move(self):d、繪制bullet對象,即調用前面所說的screen.blit方法更新(這里的screen代表前面實例化的窗口)。
def draw(self):3、敵機類:
class Enemy(object):def __init__(self, screen, x=0, y=0):# 圖片enemyImageName = 'resources/image/enemy1.png'# 導入圖片self.image = pygame.image.load(enemyImageName)# 圖片大小self.image_width = 51self.image_height = 39self.speed = 3# 圖片位置self.x = xself.y = yself.window = screenself.direction = 'right'self.name = 'enemy'def getPos(self):return [self.x, self.y, self.image_width, self.image_height]# 檢測是否出界def checkOut(self):if self.y >= SCREEN_HEIGHT - self.image_height:return Trueelse:return Falsedef move(self):self.y += self.speeddef crash(self):# 圖片crashImageName = 'resources/image/enemy1_down3.png'# 導入圖片self.image = pygame.image.load(crashImageName)def draw(self):self.window.blit(self.image, (self.x, self.y))a、screen跟前面一樣,是為了后續程序調用方便而傳入的;x、y表示敵機的坐標,默認都取0。
def __init__(self, screen, x=0, y=0):b、獲取位置坐標
def getPos(self):c、判斷是夠移動出了窗口的界面范圍,若出去了返回True;若否,則返回False。
# 檢測是否出界 def checkOut(self):d、實際是操作enemy對象的坐標變化,以使其移動。不斷調用,實現自動移動。
def move(self):e、與前面一樣,飛機破壞時導入圖片,并刷新,表示爆炸效果。
def crash(self):f、在窗口上刷新enemy對象的圖片。
def draw(self):小結:
就介紹這么多了,這里只是大概介紹了一下程序大概的思想和一些需要注意的地方。編寫程序時的思路與此完全不同,隨著功能的不斷實現,類的方法、成員等等都是同步改變的。在我上傳的程序中也有注釋,可以到其中查看完整的程序。(打開鏈接)
總結
以上是生活随笔為你收集整理的Pygame:编写一个小游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu14.04下FTP服务器的搭
- 下一篇: 数字图像处理:基于MATLAB的车牌识别