本項目是使用java技術+自創「假設下子」算法開發的人機大戰四子棋遊戲客戶端。java
具體項目,以及原創PSD,設計文檔,在文件末尾的百度雲鏈接。算法
組名:CST數組
組長:陳飛良(C):架構
組員:佈局
沈珂 (S):網站
譚明航 (T):this
本程序的代碼實現思想由三人共同討論得出,其中組員沈珂的「假設下子」思想尤其精妙,讓代碼實現更爲簡單,在這基礎上,組員譚明航 ,心思縝密,考慮到各類特殊狀況,讓整個更加智能。組長陳飛良則負責在他們的基礎上設計算法進行完善。spa
遊戲的總體界面由三人共同討論,組長陳飛良使用PS製做而成。設計
Ⅰ.遊戲的整體佈局與架構由組長陳飛良完成。htm
Ⅱ.本遊戲的核心是電腦的下子方法,共有七步
①假設該子爲電腦子,判斷能連成四子(由譚明航實現)
②假設該子爲玩家子,判斷看是否存在,玩家4子相連,即不算此位置玩家將四子的狀況,有則攔截(由譚明航實現)
③排除墊腳石的狀態, 若是此位置上一位置是玩家子,玩家子可成四子,則該位置優先級爲-9(由沈珂實現)
④排除連子最多,可是到頂端也沒法組成4個連子的(由譚明航實現)
⑤若是電腦放一子下一步 電腦能同時造成2種方法成四子 ,則設置max_x[x] = 4,即優先級爲 4。(由陳飛良實現)
⑥若是玩家放一子下一步玩家能同時造成2種方法成四子則攔截 ,則設置max_x[x] = 10,即優先級爲 10(由陳飛良實現)
⑦普通攻擊,假設電腦按照優先級前後(在max_x中有各列優先級),同級則隨機落子。(由沈珂實現)
本程序共設計了一個6個類,主要說下3個類
其中有位置類,即Position類。而且Position類中有一個整型標誌成員Label_Status.
Label_Status = 0 表示空 .
Label_Status = 1 表示玩家子.
Label_Status = 2 表示電腦子.
Game類爲主類,放了佈局的各個控件,以及,玩家和電腦的移動方法等。
MainPanel類爲主面板
在設計主界面初始化時先將每一個格子放下表明玩家子和電腦子的Label成員.同時設置爲不可見,而且Label_Status = 0 . 即該位置爲空
實現方法:使相應位置的玩家Label或者電腦Label可見,同時更改標誌。
玩家的下子:經過監聽鍵盤和鼠標進行相應的移動,得到玩家下子的位置
電腦的下子是整個程序的核心,基本是遵循人的思惟
設置一個_y[]數組每一個元素初始化爲-1,表示該列無可下位置
遍歷某一列的每一行( x : 0-- 6),找到能下子的那一行,即該子的y座標
找到後位置賦值給_y[],即 _y[x] = y’;
固然此處的y座標對應的位置應該爲115 + 100 * y
同時x座標對應的位置爲375 + 100 * x
(這個位置由棋盤大小,和佈局時埋子的方式決定)
定義了一個max_x存儲每一列(x : 0 --- 7)所下位置各方向可成最大連子,每一個元素初始化爲-10(只是取一個小於0的數能夠隨意取,可是要方便後期的優先級設置,能夠爲-7 -8 等)
使用三次Math.max可求出
max_x[r] = Math.max(Math.max(you, you_xia), Math.max(xia, you_shang));
①假設該子爲電腦子,判斷能連成四子
this.pos[x][y].setLabel_Status(2);
遍歷查找,成立,則落子,直接宣佈比賽結果。
若是不能夠,標誌恢復
this.pos[x][y].setLabel_Status(0);
如下各類狀況同理
②假設該子爲玩家子,判斷看是否存在,玩家4子相連,即不算此位置玩家將四子的狀況,有則攔截
③排除墊腳石的狀態, 若是此位置上一位置是玩家子,玩家子可成四子,則該位置優先級爲-9
把該位置的max_x[x] = -9; (前期max_x元素初始化爲-10)即除非沒地方下,才下此處
④排除連子最多,可是到頂端也沒法組成4個連子的
max_x[x] = 0; 優先級比通常的小,但比墊腳石高
⑤若是電腦放一子下一步 電腦能同時造成2種方法成四子 ,則設置max_x[x] = 10,即優先級爲 4
⑥若是玩家放一子下一步玩家能同時造成2種方法成四子則攔截 ,則設置max_x[x] = 10,即優先級爲 10
⑦普通攻擊,假設電腦下子後,連子最多的位置(在max_x中有各列最大)隨機落子。(前面的墊腳石類的狀況,能夠改變max_x中的值來改變優先級)
若是是2--4列 max_x += 0.5 ; 同等優先級,中間再優先一點,且不會跨級。
可建立一個數組a,把max_x數據賦值過去,而後利用Arrays.Sort方法排序最後去a最後一個元素,即爲a的最大值,即max_x最大值
具體代碼編寫順序以下:
因爲以前照着網上的例子敲過人與人對戰的五子棋,因此完成的效率很是的高,在老師說公佈題目以後,咱們組便開了的個會,把基本的算法定下了。組員沈珂的「假設下子」思想,對咱們的代碼實現做用很是之大,在這第一次會議中便肯定了7個主要的方法,同時在一週後,便寫出了1.0版。而後一路的查漏補缺。
本程序曾與兩個網站的遊戲進行對壘
(1)一個是 http://www.4399.com/flash/48470_1.htm ,這個網站算法有個優勢就是懂得佔據中間位置,比過以後,便決定在咱們2--4列的優先級+0.5,使其在能造成一樣多連子數的時候,比其餘位置優先,儘可能佔據中間位置,可是其餘位置比下此位置連子多時,仍然會下那個連子更多的位置。因爲這個網站沒有寫墊腳石的算法,因此咱們改完以後的勝率是80%左右。
(2)第二個是 http://www.7k7k.com/swf/50447.htm ,這個網站的優勢是能主動造成雙三,比過以後,咱們便在咱們程序中加了兩個方法:
可是,這個網站的方法還有一個方法即是,在下一個子以後成三子,咱們被迫去攔截,同時還給他本身墊腳,此時咱們必輸。
同時,咱們程序沒有寫防止本身給對方墊腳,使其成雙三的算法:
因此,在完善後,咱們的勝率只能在50--60%之間徘徊。
本程序的」假設下子」思想是採用枚舉的方法優勢在於不須要考慮具體狀況,如:
在方法6中,能夠攔截的狀況有:
...........等等。即只要符合下一子,能有兩種方法成四子就攔,並不須要考慮具體狀況,由電腦「假設下子」去枚舉,代碼效率很是的高,與其餘組的程序對比,基本以能夠20行代碼發揮200行代碼的做用。