大家好,歡迎來到 Crossin的編程教室 猖辫!
要說最近最熱門的游戲酥泞,那肯定是《羊了個羊》沒跑了。
連續(xù)上了好幾天熱搜啃憎,火到連央視都來提醒謹防有人利用游戲之名詐騙芝囤。
但游戲爆火的另一面,也是無數(shù)玩家對于第二關(guān)難度的吐槽和不滿辛萍。
如果你也像我一樣悯姊,因為過不了關(guān)而不爽,不如自己用 Python 來寫一個簡單版贩毕,想過幾關(guān)過幾關(guān)
甚至還可以調(diào)個無解關(guān)卡去霍霍其他人
我這個版本不僅難度簡單悯许,代碼也很簡單,一共不到100行辉阶。代碼已開源:
python666點cn/c/8
可下載先壕,可修改,可商用谆甜,但公開發(fā)布需署名來源:Crossin的編程教室
稍微解釋一下思路和代碼:
游戲用了 pygame-zero 這個庫(所以才能這么少的代碼實現(xiàn))垃僚,運行前需要安裝 pgzero 庫:
pip install pgzero
(或者通過 IDE 安裝)
運行時需要帶上項目里的 images 和 music 文件夾(你可以替換里面的圖片和音樂)
每一張牌是一個 Actor 對象(相當(dāng)于一般游戲開發(fā)中的精靈類),具有種類(12種各12張)规辱、層級谆棺、狀態(tài)(不可點/可點/已收集)等屬性。
開局時隨機打亂后擺放按摘,根據(jù)種類顯示不同圖片包券。
除了最上層的牌可點纫谅,其余均不可點。
# 初始化牌組溅固,12*12張牌隨機打亂
ts = list(range(1, 13))*12
random.shuffle(ts)
n = 0
for k in range(7): # 7層
for i in range(7-k): #每層減1行
for j in range(7-k):
t = ts[n] #獲取排種類
n += 1
tile = Actor(f'tile{t}') #使用tileX圖片創(chuàng)建Actor對象
tile.pos = 120 + (k * 0.5 + j) * tile.width, 100 + (k * 0.5 + i) * tile.height * 0.9 #設(shè)定位置
tile.tag = t #記錄種類
tile.layer = k #記錄層級
tile.status = 1 if k == 6 else 0 #除了最頂層付秕,狀態(tài)都設(shè)置為0(不可點)這里是個簡化實現(xiàn)
tiles.append(tile)
判斷鼠標點擊的位置是否處于某張可點的牌內(nèi),是的話就從所有牌列表中移除侍郭,加到下方牌堆列表里询吴。
然后遍歷與這張牌有重疊的下一層牌,對于每張下層牌亮元,反過來檢查是否有其他上層牌覆蓋它猛计,如果沒有,就把它變成可點爆捞。
for tile in reversed(tiles): #逆序循環(huán)是為了先判斷上方的牌奉瘤,如果點擊了就直接跳出,避免重復(fù)判定
if tile.status == 1 and tile.collidepoint(pos):
# 狀態(tài)1可點煮甥,并且鼠標在范圍內(nèi)
tile.status = 2
tiles.remove(tile)
diff = [t for t in docks if t.tag != tile.tag] #獲取牌堆內(nèi)不相同的牌
if len(docks) - len(diff) < 2: #如果相同的牌數(shù)量<2盗温,就加進牌堆
docks.append(tile)
else: #否則用不相同的牌替換牌堆(即消除相同的牌)
docks = diff
for down in tiles: #遍歷所有的牌
if down.layer == tile.layer - 1 and down.colliderect(tile): #如果在此牌的下一層,并且有重疊
for up in tiles: #那就再反過來判斷這種被覆蓋的牌成肘,是否還有其他牌覆蓋它
if up.layer == down.layer + 1 and up.colliderect(down): #如果有就跳出
break
else: #如果全都沒有卖局,說明它變成了可點狀態(tài)
down.status = 1
return
下方牌堆達到7張為失敗,上方?jīng)]有剩牌則為勝利
# 達到7張双霍,失敗
if len(docks) >= 7:
screen.blit('end', (0, 0))
# 沒有剩牌砚偶,勝利
if len(tiles) == 0:
screen.blit('win', (0, 0))
本demo距離《羊了個羊》尚有改進空間,有興趣的小伙伴可自行嘗試擴展洒闸,包括但不限于:
- 道具功能
- 增加收牌的動畫效果(可以用 pgzero 提供的 animate 方法)
- 更多的關(guān)卡布局
- 打包成exe
- 游戲排行榜
- 當(dāng)然還有游戲最最核心的部分:觀看廣告
代碼已開源:
python666點cn/c/8
可下載染坯,可修改,可商用顷蟀,但公開發(fā)布需署名來源:Crossin的編程教室
如果喜歡的話酒请,感謝幫忙點贊和轉(zhuǎn)發(fā)骡技,你的支持是我持續(xù)更新的動力鸣个!
我是Crossin,我們下個游戲見~
對了布朦,哦囤萤,對了,如果你想學(xué)Python是趴,記得來看下我的《人人都能學(xué)Python》系列
零基礎(chǔ)python入門 圖文系列教程:python666點cn