如何用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)