🕹回憶殺 python實現 華容道(數字版)可線上玩

更新於 發佈於 閱讀時間約 1 分鐘
raw-image

華容道(數字版)的遊戲描述


初始給定一個1~15數字隨機打散的4x4遊戲版

使用者透過移動空格來重新排列數字
最後數字排成1~15,而且空格剛好在右下角的時候,遊戲結束。


華容道(數字版)的遊戲場景


遊戲開始時,電腦為玩家建立一個4x4的板子,隨機填充0~15的數字。

數字0代表空格


玩家每回合可以移動空格一次,藉此重新排列板子上的數字


最後數字依序排成1~15,而且空格0剛好在右下角的時候,遊戲結束



上層思考邏輯與框架


建立遊戲場景,為玩家建立一個4x4的板子,隨機填充0~15的數字。

數字0代表空格


每回合都先顯示當下的板子狀態給玩家看。

玩家每回合可以選擇一個和空格相鄰的數字,接著把空格移動到對應的位置,
藉此重新排列板子上的數字


接著檢查所有數字是否已經依序排成1~15,而且空格0剛好在右下角?

如果是,則遊戲結束

如果不是,則遊戲繼續。


中層功能元件分析


1.怎麼建立4x4的遊戲版,並且填充隨機數?


透過list()建構子 和 range()先建立長度為16的list,依序填入0~15的數字。


並且使用python內建的random.shuffle()方法,

進行隨機採樣,打散所有數字的位置。


最後,透過List comprehension生成4x4的遊戲版,上面帶著隨機生成的0~15的數字。

class FifteenPuzzle:
def __init__(self):
# 生成4x4的遊戲版
self.board = self.create_board()

# 紀錄空格所在的位置
self.empty_tile = self.find_empty()

def find_empty(self):
# 找空格所在的位置
for y in range(4):
for x in range(4):
if self.board[y][x] == 0:
return y, x

return -1, -1

def create_board(self):
# 生成4x4的遊戲版
tiles = list(range(0, 16))
random.shuffle(tiles)
return [tiles[i:i+4] for i in range(0, 16, 4)]

2.怎麼顯示4x4的遊戲版當下的遊戲狀態?


用雙層迴圈去做輸出排版,印出4x4遊戲版當下的內容。


  def display_board(self):

for row in self.board:
print(' '.join(f'{tile:2}' for tile in row))
print()
return

3.怎麼移動空格(空格用特殊數字0來代表)?


先找出使用者輸入的數字,
接著把空格(用特殊數字0來代表)移動到使用者指定的數字所在的位置上。


  def move_tile(self, tile):

y, x = self.empty_tile
for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
nx, ny = x + dx, y + dy
if 0 <= nx < 4 and 0 <= ny < 4 and self.board[ny][nx] == tile:

# 移動空格
self.board[y][x], self.board[ny][nx] = self.board[ny][nx], self.board[y][x]

# 紀錄空格在移動後的新位置
self.empty_tile = (ny, nx)
return True
return False

4.怎麼判斷遊戲是否已經結束?


每回合檢查所有數字是否已經依序排成1~15,而且空格剛好在右下角?

如果是,則遊戲結束

如果不是,則遊戲繼續。


  def is_solved(self):

# 完全排好的狀態
answer = [list(range(i, i+4)) for i in range(1, 16, 4)]
answer[-1][-1] = 0

'''
[
[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[ 13, 14, 15, 0]
]
'''

# 檢查是否已經排好所有數字
return self.board == answer

5.如何建立遊戲的回合循環機制?


每回合先呼叫 is_solved()檢查是否遊戲結束

如果遊戲還沒結束,就進入while本體
等待使用者輸入數字,透過移動空格去重新排列遊戲版上的數字。



def play():

game = FifteenPuzzle()
while not game.is_solved():
game.display_board()
try:

tile = int(input("Enter the number to move (-1 to quit): "))
if tile == -1:
break

if not game.move_tile(tile):
print("Invalid move!")

except ValueError:
print("Please enter a valid number.")

print("Congratulations! You solved the puzzle!")

底層的完整實作: 華榮道(數字版)

import random

class FifteenPuzzle:
def __init__(self):
self.board = self.create_board()
self.empty_tile = self.find_empty()

def find_empty(self):
for y in range(4):
for x in range(4):
if self.board[y][x] == 0:
return y, x

return -1, -1

def create_board(self):

tiles = list(range(0, 16))
random.shuffle(tiles)
return [tiles[i:i+4] for i in range(0, 16, 4)]


def display_board(self):

for row in self.board:
print(' '.join(f'{tile:2}' for tile in row))
print()
return


def move_tile(self, tile):
y, x = self.empty_tile
for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
nx, ny = x + dx, y + dy
if 0 <= nx < 4 and 0 <= ny < 4 and self.board[ny][nx] == tile:
self.board[y][x], self.board[ny][nx] = self.board[ny][nx], self.board[y][x]
self.empty_tile = (ny, nx)
return True
return False


def is_solved(self):
answer = [list(range(i, i+4)) for i in range(1, 16, 4)]
answer[-1][-1] = 0
'''
[
[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[ 13, 14, 15, 0]
]
'''
return self.board == answer


def play():

game = FifteenPuzzle()
while not game.is_solved():
game.display_board()
try:

tile = int(input("Enter the number to move (-1 to quit): "))
if tile == -1:
break

if not game.move_tile(tile):
print("Invalid move!")

except ValueError:
print("Please enter a valid number.")

print("Congratulations! You solved the puzzle!")

if __name__ == "__main__":
play()

試玩畫面

raw-image

點這行 線上執行 與 試玩(在新的頁面按Run開始玩)


延伸思考:


如果對程式或者演算法有興趣的同學,

可以試著觀察華榮道移動數字的規律,

開發更強的解題演算法嘗試用最少的移動步數去重新排好所有的數字

很有趣喔~

留言
avatar-img
留言分享你的想法!
avatar-img
小松鼠的演算法樂園
96會員
427內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/09/27
井字遊戲(OOXX)的遊戲描述 Tic Tac Toe(井字遊戲)是經典的雙人棋盤遊戲,在一個3x3的方格中進行。 每回合兩個玩家輪流選一個位置,先讓自己的符號(是 X 或 O)在 水平線、垂直線或對角線上連成一線的玩家宣告獲勝。
Thumbnail
2024/09/27
井字遊戲(OOXX)的遊戲描述 Tic Tac Toe(井字遊戲)是經典的雙人棋盤遊戲,在一個3x3的方格中進行。 每回合兩個玩家輪流選一個位置,先讓自己的符號(是 X 或 O)在 水平線、垂直線或對角線上連成一線的玩家宣告獲勝。
Thumbnail
2024/08/13
從範例學python的目標讀者: 針對剛進入的初學者,想學習Python語言。 有基礎本數學邏輯基礎即可。 從小遊戲學python的目標讀者: 針對已經有經驗的C/C++, Python, 或其他有程式基礎的讀者。 想實作一些小專案,從實做中學習如何分析需求、元件分拆、到底層實作
Thumbnail
2024/08/13
從範例學python的目標讀者: 針對剛進入的初學者,想學習Python語言。 有基礎本數學邏輯基礎即可。 從小遊戲學python的目標讀者: 針對已經有經驗的C/C++, Python, 或其他有程式基礎的讀者。 想實作一些小專案,從實做中學習如何分析需求、元件分拆、到底層實作
Thumbnail
2024/08/12
賓果的遊戲描述 在一個5x5的方陣上隨機填充1~25的數字。 玩家(使用者) 和 電腦(AI)輪流叫一個號碼,最先占據一整條直線連線的獲勝。 就像小時候玩的bingo 賓果連線遊戲一樣! (可以是占據兩條對角線,可以是占據水平直線,可以是占據垂直直線)
Thumbnail
2024/08/12
賓果的遊戲描述 在一個5x5的方陣上隨機填充1~25的數字。 玩家(使用者) 和 電腦(AI)輪流叫一個號碼,最先占據一整條直線連線的獲勝。 就像小時候玩的bingo 賓果連線遊戲一樣! (可以是占據兩條對角線,可以是占據水平直線,可以是占據垂直直線)
Thumbnail
看更多
你可能也想看
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
孩子寫功課時瞇眼?小心近視!這款喜光全光譜TIONE⁺光健康智慧檯燈,獲眼科院長推薦,網路好評不斷!全光譜LED、180cm大照明範圍、5段亮度及色溫調整、350度萬向旋轉,讓孩子學習更舒適、保護眼睛!
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
https://www.youtube.com/watch?v=0L2OgNQDzTc 之前看了啾啾鞋這部影片,裡面說退坑一款手遊,也說到一些觀念,就如下圖這樣
Thumbnail
https://www.youtube.com/watch?v=0L2OgNQDzTc 之前看了啾啾鞋這部影片,裡面說退坑一款手遊,也說到一些觀念,就如下圖這樣
Thumbnail
手遊類別裡,修仙類佔了很大一部分,內容大多輕鬆放置,玩起來沒有負擔,這款也是一樣,但他可愛Q版的風格引起了我的注意,不過開頭剛進入遊戲時的選角畫面,不小心期待了一下。
Thumbnail
手遊類別裡,修仙類佔了很大一部分,內容大多輕鬆放置,玩起來沒有負擔,這款也是一樣,但他可愛Q版的風格引起了我的注意,不過開頭剛進入遊戲時的選角畫面,不小心期待了一下。
Thumbnail
短短四天,我沉迷遊戲不可自拔,竟玩了四週目,第一、第二週目的目標明確,攻略小師妹,結果雙雙走向唐門滅門,差點就把我的理智線扯斷了。 是不甘心,也是不服氣,於是開始了第三、第四週目。
Thumbnail
短短四天,我沉迷遊戲不可自拔,竟玩了四週目,第一、第二週目的目標明確,攻略小師妹,結果雙雙走向唐門滅門,差點就把我的理智線扯斷了。 是不甘心,也是不服氣,於是開始了第三、第四週目。
Thumbnail
放視大賞VGW是國內最具指標的數位內容創意設計節,本次講座主講人:赤燭遊戲共同創辦人 - 包子(王瀚宇) / Fourdesire創辦人 - 陳威帆。本文為講座筆記,涵蓋主題包括開發過程中的挑戰、創意設計、跨領域合作、遊戲製作的優勢等。
Thumbnail
放視大賞VGW是國內最具指標的數位內容創意設計節,本次講座主講人:赤燭遊戲共同創辦人 - 包子(王瀚宇) / Fourdesire創辦人 - 陳威帆。本文為講座筆記,涵蓋主題包括開發過程中的挑戰、創意設計、跨領域合作、遊戲製作的優勢等。
Thumbnail
新型態的沉浸式劇場遊戲, 幾乎頂標存在的密室遊戲
Thumbnail
新型態的沉浸式劇場遊戲, 幾乎頂標存在的密室遊戲
Thumbnail
來跟大家統合一下目前實境遊戲中,比較有名的幾家工作室所產的遊戲。
Thumbnail
來跟大家統合一下目前實境遊戲中,比較有名的幾家工作室所產的遊戲。
Thumbnail
作者計劃運用創作型論文的形式來記述遊戲的創作過程,PDF論文草稿中對獨立遊戲與敘事遊戲有所涉及,並歡迎讀者參與討論。
Thumbnail
作者計劃運用創作型論文的形式來記述遊戲的創作過程,PDF論文草稿中對獨立遊戲與敘事遊戲有所涉及,並歡迎讀者參與討論。
Thumbnail
奇怪的頁首圖,其實嘗試過放別的,但位置怎麼都橋不好,就放棄了!🤗 今年的過年沒怎麼出去玩,所以進度,還算可以吧? 文回顧 主線劇情增減。 NPC對話。 前者是做劇情演出時,不滿意的台詞旁白什麼的增減; 後者則是不重要、沒負擔,所以可以拿來訓練構思劇情的速度、以及維持每日都能打文的習
Thumbnail
奇怪的頁首圖,其實嘗試過放別的,但位置怎麼都橋不好,就放棄了!🤗 今年的過年沒怎麼出去玩,所以進度,還算可以吧? 文回顧 主線劇情增減。 NPC對話。 前者是做劇情演出時,不滿意的台詞旁白什麼的增減; 後者則是不重要、沒負擔,所以可以拿來訓練構思劇情的速度、以及維持每日都能打文的習
Thumbnail
沒想到"這個"可以出現在密室裡?! 故事劇情也能引人省思,值得一玩
Thumbnail
沒想到"這個"可以出現在密室裡?! 故事劇情也能引人省思,值得一玩
Thumbnail
探討正義想關主題的桌上解謎遊戲, 好玩卻也能引人省思
Thumbnail
探討正義想關主題的桌上解謎遊戲, 好玩卻也能引人省思
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News