Java五子棋 人人對戰

2021-09-12 03:46:39 字數 1660 閱讀 2643

五子棋是國內受到普遍歡迎的一款遊戲,規則簡單,趣味不俗。作為一名程式設計師,自然也希望將它移植到電腦上。

這篇我們要講的主要就是實現簡單的人人對戰,ai演算法放到以後單獨說。

我們先來整理一下脈絡,看看實現五子棋需要哪些內容:

按鈕的監聽我們新增在actionperformed方法(使用這個方法需要新增actionlistener介面)裡,通過e.getactioncommand來獲得按鈕的名字來判斷是哪個按鈕,實現相應的功能。而落子的監聽我們通過mousepressedmousereleasedmouseclicked來實現(需要繼承mouseadapter類或者新增mouselistener介面)。

其中mouseclicked不推薦使用,因為不好界定click的時間,本身似乎也有些問題,有些時候會監聽不到,而前兩個則沒有上述問題。我則選擇了mousepressed

棋盤已經繪製完成,而五子棋的子下在棋盤線的交點處,為了棋盤的公整,應當將棋下在交點上,這只需要簡單的數學計算就可以算出來,至於棋子長什麼樣,大家自己動手。

棋子已經能畫出來了,但這顯然是不夠的,因為之後還有勝負判斷,人可以一眼看到棋盤上子落在何處,計算機可不行,我們得用容器將棋子落下的位置儲存下來,乙個二維陣列即可(0表示空,1表示黑子,2表示白子,當然其他方法也可以)。此外如果我們還要新增悔棋功能,那麼僅儲存棋子落下的位置是完全不夠的,我們需要知道落子的先後順序,所以我們應當選擇使用有序容器。這裡我選擇了vector,當然其他有序容器也都可以,自己選擇。

為了儲存和之後的操作方便,我們把棋子的位置(x和y)用乙個類來儲存,這個類十分簡單,只需要兩個int即可。這裡,我儲存的x和y並非是棋子在棋盤上的絕對位置,而是棋子的序號(0-14),這樣的好處是在中間使用的時候十分清楚,並且如果要改變棋盤的大小等屬性,只需要在繪畫時更改公式即可,中間過程一概不用動。

到這裡,落子的監聽基本就完成了,總結一下:

借助mousepressed方法,監聽滑鼠事件

通過二維陣列儲存棋盤各個位置的狀態,方便判斷勝負

通過vector儲存落子的順序,方便悔棋

將棋子的座標打包成乙個類,儲存其在棋盤上的序號,避免棋盤變化導致大量的改動需求

最後這一部分非常簡單,只需要在每次落子之後判斷一下是否達成五子即可。又因為五子棋規則簡單,在落子之後棋子的位置不會再發生變化,所以只需要判斷落子點是否會形成五子就可以,沒必要每次都遍歷全域性。五子棋共有8個方向,但是形成連子其實只有四條直線,所以只需要判斷四次。

先往上再往下,遇到異色子或者邊界就停下,每個同色自給計數變數+1,加上自身含有5個即可達成勝利。這裡基本不會遇到什麼問題,只要細心判斷邊界,保證下標不越界就不會有任何問題。

上述三個部分完成,五子棋-人人對戰基本就完成了,但是重繪是每次繪圖都會遇到的問題,在這裡就提醒一下不要忘記重繪,不懂重繪的可以去搜尋一下關於重繪的文章,本身並不是很難。

人人對戰五子棋

c語言人人對戰五子棋 看起來五子棋很簡單,但是對於其中有許多需要考慮的因素,所以前前後後大概花了有24小時左右的時間,找bug的時間應該花的是最多的,另外主要是自己的思考非常重要,不能忙碌的複製別人的 別人每一行 都需要弄清楚,不是簡單意義上的搬磚,那樣對於自己是沒有一點成長的。以下附上我的 c 中...

五子棋人機對戰

參考 人機對戰 填子遊戲的攻防策略 關於機器的應對策略,在前文中有所表述,不一一解釋,本文進行了修繕和補強,但漏銅依然存在。增加了乙個倒計時功能,測試了一下,感覺一般,還是留在那裡,表明曾經研究過,供今後完善 增加了棋譜儲存功能和回放功能 增加了悔棋功能,這個還是有些用處的。另外策略中增加了禁手。如...

JS五子棋之人機對戰

文章目錄 1.效果圖 2.ui篇 3.ai篇 先來看看最終實現的效果吧!勝利顯示 主要是使用canvas繪製棋盤以及棋子 canvas繪製棋盤 for var i 0 i 9 i canvas繪製棋子部分 var onestep function i,j,me i,j表示棋盤索引,me表示黑棋或白棋...