国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

Kenta Cho小游戲開發(fā)教程

0
分享至


字?jǐn)?shù) 24601,閱讀大約需 124 分鐘

小游戲開發(fā)之樂
原文:Joys of Small Game Development[1] by ABA Games 許可協(xié)議:CC BY 4.0[2]
引言

游戲開發(fā)是一片展現(xiàn)創(chuàng)造力的沃土。尤其是小游戲,制作簡(jiǎn)單、即玩即樂,讓人能夠迅速沉浸于其中。本文旨在深入探討制作小游戲的樂趣。

在《制作小游戲本身就是一種樂趣》一節(jié)中,將探討什么是小游戲以及為什么制作它們令人愉快。開發(fā)小游戲不僅僅是通往更大項(xiàng)目的練兵場(chǎng),它本身就具有獨(dú)特的魅力。

當(dāng)你著手制作一款小游戲時(shí),選擇使用哪種編程語言或游戲引擎是第一道門檻。在《目標(biāo)設(shè)備與開發(fā)環(huán)境》一節(jié)中,我匯總了相關(guān)的信息。

構(gòu)思核心創(chuàng)意是小游戲創(chuàng)作中的關(guān)鍵!度绾螢樾∮螒蛳朦c(diǎn)子》一節(jié)提供了頭腦風(fēng)暴的技巧。此外,在《約束:激發(fā)創(chuàng)意與完成游戲的催化劑》中,討論了通過對(duì)游戲輸入方式或分辨率施加約束來催生更好創(chuàng)意的方法。

在小游戲中,隨著游戲推進(jìn)逐漸提升難度是常見做法!缎∮螒蛑惺裁床攀呛线m的難度》探討了如何設(shè)置讓玩家感到適度挑戰(zhàn)的難度水平。

沒有調(diào)味料的游戲是索然無味的。在《讓游戲"多汁"》中,圍繞"juicy"(多汁)這一概念,介紹了通過添加效果和音效來豐富游戲的方法。

在《打造自己的游戲開發(fā)工具》中,敘述延伸到在制作游戲的同時(shí)創(chuàng)建自定義庫或游戲引擎。雖然為游戲打造工具非常有趣,但這也是一把雙刃劍——陷得太深可能會(huì)阻礙游戲的完成。

為了快速制作小游戲,有一種自動(dòng)生成圖形和聲音的方法!锻ㄟ^自動(dòng)化提升開發(fā)效率》介紹了讓計(jì)算機(jī)生成像素畫、背景音樂、音效和關(guān)卡的方式。

如果計(jì)算機(jī)能夠創(chuàng)作游戲,將進(jìn)一步減輕人類的負(fù)擔(dān)。《小游戲能否自我生成?》探討了計(jì)算機(jī)從零開始開發(fā)游戲的可能性,重點(diǎn)關(guān)注 AI 聊天機(jī)器人的應(yīng)用。

我在本文中編織了關(guān)于小游戲開發(fā)的諸多話題。通過這些敘述,希望讀者能感受到小游戲開發(fā)的魅力,也希望這能成為更多人拿起挑戰(zhàn)創(chuàng)造之筆的契機(jī)。

  • ? 許可協(xié)議:CC BY 4.0[2]
  • ? 倉庫:joys-of-small-game-development-en[3]
  • ? 本文首頁:Introduction - Joys of Small Game Development[1]
  • ? 作者主頁:ABA Games[4]
制作小游戲本身就是一種樂趣

制作小游戲本身就是一件令人愉悅的事情。那么,什么是小游戲呢?根據(jù)"小游戲宣言"(Small Games Manifesto)[^1],它指的是在 10 分鐘內(nèi)即可完成、并且可以在瀏覽器中輕松游玩的游戲。

按照這個(gè)定義,我已經(jīng)創(chuàng)作了超過 350 款小游戲。[^2] 其中有一年我制作了 139 款小游戲,[^3] 可見我對(duì)小游戲的熱愛毋庸置疑。

舉個(gè)例子,一款讓你把紅色棍子切成等份的簡(jiǎn)單游戲,就是小游戲的典型代表(點(diǎn)擊下圖可直接在瀏覽器中游玩)。


TIMBER TEST [5]

另一個(gè)例子是一款通過點(diǎn)擊來剪斷繩子的游戲,需要確保繩子不碰到屏幕底部——這也是一款小游戲,在智能手機(jī)等觸屏設(shè)備上游玩體驗(yàn)極佳。


C NODES [6]

小游戲吸引人的魅力在于它們所需的開發(fā)時(shí)間極短。一款游戲大約可以在 2 小時(shí)內(nèi)快速完成,即使遇到困難,10 小時(shí)左右也差不多了。不過,一旦開始深入美術(shù)資源的制作,時(shí)間投入就可能變得沒有盡頭。本文所討論的小游戲,是在"一周一游戲"(Game A Week)[^4] 等活動(dòng)框架下制作的游戲,開發(fā)者的目標(biāo)是每周制作一款新游戲。這些游戲從開發(fā)者的角度來看也是"小型"的,因?yàn)樗鼈兊拈_發(fā)時(shí)間非常有限。

開發(fā)時(shí)間短意味著你可以輕松地嘗試各種創(chuàng)意。我很享受構(gòu)思和測(cè)試那些不落俗套的游戲。

關(guān)于小游戲的普遍說法是,制作它們是開發(fā)更大、更精致游戲的重要準(zhǔn)備步驟。許多文章極力建議初學(xué)者從小游戲開始。

一篇題為"Make and release lots of small games before making a big one"(先做很多小游戲再做大的)[^5] 的博客文章強(qiáng)調(diào)了在進(jìn)行大型項(xiàng)目之前這種實(shí)踐的重要性。

之所以這樣說,是因?yàn)橹苯犹酱笮陀螒蜃鳛槟愕?第一個(gè)"游戲,恰恰是讓你喪失動(dòng)力、永遠(yuǎn)無法完成它的原因,或者最終得到的成果吞噬了你好幾年的生命,而你甚至無法忍受再看到它。

但故事并沒有到此為止。小游戲擁有它們獨(dú)有的、無法被替代的魅力。這是我深信不疑的。

有一篇題為"How To Make Good Small Games"(如何制作優(yōu)秀的小游戲)[^6] 的博客文章,闡述了優(yōu)秀的小游戲確實(shí)存在,并詳細(xì)說明了如何制作它們。

這份類似宣言的文檔"How To Make Good Small Games"(如何制作優(yōu)秀的小游戲),試圖與這種觀點(diǎn)尋求一個(gè)折中。它分為十二條思考,主要由一些深邃的創(chuàng)作理論組成(為什么我喜歡小游戲?為什么我喜歡制作小游戲?),同時(shí)也希望提供一些切實(shí)可行的建議。我可以告訴你"把范圍縮小 uwu",但如果你根本不相信小游戲也能做到優(yōu)秀,那你聽到的只不過是在制作你真正在意的游戲之前不得不完成的作業(yè)。

這 12 條思考涵蓋以下內(nèi)容:

  1. 1. 游戲的品質(zhì)與其規(guī)模無關(guān)。小游戲不僅容易制作,也容易做好。游戲越大,需要關(guān)注的方面就越多,失敗的概率也越高。
  2. 2. 游戲的品質(zhì)與其情感范圍無關(guān)。正如短篇小說與長(zhǎng)篇小說或史詩的功能不同,構(gòu)成"成功"的條件在小規(guī)模游戲中也各不相同。
  3. 3. 游戲定義了自身成功的標(biāo)準(zhǔn)。接受它們本來的樣子,再評(píng)判它是好是壞。
  4. 4. 游戲在兌現(xiàn)承諾時(shí)就是成功的。引入新角色或新機(jī)制就是一種承諾。與其引入一個(gè)有趣的創(chuàng)意然后迅速拋棄,不如確保它不斷進(jìn)化,并為游戲的整體進(jìn)程做出貢獻(xiàn)。
  5. 5. 游戲做出更小的承諾,就更容易成功。減少機(jī)制、敵人、資源、角色和關(guān)卡。引入 3 個(gè)創(chuàng)意并將它們發(fā)展到令人滿意的高潮,比同時(shí)應(yīng)對(duì) 10 個(gè)或 100 個(gè)創(chuàng)意要容易得多。
  6. 6. 以有趣且令人愉悅的方式兌現(xiàn)承諾。什么能讓你微笑?這就是你的個(gè)人風(fēng)格在制作一款真正屬于"你"的游戲時(shí)閃耀的地方。
  7. 7. 不要過度兌現(xiàn)你的承諾。游戲應(yīng)該在恰當(dāng)?shù)臅r(shí)刻結(jié)束,而不是不必要地拖長(zhǎng)。
  8. 8. 形式也是游戲承諾的一部分。盡量減少向玩家呈現(xiàn)的信息,確保玩家在游戲啟動(dòng)后就能立即開始游玩,從而改變玩家的預(yù)期。
  9. 9. 在發(fā)布前完成你的游戲。在以"Demo"(演示版)的標(biāo)簽發(fā)布或添加"Prologue"(序章)副標(biāo)題之前,先問問自己為什么要在完成之前發(fā)布它。
  10. 10. 系列化不是捷徑。將游戲分成兩集或更多,在較長(zhǎng)時(shí)間內(nèi)陸續(xù)發(fā)布,幾乎總是一個(gè)壞主意。
  11. 11. 不要擔(dān)心能不能爆紅。在游戲中追求小而具體的目標(biāo),吸引的也是小而特定的受眾。
  12. 12. 夠好就是好。一旦你能持續(xù)創(chuàng)作出令自己滿意、感覺確實(shí)不錯(cuò)的游戲,你就已經(jīng)領(lǐng)先于許許多多的游戲開發(fā)者了。

此外,該文章還提出了第 13 條思考:"Have fun :)"(享受其中)。構(gòu)思新的機(jī)制,并以體現(xiàn)你個(gè)人風(fēng)格的方式將其融入游戲。我認(rèn)為這個(gè)過程本身就是令人愉悅的,如果能有一定數(shù)量的人體驗(yàn)并享受我創(chuàng)作的成果,那就更令人欣慰了。

制作小游戲通常在磨練游戲開發(fā)技能的語境下被討論。然而,頭腦風(fēng)暴各種游戲創(chuàng)意、不斷實(shí)驗(yàn)、在興奮與沮喪間坐過山車、偶爾向他人展示你的作品——這個(gè)過程本身就很快樂,這也是一段寶貴的體驗(yàn)。

小游戲應(yīng)在 10 分鐘或更短時(shí)間內(nèi)完成,最好能在網(wǎng)絡(luò)瀏覽器中游玩。
目標(biāo)設(shè)備與開發(fā)環(huán)境

當(dāng)你考慮制作一款小游戲時(shí),首先需要思考的問題之一就是游戲?qū)⑦\(yùn)行在什么設(shè)備上——PC、智能手機(jī)還是游戲主機(jī)。

如果你沒有特別的偏好,推薦為 PC 網(wǎng)頁瀏覽器制作游戲,F(xiàn)代瀏覽器已經(jīng)成熟為能夠運(yùn)行在各種開發(fā)環(huán)境下開發(fā)的游戲的平臺(tái)。而且讓別人游玩你的游戲也很方便——只需發(fā)布一個(gè) URL 就能實(shí)現(xiàn)無縫的游戲體驗(yàn)。

對(duì)于享受游戲制作過程的人來說,開發(fā)環(huán)境、編程語言和游戲引擎的選擇可以源于個(gè)人喜好。這與游戲的規(guī)模并沒有太大關(guān)系,選擇你喜歡的就好。不過,如果你的目標(biāo)是小型 2D 游戲,像 Unreal Engine [^7] 這樣的引擎可能有些大材小用了。

為瀏覽器制作游戲時(shí),有各種開發(fā)選項(xiàng)可供選擇:

  • JavaScript

在瀏覽器中運(yùn)行的游戲是用 JavaScript 編寫的,這使得它成為游戲開發(fā)的自然之選。利用 p5.js [^8] 或 Phaser [^9] 等庫可以簡(jiǎn)化渲染等繁瑣任務(wù)。使用 p5.js,初學(xué)者可以立即通過學(xué)習(xí)內(nèi)容 [^10] 或參考文檔 [^11],在網(wǎng)頁編輯器 [^12] 中跟著操作。

  • 幻想主機(jī)(Fantasy Consoles)

幻想主機(jī)是輕量級(jí)游戲引擎,集成了游戲執(zhí)行和開發(fā)環(huán)境,包括角色、關(guān)卡和聲音編輯器。代表性的有 PICO-8、[^13] Pyxel、[^14] 和 TIC-80。[^15] 這些一體化環(huán)境有意限制了功能,非常適合小游戲項(xiàng)目。它們支持不同的編程語言,找到適合你偏好的即可。如果你想嘗試 PICO-8,可以參考手冊(cè) [^16] 或 API 參考 [^17],同時(shí)使用教育版。[^18]

  • 游戲引擎

許多游戲引擎如 Unity、[^19] GameMaker、[^20] 和 Godot [^21] 支持將游戲?qū)С鰹闉g覽器(HTML5)格式,使在瀏覽器上游玩所創(chuàng)建的游戲變得輕而易舉。它們提供全面的資源管理功能,并且不僅能將游戲發(fā)布在瀏覽器上,還可以發(fā)布在 PC 和移動(dòng)平臺(tái)上,這是顯著的優(yōu)勢(shì)。

  • 制作工具(Maker Tools)

如果你想制作 RPG 或視覺小說,有專門的類型化工具可用。例如 RPG Maker MV [^22] 在這個(gè)類別中一直很受歡迎,這類工具傳統(tǒng)上被稱為"Maker"(制作工具)。除了 RPG Maker 之外,還有用于 RPG 的 WOLF RPG Editor [^23] 以及用于視覺小說的 TyranoBuilder Visual Novel Studio。[^24] 許多近年的制作工具都包含了瀏覽器導(dǎo)出功能。

  • 可視化編程語言

對(duì)于不習(xí)慣基于文本編程的人,可以使用 Scratch [^25] 或 MakeCode [^26] 等可視化編程語言。雖然制作復(fù)雜游戲可能有些困難,但它們內(nèi)置了預(yù)制好的圖形和聲音,適合小型項(xiàng)目。

  • 其他編程語言

現(xiàn)代瀏覽器可以通過 WebAssembly [^27] 等技術(shù)運(yùn)行 JavaScript 以外的語言。不過編譯過程可能比較復(fù)雜,所以如果可以的話,利用幻想主機(jī)或游戲引擎會(huì)更方便。例如,用 Pyxel 來寫 Python,或用 Unity 來寫 C#。

為瀏覽器制作游戲時(shí),確保你的游戲支持觸摸操作(或 PC 上的鼠標(biāo)操作),這樣就能兼容移動(dòng)設(shè)備。如果你想觸達(dá)更廣泛的受眾,這一點(diǎn)值得考慮。

從游戲制作體驗(yàn)本身獲得的樂趣并不一定需要面向?yàn)g覽器的方法。為 PC 或移動(dòng)設(shè)備制作應(yīng)用,或者使用 SmileBASIC 4 [^28] 在 Switch 上創(chuàng)作游戲,也是不錯(cuò)的選擇。用 MakeCode 制作的游戲可以在你喜歡的掌機(jī)上玩,[^29] 有些人甚至在上面運(yùn)行 PICO-8 游戲。[^30]

創(chuàng)作的動(dòng)力不必僅僅來源于"讓更多人方便游玩"的愿望——對(duì)某個(gè)特定設(shè)備的興趣本身也可以成為動(dòng)力。讓我們自由地創(chuàng)作吧。

如何為小游戲想點(diǎn)子

為小游戲構(gòu)思創(chuàng)意既是有趣的,也是充滿挑戰(zhàn)的,F(xiàn)在我準(zhǔn)備好制作一款小游戲了,但問題是:我應(yīng)該做什么類型的游戲?

構(gòu)思階段令人興奮,但也需要付出相當(dāng)?shù)呐ΑR粋(gè)好的創(chuàng)意能推動(dòng)制作順利前進(jìn),而一個(gè)平庸的創(chuàng)意則可能讓道路坎坷不平。不過,對(duì)于小游戲來說,如果一個(gè)想法行不通,直接丟掉就好了。

網(wǎng)上有許多關(guān)于游戲創(chuàng)意生成的文章,粗略搜索一下,找到一種適合你的方法即可。例如,我在 Reddit 的 r/gamedev 上一個(gè)題為"How do you guys come up with ideas for your games?"(你們?cè)趺聪氤鲇螒螯c(diǎn)子的?)[^31] 的帖子中找到了一種很有說服力的方法。

  1. 1. 從你最喜歡的現(xiàn)有游戲中汲取靈感。
  2. 2. 將看似不搭的元素組合在一起,比如卡牌游戲 + 釣魚、塔防 + Minecraft,或者 Pac-Man 變成 FPS。
  3. 3. 分析其他游戲,思考它們的開發(fā)過程。如果是你,你會(huì)怎么做得不同?
  4. 4. 將你的創(chuàng)意縮小到一個(gè)切實(shí)可行的子集。聚焦在"你想做的"和"你能做的"的交集上。
  5. 5. 擁抱限制。從你的創(chuàng)意中剝離各種復(fù)雜性,在過程中創(chuàng)造新的東西。

組合、提煉和增強(qiáng)現(xiàn)有游戲的元素來創(chuàng)造新事物——這個(gè)經(jīng)過驗(yàn)證的過程對(duì)于小游戲尤其有用,它通過將元素極致簡(jiǎn)化來幫助打造具有引人入勝核心機(jī)制的游戲。

GameMaker 網(wǎng)站上一篇題為"14 WAYS TO GENERATE S-TIER VIDEO GAME IDEAS"(14 種產(chǎn)生頂級(jí)游戲創(chuàng)意的方法)[^32] 的文章也提供了有見地的建議。提取與小游戲相關(guān)的要點(diǎn)如下:

  • ? 游玩過去的傳奇游戲。例如,當(dāng)你玩 Super Mario Brothers 時(shí),你正在體驗(yàn)一款為所有未來 2D 平臺(tái)游戲奠定基礎(chǔ)的游戲。你會(huì)如何為新玩家擴(kuò)展和現(xiàn)代化這個(gè)基礎(chǔ)?
  • ? 從零開始憑空構(gòu)想一個(gè)游戲概念是困難的。先選擇一個(gè)類型,圍繞它構(gòu)建你的創(chuàng)意。
  • ? 如果執(zhí)著于某個(gè)類型很困難,就聚焦于一個(gè)角色。利用角色的特征來展開圍繞他們的世界。
  • ? 使用思維導(dǎo)圖記錄創(chuàng)意。從游戲的核心方面(如類型或主角)出發(fā),記下相關(guān)的關(guān)鍵詞和想法,探索玩法機(jī)制、功能、故事主題和美術(shù)風(fēng)格。
  • ? 靈感可能在意想不到的時(shí)刻閃現(xiàn)。手邊備一個(gè)記事本,全天隨時(shí)記錄涌現(xiàn)的想法。
  • ? 對(duì)現(xiàn)有游戲運(yùn)用 SCAMPER 方法,思考哪些方面可以替換、組合、添加、修改、消除或重新排列,或者某個(gè)方面能否用于其他用途或反轉(zhuǎn)。
  • ? 將目光轉(zhuǎn)向其他媒體。電視、電影、音樂、書籍、傳統(tǒng)藝術(shù)——它們都能點(diǎn)燃游戲創(chuàng)意。
  • ? 從現(xiàn)實(shí)世界中汲取靈感。現(xiàn)實(shí)世界充滿了值得用于游戲開發(fā)的驚人概念。
  • ? 利用你自己的經(jīng)歷。你以一種獨(dú)特的方式看到了這個(gè)世界——無論正面還是負(fù)面——這些經(jīng)歷可以成為絕佳游戲創(chuàng)意的基礎(chǔ),展開只有你才能講述的故事。
  • ? 使用隨機(jī)顯示游戲類型、規(guī)則和主題的游戲創(chuàng)意生成器。
  • ? 參加有主題的游戲 Jam。它們是有設(shè)定主題和嚴(yán)格截止日期的短期游戲開發(fā)比賽,能磨練你的專注力并激發(fā)創(chuàng)造力。
  • ? 深入游戲社區(qū),直接詢問玩家。瀏覽帖子、提出問題,了解玩家想要什么、喜歡什么、不喜歡什么。

這是一份涵蓋了激發(fā)創(chuàng)意的技巧和日常習(xí)慣的全面清單。雖然小游戲可能不需要如此大量的努力,但在構(gòu)思時(shí)記住這些方法會(huì)有所幫助。

讓我分享一些我個(gè)人在創(chuàng)意生成方面采用的方法。

在我大量制作小游戲的那段時(shí)期,我在博客上寫了一些方法,取材自受歡迎游戲的特點(diǎn)和我在構(gòu)思方面的經(jīng)驗(yàn)。這些方法包括:

  • ? 高效地從現(xiàn)有游戲中借鑒主題和規(guī)則,不僅限于電子游戲,還可以考慮傳統(tǒng)體育運(yùn)動(dòng)。
  • ? 從復(fù)古游戲中獲取靈感,將復(fù)古游戲的一部分重新打造成獨(dú)立的游戲。
  • ? 融入連鎖反應(yīng)和重力等經(jīng)典機(jī)制。
  • ? 以收集和擊敗對(duì)象所獲得的高分作為享受游戲的基礎(chǔ)。
  • ? 將自然現(xiàn)象或幾何學(xué)中的有趣行為進(jìn)行轉(zhuǎn)譯。
  • ? 將物理行為與控制聯(lián)系起來以產(chǎn)生樂趣。
  • ? 在視覺上標(biāo)示成功的操作,以增強(qiáng)成就感。
  • ? 基于限制(如單按鈕控制)設(shè)計(jì)互動(dòng)方式。
  • ? 始終考慮風(fēng)險(xiǎn)與回報(bào)之間的平衡。
  • ? 風(fēng)險(xiǎn)驅(qū)動(dòng)的開發(fā):從向玩家呈現(xiàn)的風(fēng)險(xiǎn)角度來思考新的機(jī)制。
  • ? 平衡爽快感與緊張感。
  • ? 尋找提升游戲節(jié)奏的規(guī)則。
  • ? 呈現(xiàn)游戲設(shè)定或背景故事,將游戲與敘事聯(lián)系起來。
  • ? 通過去除讓玩家困惑的新奇元素來使游戲更易上手。

我創(chuàng)造了一個(gè)類似老虎機(jī)的工具術(shù)語,用于隨機(jī)輸出游戲創(chuàng)作的主題——游戲創(chuàng)意生成器。[^33] 雖然它是獲取構(gòu)思起點(diǎn)的不錯(cuò)工具,但對(duì)于小游戲來說,它的建議往往過于模糊。因此,我制作了一個(gè)專門針對(duì)小型動(dòng)作游戲的游戲創(chuàng)意生成器。[^34] 它會(huì)輸出諸如"deflect missiles"(偏轉(zhuǎn)導(dǎo)彈)、"roofs fighting"(屋頂戰(zhàn)斗)或"enlarge electricity"(放大電力)等天馬行空的創(chuàng)意,當(dāng)這些創(chuàng)意被開發(fā)成游戲時(shí),可能會(huì)產(chǎn)生創(chuàng)新性的成果。

頭腦風(fēng)暴游戲創(chuàng)意有各種技巧,利用前人的智慧可以加速這個(gè)過程。然而,最好的方法是創(chuàng)造性地思考和大量地創(chuàng)作。幸運(yùn)的是,對(duì)于小游戲來說,構(gòu)思和實(shí)現(xiàn)創(chuàng)意都可以迅速完成。如果一個(gè)想法失敗了,直接丟掉就好。以這種輕松的心態(tài),何不試一試呢?

解構(gòu)與組裝游戲機(jī)制

構(gòu)思游戲創(chuàng)意的一種方式是理解先前創(chuàng)作的游戲背后的機(jī)制。分析這些機(jī)制如何為玩家提供樂趣和挑戰(zhàn),可以提供一種系統(tǒng)化的方法。通過組合這些機(jī)制,可以創(chuàng)造出新的游戲。

例如,我對(duì)迄今為止制作的游戲進(jìn)行了解構(gòu)。我整理了每款游戲由玩家角色、武器、障礙物、場(chǎng)地、規(guī)則和控制組成的方式,并用標(biāo)簽進(jìn)行了分類 [^35](點(diǎn)擊圖片進(jìn)入首頁)。


action-mini-game mechanic tags [7]

按下每個(gè)標(biāo)簽的"Detail"(詳情)按鈕后,可以查看該標(biāo)簽的說明以及帶有該標(biāo)簽的游戲列表。

標(biāo)簽對(duì)應(yīng)各種機(jī)制,例如:

  • ? 玩家角色旋轉(zhuǎn) [^36]:配合旋轉(zhuǎn)時(shí)機(jī)進(jìn)行操作。
  • ? 武器沿拋物線飛行 [^37]:投擲方式、投擲物和落地效果各有變化。
  • ? 混入帶有懲罰的物品 [^38]:不能盲目持續(xù)攻擊,需要仔細(xì)觀察屏幕狀況來把握攻擊時(shí)機(jī)。
  • ? 一維場(chǎng)地 [^39]:游戲畫面可以用一個(gè)維度來表示,角色只能左右(或上下)移動(dòng)。
  • ? 鄰近獎(jiǎng)勵(lì) [^40]:通過在障礙物附近放置獎(jiǎng)勵(lì)分?jǐn)?shù),實(shí)現(xiàn)風(fēng)險(xiǎn)與回報(bào)的基本形式。
  • ? 按鈕按下時(shí)屬性反轉(zhuǎn) [^41]:通過設(shè)計(jì)屬性可以實(shí)現(xiàn)各種特殊行為。

這些頁面的使用方式如下:

  • ? 查看標(biāo)簽列表頁面,了解可以整合到動(dòng)作小游戲中的機(jī)制。
  • ? 查看標(biāo)簽詳情頁面,考慮使用該機(jī)制的其他游戲。
  • ? 任意組合多個(gè)標(biāo)簽,構(gòu)思使用這些機(jī)制的游戲概念。

這類游戲機(jī)制通常被稱為游戲機(jī)制(game mechanics)。[^42] 游戲機(jī)制指的是玩家在游戲中可以執(zhí)行的有序動(dòng)作,以及這些動(dòng)作所觸發(fā)的事件。游戲機(jī)制被用來分析游戲的設(shè)計(jì)方式,或在構(gòu)思新游戲時(shí)作為輔助。玩法通常被描述為游戲機(jī)制之間的流轉(zhuǎn),[^43] 基于這些機(jī)制,可以通過思考如何挑戰(zhàn)玩家來塑造游戲體驗(yàn)。

識(shí)別游戲機(jī)制的粒度水平似乎沒有特定的標(biāo)準(zhǔn)。雖然回合制、資源管理和風(fēng)險(xiǎn)與回報(bào)等抽象元素可以列為機(jī)制,但更精細(xì)的游戲內(nèi)動(dòng)作——如跳躍、格擋、旋轉(zhuǎn)和強(qiáng)化——也可以列為機(jī)制。

這一次,為了輔助構(gòu)思新的動(dòng)作小游戲,整理工作聚焦于更精細(xì)的游戲內(nèi)動(dòng)作。重點(diǎn)是查看每個(gè)機(jī)制的實(shí)際示例,了解它們?nèi)绾闻c其他機(jī)制組合,以及識(shí)別向玩家提供的風(fēng)險(xiǎn)(挑戰(zhàn))和獎(jiǎng)勵(lì)。展示了這些機(jī)制的游戲已可查看和游玩。

通過使用自制游戲作為整理的示例,內(nèi)容不可否認(rèn)地偏向于動(dòng)作小游戲,尤其是單按鈕游戲,但這種展示方式為頭腦風(fēng)暴游戲創(chuàng)意提供了一個(gè)范例。

約束:創(chuàng)造力與游戲完成的催化劑

產(chǎn)生創(chuàng)意的一種方法是事先對(duì)自己施加某些約束。通過思考如何在這些約束下使游戲變得有趣,可以預(yù)期產(chǎn)生與以往不同的創(chuàng)意。此外,思考如何利用這些約束還能增強(qiáng)創(chuàng)意的獨(dú)特性。

可以設(shè)想什么樣的約束呢?例如 Game Jam 等游戲開發(fā)比賽中的格式、規(guī)則和主題。在許多 Game Jam 中,會(huì)對(duì)可提交的游戲設(shè)置一些約束,鼓勵(lì)參與者在這些約束下集中精力創(chuàng)作游戲。

在視頻"Different Game Jam Formats"[^44] 中,列舉了以下類型的約束:

  • 工具:指定可使用的游戲引擎。
  • 素材:預(yù)先提供可在游戲中使用的圖片等素材。
  • 畫面:限制分辨率和顏色數(shù)量。
  • 目標(biāo):定義游戲的目標(biāo),例如"收集更多物品"。
  • 交互:限制玩家與游戲交互的方式,例如"只能使用兩個(gè)按鈕"。
  • 類型:指定類型,如"平臺(tái)跳躍"或"Roguelike"。
  • 時(shí)間限制:在規(guī)定時(shí)間內(nèi)完成游戲。

為了激發(fā)創(chuàng)意,關(guān)于交互、畫面和目標(biāo)的約束可能較為有益。

關(guān)于交互,常見的約束包括限制可用按鈕數(shù)量、僅使用鼠標(biāo)、使用整個(gè)鍵盤或雙搖桿輸入。當(dāng)可用按鈕數(shù)量受限時(shí),需要仔細(xì)考慮為每個(gè)按鈕分配什么操作。例如,將使用傳統(tǒng)方向鍵加兩個(gè)按鈕的游戲轉(zhuǎn)換為單按鈕游戲,就面臨一個(gè)棘手的難題,而在構(gòu)思強(qiáng)制解決方案的過程中,有可能催生全新的創(chuàng)意。

畫面約束主要只影響外觀,不影響游戲規(guī)則。然而,在極端約束的情況下,例如極低的 16x16 像素?cái)?shù),或本質(zhì)上只允許一條垂直線的一維空間,就需要?jiǎng)?chuàng)造性的方案來克服這些約束。過去甚至有只允許 1x1 像素、兩色顯示作為輸出的 Game Jam。[^45]

關(guān)于目標(biāo),僅僅設(shè)置平凡的目標(biāo)并不能引導(dǎo)創(chuàng)意探索。通過設(shè)計(jì)具有不尋常目標(biāo)的游戲,如"摧毀自身"、"做出犧牲"或"利用敵人獲勝",可以構(gòu)想出全新的游戲體驗(yàn)。有趣的是,這些獨(dú)特的目標(biāo)正是由 Game Jam Theme Generator 生成的。[^46] 該生成器不僅限于目標(biāo),還能輸出各種 Game Jam 主題,可用作輔助頭腦風(fēng)暴的創(chuàng)意生成器。

工具、素材、類型和時(shí)間限制更多是關(guān)于在有限時(shí)間內(nèi)完成游戲,而非創(chuàng)意生成。通過不花時(shí)間選擇工具和素材,專注于在時(shí)間限制內(nèi)創(chuàng)作指定類型的游戲,這種標(biāo)準(zhǔn)化方法有助于快速完成游戲創(chuàng)作。

如果你有志于創(chuàng)作大量游戲,為創(chuàng)作過程建立自己的一套規(guī)則和規(guī)范是明智的策略。標(biāo)準(zhǔn)化創(chuàng)作內(nèi)容和創(chuàng)作方式,以最大限度地減少開發(fā)中的工作量。[^47]

在游戲開發(fā)中施加一些約束可以幫助產(chǎn)生新創(chuàng)意或快速完成游戲。過于嚴(yán)格的約束會(huì)使克服它們變得困難,因此建議找到并有效利用適合自己感覺的約束。

單按鈕游戲的可能性

在 Game Jam 中,有一種將交互限制為僅一個(gè)按鈕的設(shè)置,即創(chuàng)建所謂的單按鈕游戲。

不同于除了一個(gè)按鈕外還有搖桿用于移動(dòng)的情況,這里的"單按鈕游戲"指的是所有游戲交互都僅使用一個(gè)按鈕。

單按鈕游戲的優(yōu)勢(shì)在于操作簡(jiǎn)單,在觸摸設(shè)備上容易操作。本質(zhì)上,按下按鈕即可執(zhí)行玩家的所有可用操作,幾乎不需要操作說明。此外,在觸摸設(shè)備上,只需在屏幕任意位置點(diǎn)擊或長(zhǎng)按即可進(jìn)行控制,避免了其他游戲中虛擬方向鍵不靈敏的常見問題。

缺點(diǎn)自然是難以引入操作變化。即使是用搖桿就能輕松實(shí)現(xiàn)的簡(jiǎn)單橫向移動(dòng),也需要采用非常規(guī)的操作方式,例如每次按下按鈕時(shí)反轉(zhuǎn)方向。

因此,開發(fā)單按鈕游戲時(shí)的關(guān)鍵問題是:如何僅用一個(gè)按鈕在游戲交互中引入變化。在這方面,我想根據(jù)獨(dú)特的機(jī)制對(duì)我迄今為止創(chuàng)建的一些單按鈕游戲進(jìn)行分類。

融入獨(dú)特操作

通常,在單按鈕游戲中,玩家按下按鈕后執(zhí)行以下操作:

  • ? 反轉(zhuǎn)移動(dòng)方向,或旋轉(zhuǎn) 90 度。
  • ? 跳躍或扇翅。
  • ? 射擊。

例如,在我制作的游戲 THUNDER 中(點(diǎn)擊圖片可玩),即使只有兩個(gè)方向的移動(dòng),也可以通過巧妙利用障礙物和獎(jiǎng)勵(lì)物品來制作單按鈕游戲。但它缺乏單按鈕游戲獨(dú)有的特色。


THUNDER [8]

如果按下按鈕觸發(fā)的操作在傳統(tǒng)游戲中很少見,就能強(qiáng)烈地給玩家留下單按鈕操控方案的獨(dú)特印象。

瞬移CYWALL [9]

屏幕上預(yù)設(shè)若干點(diǎn),按下按鈕后瞬移到最近的點(diǎn)。這一機(jī)制使僅用一個(gè)按鈕即可實(shí)現(xiàn)快速移動(dòng)。

分裂DIVARR [10]

每次按下按鈕使導(dǎo)彈分裂。持續(xù)按住按鈕可增強(qiáng)攻擊力,但需要設(shè)置約束,例如引入不應(yīng)被擊中的目標(biāo),以防止無腦瘋狂按鍵。

選擇JUMP ON [11]

在某些節(jié)點(diǎn),玩家選擇轉(zhuǎn)向或跳到另一個(gè)平臺(tái)等操作。關(guān)鍵是讓玩家清楚地理解選擇的時(shí)機(jī)及其后果,這需要精心設(shè)計(jì)游戲場(chǎng)地的布局和呈現(xiàn)方式。

屬性反轉(zhuǎn)NS CLIMB [12]

每次按下按鈕,磁極等屬性就會(huì)切換。游戲設(shè)計(jì)的關(guān)鍵在于決定使用哪些屬性以及它們?nèi)绾闻c環(huán)境交互。

其他特殊機(jī)制LADDER DROP [13]

適時(shí)投放移動(dòng)平臺(tái)和梯子,類似于單按鈕的方塊下落游戲。


NUMBER LINE [14]

將流動(dòng)的數(shù)字相加,這是一個(gè)相當(dāng)奇特的例子,說明分配給按鈕的操作可以非常多樣。

利用按住按鈕的操作

單按鈕游戲通常在按下按鈕時(shí)觸發(fā)操作,但也可以在按住按鈕期間持續(xù)產(chǎn)生操作。

調(diào)整角度或距離NUMBER BALL [15]

在高爾夫游戲中很常見,按住按鈕時(shí)角度逐漸增加,玩家必須在恰當(dāng)時(shí)機(jī)松開按鈕擊球。在這個(gè)游戲中,當(dāng)球上的數(shù)字與地板上的數(shù)字匹配時(shí)地板會(huì)消失,這是一個(gè)與傳統(tǒng)高爾夫不同的奇特規(guī)則。


FROOOOG [16]

青蛙的跳躍距離取決于按住按鈕的時(shí)長(zhǎng);這是解決如何用一個(gè)按鈕將玩家從一個(gè)位置移動(dòng)到多個(gè)位置的方案。

伸展PIN CLIMB [17]

按住按鈕時(shí)棍子伸展,松開時(shí)收縮。伸展的棍子可以鉤住物體,配合特定地形特征幫助推進(jìn)。


SQUARE BAR [18]

與幾何形狀結(jié)合時(shí),即使僅僅是伸展也能產(chǎn)生復(fù)雜的運(yùn)動(dòng)。


TAPE J [19]

伸展越長(zhǎng)得分越高,但風(fēng)險(xiǎn)也越大,創(chuàng)造了平衡的風(fēng)險(xiǎn)-回報(bào)情境。

防御 / 閃避EMBATTLED [20]

按住按鈕時(shí),玩家對(duì)子彈無敵。但如果一直不動(dòng)會(huì)被坦克碾壓,所以需要引誘坦克靠近,松開按鈕縱向閃避,觀看坦克互相戰(zhàn)斗。


REFLECTOR [21]

防御墻始終在下方提供保護(hù),反射敵人火力,但按住按鈕可以發(fā)動(dòng)強(qiáng)力反擊,代價(jià)是防御墻縮小。


BAMBOO [22]

按下按鈕可以讓玩家穿過竹子,并通過在竹子之間彈跳快速切割竹子。

其他特殊機(jī)制CHARGE BEAM [23]

蓄力能量,管理蓄力量對(duì)游戲體驗(yàn)至關(guān)重要。


LASER FORTRESS [24]

掃射,射擊的超級(jí)強(qiáng)化版。混合敵我單位確保過于強(qiáng)大的攻擊可能適得其反。


SHINY [25]

晴天或雨天,雨天加速人類移動(dòng),使其更快地撤離到右端。這種奇特的機(jī)制似乎不容易移植到其他游戲中。

組合多種操作

組合上述操作是經(jīng)典的方法。


SCRAMBIRD [26]

扇翅 + 射擊,


TILTED [27]

多次跳躍 + 反轉(zhuǎn)方向,


UP SHOT [28]

射擊 + 停止。

此外,一個(gè)操作可以在游戲中產(chǎn)生多種效果。


BOMB UP [29]

例如,用按鈕投放/引爆炸彈,爆炸同時(shí)將玩家彈射出去。通過調(diào)整爆炸和玩家的位置可以控制玩家移動(dòng)。這種方法可以用一個(gè)按鈕實(shí)現(xiàn)相當(dāng)復(fù)雜的操作,但過于復(fù)雜會(huì)導(dǎo)致操作困難,因此適度是關(guān)鍵。

結(jié)合旋轉(zhuǎn)運(yùn)動(dòng)

類似于角度調(diào)整,但這里玩家或炮臺(tái)始終在旋轉(zhuǎn),把握跳躍或射擊的時(shí)機(jī)至關(guān)重要。


ORBIT MAN [30]

跳躍方向不斷旋轉(zhuǎn),玩家必須精確把握朝向星星跳躍的時(shí)機(jī)。


ARCFIRE [31]

炮臺(tái)旋轉(zhuǎn)時(shí),玩家必須精確把握面向敵人時(shí)的射擊時(shí)機(jī)。這款游戲允許通過按住按鈕調(diào)整射程和攻擊范圍,以及射擊方向的微小提前量,實(shí)現(xiàn)一個(gè)按鈕的多種操作。

利用地形

如果輸入變化難以實(shí)現(xiàn),根據(jù)玩家所在的地形改變玩家操作是一個(gè)可行的解決方案。


TURBULENT [32]

即使是跳躍這樣簡(jiǎn)單的操作,將跳躍地形變?yōu)椴龥坝康暮C,就能根?jù)時(shí)機(jī)改變跳躍方向。


SUB JUMP [33]

將屏幕分為水下和水上,按下按鈕在水下時(shí)上升,在水上時(shí)跳躍,根據(jù)地形賦予按鈕多種功能。

利用道具

除了地形,利用道具是另一種方法。拾取道具會(huì)改變某種模式,選擇拾取或忽略道具替代了輸入的多樣性。


MIRROR FLOOR [34]

金幣切換重力方向;玩家必須觀察下一個(gè)平臺(tái)的位置來決定是否收集金幣,這會(huì)影響跳上下一個(gè)平臺(tái)的能力。


LIFT UP [35]

收集道具改變移動(dòng)方向。需要在收集金幣的同時(shí)巧妙收集反轉(zhuǎn)道具,避免碰到左右兩邊的尖刺。


REBIRTH [36]

被卡車撞到會(huì)將玩家傳送到反轉(zhuǎn)世界。卡車是否算作道具可以商榷,但玩家需要根據(jù)下一個(gè)鉆石的位置決定是否要被撞。


R WHEEL [37]

收集道具向下發(fā)射激光,摧毀尖刺障礙。這款游戲在跳躍時(shí)也會(huì)向下發(fā)射激光,尖刺會(huì)回旋到玩家身邊,跳躍時(shí)出現(xiàn)道具。跳躍動(dòng)作在這款游戲中觸發(fā)了多個(gè)事件。

結(jié)論

與認(rèn)為單按鈕游戲無法提供太多操作變化的假設(shè)相反,這里列舉的例子證明可以創(chuàng)建種類繁多的游戲類型。通過發(fā)揮單按鈕游戲的潛力,我期待在未來開發(fā)更多樣的游戲。

雖然單按鈕游戲的簡(jiǎn)潔性是優(yōu)勢(shì),但也帶來了意想不到的陷阱。例如,游戲可能無意中演變成重復(fù)的瘋狂按鍵或持續(xù)按住按鈕的模式,玩家可以獲得無限分?jǐn)?shù)。因此,必須測(cè)試這些重復(fù)游玩模式,以確保游戲體驗(yàn)平衡且引人入勝。

最后,重要的是要記住,作為單按鈕游戲和作為有趣的游戲是兩回事。因此,確保游戲有趣、有暢快感和緊張感、風(fēng)險(xiǎn)與回報(bào)平衡等愉快游戲體驗(yàn)的各方面至關(guān)重要。然后再考慮如何將那種樂趣融入單按鈕游戲的格式中。

在有限大小約束下創(chuàng)作游戲

Game Jam 經(jīng)常對(duì)游戲二進(jìn)制文件或源代碼的大小施加約束。著名的例子包括 js13kGames[^48],它挑戰(zhàn)參與者在 13 千字節(jié)內(nèi)創(chuàng)建瀏覽器游戲。

使用短代碼實(shí)現(xiàn)多樣化表達(dá)的嘗試跨越許多領(lǐng)域,不僅限于游戲。例如,使用 ggplot2[^49],可以在 280 個(gè)字符內(nèi)創(chuàng)建精美的幾何圖案。[^50] 此外,在 140 個(gè)字符[^51]內(nèi)使用 SuperCollider[^52] 和在 Dwitter[^53] 等平臺(tái)上使用 JavaScript 創(chuàng)建的音樂和生成藝術(shù)合集。

緊湊編碼作品的精髓在于密集打包信息的美感。它們體現(xiàn)了用最少組件實(shí)現(xiàn)最大效果的巧思。

在 Dwitter 上,用戶不僅分享圖形和音樂,還分享游戲。例如,游戲 Crossy Tortoise[^54] 涉及引導(dǎo)烏龜穿越馬路,展示了在 140 個(gè)字符內(nèi)實(shí)現(xiàn)的單按鈕游戲。但它缺少計(jì)分系統(tǒng),一旦完成穿越游戲就結(jié)束了。

要稱得上是游戲,以下要素是理想的:

  • ? 具有計(jì)分系統(tǒng)。
  • ? 有游戲結(jié)束條件。
  • ? 難度遞增。
  • ? 最好有音效。

考慮到包含這些要素,我們來思考短代碼的合理規(guī)則:

  • ? 編寫每幀更新的 JavaScript 函數(shù),最大長(zhǎng)度 256 個(gè)字符。
  • ? 引入 p5.js[^55]、Tone.js[^56] 和 lodash.range[^57] 等庫,提供適合游戲的便捷函數(shù)。
  • ? 為p5.mouseIsPressedp5.mouseXp5.mouseYp5.random()Tone.synth.triggerAttackRelease()_.range()分別賦予MXYRNA等單字符別名,以便在更少的字符內(nèi)調(diào)用函數(shù)。
  • ? 變量S代表分?jǐn)?shù),顯示在頂部;變量T代表游戲開始以來的幀計(jì)數(shù),用于難度調(diào)整。

按照這些規(guī)則創(chuàng)建了幾個(gè)示例游戲[^58](點(diǎn)擊圖片可玩)。


springcar [38]

其中一個(gè)游戲 springcar,涉及一輛點(diǎn)擊后跳躍的汽車。代碼如下:


clear(),
T || ((s = A(9).map((i) => [10 * i])), (y = v = 0)),
(d = 1 + T / 999),
s.map((u) => text("", (u[0] = u[0] < 99 ? u[0] + d : -R(30)), 80)),
(y += v += (M ? 0.1 : 0.2) * d),
get(74, y)[3] + get(82, y)[3] > 0 && ((v = -1), (y = 72), S++, N(333, 0.1)),
y > 70 && v < 1 && M && ((v = -3), N(444, 0.2)),
y > 95 && ((S = y = T = 0), N(222, 0.5)),
text("", 75, y);

按照這些規(guī)則,創(chuàng)建一個(gè)游戲仍然是可行的。還有在更嚴(yán)格的規(guī)則下創(chuàng)建的 Pong,例如不允許添加庫,整個(gè) HTML 包含在 226 字節(jié)內(nèi)。[^59] 你可以在 codegolf JS[^60] 中看到更多類似的優(yōu)秀代碼。

按照這些規(guī)則,大約一小時(shí)內(nèi)制作一個(gè)基本游戲是可行的。然而,256 個(gè)字符的約束很嚴(yán)格,嘗試實(shí)現(xiàn)復(fù)雜的動(dòng)作很快就會(huì)超出字符限制。當(dāng)你精心制作了一個(gè)約 270 個(gè)字符的游戲時(shí),盡管使用了巧妙的技巧,但為了滿足限制而縮減就必須要縮小游戲系統(tǒng),這令人沮喪。然而,沒有 256 個(gè)字符的約束,就有無限添加效果和調(diào)整游戲平衡的可能。因此,即使令人沮喪,放棄這些額外的部分也是挑戰(zhàn)的一部分。

有限大小游戲開發(fā)能夠快速產(chǎn)出的特性很有趣。在如此有限的大小內(nèi)就能制作游戲這一事實(shí),意味著規(guī)則和機(jī)制被極大地精簡(jiǎn)。這樣的約束能產(chǎn)生有趣的游戲,是優(yōu)秀創(chuàng)意的寶庫。

然而,自我施加的大小約束往往更多是束縛而非有助于提前完成,因此建議只有那些覺得克服大小約束有趣的人才去嘗試。存在大量用于大小壓縮的庫和技術(shù)。[^61] 你可以參考這些來判斷自己是否有興趣,根據(jù)你是否覺得這個(gè)概念有趣來確認(rèn)自己的天賦。

小游戲中什么構(gòu)成適當(dāng)?shù)碾y度

太難的游戲會(huì)令人沮喪,太簡(jiǎn)單的游戲則令人無聊。適當(dāng)?shù)碾y度是好游戲不可或缺的要素;然而達(dá)到正確的平衡可能頗具挑戰(zhàn)。所需的難度水平因游戲類型而異——從 Soul-like 游戲中無情的挑戰(zhàn)和反復(fù)重試,到輕松易通的三消益智游戲。游戲類型極大地影響了所需的難度水平。

正如 Mihaly Csikszentmihalyi 的心流模型中所提到的,提供與個(gè)人技能水平相對(duì)應(yīng)的挑戰(zhàn)可以提高參與度和沉浸感。[^62]

在 Mihaly Csikszentmihalyi 的心流模型中,實(shí)現(xiàn)技能與挑戰(zhàn)之間的平衡是關(guān)鍵。小游戲中維持這種平衡的常用方法是隨著時(shí)間推移逐步提高難度。難度水平,即挑戰(zhàn)水平,持續(xù)上升直到匹配玩家的技能水平,一旦超越該水平,任何失誤都會(huì)導(dǎo)致"游戲結(jié)束"。

如果提高難度的方法和節(jié)奏得當(dāng),這種方法可以很好地創(chuàng)造有趣的游戲。什么被認(rèn)為是正確的方法呢?當(dāng)難度增加且玩家犯錯(cuò)時(shí),如果玩家認(rèn)為是由于自己技能不足,那么難度水平就被認(rèn)為是適當(dāng)?shù)。相反,如果游戲變得不公平地困難,例如玩家面臨不可避免的攻擊,那么難度水平就被認(rèn)為是不適當(dāng)?shù)摹?/p>

調(diào)整難度常用的參數(shù)是游戲速度。隨著游戲進(jìn)行,游戲速度加快,玩家和敵人的速度都增加。這要求玩家更快速地反應(yīng),任何誤操作都會(huì)導(dǎo)致"游戲結(jié)束"。這種自 Game & Watch[^63] 時(shí)代——指任天堂早期掌上游戲時(shí)期——就使用的傳統(tǒng)難度調(diào)整方法至今仍然有效。使用游戲速度調(diào)整難度的一個(gè)好處是,它最大限度地減少了變得不公平的可能性。當(dāng)游戲速度變化時(shí),敵人和玩家的速度按比例增加,避免了早期可以躲避的敵人在后期變得無法躲避的情況。

然而,僅依靠游戲速度來調(diào)整難度可能會(huì)變得單調(diào)。在這種情況下,增加敵人數(shù)量或擴(kuò)大障礙物等方法可以用來提高挑戰(zhàn)。因此,進(jìn)行調(diào)整以確保不會(huì)出現(xiàn)諸如障礙物變得大到玩家跳躍能力無法躲避而導(dǎo)致不公平的情況,這是至關(guān)重要的。

通過組合各種難度調(diào)整方法,游戲變得更加復(fù)雜,玩家也不容易失去興趣。理想情況下,引入要求玩家高級(jí)技巧的新元素,如新敵人、武器、地形、道具等,可以增強(qiáng)游戲體驗(yàn)。然而,在小游戲中實(shí)現(xiàn)成本較高,這可能是一項(xiàng)具有挑戰(zhàn)性的任務(wù)。

上升的難度曲線

適當(dāng)?shù)碾y度提升意味著什么,應(yīng)該以什么節(jié)奏進(jìn)行?這在很大程度上取決于你希望玩家在游戲中投入多長(zhǎng)時(shí)間。例如,假設(shè)一款游戲應(yīng)持續(xù) 3 分鐘,你將難度設(shè)計(jì)為在從初始翻倍時(shí)大多數(shù)玩家淘汰,可以考慮以下公式來計(jì)算難度:


[難度] = sqrt([已過幀數(shù)] * 0.0001) + 1

這里,"幀"是時(shí)間單位,代表游戲中 1/60 秒。已過幀數(shù)每秒 60,每分鐘 3600。sqrt指平方根。不使難度與幀數(shù)線性成正比,而是使用sqrt函數(shù)確保在經(jīng)過一定時(shí)間后難度上升更為平緩。將 3 分鐘的幀數(shù) 10800 代入上述公式,得到的難度為 2.04,與初始假設(shè)一致。

然而,這個(gè)難度設(shè)置可能并不適合所有小游戲。在某些情況下,更快地提升難度可以創(chuàng)造更緊張、更引人入勝的體驗(yàn)。

不將難度提升應(yīng)用到游戲中并觀察結(jié)果,很難判斷什么樣的難度提升是適當(dāng)?shù)。因此,我將難度隨時(shí)間上升的情況可視化為曲線,準(zhǔn)備了調(diào)整該曲線的 UI,并將其反映到示例游戲中(點(diǎn)擊圖片前往演示頁面)。


diff-tween [39]

在 diff-tween 頁面中,在右側(cè) UI 上調(diào)整難度曲線,然后點(diǎn)擊左側(cè)游戲畫面即可開始一款躲避落石的游戲。初始曲線設(shè)置旨在讓人清楚理解難度提升,30 秒內(nèi)難度翻倍。

每條難度曲線由其公式(sqrt、linear、pow)和提升速率(climb)定義,并可以調(diào)整為鋸齒波(saw),即以固定間隔降低難度。鋸齒波是引入難度變化的好方法,這一技術(shù)也用于 Game & Watch。此外,還可以調(diào)整多個(gè)參數(shù),如落石速度和大小。

當(dāng)有多個(gè)參數(shù)受難度影響時(shí),調(diào)優(yōu)變得更加困難。玩過游戲后會(huì)發(fā)現(xiàn),雖然玩家可以通過技能應(yīng)對(duì)更快的落石,但一旦石頭達(dá)到一定大小就無法應(yīng)對(duì)了。更快的落石也許還能設(shè)法躲避,但更大的石頭給人一種不可避免、不公平的印象。

因此,可以使用 sqrt 函數(shù)來提升石頭大小以減輕不公平感,同時(shí)使用線性增加來從游戲開始就維持落石速度的緊張感,偶爾用鋸齒波來緩和節(jié)奏。

此外,這種調(diào)整確實(shí)有缺點(diǎn)——初始難度可能讓人覺得太簡(jiǎn)單、太無聊。在這種情況下,引入諸如靠近石頭通過時(shí)獲得獎(jiǎng)勵(lì)分?jǐn)?shù)等機(jī)制,鼓勵(lì)玩家冒著風(fēng)險(xiǎn)換取獎(jiǎng)勵(lì),從游戲早期階段就提供緊張感。

基于關(guān)卡的難度設(shè)定

到目前為止,討論主要圍繞沒有關(guān)卡(舞臺(tái)、回合)概念的游戲展開。但是,當(dāng)考慮由多個(gè)關(guān)卡組成、每個(gè)關(guān)卡各有難度設(shè)定的游戲時(shí),可以有哪些難度配置方式呢?

隨著關(guān)卡推進(jìn),游戲必須逐漸變得更具挑戰(zhàn)性,否則就會(huì)缺乏緊張感。然而,僅僅是線性增加難度可能導(dǎo)致缺乏變化。如何設(shè)計(jì)一種隨著關(guān)卡推進(jìn)越來越難、同時(shí)又有足夠波動(dòng)的關(guān)卡設(shè)計(jì)呢?下面以使用以下圖表的方法為例進(jìn)行說明。


level-difficulty-curve

橫軸表示從random函數(shù)獲取的 0 到 1 之間的隨機(jī)值。縱軸表示難度,0 為最簡(jiǎn)單,1 為最具挑戰(zhàn)性。在開始一個(gè)關(guān)卡之前,從random函數(shù)獲取一個(gè)值作為橫軸值,對(duì)應(yīng)的難度即作為該關(guān)卡的難度等級(jí)。

該圖表中的難度通過以下公式計(jì)算:


pow(random(), 100 / ([current level number] + 1))

在早期關(guān)卡中,關(guān)卡數(shù)較低時(shí),難度傾向于停留在低端,隨著關(guān)卡數(shù)增加,難度向上擴(kuò)展。因此,更高的關(guān)卡傾向于擁有更高的難度設(shè)定,盡管偶爾由于random函數(shù)的返回值,某個(gè)關(guān)卡可能會(huì)明顯比其關(guān)卡號(hào)所暗示的更容易或更難。

這種難度也可以應(yīng)用于多個(gè)參數(shù),例如:

  • ? 敵人數(shù)量
  • ? 敵人射擊頻率
  • ? 子彈速度

通過對(duì)上述公式分別設(shè)定每個(gè)參數(shù)的難度并使用隨機(jī)函數(shù),可以實(shí)現(xiàn)更復(fù)雜的變化組合。在某些關(guān)卡中可能有很多敵人但它們不常射擊,或者可能只有一個(gè)敵人但它射出極快的子彈,等等。

在游戲的后期關(guān)卡中,所有參數(shù)都趨向于難度 1,導(dǎo)致一系列普遍高難度的關(guān)卡。但由于難度本身被限制在 1,與單純線性增加難度相比,這種設(shè)定可以實(shí)現(xiàn)某種約束。

這種方法也有缺點(diǎn)。最終所有參數(shù)都會(huì)固定在難度 1,無法創(chuàng)造無限增加難度的關(guān)卡。在難度封頂為 1 的狀態(tài)下設(shè)定合適的難度是一項(xiàng)挑戰(zhàn)。

即使采用其他方法,確保難度增加不單調(diào)也是至關(guān)重要的。通過改變玩家所體驗(yàn)的緊張感,可以實(shí)現(xiàn)更令人愉快的游戲進(jìn)程。

讓游戲變得"多汁"

僅僅依靠核心規(guī)則、最少的視覺效果和沒有聲音就能令人滿意的游戲,是極為罕見的共識(shí)。除了基本規(guī)則之外,游戲還需要對(duì)玩家感官的刺激,如視覺和聽覺效果,以及增強(qiáng)體驗(yàn)的演出效果。

游戲開發(fā)者將這些元素被恰當(dāng)運(yùn)用的游戲稱為"多汁"(juicy)游戲。通過讓一個(gè)簡(jiǎn)單的打磚塊游戲變得"多汁",很容易看出同樣的規(guī)則如何讓游戲變得更加有趣。這一概念在一些視頻中有很好的說明,它們展示了如何通過添加"汁液"來讓游戲變得多汁,[^64] 或者通過演示來展示多汁游戲帶來的差異。[^65]

文章《研究:制作一款"多汁"的游戲》[^66] 包含了上述視頻的內(nèi)容,并介紹了讓游戲多汁化的方法。其中提出的方法包括:

  • ? 添加色彩。
  • ? 利用緩動(dòng)(tweening)和緩動(dòng)曲線(easing)實(shí)現(xiàn)平滑動(dòng)畫。
  • ? 根據(jù)事件改變或彈跳對(duì)象大小。
  • ? 加入音效和音樂。
  • ? 用大量粒子顯示煙霧、破壞效果或拖尾。
  • ? 震動(dòng)畫面以傳達(dá)沖擊感。
  • ? 為對(duì)象添加眼睛和微笑,讓它們對(duì)環(huán)境做出反應(yīng)。眼睛跟蹤物體并眨眼,嘴巴表達(dá)情感。
  • ? 讓環(huán)境跟隨音樂節(jié)奏做出反應(yīng)。
  • ? 在攻擊時(shí)添加命中停頓或擊退等動(dòng)畫。

有效運(yùn)用這些方法的游戲被稱為"多汁"游戲。然而,"多汁"這個(gè)術(shù)語有些模糊。

文章《"多汁":一個(gè)有用的游戲設(shè)計(jì)術(shù)語?》[^67] 探討了"多汁"所代表的含義,但并未得出一個(gè)明確的定義。其中提到了 PopCap[^68] 等公司的休閑多汁游戲,尤其是 Peggle[^69],因其各種贊美玩家的演出效果而備受稱贊。簡(jiǎn)單來說,Peggle 是一款玩家從屏幕頂部發(fā)射球并觀看球擊中釘子的游戲。但每次連擊時(shí),一只名叫 Jimmy Lightning 的海貍會(huì)用"太酷了!"或"太創(chuàng)新了!"等話語歡呼,保持高昂的氛圍。其他演出效果還包括在擊中最后一個(gè)釘子之前的鼓點(diǎn)和放大特寫,成功后會(huì)播放貝多芬第九交響曲——真是一款多汁的游戲。

在游戲中加入這樣生動(dòng)的演出效果,即使在簡(jiǎn)單的游戲中也能大大提升玩家的樂趣。雖然在短開發(fā)周期內(nèi)添加豐富的演出效果可能有挑戰(zhàn),但也有更簡(jiǎn)單而有效的方法,比如粒子效果或響應(yīng)式音效來增加多汁感。

雖然與"多汁感"略有不同,但改善游戲的"手感"(feel)[^70] 同樣至關(guān)重要。通過寬容玩家的小失誤并使正確操作更容易執(zhí)行,可以提供更舒適的游戲體驗(yàn)。

關(guān)注核心機(jī)制之外的方面,游戲可以進(jìn)化為對(duì)玩家來說更加有趣的體驗(yàn)。

創(chuàng)造你自己的游戲開發(fā)工具

讓游戲創(chuàng)作更有樂趣的一種方式是開發(fā)自己的工具來簡(jiǎn)化和加速這個(gè)過程。這里的"工具"指的是面向游戲的庫、像素畫繪制工具、音樂作曲工具等等。如果有足夠的熱情,開發(fā)者可以創(chuàng)造各種各樣的基礎(chǔ)游戲開發(fā)工具,包括幻想主機(jī)(fantasy consoles)、游戲引擎,甚至編程語言。

盡管已有大量現(xiàn)有工具,創(chuàng)造自己的工具有何意義?一個(gè)原因是獲得高度熟悉、內(nèi)部運(yùn)作完全理解的工具。既然是你自己創(chuàng)建的,自然清楚如何操控它們以獲得期望的結(jié)果。此外,你還可以自由添加自己喜歡的功能。應(yīng)用程序編程接口(API)和用戶界面(UI)的設(shè)計(jì)可以根據(jù)你的偏好量身定制,從而營(yíng)造舒適的的開發(fā)環(huán)境。

此外,工具創(chuàng)建過程本身就帶來樂趣。與游戲開發(fā)不同——在創(chuàng)作過程中探索最終形態(tài)——這些工具有相對(duì)明確的目的,在游戲創(chuàng)作過程中可以作為很好的調(diào)劑。看到你需要的功能逐步擴(kuò)展,是很有成就感的。

問題在于這個(gè)過程可能變得過于令人愉快。游戲開發(fā)者中有一句俗語很好地概括了這個(gè)問題:"不要造游戲引擎,去造游戲。"這是對(duì)沉迷于創(chuàng)建外圍工具、從而忽視游戲本身導(dǎo)致游戲永遠(yuǎn)完不成的警示。

保持適當(dāng)?shù)钠胶猓ぞ邉?chuàng)造可以為游戲開發(fā)帶來新一層的樂趣。

為小型瀏覽器游戲創(chuàng)建庫

游戲庫或游戲引擎應(yīng)該包含哪些功能?一篇題為《如何制作自己的游戲引擎(以及為什么)》[^71] 的文章列出了以下功能:

  • ? 基本功能:
    • ? 系統(tǒng)初始化:準(zhǔn)備窗口、啟動(dòng)渲染和音頻系統(tǒng)。
    • ? 幀時(shí)序控制:以 1/60 秒間隔定期調(diào)用的更新處理。
    • ? 輸入:處理按鈕輸入等。
    • ? 渲染:繪制 2D 或 3D 紋理、模型等。
    • ? 算術(shù)工具:向量運(yùn)算和其他游戲所需的函數(shù)。
  • ? 高級(jí)功能:
    • ? 游戲?qū)ο笈c場(chǎng)景管理:管理多個(gè)對(duì)象以及在多個(gè)場(chǎng)景之間切換。
    • ? 音頻:使用音頻框架播放音頻。
    • ? 文件管理:管理文件和資源。
    • ? 網(wǎng)絡(luò):多人游戲的通信功能。

此外還提到了碰撞檢測(cè)、物理計(jì)算、序列化、動(dòng)畫、UI 等,但并非必需,F(xiàn)有的游戲引擎提供了經(jīng)多年經(jīng)驗(yàn)支撐的功能集,了解它們的功能在創(chuàng)建自己的游戲庫或引擎時(shí)會(huì)非常有幫助。

該文章還概述了創(chuàng)建自定義游戲引擎時(shí)應(yīng)有的心態(tài):

  • ? 同時(shí)構(gòu)建引擎和游戲:引擎應(yīng)該擁有的功能是由你想創(chuàng)建的游戲的需求所支撐的。
  • ? 不要在需要之前創(chuàng)建功能:避免過度工程化你的游戲不需要的功能。
  • ? 使用你熟悉的編程語言:構(gòu)建引擎是一項(xiàng)具有挑戰(zhàn)性的任務(wù),不應(yīng)在學(xué)習(xí)新編程語言的同時(shí)進(jìn)行。
  • ? 不要從一開始就尋求正確答案:經(jīng)過多次構(gòu)建引擎的經(jīng)驗(yàn)之后,你最終會(huì)創(chuàng)建出一個(gè)可用的引擎。

那么,面向小型瀏覽器游戲的游戲庫應(yīng)該具備哪些功能呢?上面提到的基本功能是必需的,但高級(jí)功能可以有限度地實(shí)現(xiàn)。此外,如果目標(biāo)是快速將創(chuàng)意變?yōu)楝F(xiàn)實(shí),專注于實(shí)現(xiàn)游戲所需的機(jī)制會(huì)更好。

基于這些考慮,我創(chuàng)建了一個(gè)名為 crisp-game-lib[^72] 的游戲庫。該庫具有以下特點(diǎn):

  • ? 標(biāo)題、游戲中、游戲結(jié)束等場(chǎng)景在庫內(nèi)標(biāo)準(zhǔn)化,無需為每個(gè)游戲單獨(dú)開發(fā)。
  • ? 提供小型游戲特別需要的功能,如高分管理和回放。
  • ? 對(duì)分辨率、顏色和聲音施加約束,減少耗時(shí)制作豐富表現(xiàn)的需要。
  • ? 讓游戲變得"多汁"變得容易。具體來說,可以輕松添加各種視覺和音效。

在 crisp-game-lib 中,只需編寫一個(gè) JavaScript 文件,[^73] 包含游戲的title、description和每秒調(diào)用 60 次的update函數(shù),就可以創(chuàng)建在 PC 和移動(dòng)端都能運(yùn)行的瀏覽器游戲。

一個(gè)在其他庫中找不到的獨(dú)特功能是,渲染盒子、線條、弧線、文本和角色時(shí),集成了碰撞檢測(cè)。


ref_collision screenshot [40]

當(dāng)使用函數(shù)繪制一個(gè)元素時(shí),返回值會(huì)告訴你該元素是否與屏幕上已有的其他形狀、文本或角色重疊。只需檢查這個(gè)值,即使對(duì)線條和弧線等復(fù)雜形狀也能檢測(cè)碰撞,無需特定的碰撞檢測(cè)處理。

此外,該庫還具有以下讓游戲多汁化的功能:

  • ? 只需選擇所需聲音名稱即可播放的音效。[^74]
  • ? 將選項(xiàng) [^75]isPlayingBgm設(shè)為 true 即可自動(dòng)生成 BGM。
  • ? 將isReplayEnabled設(shè)為 true 即可啟用回放功能。
  • ? 外觀改變功能,如復(fù)古 CRT 風(fēng)格或像素畫風(fēng)格,可通過定義theme來設(shè)定。
  • ? 像素畫可通過characters數(shù)組輕松定義。

創(chuàng)建自己的游戲庫,根據(jù)自身需求裁剪功能,可以是一種愉快的、更高效開發(fā)游戲的方式。思考什么樣的功能在你符合你游戲開發(fā)風(fēng)格的庫中是理想的,然后嘗試創(chuàng)建你自己的原創(chuàng)庫。

為 DIY 手持設(shè)備開發(fā)游戲

最近出現(xiàn)了一種趨勢(shì):以 Arduino [^76] 等單板微控制器為核心,加上顯示屏和按鈕,來創(chuàng)建 DIY 手持游戲機(jī)。優(yōu)點(diǎn)是可以根據(jù)自己的喜好創(chuàng)建游戲機(jī)。缺點(diǎn)是各種設(shè)備層出不窮,沒有一款是很多人共同擁有的通用設(shè)備。

這些設(shè)備的游戲通常用 C 語言編寫。因此,配套的庫也需要用 C 語言實(shí)現(xiàn)。

這次,我將最初為瀏覽器用 JavaScript(TypeScript)實(shí)現(xiàn)的自定義庫移植到了 C 語言。我將其命名為 crisp-game-lib-portable。[^77]



PyBadge crisp-game-lib-portable screenshot

用 crisp-game-lib-portable 創(chuàng)建的游戲兼容 M5StickC PLUS [^78] 和 Adafruit PyBadge [^79] 等設(shè)備。此外,通過利用 Emscripten,[^80] 現(xiàn)在也可以在瀏覽器上運(yùn)行。

庫核心 [^81] 和游戲代碼 [^82] 被設(shè)計(jì)為包括瀏覽器在內(nèi)的所有設(shè)備通用,目標(biāo)是只需要最少量的設(shè)備特定代碼。

需要在設(shè)備特定代碼中編寫的處理包括:

  • ? 設(shè)備初始化(如 Arduino 中的setup()),并從中調(diào)用initGame()
  • ? 幀更新處理(如 Arduino 中的loop()),通過調(diào)用setButtonState()通知按鈕狀態(tài),并調(diào)用updateFrame()
  • ? 在machineDependent.h中定義的繪圖和聲音相關(guān)處理。[^83]

通過這種方式,通用設(shè)備所需的設(shè)備特定實(shí)現(xiàn)大約為 250 行。

在 PyBadge 等設(shè)備上適配這些函數(shù)可能有些麻煩,因?yàn)橹荒苁褂?code>analogWrite()調(diào)節(jié)蜂鳴器音量,需要手動(dòng)管理聲音時(shí)序和生成方波。

顯示像素畫的md_drawCharacter(unsigned char grid[CHARACTER_HEIGHT][CHARACTER_WIDTH][3], float x, float y, int hash)函數(shù)也需要一些功夫。最后一個(gè)哈希值用于緩存像素畫的圖案定義,而不是每次都解析并繪制。如果你使用 LovyanGFX 庫 [^84] 進(jìn)行繪圖,應(yīng)該將 LGFX_Sprite 和哈希值作為一對(duì)保存,然后取出并執(zhí)行pushSprite()。

在考慮這種可移植性的同時(shí)編寫代碼是一種有趣的體驗(yàn),這也是不以庫為目標(biāo)面向各種設(shè)備就無法做到的事情。創(chuàng)建獨(dú)特的游戲庫,同時(shí)利用 Arduino IDE 等通用開發(fā)環(huán)境和 Adafruit Arcada [^85] 或 LovyanGFX 等多設(shè)備兼容庫,提供了獨(dú)特的體驗(yàn)。與各種微控制器板打交道,相比面向 PC 或智能手機(jī)開發(fā)庫,呈現(xiàn)出另一種不同的樂趣。如果感興趣,不妨一試。

制作幻想主機(jī)

幻想主機(jī) [^86] 體現(xiàn)了開發(fā)者一種異想天開的想法:"如果真有這樣一臺(tái)游戲主機(jī)就好了。"想象一下不存在的 Game Boy 或 Famicom 版本,在 PC 上實(shí)現(xiàn)它們,然后享受成果——這就是幻想主機(jī)。

幻想主機(jī)的典型代表無疑是 PICO-8。[^87] 128x128 像素的屏幕、四個(gè)音軌同時(shí)播放、256 個(gè) 8x8 像素的精靈圖,以及包含 Lua 開發(fā)環(huán)境、像素畫編輯器、音樂編輯器和地圖編輯器的豐富內(nèi)置工具——這是一款極具創(chuàng)新性的技術(shù)產(chǎn)品。

雖然名字叫"主機(jī)",[^88] 但許多幻想主機(jī)在內(nèi)部集成了完整的開發(fā)環(huán)境。它們更像 MSX 或 Family BASIC 那樣的微型計(jì)算機(jī)。

制作一臺(tái) PICO-8 水平的幻想主機(jī)是相當(dāng)有挑戰(zhàn)性的。然而,親手打造自己幻想主機(jī)的愿望確實(shí)令人心動(dòng)。要做到這一點(diǎn),就必須刻意限制規(guī)格。以擁有極小屏幕、簡(jiǎn)單聲音輸出和基本輸入方式的幻想主機(jī)為目標(biāo),我創(chuàng)作了 PEEKPOKE。[^89]

PEEKPOKE 可以在 PC 和智能手機(jī)瀏覽器上游玩(點(diǎn)擊屏幕即可操作)。



BOMB SNAKE [41]

這是一款貪吃蛇游戲,用方向鍵(上下左右)或 WASD 鍵操控蛇去收集紅色炸彈。在智能手機(jī)上,通過屏幕底部的虛擬方向鍵來操控。


PEEKPOKE 內(nèi)存映射

在 PEEKPOKE 中,機(jī)器的控制完全通過 peek 和 poke 命令來讀寫內(nèi)存實(shí)現(xiàn)。它采用內(nèi)存映射 I/O [^90] 來操作有限的功能集:32x30 像素 8 色屏幕、8x5 文本屏幕、七個(gè)按鍵輸入和一個(gè)單音蜂鳴器。沒有內(nèi)置開發(fā)環(huán)境;游戲可以用 JavaScript 編寫腳本。[^91]

通過將所有主機(jī)特有功能委托給內(nèi)存,并將開發(fā)環(huán)境交給 JavaScript,構(gòu)建過程大大簡(jiǎn)化了。能制作的游戲相當(dāng)基礎(chǔ),但勉強(qiáng)可以稱之為一臺(tái)幻想主機(jī)。在啟動(dòng)時(shí)添加一個(gè)啟動(dòng)畫面,就能增添幾分幻想主機(jī)的韻味。

沒有開發(fā)環(huán)境,制作幻想主機(jī)的工作量大幅減少;孟胍慌_(tái)擁有有趣規(guī)格的主機(jī)并輕松地制作出來,是一件非常愉快的事情。這次制作的主機(jī)架構(gòu)相當(dāng)簡(jiǎn)單。不過,考慮設(shè)計(jì)具有更奇特功能的主機(jī),或者致敬 Cassette Vision、ATARI 2600 等現(xiàn)有主機(jī)的設(shè)計(jì),也會(huì)很有趣。

通過自動(dòng)化提升開發(fā)效率

當(dāng)想要以更少的精力進(jìn)行游戲開發(fā)時(shí),程序化生成 [^92] ——即通過編程來生成像素畫、音效、背景音樂和關(guān)卡——是一個(gè)強(qiáng)大的工具。雖然生成質(zhì)量可能不及手工制作的素材,但通過反復(fù)迭代生成過程直到獲得滿意的結(jié)果,就能以最小的精力獲取必要的游戲素材。此外,通過使用隨機(jī)關(guān)卡生成算法,玩家每次都能享受獨(dú)特的游戲體驗(yàn),從而提升游戲的重復(fù)游玩價(jià)值。

在這里,讓我們探討自動(dòng)生成角色像素畫、背景音樂、音效和益智游戲關(guān)卡等元素的方法。

自動(dòng)像素畫生成

被稱為自動(dòng)像素畫生成器的工具有多種類型,常見的方法是將大量預(yù)設(shè)部件進(jìn)行組合并改變其顏色來創(chuàng)建新的像素畫。[^93] 這種方法常用于游戲頭像創(chuàng)建,能夠生成大量風(fēng)格一致的角色及其動(dòng)畫。然而,這種方法只能創(chuàng)建特定角色的變體。如果沒有與所需角色匹配的生成器,就無法獲得想要的像素畫。

一種稍微更靈活的方法是在基礎(chǔ)像素畫上添加隨機(jī)開關(guān)的點(diǎn),通過這些變化來創(chuàng)建各種圖案。[^94] 使用這種方法,通過修改基礎(chǔ)像素畫,可以適應(yīng)各種角色的生成。

我也按照隨機(jī)點(diǎn)變化的方法制作了一個(gè)像素畫創(chuàng)建庫。[^95] 例如,使用這個(gè)庫創(chuàng)建各種形狀的宇宙飛船,結(jié)果如下(點(diǎn)擊圖片可跳轉(zhuǎn)到演示頁面)。


pixel-art-gen [42]

這種方法生成的產(chǎn)物隨機(jī)性很高,擅長(zhǎng)創(chuàng)建像宇宙飛船這樣自由形態(tài)的角色。然而,對(duì)于有約束的角色,比如側(cè)面視角下有明確眼睛、手臂和腿的怪物,就顯得力不從心了。因此,像素畫生成器本身就有固有的優(yōu)勢(shì)和劣勢(shì),不存在萬能的解決方案。

近年來,生成式 AI 已經(jīng)能夠根據(jù)提示詞創(chuàng)建圖像,將此應(yīng)用于像素畫的方法也已出現(xiàn)。[^96] 然而,生成式 AI 擅長(zhǎng)創(chuàng)建較大的圖像,并不適合創(chuàng)建 16x16 像素這樣的小圖像。

不過,隨著技術(shù)的進(jìn)步,未來也許能夠生成像像素畫這樣的小圖像及其動(dòng)畫。例如,向搭載 DALL-E 3 模型的 Bing Image Creator [^97] 提供以下提示詞,可以獲得可用于射擊游戲的宇宙飛船像素畫:

創(chuàng)建一張展示一系列復(fù)古視頻游戲風(fēng)格宇宙飛船的圖像,俯視視角。每艘宇宙飛船應(yīng)在 32x32 像素網(wǎng)格內(nèi)設(shè)計(jì),使用 16 色調(diào)色板。將這些像素化宇宙飛船以視覺上美觀的方式排列。

按照提示詞在 32x32 像素網(wǎng)格內(nèi)創(chuàng)建圖像的指令尚未被準(zhǔn)確執(zhí)行。不過,這類問題預(yù)計(jì)會(huì)隨著未來生成模型的發(fā)展而逐步解決。

背景音樂和音效的自動(dòng)生成

什么樣的背景音樂(BGM)適合小游戲?首先想到的是老式街機(jī)游戲中的 BGM。所謂"老",指的是 20 世紀(jì) 80 年代初期的《Xevious》或《Dig Dug》之類的游戲。那個(gè)時(shí)代的復(fù)古街機(jī)游戲通常使用大約 4 到 8 小節(jié)的短樂句作為 BGM,不斷循環(huán)播放。

自動(dòng)生成此類 BGM 的技術(shù)有多種。其中之一是 WolframTones。[^98] 看起來很方便。不過它似乎有一個(gè)限制:無法重現(xiàn)老游戲中常見的樂句,比如貝斯線以十六分音符在純五度間交替。

在最新技術(shù)中,有 OpenAI 的 Jukebox;[^99] 但它生成的是音樂波形而非樂譜,因此不適合復(fù)古游戲。類似的技術(shù) MusicLM [^100] 有一個(gè) 8 位采樣,似乎能夠創(chuàng)建類似芯片音樂的音軌,但仍然顯得過于豐富。

這就引出了 Magenta,[^101] 這是 Google 的一個(gè)研究項(xiàng)目,將機(jī)器學(xué)習(xí)應(yīng)用于音樂和藝術(shù)。Magenta.js [^102] 是其在瀏覽器中運(yùn)行的實(shí)現(xiàn)版本。

Magenta.js 在給定一段樂譜后,利用 MusicRNN [^103] 自動(dòng)生成后續(xù)樂句。如果給它一段復(fù)古游戲的短樂譜,它就能產(chǎn)生具有類似風(fēng)格的另一首曲子。我創(chuàng)建了一個(gè)簡(jiǎn)單的演示程序來測(cè)試這一點(diǎn)(點(diǎn)擊圖片跳轉(zhuǎn)到演示頁面)。[^104]


Short VGM generator [43]

點(diǎn)擊屏幕中央的"Generate"按鈕后,會(huì)基于左側(cè)的樂句生成新的樂句并顯示出來,在右側(cè)播放。它生成僅包含旋律和貝斯音軌的簡(jiǎn)單樂句,但能產(chǎn)生相當(dāng)有復(fù)古游戲音樂韻味的曲調(diào)。對(duì)于多個(gè)音軌,每個(gè)樂句分別創(chuàng)建,如果貝斯與旋律不和諧(確保頻率比約為 1:4),會(huì)進(jìn)行調(diào)整。取消選中中間下方復(fù)選框可禁用此調(diào)整,從而生成更自由的樂句。

至于音效的自動(dòng)生成,針對(duì)旋律的 MusicRNN 似乎難以勝任。相反,有許多基于波形的解決方案,其中很多基于 sfxr。[^105] 這些工具可以用來為動(dòng)作游戲添加簡(jiǎn)單的音效。

益智游戲關(guān)卡自動(dòng)生成

本節(jié)將探討關(guān)卡自動(dòng)生成,換言之就是益智游戲謎面的自動(dòng)生成。雖然像 Game & Watch 這樣的游戲在單一畫面上游玩,但許多游戲有多個(gè)關(guān)卡或隨滾動(dòng)出現(xiàn)的地形,因此需要生成關(guān)卡。

關(guān)卡制作的質(zhì)量直接影響游戲體驗(yàn),尤其是在益智游戲中。特別是在像《推箱子》[^106] 這樣的非動(dòng)作益智游戲中,創(chuàng)建令人享受解謎過程的關(guān)卡至關(guān)重要。

目前已經(jīng)存在多種《推箱子》關(guān)卡生成器。典型的創(chuàng)建方法包括:

  1. 1. 創(chuàng)建一個(gè)沒有放置箱子的空房間。
  2. 2. 將箱子放置在正確的目標(biāo)位置。
  3. 3. 反向模擬游戲來分散箱子。

第三步本質(zhì)上確保了如果玩家"拉"并移動(dòng)箱子,箱子確實(shí)可以被移動(dòng)到正確的位置。

一種基于上述方法的生成器實(shí)現(xiàn),[^107] 在玩家卡住時(shí)會(huì)回溯搜索其他排列方式。關(guān)于生成方法的論文 [^108] 引入了諸如玩家沿直線推箱子的次數(shù)或去推另一個(gè)箱子的次數(shù)等指標(biāo),旨在創(chuàng)建箱子盡可能遠(yuǎn)離正確位置的關(guān)卡,從而增加玩家需要執(zhí)行的操作。

還有一篇論文旨在使用被稱為 PuzzleScript [^110] 的通用益智游戲創(chuàng)建語言,為任何益智游戲生成關(guān)卡。[^109] 通過將 PuzzleScript 規(guī)則分析器中的游戲?qū)ο筇匦詡鬟f給關(guān)卡生成器和評(píng)估器來創(chuàng)建關(guān)卡。這種方法由評(píng)估器判斷生成的關(guān)卡是否可解、是否有趣,與前述的反向模擬方法不同。

雖然現(xiàn)有方法多種多樣,讓我們嘗試為自己定制的益智游戲進(jìn)行關(guān)卡生成。

我嘗試創(chuàng)建了一款名為 slickslack [^111] 的益智游戲,類似于《推箱子》和《Pengo》[^112] 的混合體。游戲目標(biāo)是將顯示為藍(lán)色方塊的箱子彈到正確的黃色位置(點(diǎn)擊圖片游玩)。


slickslack_screenshot [44]

采用的關(guān)卡自動(dòng)生成方法與其他《推箱子》生成器類似,從正確答案反向模擬游戲。不過,并非先創(chuàng)建空房間,而是創(chuàng)建一個(gè)全是墻壁的房間,在反向滑箱子的同時(shí)挖掘墻壁。


slickslack_screenshot_generating

  1. 1. 創(chuàng)建一個(gè)任意大小的、全部由墻壁組成的房間(或由可以是墻壁或空地的格子組成)。
  2. 2. 將箱子放置在正確的目標(biāo)位置。
  3. 3. 沿任意方向滑動(dòng)箱子任意距離。
  4. 4. 在滑動(dòng)方向的起始位置的對(duì)面放置墻壁,確保箱子在那里停下。
  5. 5. 將滑動(dòng)過的區(qū)域確認(rèn)為空地(挖掘墻壁)。

執(zhí)行上述滑動(dòng)操作任意次數(shù)來創(chuàng)建關(guān)卡。然而,這樣不加考慮地創(chuàng)建關(guān)卡并不能保證關(guān)卡有趣,所以需要進(jìn)行一些調(diào)整。

由于這個(gè)益智游戲沒有玩家角色,箱子可以相當(dāng)自由地滑動(dòng)。因此,為了營(yíng)造益智感,需要考慮滑動(dòng)箱子的順序、如何通過撞擊其他箱子讓箱子停在正確位置,以及箱子之間的交互。此外,過多的墻壁會(huì)減少游戲約束,降低益智感。考慮到這些,做了以下調(diào)整:

  • ? 優(yōu)先選擇能讓箱子被現(xiàn)有墻壁或其他箱子擋住的滑動(dòng)方向,避免創(chuàng)建新墻壁。
  • ? 旨在使箱子滑動(dòng)后與其他箱子相鄰。

我還創(chuàng)建了另一款自動(dòng)生成關(guān)卡的益智游戲 HAKOSAN。[^113] 目標(biāo)是使用方向鍵同時(shí)滑動(dòng)三個(gè)角色到達(dá)紅色終點(diǎn)(點(diǎn)擊圖片游玩)。


HAKOSAN [45]

同樣,關(guān)卡是通過從終點(diǎn)反向滑動(dòng)角色來生成的。

因此,這種從正確答案反向操作謎題來自動(dòng)生成問題的方法,在許多場(chǎng)景中都適用。如果加入像 PuzzleScript 論文中提到的評(píng)估器,來判斷生成關(guān)卡的趣味性并進(jìn)行篩選,可以進(jìn)一步提升此方法。該論文使用各種指標(biāo)評(píng)估關(guān)卡:箱子與正確位置之間的距離、玩家的移動(dòng)次數(shù)、應(yīng)用規(guī)則的次數(shù)等。雖然不能確定這些指標(biāo)是否準(zhǔn)確反映了解謎的樂趣,但它們對(duì)于過濾掉明顯無趣的關(guān)卡似乎很有用。在資源充足的情況下,融入此類改進(jìn)可以實(shí)現(xiàn)更好的關(guān)卡生成。

小游戲能否自動(dòng)生成?

我渴望擁有一臺(tái)能自動(dòng)生成小游戲的機(jī)器。開發(fā)者只需游玩這臺(tái)機(jī)器生成的游戲,保留有趣的、丟棄無趣的,僅憑這一過程就能創(chuàng)造出游戲。這簡(jiǎn)直是一臺(tái)夢(mèng)想機(jī)器。

前提是人類之后會(huì)進(jìn)行審查和篩選,因此大多數(shù)產(chǎn)出不有趣也沒關(guān)系。更關(guān)鍵的是確保游戲在生成時(shí)擁有足夠豐富的機(jī)制變化。

讓 AI 創(chuàng)造游戲的努力已經(jīng)持續(xù)了數(shù)年。ANGELINA 項(xiàng)目 [^114] 提出了一種通過隨機(jī)組合機(jī)制來生成新游戲的方法——比如在按下按鈕時(shí),將玩家的位置或重力等變量進(jìn)行翻倍、減半或正負(fù)號(hào)切換。[^115] 按下按鈕后切換變量狀態(tài)的機(jī)制被稱為"可切換游戲機(jī)制"(Toggleable Game Mechanics, TGM),該研究將其應(yīng)用于從始至終的跳躍解謎游戲中,旨在探索各種 TGM 的應(yīng)用方式。

研究采用遺傳算法從隨機(jī)組合中篩選出合適的 TGM 組合。選擇的適應(yīng)度取決于玩家在到達(dá)終點(diǎn)前在關(guān)卡中移動(dòng)的范圍有多廣。

然而,通過這種方法創(chuàng)造的游戲變化范圍仍然有限,能否稱之為"新游戲"仍是一個(gè)模糊地帶。發(fā)明新游戲?qū)θ祟悂碚f都很困難,對(duì)計(jì)算機(jī)來說更是巨大的挑戰(zhàn)。

最近,有潛力突破這些限制的技術(shù)出現(xiàn)了。以 ChatGPT 為代表,這些技術(shù)體現(xiàn)在搭載了大型語言模型(LLM)的 AI 聊天機(jī)器人中。

用 AI 聊天機(jī)器人創(chuàng)造解謎游戲

文章《ChatGPT 發(fā)明了自己的解謎游戲》[^116] 討論了一個(gè)場(chǎng)景:讓 ChatGPT 設(shè)計(jì)一種新的邏輯謎題,結(jié)果它提出了一個(gè)名為 Sumplete 的游戲。在這個(gè)游戲中,數(shù)字被放置在二維網(wǎng)格上,每行和每列的數(shù)字之和分別標(biāo)注在網(wǎng)格的右側(cè)和底邊。玩家通過劃掉網(wǎng)格上的數(shù)字來匹配給定的總和。


Sumplete

然而,這款游戲?qū)嶋H上早已存在,名為 Summer,[^117] 是為智能手機(jī)設(shè)計(jì)的。無論人類還是 AI 都不可能了解所有已存在的游戲,因此創(chuàng)造出已經(jīng)存在的游戲是常有的事。保證游戲的全新性是一件困難的事。

盡管如此,讓 ChatGPT 參與頭腦風(fēng)暴新的邏輯謎題仍然是一項(xiàng)有趣的嘗試。例如,當(dāng)給出以下任務(wù)時(shí),ChatGPT 能夠提出多種謎題:

我希望你扮演一名邏輯謎題游戲設(shè)計(jì)師。設(shè)計(jì) 5 種全新的邏輯謎題。創(chuàng)建的規(guī)則要與現(xiàn)有的邏輯謎題(如數(shù)獨(dú))不同。謎題應(yīng)由二維網(wǎng)格構(gòu)成。部分網(wǎng)格可以被墻壁分隔。單元格的初始狀態(tài)既包含含有數(shù)字或符號(hào)的格子,也包含空格子。玩家需要填入空白格并努力找到正確答案。

提示詞要求提供五種基于二維網(wǎng)格的邏輯謎題,部分格子含有數(shù)字或符號(hào),其余為空。網(wǎng)格可能被墻壁分隔。預(yù)計(jì)會(huì)出現(xiàn)類似 Heyawake [^118] 的謎題建議。

其中一個(gè)提案是名為"Magnet Blocks"(磁鐵方塊)的謎題:

在這個(gè)謎題中,網(wǎng)格包含極性相反的磁鐵(北極和南極)。玩家必須在網(wǎng)格中填入正極和負(fù)極的方塊,使每個(gè)方塊根據(jù)極性吸引或排斥相鄰的磁鐵。只有當(dāng)方塊與周圍磁鐵兼容時(shí)才能放置,且相同極性的方塊不能相鄰接觸。

以磁鐵為主題的 Magnet Blocks 提出的規(guī)則有些模糊。不過,將其解讀為"N 與 N、S 與 S 不能相鄰接觸"的磁鐵游戲后,成功實(shí)現(xiàn)了可玩的版本(點(diǎn)擊圖片即可游玩)。


Magnet Blocks [46]

具體規(guī)則如下:

  • ? 網(wǎng)格初始包含條形磁鐵和墻壁。
  • ? 條形磁鐵必須放入空格中,使 N 與 N、S 與 S 不相鄰接觸。條形磁鐵的長(zhǎng)度為 3 格或以上。
  • ? 當(dāng)所有空格都放有條形磁鐵時(shí),謎題通關(guān)。

盡管關(guān)卡生成邏輯不夠出色,導(dǎo)致謎題缺乏深度,但它仍然算得上是一個(gè)謎題。

這個(gè)謎題真的是全新的嗎?存在一款名為 Magnets [^119] 的類似游戲,雖然同樣以磁鐵為主題,但規(guī)則有很大不同:

  • ? 條形磁鐵的放置位置和方向是預(yù)先確定的,固定長(zhǎng)度為 2。
  • ? 網(wǎng)格邊緣給出了每行和每列中 + 和 - 出現(xiàn)次數(shù)的約束條件。
  • ? 不需要填滿所有空格。

到目前為止,尚未發(fā)現(xiàn)具有完全相同規(guī)則的謎題。然而,不能排除在非磁鐵主題的謎題中存在類似規(guī)則集的可能性。

邏輯謎題通常有固定的風(fēng)格范式,是 ChatGPT 圍繞其頭腦風(fēng)暴新規(guī)則的不錯(cuò)主題。然而,正因?yàn)檫@些固定風(fēng)格,被認(rèn)為是"新的"想法很可能與已有游戲不謀而合。

此外,讓 ChatGPT 生成足夠精確以構(gòu)成可玩謎題的規(guī)則并不容易;這需要人類介入,將模糊的提案精煉為具體的規(guī)則。將這些規(guī)則轉(zhuǎn)化為可玩的程序代碼仍然是一項(xiàng)困難的任務(wù)。

判斷所創(chuàng)造的謎題是否有趣又是另一個(gè)挑戰(zhàn),因?yàn)檫@不僅取決于規(guī)則,還取決于關(guān)卡生成背后的邏輯。

通過用其他方法、程序或插件來補(bǔ)充 ChatGPT 不擅長(zhǎng)的任務(wù)(如創(chuàng)建精確規(guī)則),AI 聊天機(jī)器人的應(yīng)用范圍有望進(jìn)一步擴(kuò)大。

教 AI 理解游戲機(jī)制

在上一節(jié)中,我將動(dòng)作小游戲的機(jī)制以標(biāo)簽的形式列出。[^120] 我們展示了通過隨機(jī)組合多個(gè)標(biāo)簽,可以構(gòu)思出利用這些機(jī)制的游戲。如果把這項(xiàng)任務(wù)交給 ChatGPT,或許能夠想出新的游戲創(chuàng)意。

我們向 ChatGPT 提供了以下提示詞,讓它扮演游戲設(shè)計(jì)師的角色:

我希望你扮演一名游戲設(shè)計(jì)師。請(qǐng)記住以下與游戲機(jī)制相關(guān)的標(biāo)簽。標(biāo)簽以"類別: 名稱, "描述""的格式書寫,每個(gè)標(biāo)簽占一行。隨機(jī)組合這些標(biāo)簽,構(gòu)思一個(gè)僅包含對(duì)應(yīng)游戲機(jī)制的新游戲。將該游戲設(shè)計(jì)為僅需單個(gè)按鍵的動(dòng)作小游戲。最多可組合 5 個(gè)標(biāo)簽。描述這是什么樣的游戲以及所選的標(biāo)簽。盡量不重復(fù)使用相同的游戲機(jī)制標(biāo)簽,嘗試構(gòu)思 5 款不同的游戲。 player: rotate, "玩家角色旋轉(zhuǎn)。" player: reciprocate, "玩家角色水平或垂直往復(fù)運(yùn)動(dòng)。" player: reflect, "玩家角色在碰到墻壁或物體時(shí)反彈。" ...

標(biāo)簽列表及其說明在標(biāo)簽列表文件 [^121] 中繼續(xù),完整的提示詞包含所有這些標(biāo)簽。[^122]

游戲 1:Scaffold Jump(腳手架跳躍) 所選標(biāo)簽:player: scaffold, on pressed: jump 描述:在這款游戲中,玩家控制一個(gè)沿腳手架移動(dòng)的角色。角色持續(xù)向前移動(dòng),玩家可以通過按下按鈕讓角色跳躍。目標(biāo)是在收集硬幣或道具的同時(shí)避免從腳手架墜落或撞到障礙物。隨著玩家前進(jìn),游戲逐漸加速,難度也隨之增加。 游戲 2:Pinball Panic(彈球恐慌) 所選標(biāo)簽:player: circle, weapon: bounce, field: pins, on pressed: shoot 描述:在這款游戲中,玩家控制一個(gè)在彈球臺(tái)式場(chǎng)地中彈跳的圓形角色。按下按鈕可以發(fā)射彈丸,彈丸會(huì)在釘子間彈射并消滅敵人。目標(biāo)是盡可能長(zhǎng)時(shí)間存活,同時(shí)通過消滅敵人和收集道具來獲取高分。 游戲 3:Springy Strings(彈力繩) 所選標(biāo)簽:player: string, player: bounce, field: gravity, on pressed: jump 描述:在這款游戲中,玩家控制一個(gè)在零重力場(chǎng)中彈跳的彈簧角色。按下按鈕可以讓角色跳躍,彈得更高。目標(biāo)是在收集道具和到達(dá)關(guān)卡終點(diǎn)的同時(shí)躲避障礙物和敵人。 游戲 4:Wipeout Warriors(沖刷戰(zhàn)士) 所選標(biāo)簽:player: bar, field: water, obstacle: chase, weapon: wipe, on pressed: jump 描述:在這款游戲中,玩家控制一個(gè)在水上賽道中競(jìng)速的條形角色,賽道上充滿了障礙物和敵人。角色自動(dòng)向前移動(dòng),玩家可以通過按下按鈕讓角色跳躍。角色還可以使用沖刷武器來清除前方的障礙物和敵人。目標(biāo)是以最短時(shí)間到達(dá)賽道終點(diǎn)。 游戲 5:Color Conundrum(色彩謎題) 所選標(biāo)簽:rule: match, rule: time limit, field: roughness, on pressed: turn 描述:在這款游戲中,玩家控制一個(gè)在崎嶇地形中導(dǎo)航的角色,同時(shí)需要匹配顏色。角色自動(dòng)向前移動(dòng),玩家可以通過按下按鈕來左右轉(zhuǎn)向。目標(biāo)是在時(shí)間耗盡前盡可能多地匹配顏色,同時(shí)避開路上的障礙物和敵人。

有了游戲名稱、所選標(biāo)簽和游戲描述,就可以挑選有趣的游戲并將其作為游戲創(chuàng)意。

以游戲 2 "Pinball Panic" 為例。在布滿釘子和敵人的彈球臺(tái)式場(chǎng)地中,玩家按下按鈕發(fā)射彈丸,彈丸在釘子間彈射來消滅敵人。巧妙控制彈射球擊中敵人可能很有趣,也許可以加入彈球翻板來發(fā)射球。

游戲 3 "Springy Strings" 如何?在無重力空間中,彈簧角色通過彈射障礙物和敵人來導(dǎo)航,或許是通過踢擊或揮臂推進(jìn)。

游戲 5 "Color Conundrum" 設(shè)想了一款俯視游戲,玩家角色在崎嶇地形中導(dǎo)航,通過按下按鈕左右轉(zhuǎn)向來匹配顏色,同時(shí)收集同色道具,并避開障礙物和敵人。

如果 ChatGPT 還能實(shí)現(xiàn)游戲代碼就太方便了,但目前這顯然還不可行。雖然當(dāng)提示"用 p5.js 實(shí)現(xiàn)游戲 1"時(shí),它確實(shí)會(huì)輸出一些代碼,但無法準(zhǔn)確反映游戲機(jī)制。

將游戲機(jī)制標(biāo)簽教給 ChatGPT 并讓其進(jìn)行組合,可以作為頭腦風(fēng)暴游戲創(chuàng)意基礎(chǔ)的一個(gè)好方法。ChatGPT 似乎很適合這類頭腦風(fēng)暴應(yīng)用。

AI 聊天機(jī)器人能創(chuàng)造新游戲嗎?

搭載大型語言模型(LLM)的 AI 聊天機(jī)器人能夠生成游戲創(chuàng)意并實(shí)現(xiàn)代碼。然而,它們的能力仍在發(fā)展中,尚不能在沒有人類干預(yù)的情況下創(chuàng)建平衡性良好的游戲。不過,最近 LLM 性能的提升使它們已經(jīng)能夠處理小游戲開發(fā)的許多方面。

GPT-3.5 時(shí)代

GPT-4 于 2023 年 3 月 14 日在 ChatGPT 上線,在此之前使用的是 GPT-3.5。雖然 GPT-3.5 在發(fā)布時(shí)是一款開創(chuàng)性的 LLM,但不可否認(rèn),與更新的高性能 LLM 相比,其輸出質(zhì)量有所不足。

使用 GPT-3.5 進(jìn)行游戲開發(fā)面臨以下挑戰(zhàn):

  • ? 難以構(gòu)思出足夠詳細(xì)、可在算法層面實(shí)現(xiàn)的新游戲創(chuàng)意
  • ? 無法有效實(shí)現(xiàn)新算法的源代碼

當(dāng)被要求生成小游戲創(chuàng)意時(shí),GPT-3.5 只會(huì)返回模糊的、泛泛的概念,缺乏實(shí)現(xiàn)所需的具體性。而且,即使給出了具體的創(chuàng)意,如果需要新算法,它也很難產(chǎn)出合適的代碼。因此,將 LLM 作為小游戲生成器來使用面臨很大挑戰(zhàn)。

Claude 3.5 Sonnet 時(shí)代

OpenAI 逐步將 ChatGPT 的模型從 GPT-3.5 更新到 GPT-4 和 GPT-4o,顯著提升了性能。OpenAI 的競(jìng)爭(zhēng)對(duì)手 Anthropic 也更新了其 Claude LLM,于 2024 年 6 月 21 日發(fā)布了 Claude 3.5 Sonnet。[^123]

伴隨 LLM 性能提升的還有將大型參考文檔附加到提示詞的能力,使 LLM 能夠處理各種前置知識(shí)。這些在 LLM 性能和功能上的改進(jìn)在一定程度上幫助克服了上述問題。

LLM 在生成新創(chuàng)意方面越來越強(qiáng)

LLM 性能的提升是否直接關(guān)聯(lián)到創(chuàng)意生成能力的增強(qiáng)尚不清楚。但似乎確實(shí)有明顯的改善。此外,通過參考文檔向 LLM 提供關(guān)于創(chuàng)意構(gòu)思方法和期望創(chuàng)意示例的前置知識(shí)也變得更加容易。

當(dāng)使用 LLM 自動(dòng)生成一鍵動(dòng)作小游戲時(shí),此語境下的"創(chuàng)意"指的是新穎有趣的游戲規(guī)則。為此,我向 LLM 提供了以下知識(shí):

  • ? 生成游戲創(chuàng)意的頭腦風(fēng)暴方法 [^124]
  • ? 可分配給單個(gè)按鈕的動(dòng)作描述 [^125]
  • ? 現(xiàn)有自創(chuàng)游戲的規(guī)則 [^126]

結(jié)果,結(jié)合 Claude 3.5 Sonnet 的高性能,我們成功提高了生成獨(dú)特游戲規(guī)則的概率。

LLM 可以通過逐步流程實(shí)現(xiàn)新算法

如上所述,LLM 已經(jīng)能夠生成合適的游戲規(guī)則。下一個(gè)挑戰(zhàn)是將這些規(guī)則轉(zhuǎn)化為正確的代碼。

即使對(duì)于最新的高性能 LLM,將游戲規(guī)則直接轉(zhuǎn)化為代碼仍然困難。當(dāng)從游戲規(guī)則開始逐步細(xì)化實(shí)現(xiàn)方法時(shí),獲得正確代碼的可能性會(huì)提高。因此,我在提示詞中指示 LLM 按以下步驟實(shí)現(xiàn)游戲:

  1. 1. 從游戲環(huán)境、核心機(jī)制、玩家交互和挑戰(zhàn)等方面整理游戲規(guī)則。
  2. 2. 詳細(xì)描述實(shí)現(xiàn)所整理游戲規(guī)則的游戲?qū)ο笮袨,考慮屬性、初始狀態(tài)、形狀、顏色、運(yùn)動(dòng)方式和一鍵操控。
  3. 3. 給出實(shí)現(xiàn)游戲規(guī)則和對(duì)象的 JavaScript 骨架代碼。
  4. 4. 使用庫將骨架代碼完善為可玩的游戲。

我還在提示詞中提供了使用這些步驟實(shí)現(xiàn)自創(chuàng)游戲的示例。這種方法有助于向 LLM 傳達(dá)我們的期望,進(jìn)一步改善其輸出質(zhì)量。

LLM 難以調(diào)整游戲平衡

高性能 LLM 現(xiàn)在能夠以一定的質(zhì)量創(chuàng)建游戲主題、規(guī)則和相應(yīng)的源代碼。但它們?nèi)匀浑y以評(píng)估所創(chuàng)建游戲的質(zhì)量并改進(jìn)其不足之處。

這里的游戲質(zhì)量指以下方面:

  • ? 它能作為一個(gè)游戲正常運(yùn)行嗎?是否存在不合理的游戲結(jié)束條件或無限循環(huán)模式?
  • ? 它有適當(dāng)?shù)娘L(fēng)險(xiǎn)與回報(bào)嗎?分?jǐn)?shù)和游戲時(shí)長(zhǎng)是否隨著玩家技能提升而增長(zhǎng)?
  • ? 它有趣嗎?游戲玩法是否直觀并能帶來暢快感?

針對(duì)這些問題的改進(jìn)示例可能包括:

  • ? 規(guī)則優(yōu)化:修改游戲結(jié)束條件或得分系統(tǒng)
  • ? 參數(shù)調(diào)整:改變速度或玩家角色和敵人出現(xiàn)的頻率
  • ? 操控方式改進(jìn):修改操控使其更直觀、對(duì)玩家壓力更小

僅靠 LLM 似乎難以處理這些任務(wù)。要評(píng)判所創(chuàng)建游戲的質(zhì)量,計(jì)算機(jī)需要親自游玩實(shí)現(xiàn)的游戲并分析結(jié)果。雖然超出 LLM 范疇的能夠玩游戲的 AI 已經(jīng)存在,但計(jì)算機(jī)能在多大程度上理解人類諸如"暢快感"這類感受還不得而知。

讓計(jì)算機(jī)改進(jìn)游戲的弱點(diǎn)似乎非常具有挑戰(zhàn)性。如果 AI 能夠評(píng)判游戲質(zhì)量,也許可以利用類似強(qiáng)化學(xué)習(xí)的方式將其作為獎(jiǎng)勵(lì)。然而,AI 能否適當(dāng)?shù)馗倪M(jìn)規(guī)則和操控方式,或調(diào)整游戲中各種各樣的參數(shù)來提升游戲質(zhì)量,仍然存疑。

因此,LLM 在小游戲創(chuàng)作中的使用范圍似乎最好限制在 LLM 目前擅長(zhǎng)做的方面。也就是說,LLM 僅被期望創(chuàng)建游戲創(chuàng)意和生成實(shí)現(xiàn)代碼。生成的代碼和游戲仍然不完美,因此以下任務(wù)需要手動(dòng)完成:

  • ? 修復(fù)代碼 bug 和不符合預(yù)期的規(guī)則
  • ? 改進(jìn)規(guī)則和代碼使游戲可玩
  • ? 添加考慮風(fēng)險(xiǎn)與回報(bào)的游戲結(jié)束條件和得分系統(tǒng)
  • ? 調(diào)整規(guī)則和參數(shù)使游戲更有趣
  • ? 實(shí)現(xiàn)難度遞進(jìn)并調(diào)整難度曲線

考慮到這一點(diǎn),使用 LLM 似乎并沒有顯著減少工作量。然而,LLM 實(shí)現(xiàn)的代碼偶爾會(huì)產(chǎn)生有趣的行為。因此,它仍然可以作為創(chuàng)建游戲創(chuàng)意基礎(chǔ)的"玩具"來使用。

使用 LLM 的"生成重?cái)S游戲開發(fā)"

通過這種方式使用 LLM,可以反復(fù)生成游戲,直到創(chuàng)建出符合你偏好的游戲,然后手動(dòng)完善它。讓我們將這個(gè)過程稱為"生成重?cái)S游戲開發(fā)"(Generative Reroll Game Development)。

以下是生成重?cái)S游戲開發(fā)的一個(gè)例子。我們使用 Claude 3.5 Sonnet 作為 LLM,提示詞和前置知識(shí)存儲(chǔ)在倉庫中。[^127]

當(dāng)給定主題"脆弱的柱子"時(shí),提示詞建議了以下游戲:

Pillar Paraglider(柱間滑翔):控制一個(gè)在脆弱柱子間飛行的滑翔翼。滑翔翼持續(xù)下降。按下按鈕可以上升,但每次按壓也會(huì)發(fā)出可能損壞附近柱子的沖擊波。核心機(jī)制:在上升與保護(hù)柱子之間取得平衡。

在細(xì)化和實(shí)現(xiàn)這個(gè)創(chuàng)意后,我們創(chuàng)建了游戲。[^128] 這是 Claude 的直接輸出。

按下按鈕后,紅色玩家角色上升,同時(shí)發(fā)出圓形沖擊波。沖擊波會(huì)摧毀柱子。雖然看起來深受 Flappy Bird 的影響,但實(shí)現(xiàn)的行為相當(dāng)有趣。

然而,這個(gè)游戲有幾個(gè)明顯的問題:

  • ? 太簡(jiǎn)單了。反復(fù)按下按鈕可以用沖擊波清除柱子。即使玩家角色到達(dá)屏幕頂部或底部也不會(huì)游戲結(jié)束。
  • ? 得分系統(tǒng)過于簡(jiǎn)單。分?jǐn)?shù)僅基于飛行距離,因此冒險(xiǎn)行為不會(huì)帶來更高的分?jǐn)?shù)。
  • ? 沒有實(shí)現(xiàn)最初的核心機(jī)制。本意是在上升與保護(hù)柱子之間取得平衡,但沒有這樣實(shí)現(xiàn)。而且,忠實(shí)實(shí)現(xiàn)這一機(jī)制可能會(huì)導(dǎo)致沖擊波碰撞檢測(cè)范圍過大的壓力型游戲。

在生成重?cái)S游戲開發(fā)中,關(guān)鍵過程是如何將這些具有有趣行為的游戲改進(jìn)為真正有趣的游戲。

對(duì)于這個(gè)游戲,我做了以下改動(dòng):

  • ? 影響所有方向的圓形沖擊波太過強(qiáng)大,因此我為玩家角色添加了方向性,將沖擊波限制在其前方的一個(gè)窄角度內(nèi)。此外,沖擊波現(xiàn)在只摧毀直接命中的柱子部分,而不是整根柱子。我還實(shí)現(xiàn)了玩家角色觸碰屏幕頂部或底部時(shí)的游戲結(jié)束條件。
  • ? 為摧毀柱子的每個(gè)部分給予分?jǐn)?shù)。還實(shí)現(xiàn)了連續(xù)摧毀的分?jǐn)?shù)倍增器,激勵(lì)玩家冒險(xiǎn)飛向柱子以獲取更高分?jǐn)?shù)。
  • ? 我放棄了原來的核心機(jī)制。一般來說,關(guān)于"破壞"的游戲比關(guān)于"避免破壞"的游戲更有趣。

改進(jìn)后的游戲可以在 [^129] 中看到。


WAVY BIRD 截圖

游戲演變?yōu)橛脹_擊波在柱子上打洞來前進(jìn)。雖然可能稍顯困難,但它比初始版本實(shí)現(xiàn)了更好的風(fēng)險(xiǎn)與回報(bào)平衡,成為了一款更完整的游戲。

改進(jìn)版本與原始代碼之間的差異詳見 [^130]。雖然看起來原始代碼所剩無幾,但原始框架為修改提供了有用的參考,比從零開始要輕松得多。

添加了音效和標(biāo)題的完成版本可在 [^131] 中體驗(yàn)。倉庫 [^127] 中包含大量通過類似流程開發(fā)的游戲,供參考。

這就是目前使用 LLM 的生成重?cái)S游戲開發(fā)的現(xiàn)狀。這個(gè)過程是否比人類自己構(gòu)思創(chuàng)意并傳統(tǒng)方式實(shí)現(xiàn)更容易,還有待討論。然而,選擇 LLM 建議的游戲并想方設(shè)法使其變得有趣的開發(fā)過程,與傳統(tǒng)開發(fā)過程相比提供了不同類型的樂趣。在生成重?cái)S游戲開發(fā)中,同時(shí)享受游戲開發(fā)和用于生成的提示詞開發(fā)/改進(jìn)的并行過程也很重要。

未來,我們或許只需告訴 LLM "創(chuàng)建一個(gè)有趣的游戲",它就能返回一個(gè)實(shí)現(xiàn)完善的好的游戲。目前,通常需要數(shù)十次"重?cái)S"才能獲得一個(gè)具有有趣行為的游戲,成功率相當(dāng)?shù)。然而,用以前?LLM 幾乎不可能獲得任何有趣的產(chǎn)出,泛泛的、缺乏靈感的游戲是常態(tài)。得益于過去一年左右 LLM 的進(jìn)化,我們現(xiàn)在能夠生成至少感覺上有些新意的東西,這是一個(gè)積極的信號(hào)。

如果 LLM 繼續(xù)以這種速度進(jìn)化,創(chuàng)意的質(zhì)量將會(huì)提高,它們也將能更準(zhǔn)確地將這些創(chuàng)意實(shí)現(xiàn)為代碼。而且,當(dāng)我們指出上述問題時(shí),LLM 也許能夠相應(yīng)地修改代碼。這可能導(dǎo)致通過更少的重?cái)S和更簡(jiǎn)單的改進(jìn)就能獲得可玩的游戲。然而,未來的 LLM 是否會(huì)穩(wěn)步提升性能以達(dá)到這些能力,目前尚不確定。截至 2024 年,LLM 性能提升的速率似乎正在放緩。

利用 AI 聊天機(jī)器人的游戲開發(fā)未來

利用 AI 聊天機(jī)器人的游戲開發(fā)尚未成為完全自動(dòng)化的過程,但它蘊(yùn)含著新的可能性。目前,AI 聊天機(jī)器人有能力生成具有有趣行為的"玩具",有效的流程是由人類將這些"玩具"精煉為完整的游戲。

未來,如果 LLM 性能持續(xù)提升,有望生成更高質(zhì)量的游戲創(chuàng)意和代碼。然而,游戲平衡調(diào)整和趣味性評(píng)估等方面——這些創(chuàng)意性工作——在可預(yù)見的未來可能仍需人類介入。

"生成重?cái)S游戲開發(fā)"提供了一種全新的、與眾不同的游戲開發(fā)樂趣; LLM 生成的創(chuàng)意和代碼來構(gòu)建游戲,結(jié)合人類的創(chuàng)造力,帶來了新的發(fā)現(xiàn)和驚喜。

隨著 LLM 的進(jìn)化,我們可以期待這些開發(fā)方法進(jìn)一步發(fā)展。對(duì)于小游戲開發(fā)者而言,AI 聊天機(jī)器人有望開啟創(chuàng)造力的大門。

結(jié)語

我們圍繞小游戲開發(fā)探討了各種話題,從它帶來的樂趣、創(chuàng)作方法,到利用 AI 進(jìn)行自動(dòng)生成的潛力。

創(chuàng)建和游玩小游戲都很簡(jiǎn)單。近年來,隨著幻想主機(jī)(fantasy console)和游戲引擎的出現(xiàn),游戲創(chuàng)作的環(huán)境變得越來越豐富。面向初學(xué)者的教程和文檔也非常充足,入門之簡(jiǎn)單令人驚訝。

游戲創(chuàng)作完成后,將其發(fā)布到網(wǎng)上觀察反應(yīng)也是一種樂趣。參加 Game Jam 也很有意思。在這些場(chǎng)合中,分享自己創(chuàng)作的游戲并獲取反饋,能夠進(jìn)一步提升你的游戲開發(fā)技能。

如果這篇文章激發(fā)了哪怕一絲興趣,我鼓勵(lì)你跟隨突然閃現(xiàn)的靈感,試著做一款簡(jiǎn)單的游戲。新的發(fā)現(xiàn)和樂趣一定在等著你。

引用鏈接

[1]Joys of Small Game Development: https://abagames.github.io/joys-of-small-game-development-en/

[2]CC BY 4.0: https://creativecommons.org/licenses/by/4.0/deed.en

[3]joys-of-small-game-development-en: https://github.com/abagames/joys-of-small-game-development-en

[4]ABA Games: http://www.asahi-net.or.jp/~cs8k-cyu/

[5]![TIMBER TEST](https://github.com/abagames/crisp-game-lib-11-games/raw/main/docs/timbertest/screenshot.gif): https://abagames.github.io/crisp-game-lib-11-games/?timbertest

[6]![C NODES](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/cnodes/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?cnodes

[7]![action-mini-game mechanic tags](https://abagames.github.io/action-mini-game-mechanic-tags/twitter_card_image.png): https://abagames.github.io/action-mini-game-mechanic-tags/index.html

[8]![THUNDER](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/thunder/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?thunder

[9]![CYWALL](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/cywall/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?cywall

[10]![DIVARR](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/divarr/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?divarr

[11]![JUMP ON](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/jumpon/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?jumpon

[12]![NS CLIMB](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/nsclimb/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?nsclimb

[13]![LADDER DROP](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/ladderdrop/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?ladderdrop

[14]![NUMBER LINE](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/numberline/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?numberline

[15]![NUMBER BALL](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/numberball/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?numberball

[16]![FROOOOG](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/froooog/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?froooog

[17]![PIN CLIMB](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/pinclimb/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?pinclimb

[18]![SQUARE BAR](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/squarebar/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?squarebar

[19]![TAPE J](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/tapej/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?tapej

[20]![EMBATTLED](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/embattled/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?embattled

[21]![REFLECTOR](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/reflector/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?reflector

[22]![BAMBOO](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/bamboo/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?bamboo

[23]![CHARGE BEAM](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/chargebeam/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?chargebeam

[24]![LASER FORTRESS](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/laserfortress/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?laserfortress

[25]![SHINY](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/shiny/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?shiny

[26]![SCRAMBIRD](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/scrambird/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?scrambird

[27]![TILTED](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/tilted/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?tilted

[28]![UP SHOT](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/upshot/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?upshot

[29]![BOMB UP](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/bombup/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?bombup

[30]![ORBIT MAN](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/orbitman/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?orbitman

[31]![ARCFIRE](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/arcfire/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?arcfire

[32]![TURBULENT](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/turbulent/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?turbulent

[33]![SUB JUMP](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/subjump/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?subjump

[34]![MIRROR FLOOR](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/mirrorfloor/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?mirrorfloor

[35]![LIFT UP](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/liftup/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?liftup

[36]![REBIRTH](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/rebirth/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?rebirth

[37]![R WHEEL](https://github.com/abagames/crisp-game-lib-games/raw/main/docs/rwheel/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?rwheel

[38]![springcar](https://raw.githubusercontent.com/abagames/jsgame256/master/docs/springcar.png): https://abagames.github.io/jsgame256/springcar.html

[39]![diff-tween](https://abagames.github.io/diffi-tween/screenshot.png): https://abagames.github.io/diffi-tween/

[40]![ref_collision screenshot](https://abagames.github.io/crisp-game-lib-games/ref_collision/screenshot.gif): https://abagames.github.io/crisp-game-lib-games/?ref_collision

[41]![BOMB SNAKE](https://raw.githubusercontent.com/abagames/peekpoke/main/docs/screenshot.gif): https://abagames.github.io/peekpoke/bombsnake/

[42]![pixel-art-gen](https://abagames.github.io/joys-of-small-game-development-en/images/ships.gif): https://abagames.github.io/pixel-art-gen/index.html?ships

[43]![Short VGM generator](https://raw.githubusercontent.com/abagames/short-vgm-generator/main/docs/screenshot.png): https://abagames.github.io/short-vgm-generator/build/

[44]![slickslack_screenshot](https://abagames.github.io/slickslack/screenshot.gif): https://abagames.github.io/slickslack/index.html

[45]![HAKOSAN](https://raw.githubusercontent.com/abagames/hakosan/main/docs/screenshot.gif): https://abagames.github.io/hakosan/build/

[46]![Magnet Blocks](https://raw.githubusercontent.com/abagames/crisp-game-lib-11-games/main/docs/magnetblocks/screenshot.gif): https://abagames.github.io/crisp-game-lib-11-games/?magnetblocks

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
一個(gè)收入不高的人,可以偽精致到什么程度?網(wǎng)友:天天為賬單發(fā)愁

一個(gè)收入不高的人,可以偽精致到什么程度?網(wǎng)友:天天為賬單發(fā)愁

另子維愛讀史
2026-04-20 09:36:56
人民日?qǐng)?bào)評(píng)景區(qū)NPC:別再“擦邊”了!蓋上紅蓋頭、用嘴咬著棒棒糖送到游客嘴里,這種玩法看著熱鬧有趣,實(shí)則存在隱患

人民日?qǐng)?bào)評(píng)景區(qū)NPC:別再“擦邊”了!蓋上紅蓋頭、用嘴咬著棒棒糖送到游客嘴里,這種玩法看著熱鬧有趣,實(shí)則存在隱患

農(nóng)視網(wǎng)
2026-05-02 11:02:00
嫁老頭? 包養(yǎng)男學(xué)生? 不雅照? 央視主持人張蕾私生活謠言不堪入目

嫁老頭? 包養(yǎng)男學(xué)生? 不雅照? 央視主持人張蕾私生活謠言不堪入目

小樾說歷史
2026-04-23 15:13:27
56歲知名演員突然斷氣,死前正籌備新餐廳,給所有中年人上了一課

56歲知名演員突然斷氣,死前正籌備新餐廳,給所有中年人上了一課

翰飛觀事
2026-04-30 19:33:28
央八新劇被要求下架:全是算計(jì)、演技稀爛、劇情懸浮、三觀盡毀!

央八新劇被要求下架:全是算計(jì)、演技稀爛、劇情懸浮、三觀盡毀!

科學(xué)發(fā)掘
2026-05-01 00:34:21
只要有陌生電話問你“您是不是本人”,這樣反問一句,防騙超實(shí)用

只要有陌生電話問你“您是不是本人”,這樣反問一句,防騙超實(shí)用

林子說事
2026-05-02 14:31:12
女子20元買一舊肚兜,幾年后去鑒寶,專家聞了聞,一句話讓她傻眼

女子20元買一舊肚兜,幾年后去鑒寶,專家聞了聞,一句話讓她傻眼

燦爛夏天
2025-03-12 22:44:55
主持人被評(píng)為勞模?這是對(duì)勞模最大諷刺、是現(xiàn)階段勞模評(píng)選的悲哀

主持人被評(píng)為勞模?這是對(duì)勞模最大諷刺、是現(xiàn)階段勞模評(píng)選的悲哀

網(wǎng)絡(luò)易不易
2026-05-02 11:53:18
大量硼砂,別再給家里人吃了!這10類食物最易摻硼砂,超危險(xiǎn)

大量硼砂,別再給家里人吃了!這10類食物最易摻硼砂,超危險(xiǎn)

笑熬漿糊111
2026-04-13 00:05:12
張維為:中國(guó)工業(yè)能力完備 可向世界提供頂尖技術(shù)

張維為:中國(guó)工業(yè)能力完備 可向世界提供頂尖技術(shù)

看看新聞Knews
2026-05-01 21:24:05
出軌忍了,私生子也忍了,套現(xiàn)2億后,“贅婿”終于被踢出豪門

出軌忍了,私生子也忍了,套現(xiàn)2億后,“贅婿”終于被踢出豪門

楓塵余往逝
2026-05-01 01:13:54
美國(guó)不交會(huì)費(fèi),5月第一天,中國(guó)在聯(lián)合國(guó)身份變了

美國(guó)不交會(huì)費(fèi),5月第一天,中國(guó)在聯(lián)合國(guó)身份變了

涼羽亭
2026-05-02 16:14:28
離譜!許家印只喝2700一瓶水 馬桶必須噴香水 隨身配備女按摩師

離譜!許家印只喝2700一瓶水 馬桶必須噴香水 隨身配備女按摩師

念洲
2026-04-28 11:37:39
“窮人炫富,難掩心酸!”男大學(xué)生炫耀坐高鐵一等座,因長(zhǎng)相被嘲

“窮人炫富,難掩心酸!”男大學(xué)生炫耀坐高鐵一等座,因長(zhǎng)相被嘲

妍妍教育日記
2026-04-24 09:05:03
國(guó)際米蘭:除了尼科·帕斯,帕萊斯特拉也可能加盟——馬洛塔的經(jīng)濟(jì)策略

國(guó)際米蘭:除了尼科·帕斯,帕萊斯特拉也可能加盟——馬洛塔的經(jīng)濟(jì)策略

綠茵情報(bào)局
2026-05-02 15:35:08
美辯稱襲擊伊朗系“自衛(wèi)” 伊朗怒斥:赤裸裸的侵略

美辯稱襲擊伊朗系“自衛(wèi)” 伊朗怒斥:赤裸裸的侵略

北青網(wǎng)-北京青年報(bào)
2026-05-01 17:53:03
4場(chǎng)狂輸117分!雷霆是湖人克星?詹皇帶隊(duì)復(fù)仇時(shí)刻到了

4場(chǎng)狂輸117分!雷霆是湖人克星?詹皇帶隊(duì)復(fù)仇時(shí)刻到了

球童無忌
2026-05-02 14:11:24
或12萬預(yù)算,上汽全新大6座SUV官宣!

或12萬預(yù)算,上汽全新大6座SUV官宣!

米粒說車唯一呀
2026-04-30 18:24:37
特朗普5月或?qū)⒃L華,臺(tái)灣統(tǒng)一或上演全新劇本?

特朗普5月或?qū)⒃L華,臺(tái)灣統(tǒng)一或上演全新劇本?

像詩一樣的姑娘
2026-05-02 16:31:32
Starz出品,這3部黃暴爽劇別看刪減版

Starz出品,這3部黃暴爽劇別看刪減版

來看美劇
2026-05-01 19:58:14
2026-05-02 18:44:49
教你畫像素畫 incentive-icons
教你畫像素畫
像素畫教程
2462文章數(shù) 12217關(guān)注度
往期回顧 全部

游戲要聞

LCK第二賽段:沒有Chovy,GEN就是中游隊(duì)伍!GEN三局戰(zhàn)勝DK

頭條要聞

單親媽媽被無辜羈押821天申請(qǐng)國(guó)賠遭叫停 最新消息來了

頭條要聞

單親媽媽被無辜羈押821天申請(qǐng)國(guó)賠遭叫停 最新消息來了

體育要聞

休賽期總冠軍,輪到休斯頓火箭

娛樂要聞

白百何罕曬大兒子 18歲元寶越來越帥

財(cái)經(jīng)要聞

雷軍很努力 小米還是跌破了30港元大關(guān)

科技要聞

AI熱潮耗盡庫存,Mac Mini起售調(diào)高200美元

汽車要聞

新紀(jì)錄!零跑汽車4月交付達(dá)71387臺(tái)

態(tài)度原創(chuàng)

親子
房產(chǎn)
手機(jī)
本地
公開課

親子要聞

寶寶多指是什么原因造成的?大概和這些因素有關(guān)

房產(chǎn)要聞

所有戶型全賣爆!海口TOP級(jí)豪宅,景觀樣板間五一全線開放!

手機(jī)要聞

小米R(shí)EDMI K Pad 2體驗(yàn):專為電競(jìng)而生的Mini小平板

本地新聞

用青花瓷的方式,打開西溪濕地

公開課

李玫瑾:為什么性格比能力更重要?

無障礙瀏覽 進(jìn)入關(guān)懷版