如何用100行Python代碼做出魔性聲控遊戲「八分音符醬」

最近幾天,一款魔性的小遊戲在微博上刷屏了,各大平台的主播也紛紛如感染病毒一樣直播自己怎麼玩這個遊戲(被遊戲玩)。

這個遊戲叫做《不要停!八分音符醬?》。它是一款來自島國的惡搞遊戲,主角是一隻可愛的小生物 — 八分音符醬,玩家通過對它喊話來控制其前進和跳躍。

因為操作方式太奇葩,所以玩遊戲的人本身似乎會比遊戲更好玩……

不過這不是我今天重點。我們是編程教室啊,肯定不能像遊戲主播一樣打個遊戲賣個萌就完啦!n

所以,我就用了大約 100 行 Python 代碼,自己實現了一個。而且,還配了個超霸氣的主角:海中霸主皮皮蝦!

先上效果(優化後的版本):n

魔性聲控遊戲 - 暴走皮皮蝦 - 騰訊視頻 https://v.qq.com/x/page/z0380ogn3e7.html

最初的仿製版本用了大約100行 Python 代碼,花了半天時間。後來又花一天時間,根據自己的惡趣味,加了點更魔性的功能。另外加了個聯機的排行榜。

執行文件和代碼都上傳了,不用安裝 Python 也可以玩。具體細節可以對照源碼看,代碼不長。n

這裡簡單說下實現的核心思路,主要用到兩個模塊:

cocos2d-python

這個之前的貪吃蛇大作戰 Python 版就用到。參見 爆款遊戲《貪吃蛇大作戰》的 Python 實現 - 知乎專欄。負責遊戲的主循環、圖像渲染、事件響應等。

pyaudio

基於開源聲音庫 PortAudio 的 Python 模塊。靠它實現這個遊戲的核心玩法:聲控。

有了這兩樣東西,其他就沒什麼特別的了。如果你用 cocos2d 開發過小遊戲,剩下的就是一些常規工作。通過幾個代碼片段粗略地說下:

  • 定義角色,添加在場景上

# 定義 spritenclass PPX(cocos.sprite.Sprite):n def __init__(self):n super(PPX, self).__init__(ppx.png)n ... # 略n# 創建並添加nself.ppx = PPX()nself.add(self.ppx)n

  • 給角色增加重力的效果

def update(self, dt):n self.speed += 10 * dtn self.y -= self.speedn if self.y < -80:n self.reset()n

  • 獲取麥克風的聲音

# 初始化npa = PyAudio()nSAMPLING_RATE = int(pa.get_device_info_by_index(0)[defaultSampleRate])nself.stream = pa.open(format=paInt16, channels=1, rate=SAMPLING_RATE, input=True, frames_per_buffer=self.NUM_SAMPLES)n# 每幀中獲取音量nstring_audio_data = self.stream.read(self.NUM_SAMPLES)nk = max(struct.unpack(1000h, string_audio_data))n

  • 通過音量判斷行走和跳躍

if k > 3000:n self.floor.x -= min((k / 20.0), 150) * dtnif k > 8000:n self.ppx.jump((k - 8000) / 1000.0)n

目前只是通過試驗隨意設置了下參數,不能保證在每台電腦上的效果。

這裡,地面上的每個塊是放在一個整體的容器里,皮皮蝦的「行走」,其實是通過地面整體向後退來實現的。

  • 簡單的碰撞檢測

def collide(self):n px = self.ppx.x - self.floor.xn for b in self.floor.get_children():n if b.x <= px + self.ppx.width * 0.8 and px + self.ppx.width * 0.2 <= b.x + b.width:n if self.ppx.y < b.height:n self.ppx.land(b.height)n breakn

如果你現在對上面的代碼還一臉懵逼,沒關係,趕緊去看一看我們公眾號里超好懂的入門教程。我們之後也還會對遊戲開發、爬蟲、數據分析等方面做進一步的介紹。

公眾號(Crossin的編程教室)里回復 皮皮蝦,獲取遊戲程序和源代碼。

其他文章及回答:

學習編程的過程中可能會走哪些彎路,有哪些經驗可以參考?

你是如何自學 Python 的?

數據分析:當趙雷唱民謠時他唱些什麼?

我去扒了杜蕾斯的微博

一行代碼掃出「敬業福」

今天,你搶到票了嗎?

Crossin的編程教室

  • 微信公眾號ID:crossincode
  • 網站:crossincode.com
  • QQ群:149164011
  • 微信加群:crossin123


推薦閱讀:

爬蟲入門到精通-headers的詳細講解(If-modified-since)
跟黃哥學python序列文章之python方法鏈(method chaining)
代碼優化指南:人生苦短,我用Python
由淺入深寫代理(3) -socks5 代理
Python數據分析及可視化實例之文本處理文本相似度(29)

TAG:Python | 游戏开发 | 八分音符酱 |