Python+Pygame實(shí)戰(zhàn)之實(shí)現(xiàn)小蜜蜂歷險(xiǎn)記游戲
導(dǎo)語(yǔ)
親愛(ài)的小可愛(ài)們,大家好! 歡迎來(lái)到木子的游戲編程空間
經(jīng)常聽(tīng)到有朋友說(shuō),學(xué)習(xí)編程是一件非??菰餆o(wú)味的事情。其實(shí),大家有沒(méi)有認(rèn)真想過(guò),可能是我們的學(xué)習(xí)方法不對(duì)?

比方說(shuō),你有沒(méi)有想過(guò),可以通過(guò)打游戲來(lái)學(xué)編程?
今天又又又更新一款新游戲給大家啦,期待不期待呀?教大家如何通過(guò)邊打游戲邊學(xué)編程!準(zhǔn)備好了嗎?我們即將開(kāi)始激動(dòng)人心的游戲編程之旅。
或許你之前學(xué)習(xí)過(guò)一點(diǎn)編程,但若是你從沒(méi)接觸過(guò)游戲編程,那么你仍然會(huì)對(duì)游戲程序的運(yùn)行感到不解。游戲程序不像計(jì)算一個(gè)公式或謎題,得到答案之后程序就結(jié)束了,游戲程序一直是處于運(yùn)行中的,只要你不主動(dòng)退出,那么你可以永遠(yuǎn)呆在游戲之中。這就游戲循環(huán)的神奇魔力。下面我們進(jìn)入今天的主題——制作一款《小蜜蜂歷險(xiǎn)記》小游戲!

一、運(yùn)行環(huán)境
小編使用的環(huán)境:Python3、Pycharm社區(qū)版、Pygame模塊部分自帶就不一一 展示啦。
模塊安裝:pip install -i https://pypi.douban.com/simple/ +pygame
二、素材(圖片等)
圖片的話可以自己準(zhǔn)備,但是要注意的大小尺寸問(wèn)題還有圖片是.png模式的哈。

三、代碼展示
這款小游戲主要分為兩大塊代碼:plame_sprites.py、主程序plane_main.py。
1)plame_sprites.py(屏幕的大小、背景、敵機(jī)等類的設(shè)置)
import random
import pygame
# 屏幕大小的常量
SCREEN_RECT = pygame.Rect(0, 0, 480, 650)
# 刷新的幀率
FRAME_PER_SEC = 60
# 創(chuàng)建敵機(jī)定時(shí)器常量
CREATE_ENEMY_EVENT = pygame.USEREVENT
# 創(chuàng)建子彈定時(shí)器常量
HERO_FIRE_EVENT = pygame.USEREVENT + 1
class GrameSprite(pygame.sprite.Sprite):
""""飛機(jī)大戰(zhàn)游戲精靈類"""
def __init__(self, image_name, speed=1,speed1=1):
# 調(diào)用父類方法
super().__init__()
pygame.image.load(image_name).convert_alpha()
self.image = pygame.image.load(image_name).convert_alpha()
self.rect = self.image.get_rect()
self.speed = speed
self.speed1=speed1
def update(self):
self.rect.y += self.speed
class Background(GrameSprite):
"""背景類"""
def __init__(self, is_flag=False):
super().__init__('./images/background1.jpeg')
if is_flag:
self.rect.y = -self.rect.height
def update(self):
super().update()
if self.rect.y >= SCREEN_RECT.height:
self.rect.y = -SCREEN_RECT.height
class Enemy(GrameSprite):
""""敵機(jī)類"""
def __init__(self):
super().__init__('./images/enemy0.png')
self.speed = random.randint(2, 3)
max_x = SCREEN_RECT.width - self.rect.width
self.rect.x = random.randint(0, max_x)
self.rect.bottom = 0
def __del__(self):
# print('敵機(jī)掛了%s' % self.rect)
pass
def update(self):
super().update()
if self.rect.y >= SCREEN_RECT.height:
# kill方法可以將精靈從精靈組中移除,精靈就會(huì)被銷毀
self.kill()
class Hero(GrameSprite):
"""英雄類"""
def __init__(self):
super().__init__('./images/hero1.png', 0)
self.rect.centerx = SCREEN_RECT.centerx
self.rect.bottom = SCREEN_RECT.bottom - 120
# 創(chuàng)建子彈精靈組
self.bullet_group = pygame.sprite.Group()
def update(self):
self.rect.x += self.speed
self.rect.y += self.speed1
if self.rect.x < 0:
self.rect.x = 0
elif self.rect.right > SCREEN_RECT.right:
self.rect.right = SCREEN_RECT.right
if self.rect.y>SCREEN_RECT.height:
self.rect.bottom=SCREEN_RECT.height
elif self.rect.y<0:
self.rect.bottom=0
def fire(self):
bullet = Bullet()
bullet.rect.bottom = self.rect.y - 20
bullet.rect.centerx = self.rect.centerx
self.bullet_group.add(bullet)
class Bullet(GrameSprite):
"""子彈類"""
def __init__(self):
super().__init__('./images/new_arrow.png', -4)
def __del__(self):
pass
# print('子彈銷毀')
def update(self):
super().update()
if self.rect.bottom < 0:
self.kill()
2)主程序plane_main.py
import pygame
from plame_sprites import *
class PlaneGame(object):
def __init__(self):
# 1.創(chuàng)建游戲窗口
self.screen = pygame.display.set_mode(SCREEN_RECT.size)
# 2.創(chuàng)建時(shí)鐘對(duì)象
self.clock = pygame.time.Clock()
# 3.創(chuàng)建精靈組
self.__create_speites()
# 4.設(shè)置定時(shí)器
pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)
pygame.time.set_timer(HERO_FIRE_EVENT, 500)
def __create_speites(self):
bg1 = Background()
bg2 = Background(True)
self.back_group = pygame.sprite.Group(bg1, bg2)
# 創(chuàng)建敵機(jī)精靈組
self.enemy_group = pygame.sprite.Group()
# 創(chuàng)建英雄
self.hero = Hero()
self.hero_group = pygame.sprite.Group( self.hero )
def __event_handler(self):
for event in pygame.event.get():
# 退出
if event.type == pygame.QUIT:
PlaneGame.__game_over()
# 判斷事件是不是定時(shí)器
elif event.type == CREATE_ENEMY_EVENT:
enemy = Enemy()
self.enemy_group.add(enemy)
if event.type==pygame.KEYDOWN:
if event.key==pygame.K_SPACE:
self.hero.fire()
# elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:
# print('按下向右')
# 獲取按下的鍵盤(pán)被按下的鍵
keys_pressd = pygame.key.get_pressed()
# 判斷用戶按下的方向
if keys_pressd[pygame.K_RIGHT]:
self.hero.speed = 3
elif keys_pressd[pygame.K_LEFT]:
self.hero.speed = -3
elif keys_pressd[pygame.K_UP]:
self.hero.speed1 =-3
elif keys_pressd[pygame.K_DOWN]:
self.hero.speed1 = 3
else:
self.hero.speed = 0
self.hero.speed1=0
def __check_collide(self):
# 子彈打飛機(jī)
pygame.sprite.groupcollide(self.hero.bullet_group,self.enemy_group,True,True)
# 敵機(jī)撞英雄
enemies = pygame.sprite.spritecollide(self.hero,self.enemy_group,True)
if len(enemies) > 0:
self.hero.kill()
# 清空所有的子彈 精靈組的 子彈
# self.hero.bullet_group.empty()
# 停止在事件隊(duì)列上重復(fù)創(chuàng)建子彈事件
# pygame.time.set_timer(HERO_FIRE_EVENT, 0)
# Restart = pygame.image.load('./images/restart_sel.png')
# self.screen.blit(Restart, (0, 0))
# pygame.display.update()
PlaneGame.__game_over()
def __update_sprites(self):
# 精靈組 更新精靈的位置
self.back_group.update()
self.enemy_group.update()
self.hero_group.update()
self.hero.bullet_group.update()
# 繪制所有得精靈
self.back_group.draw(self.screen)
self.enemy_group.draw(self.screen)
self.hero_group.draw(self.screen)
self.hero.bullet_group.draw(self.screen)
@staticmethod
def __game_over():
pygame.quit()
exit()
def start_game(self):
while True:
# 1.設(shè)置刷新幀率
self.clock.tick(FRAME_PER_SEC)
# 2.事件監(jiān)聽(tīng)
self.__event_handler()
# 3.碰撞檢測(cè)
self.__check_collide()
# 4.更新/繪制精靈組
self.__update_sprites()
# 5.更新顯示
pygame.display.update()
if __name__ == '__main__':
game = PlaneGame()
game.start_game()四、效果展示
圖片背景優(yōu)化了一下子的哈,背景更好看啦~小蜜蜂當(dāng)然是在花叢中啦!
1)隨機(jī)截圖界面

2)擊殺敵人(小瓢蟲(chóng))

3)隨機(jī)背景截圖
撞擊死亡,上下左右移動(dòng)方向鍵,空格放箭。

以上就是Python+Pygame實(shí)戰(zhàn)之實(shí)現(xiàn)小蜜蜂歷險(xiǎn)記游戲的詳細(xì)內(nèi)容,更多關(guān)于Python Pygame小蜜蜂歷險(xiǎn)記的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Pygame改編飛機(jī)大戰(zhàn)制作兔子接月餅游戲
- Python+Pygame實(shí)現(xiàn)海洋之神大冒險(xiǎn)游戲
- Python pygame 動(dòng)畫(huà)游戲循環(huán)游戲時(shí)鐘實(shí)現(xiàn)原理
- Python+Pygame實(shí)戰(zhàn)之英文版猜字游戲的實(shí)現(xiàn)
- Pygame游戲開(kāi)發(fā)之太空射擊實(shí)戰(zhàn)盾牌篇
- Pygame游戲開(kāi)發(fā)之太空射擊實(shí)戰(zhàn)碰撞改進(jìn)篇
- Pygame游戲開(kāi)發(fā)之太空射擊實(shí)戰(zhàn)添加圖形篇
- Pygame游戲開(kāi)發(fā)之太空射擊實(shí)戰(zhàn)子彈與碰撞處理篇
- pygame實(shí)現(xiàn)一個(gè)類似滿天星游戲流程詳解
相關(guān)文章
Python實(shí)現(xiàn)螺旋矩陣的填充算法示例
這篇文章主要介紹了Python實(shí)現(xiàn)螺旋矩陣的填充算法,結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)螺旋矩陣的相關(guān)循環(huán)、遍歷、判斷、運(yùn)算等操作技巧,需要的朋友可以參考下2017-12-12
matplotlib基礎(chǔ)繪圖命令之errorbar的使用
這篇文章主要介紹了matplotlib基礎(chǔ)繪圖命令之errorbar的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
利用Python實(shí)現(xiàn)個(gè)性化日歷
雖然市面上已經(jīng)存在現(xiàn)成的日歷功能,并且有第三方庫(kù)可以直接調(diào)用實(shí)現(xiàn),但我們?nèi)匀幌Mㄟ^(guò)自己編寫(xiě)日歷程序來(lái)引出我認(rèn)為好用的日歷實(shí)現(xiàn),所以下面就跟隨小編一起學(xué)習(xí)一下如何使用Python編寫(xiě)一個(gè)簡(jiǎn)單的日歷程序吧2024-02-02
通過(guò)LyScript實(shí)現(xiàn)從文本中讀寫(xiě)ShellCode
LyScript 插件通過(guò)配合內(nèi)存讀寫(xiě),可實(shí)現(xiàn)對(duì)特定位置的ShellCode代碼的導(dǎo)出。本文將利用這一特性實(shí)現(xiàn)從文本中讀寫(xiě)ShellCode,感興趣的可以了解一下2022-08-08
python實(shí)現(xiàn)QQ定時(shí)發(fā)送新年祝福信息
大家好,本篇文章主要講的是python實(shí)現(xiàn)QQ定時(shí)發(fā)送新年祝福信息,感興趣的同學(xué)感快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02
Windows下的Python 3.6.1的下載與安裝圖文詳解(適合32位和64位)
這篇文章主要介紹了Windows下的Python 3.6.1的下載與安裝圖文詳解(適合32位和64位),需要的朋友可以參考下2018-02-02
Python常用Web框架Django、Flask與Tornado介紹
這篇文章介紹了Python常用Web框架Django、Flask與Tornado,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05

