精華區beta Programming 關於我們 聯絡資訊
※ 引述《Beethovenlu@kkcity.com.tw (...)》之銘言: : 我才剛開始想學寫C++的程式 : 其實之前就有修過一些程式語言的課程了 : 但是資料結構和演算法之類的課卻都沒有研究過 : 最近突發奇想想要寫一個程式 : 是人和電腦對戰的遊戲:「畫圈圈」 : 應該很多人玩過 : 盤面如下: : * : * * : * * * : * * * * : * * * * * : 五層的三角形 : 玩家和對手輪流劃掉盤面上的圈圈 : 最多劃三個,最少劃一個 : 誰劃到最後一個就輸了 : 這個遊戲最多才十五步 : 比圈圈叉叉多一點點 : 而且也有對稱性的盤面 正好我有寫過這個遊戲,畫圈圈 當你要設計如何讓電腦畫掉盤面上的圈圈時,不妨參考參考我設計過的方法 實際跑過之後,確實是可以破解這個遊戲的 (15個圈圈) 假設盤面的圈圈個數: n 因為畫到剩最後一個圈圈時,下一個人必定畫到最後一個 所以當 n=1 時,都是必敗盤面 接下來從 n=2 開始搜尋每一種畫法 假設 n=2 的其中一種盤面是 S2 令 T 為 S2 之中畫掉一次盤面上的圈圈的所有方法的集合 若存在 e 屬於 T,使得 S2 - e 的圈圈個數為 1 => e 為必勝著點,且 S2 為必勝盤面 接下來從 n=k 開始插尋每一種畫法 假設 n=k 的其中一種盤面是 Sk 令 T 為 Sk 之中畫掉一次盤面上的圈圈的所有方法的集合 若存在所有 e 屬於 T,使得 Sk - e 為必勝盤面 => Sk 為必敗盤面 若 Sk 為非必敗盤面,且若存在 e 屬於 T,使得 Sk - e 為必敗盤面 => e 為必勝著點,且 Sk 為必勝盤面 舉例: 假設搜尋到 n=4,且 S4 = ○ , T = { ○, ○, , , , ... , } ○○ ○ ○ ○○ ○ ○ ○ ○ ○ ○ ∵ T 的所有元素 e 都使得 S4 - e 為必勝盤面 ∴ S4 為必敗盤面 假設搜尋到 n=3,且 S3 = ○ , T = { ○, ○, ○ , , ... , } ○○ ○ ○ ○○ ○ ∵ 存在 e = ○○ 屬於 T,使得 S3 - e = ○ 為必敗盤面 ∴ e 為必勝著點,且 S3 為必勝盤面 以上報告完畢。 : 但是因為才剛開始想要研究這類的程式 : (象棋、西洋棋、五子棋...之類的對弈遊戲) : 所以不太知道該從哪裡入門 : 有上網找過一些資料 : 包括MIN-MAX法或ALPHA-BETA法、樹狀結構、遞迴、指標...等好像都是必備的知識 : 不過完整的程式碼範例很像很少... : 我想請有經驗寫過類似程式的人能夠推薦一些書讓我參考 : 希望書的內容由簡入深,並且有詳細的範例和說明(希望是以C++為設計平台) : (找過好多書和資料都只是提供寫遊戲的"觀念",但範例和步驟解釋卻不甚詳細...) : 感謝~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.205.85