105-2 JAVA軟體開發期末專題 - AlphaReverse(黑白棋 Reversi)
- 組員: 陳聲發、王皓玄、謝永家、吳元智
- 單人模式
- 對戰模式
- 棋盤大小可改
- 可以選擇不同難度AI
- 支援悔棋
- 落子提示
- 可單機可對戰
支援隨機選一子反轉
- 電腦AI - 陳聲發
- 棋盤規則 - 陳聲發
- 單人模式 - 謝永家
- 對戰模式 - 王皓玄、陳聲發
- 分數表 - 吳元智
- GUI - 王皓玄
- PowerPoint - 吳元智
- 游戲前期架構 - 謝永家
- 游戲前期使用界面 - 謝永家
-
- 權重: 一般情況下角最重要,邊次之,角附近尤其是角的對角最弱
- 行動力 : 一開始起關鍵作用,所以會發現好的AI一開始會盡量不吃子,目的是減少對方行動力的同時也增加己方的行動力
- 再進階還有 穩定子 和 奇偶性 等等,但這些實作起來比較麻煩
- 目前做法 :取值 = 權重 + 行動力 , 行動力佔主要比重,可行動點在各個位置有其對應的值
- 嘗試走目前每一步可走的位置,計算該局勢的估值後,退一步再往其他可走的位置走,若有若干個較好位置則隨機選一個,目的是不要每次遇到同樣情況都走一樣的位置,增加一些隨機性
- 深度:1步
以上為參考報告前實作的部分 以下為參考一篇黑白棋報告(點擊這裡)的第3-8頁實作出來的部分(原本想把機器學習以前的部分都寫的但後來發現後面太難實作出來了……)
- 只走一步當然不夠,那再往後搜幾步,要的其實不是一直最大化自己的收益,而是假設對方每步都是最好的情況下最小化自己的虧損,也就是找最差的情況不會太差的一步
- 通過文中介紹的極大極小博弈樹,往下搜4步以內的所有可能情況,再調用之前寫好的估值函數來選出最不差的一步
- 深度 :4步(最長3秒左右得出結果)
- 由於中局雙方可能都有超過15步的可走位置,那假設要將深度提升至5步,就必須跑完15^5的情況,這樣會計算很久 - 通過文中介紹的alpha-beta剪枝,一樣用極大極小博弈樹往下搜5步以內的所有有機會是最好的位置,一樣調用之前寫好的估值函數來選出最不差的一步
- 深度 :5步(最長5秒左右得出結果)
- 後來嘗試用AI_medium對戰AI_hard,發現AI_medium竟然領先,於是想說終局部分應該不可以再調用估值函數,而是直接以子數為準,往下搜到結束部分(一定要搜到結束是因為覺得少了估值,最後一步其實很有機會扭轉乾坤)
- 所以AI_medium和AI_hard都根據各自的能力在快結束時使用直接暴力搜到結束的方式,於是AI_hard就沒再輸過AI_medium了
- 由於終局樹不會長很大,可以適量增加深度
- 深度 :medium 8 步, hard 10 步(最長5秒左右得出結果)
-
- 先設定好Socket,然後透過DataOutputStream的writeUTF的方式把訊息傳送到Server端。
- 先設定好Socket,然後透過DataInputStream的readUTH的方式把訊息接受到String裡面。
- 在Host先選擇黑棋/白棋,然後呼叫**LAN.Read()**等待Player連線。
- 開啟Player,然後選擇開始遊戲。當按下開始遊戲,Player會發送"CONNECT"訊息到Host。
- 如果Host/Player是黑棋,那就開始遊戲,等玩家"下棋"時會發送所下的棋子的坐標。
- 如果Host/Player是白棋,那就會執行LAN.Read(),等待Player下棋(
發送訊息)。
- 當按下按鈕(下棋)時,程式會先Update棋盤上的訊息,然後透過LAN.Write發送下的棋子的坐標,然後等待對手回復。
- 當收到對手的回復後,會Update棋盤上的訊息,然後顯示可下棋的點。
- 把LAN.Read()放到一個Thread裡面,然後只呼叫Thread來等待對手回復。