慣性聚合 高效追蹤和閱讀你感興趣的部落格、新聞、科技資訊
閱讀原文 在慣性聚合中打開

推薦訂閱源

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

阮一峰的网络日志

科技爱好者周刊(第 396 期):互联网通信的替代方案 科技爱好者周刊(第 396 期):互联网通信的替代方案 - 阮一峰的网络日志 科技爱好者周刊(第 395 期):软件开发的第三种方式 科技爱好者周刊(第 395 期):软件开发的第三种方式 - 阮一峰的网络日志 科技爱好者周刊(第 393 期):脑腐状态 科技爱好者周刊(第 392 期):axios 投毒与好莱坞式骗术 科技爱好者周刊(第 391 期):AI 的贫富分化 科技爱好者周刊(第 390 期):没有语料,大模型就是智障 套壳中国大模型撑起500亿美元估值?扒一扒 Cursor 的"套壳"疑云 科技爱好者周刊(第 389 期):未来如何招聘程序员 科技爱好者周刊(第 388 期):测试是新的护城河 零安装的"云养虾":ArkClaw 使用指南 科技爱好者周刊(第 387 期):你是领先的 科技爱好者周刊(第 386 期):当外卖员接入 AI 字节全家桶 Seed 2.0 + TRAE 玩转 Skill 科技爱好者周刊(第 385 期):马斯克害怕中国车企吗? 智谱旗舰 GLM-5 实测:对比 Opus 4.6 和 GPT-5.3-Codex 科技爱好者周刊(第 384 期):为什么软件股下跌 科技爱好者周刊(第 383 期):你是第几级 AI 编程 Kimi 的一体化,Manus 的分层 科技爱好者周刊(第 382 期):独立软件的黄昏 AI native Workspace 也许是智能体的下一阶段 科技爱好者周刊(第 381 期):中国 AI 大模型领导者在想什么 科技爱好者周刊(第 380 期):为什么人们拥抱"不对称收益" 科技爱好者周刊(第 379 期):《硅谷钢铁侠》摘录 我如何用 AI 处理历史遗留代码:MiniMax M2.1 升级体验 科技爱好者周刊(第 378 期):预测是新的互联网热点 科技爱好者周刊(第 377 期):14万美元的贫困线 科技爱好者周刊(第 376 期):太空数据中心的争议 科技爱好者周刊(第 375 期):一扇门的 Bug 终于有人做了 Subagent,TRAE 国内版 SOLO 模式来了 科技爱好者周刊(第 374 期):6GHz 的问题 VS Code 使用国产大模型 MiniMax M2 教程 科技爱好者周刊(第 373 期):数据模型是新产品的核心 国产大模型接入 Claude Code 教程:以 Doubao-Seed-Code 为例 科技爱好者周刊(第 372 期):软件界面如何设计 大模型比拼:MiniMax M2 vs GLM 4.6 vs Claude Sonnet 4.5 科技爱好者周刊(第 371 期):一个乐观主义者的专访 科技爱好者周刊(第 370 期):正确的代码高亮 错误处理:异常好于状态码 科技爱好者周刊(第 369 期):Tim 与罗永浩的对谈 科技爱好者周刊(第 368 期):不要这样管理软件团队 一天之内,智谱和 Anthropic 都发了最强编程模型 科技爱好者周刊(第 367 期):Nano Banana 的几个妙用 科技爱好者周刊(第 366 期):旧金山疯狂的 AI 广告 科技爱好者周刊(第 365 期):流量变现正在崩塌 科技爱好者周刊(第 364 期):最难还原的魔方 科技爱好者周刊(第 363 期):最好懂的神经网络解释 科技爱好者周刊(第 362 期):GitHub 工程师谈系统设计 科技爱好者周刊(第 361 期):暗网 Tor 安全吗?
羊了個羊,如何自己實現(暨"碼上掘金"編程挑戰賽介紹)
阮一峰 · 2022-10-25 · via 阮一峰的网络日志

[海報] 稀土掘金正在面向全國舉辦"首屆編程挑戰賽",這是展示自己作品的好機會,詳情見文後。

小遊戲《羊了個羊》最近非常火爆,引發了全民關注,抖音和微博都有幾十億的查看量。

它的開發難度,其實一點不高,主要遊戲邏輯都在前端,用的是普通的網頁開發技術。如此簡單的實現,卻取得了這樣巨大的反響,堪稱奇蹟。

本文就介紹這個遊戲怎麼實現。只用 HTML + CSS + JS 做出一個簡單版本,根本不需要後端。

最後的成品會放到"碼上掘金" code.juejin.cn,那是一個網頁的代碼開發環境,可以分享運行結果,跟國外的 CodePen 差不多。

對於不瞭解的讀者,我先簡單說一下,《羊了個羊》是怎麼回事。

本質上,它就是傳統的"消消樂"遊戲(下圖),同種花色的方塊連到一起,可以消除,消除所有方塊,就過關了。

《羊了個羊》在形式上借鑑了國外的《消麻將》遊戲(下圖),採用堆疊式消除。

不同之處在於,它有一個槽位欄,存放取下的卡片(下圖)。只要槽位欄裡面,連續三張卡片花色相同,就能消除,也就是所謂的"三消"。

你仔細一想,網頁實現的核心邏輯,其實只有兩步。

第一步,網頁劃出一個區域,將所有卡片在這個區域堆成四層。每一層的卡片位置和花色分佈,可以用隨機數控制。

第二步,每一層的沒有被遮擋的卡片可以移動。它們只要被點擊,就從卡片區移動到槽位欄。

那麼,下面就來實現這兩步。我原想自己寫,但在 GitHub 搜了一下"羊了個羊",返回了近兩百個結果,什麼樣的代碼都有。

他們實現得比我完善,效果更好,所以我選了一個倉庫 chenxch/xlegex,就用他的代碼演示。

這個倉庫使用 vue3 + TypeScript,源碼加起來不到1000行。核心邏輯就是上面的兩點,下面介紹一些關鍵的實現細節。

首先,每張卡片是一個實例對象,TypeScript 類型描述如下。

從上圖看到,每張卡片有如下屬性。

  • id:卡片編號。
  • type:卡片種類,相同種類的卡片可消除。
  • state:卡片狀態,是否已經點擊或已經消除。
  • zIndex:卡片在哪一層。
  • index:該層的卡片編號。
  • row:卡片所在的行。
  • column:卡片所在的列。
  • top:卡片距離堆疊區左上角的垂直距離。
  • left:卡片距離堆疊區左上角的水平距離。

熟悉 CSS 的同學,看到裡面的zIndextopleft這些屬性名,可能已經想到了,作者使用"絕對定位 + zIndex"實現卡片的定位。

定位邏輯就在卡片組件的代碼裡面,只有幾行。

上面代碼中,紅框部分就是定位邏輯,設置每張卡片的座標,以及在第幾層。

注意,上一層卡片的頂點要落在下一層卡片的中心點,從而可以露出下面的圖案。

上面示意圖中,黑色方塊代表下一層的卡片,以它的中心點為基點,上一層可以放四張卡片,以紅框表示。

最後得到的堆疊效果,就是下圖。

圖片替換以後,UI 就基本完成了。

最後,為每張圖片加上 click 事件處理函數(點擊後移動到卡片槽),遊戲的核心邏輯就差不多了。

更詳細的源碼解讀,可以參考作者自己的文章,並試玩 Demo

但是,他的實現還不是最簡單的,這裡還有一個更簡單的實現

這個實現的頁面源碼只有一個腳本,甚至不需要編譯。(如果"碼上掘金"頁面是白屏,點擊右上角的"運行"按鈕。)

《羊了個羊》就介紹到這裡,不過本文還沒結束。

我的目的是拋磚引玉,向大家展示簡單的 HTML + CSS + JS 代碼,就可以做出效果很好的小遊戲。下面是其他一些例子。

《平臺跳躍》

《消方塊》

《推箱子》

大家可以去"碼上掘金"平臺,看看它們的代碼和效果。

如果你也有這樣的作品,或者想嘗試一下,現在就有一個好機會。"碼上掘金"正在舉辦首屆全國編程挑戰賽,這是國內少有的前端編程比賽。

["碼上掘金"介紹] 稀土掘金推出的一款面向開發者的在線 Code Playground 服務,無需搭建複雜的開發環境,即可實現代碼效果的即時預覽、演示和分享。

它類似於國外的 Codepen,這種網站國內好像只有這一家。它主要面向前端開發,但是也支持20多種後端語言

如果你有自己的作品(網頁遊戲、網頁動畫、UI 特效等等),但苦於無法向社區展示和推廣,那麼不要錯過這個比賽機會,請仔細閱讀下面的介紹。

只要參賽,平臺會幫忙推廣你的作品,並提供豐厚的獎金和獎品。

碼上掘金編程挑戰賽

一、活動賽道

賽題一:碼上游戲:基於碼上掘金開發完成一款創意的 web 互動小遊戲,具體遊戲內容及形式不限。

賽題二:碼上創意:可以使用任意第三方開源庫/框架,呈現形式包括但不限於可視化的創意動效、動畫、UI 效果等,參見 Demo

賽題三:碼上文言文:需使用碼上掘金提供的文言文編程能力,以文言文作為編程語言實現作品,呈現出的作品風格及形式不限,參見 Demo

賽題四:碼上1024:在碼上掘金上實現"稀土掘金"或"1024"相關的效果,參見 Demo

注意,參賽作品必須是原創作品。更多作品靈感參見討論區

二、活動獎品

(一)獲獎同學:賽事獎金,榮譽證書,掘金年度會員,掘金周邊盲盒。

獲獎作品有可能成為掘金網站開屏頁面,獲得站內資源位推薦、字節跳動工區宣傳位等。

獲獎同學有機會獲得字節 offer。

(二)通過審核的參賽選手:獲得稀土掘金月度會員,最新周邊盲盒。

(三)官網報名的所有同學:參與抽獎,有機會獲得 iPhone 14 Pro、Apple Watch 8、Pico4、Airpods Pro 2、掘金盲盒等獎品。

三、活動時間

10月12日 ~ 11月30日

時間點:

  • 10月12日 ~ 11月22日:報名並提交作品。
  • 11月23日 ~ 11月29日:作品評選。
  • 11月30日:賽事頒獎。

四、報名方法

訪問活動官網,或者掃描下方二維碼,瞭解詳情,並報名參加。

(官網報名二維碼)

報名即可參與抽獎,iPhone 14 Pro、Apple Watch 8、Pico4、Airpods Pro 2、最新盲盒等獎品等你來拿!

如有疑問,微信掃碼添加賽事小助理,回覆"1024"加入大賽交流群。

(賽事小助理二維碼)

五、活動直播

10月31日(星期一)晚七點,掘金也會發起一場 《碼上掘金編程挑戰賽特別圓桌》 活動直播,邀請四位不同職業選擇的嘉賓,聊聊自己的"碼上掘金"之路。

他們有人去了大廠、有人離開大廠、有人創業、有人走上了學術道路,通過他們的分享希望給還在學習和剛進入職場的同學們一些啟發。

保存直播鏈接,或到時點擊這裡,進入直播間。

(完)