java智能四子棋人機大戰遊戲設計(附項目,以及原創PSD,設計文檔)

本項目是使用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中有各列優先級),同級則隨機落子。(由沈珂實現)

 

三.課程設計思路說明

I.各個類

本程序共設計了一個6個類,主要說下3個類

1.

其中有位置類,即Position類。而且Position類中有一個整型標誌成員Label_Status.

 

Label_Status = 0 表示空 .

 

Label_Status = 1 表示玩家子.

 

Label_Status = 2 表示電腦子.

2.

Game類爲主類,放了佈局的各個控件,以及,玩家和電腦的移動方法等。

3.

MainPanel類爲主面板

II.各個操做的實現

 

1.初始化

 

在設計主界面初始化時先將每一個格子放下表明玩家子和電腦子的Label成員.同時設置爲不可見,而且Label_Status = 0 . 即該位置爲空

 

2.下子

 

實現方法:使相應位置的玩家Label或者電腦Label可見,同時更改標誌。

 

玩家的下子:經過監聽鍵盤和鼠標進行相應的移動,得到玩家下子的位置

 

III.電腦的下子

 

電腦的下子是整個程序的核心,基本是遵循人的思惟

 

設置一個_y[]數組每一個元素初始化爲-1,表示該列無可下位置

 

1.找到每列能夠下的位置

 

遍歷某一列的每一行( x : 0-- 6),找到能下子的那一行,即該子的y座標

 

找到後位置賦值給_y[],_y[x] = y’;

 

固然此處的y座標對應的位置應該爲115 + 100 * y

 

同時x座標對應的位置爲375 + 100 * x

 

(這個位置由棋盤大小,和佈局時埋子的方式決定)

 

2.找出各列放電腦子後可成最大連子數

 

定義了一個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));

 

3.考慮各類特殊狀況

 

①假設該子爲電腦子,判斷能連成四子

 

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最大值

 

具體代碼編寫順序以下:

 

 

 

 

 

 

.程序的成長過程,特色,以及須要改進的地方 

 

1.成長過程

 

.自我完善

 

因爲以前照着網上的例子敲過人與人對戰的五子棋,因此完成的效率很是的高,在老師說公佈題目以後,咱們組便開了的個會,把基本的算法定下了。組員沈珂的「假設下子」思想,對咱們的代碼實現做用很是之大,在這第一次會議中便肯定了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%之間徘徊。

 

2.程序的特色

 

      本程序的」假設下子」思想是採用枚舉的方法優勢在於不須要考慮具體狀況,如:

 

 

 

 

在方法6中,能夠攔截的狀況有:

 

 

 

1.水平將有兩種方法成4

 

 

 

 

 

 

 

 

 

 

2.斜方向上將有兩種方法成4

 

 

 

 

 

 

 

 

 

 

3.雙方向成3

 

 

 

 

 

 

...........等等。即只要符合下一子,能有兩種方法成四子就攔,並不須要考慮具體狀況,由電腦「假設下子」去枚舉,代碼效率很是的高,與其餘組的程序對比,基本以能夠20行代碼發揮200行代碼的做用。

 

3.須要改進的地方

1)完善方法8

2寫出,提早攔截 玩家在下一個子以後成三子,致使咱們被迫去攔截,同時還給他本身墊腳 的方法

 

項目鏈接  https://pan.baidu.com/s/1mM95FgUyeHWT6AhY8hA8CA

相關文章
相關標籤/搜索