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

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

給他 直接 發揮 假設 獲得 思路 -- 攔截 格子

本項目是使用java技術+自創“假設下子”算法開發的人機大戰四子棋遊戲客戶端。

具體項目,以及原創PSD,設計文檔,在文件末尾的百度雲連接。

技術分享圖片

. 小組說明:

組名:CST

組長:陳飛良(C):

組員:

沈珂 S):

譚明航 T):

.分工說明:

①算法思想上:

本程序的代碼實現思想由三人共同討論得出,其中組員沈珂的“假設下子”思想尤為精妙,讓代碼實現更為簡單,在這基礎上,組員譚明航 ,心思縝密,考慮到各種特殊情況,讓整個更加智能。組長陳飛良則負責在他們的基礎上設計算法進行完善。

②遊戲界面上:

遊戲的整體界面由三人共同討論,組長陳飛良使用PS制作而成。

③代碼實現上:

.遊戲的總體布局與架構由組長陳飛良完成。

.本遊戲的核心是電腦的下子方法,共有七步

①假設該子為電腦子,判斷能連成四子(由譚明航實現)

②假設該子為玩家子,判斷看是否存在,玩家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--4max_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

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