基于java五子棋游戏设计与实现
歡迎添加微信互相交流學習哦!
項目源碼:https://gitee.com/oklongmm/biye2
摘要:五子棋作為中國古代的傳統黑白棋種之一,有著廣泛的群眾基礎,是一種老少皆宜的棋類休閑游戲。開發一款五子棋游戲可以使廣大棋牌游戲愛好者在閑暇時間切磋棋藝,對互聯網技術的推廣和個人棋藝的提高都有好處。的提高都有好處。
本文是采用JAVA語言寫的五子棋游戲,JAVA語言無論體現在跨平臺還是在面向對象,可移植性,安全性,并發機制和可視化圖形界面的支持都是很好的。選用它作為開發語言,對程序開發來說,很具有高效性。
關 鍵 詞: JAVA語言 棋牌游戲 跨平臺性
Abstract:Backgammon in ancient China, one of the traditional Othello species has a broad mass base, is a casual chess games for all ages. Development of a backgammon board games game can make the general demonstrate their chess enthusiasts in their spare time on Internet technology to promote and improve individual chess is good.
This article is written by JAVA language Gobang games, JAVA language or both reflected in the cross-platform object-oriented, portability, security, concurrency mechanisms and visualization support for graphical interfaces are good. Use it as a development language for the program development, it is very efficient.
Key words:JAVA language Card Games Cross-platform
1. 第一章 系統概述
1.1五子棋簡介
1.1.1五子棋
五子棋是起源于中國古代的傳統黑白棋種之一。亦連五子”、五子連”、串珠”、五目”、五目碰”、五格”等多種稱謂。
玩家根據自身等級和習慣,可以自由選擇不同的游戲房間。其游戲規則也有所不同。詳細分為三種棋室:普通棋室、國標棋室、職業棋室。其中普通棋室不受任何規則限制;國標棋室有禁手規則限制;而職業棋室則在國標棋室的基礎上增加三手交換”和五手兩打”兩項規則。(三手交換:是指黑棋下盤面第3著棋后,白方在應白④之前,如感覺黑方棋形不利于己方,可提出交換,即執白棋一方變為執黑棋一方,而黑方不可以不換。五手兩打:是指黑棋在下盤面上關鍵的第5手棋時,必須下兩步棋,讓白棋在這兩步棋中任選一步,然后再繼續對弈。)
國際比賽規則規定:對局中如黑方出現禁手,白方應立即指出禁手點,黑方即負。如白方在黑方出現禁手后,又落一步白子,黑棋禁手則不成立了。所以 在有禁手的房間里,如果黑方出現禁手,白方應立即按下禁手按鈕。程序會判黑方負。如果這時白方又在棋盤上落一子,黑棋禁手則不成立了。為了簡化用戶對禁手按鈕的使用,也有走禁手就輸和禁手不能落子規則的房間,顧名思義不多介紹。雖然采取了禁手的限制,黑棋先行仍有優勢,黑棋仍可以必勝。所以如果用戶是高段位的棋手,或者想成為高手一定要選擇國際上比賽選用的比賽標準,即三手交換,五手兩打”。
1.1.2五子棋棋盤
棋盤正中一點為天元”。棋盤兩端的橫線稱端線。棋盤左右最外邊的兩條縱線稱邊線。從兩條端線和兩條邊線向正中發展而縱橫交叉在第四條線形成的四個點稱為星”。天元和星應在棋盤上用直徑約為0.5厘米的實心小圓點標出。
以持黑方為準,棋盤上的縱軸線從左到右用英文字母A~O標記。橫行線從近到遠用阿拉伯數字1~15標記。縱橫軸上的橫縱線交叉點分別用橫縱線標記的名稱合寫成。如天元”H8,四個星”分別為D4、D12、L12、L4等。
圖 1.1.2 五子棋棋盤
1.1.3五子棋棋盤
? 行棋順序
黑先、白后,從天元開始相互順序落子。
? 判斷勝負
1、最先在棋盤橫向、豎向、斜向形成連續的相同色五個棋子的一方為勝。
2、黑棋禁手判負(Lose),白棋無禁手。黑棋禁手包括三、三”(Double Three)(包括四、三、三”)、四、四”(Double Four)(包括四、四、三”)、長連”(Overline)。黑棋只能以四、三”取勝。
3、如分不出勝負,則定為平局(Draw)。
4、對局中中途退場判為負。
5、五連與禁手同時形成,先五為勝。
6、黑方禁手形成時,白方應立即指出。若白方未發現或發現后未指明而繼續應子,則不能判黑方負。
1.2課題背景及意義
1.2.1開發背景
隨著社會經濟的發展,青少年的生活環境日益改善,再加上他們基本上都是獨生子女,父母家庭對他們的關愛也就特別強烈。由于家庭給了孩子們太多的關愛,致使許多孩子養成了以自我為中心”的陋習。圍繞自我”片面地分析問題,解決問題是很難把事情辦好的。而五子棋是雙人對弈的項目,行棋過程中就必須同時考慮雙方的意圖和利益,只顧自己的利益,得到的往往是速敗”。再次,五子棋棋手必須從全局入手,正確分析全盤形勢,盡最大限度調用自己的有利因素才能達到取勝的目的。由此看來,五子棋可以改善青少年的思維方式,讓他們培學會知己知彼” 大局入手”的思考方法,這對他們今后走上競爭日益激烈的社會是大有好處的。
一個沒有經歷過失敗的人,一定是個什么也不懂的人。許多青少年碰到一點挫折就退縮,不敢面對,這是他們脆弱的心理所造成的。五子棋有助于修身養性,對下棋的孩子來說,勝敗是常事,關鍵是要學會善于自我反思,善于吸取教訓, 善于積累經驗,使他們有面對失敗的勇氣,有自我調整心態的能力,這也是他們今后走向社會所必須具備的。
1.2.2開發的意義
畢業設計是大學學習的總結,同時也是自己綜合運用所學知識解決實際問題的一次鍛煉。鑒于以上這些,我感覺有必要普及五子棋,發揚這種思維方式與方法。而互聯網作為現今最大的青少年平臺。能很好的推廣青少年去學習五子棋,發展智力。開發五子棋程序,并放置在互聯網平臺上,這樣會很好的讓青少年去關注,以至于愛好它,學習五子棋,培養青少年的智力發育,提高國民整體素質。
1.3 JAVA簡介
Java是一種簡單的,面向對象的,分布式的,解釋型的,健壯安全的,結構中立的,可移植的,性能優異、多線程的動態語言。它不只是一門編程語言,也是一個平臺,它基于Java虛擬機技術,借助這個東西建立了跨平臺的優勢。Java技術的重要性就不講了,從最近流行的一個統計數據上來說,目前世界上編程語言Java 、C 、VB、C++依次排名前4位,這排名本身不說明什么,至少也是工業界對編程語言使用上一個側面的反映吧。
Java平臺:
平臺是程序運行的硬件或軟件環境。Java平臺與大多數其它平臺不同之處在于它是運行于其它基于硬件平臺的純軟件平臺。大多數其它平臺是硬件和操作系統的結合。Java平臺由兩部分組成:
* Java虛擬機(Java VM)
* Java應用程序界面(Java API)
Java平臺是一種純軟件平臺,它有三個版本JavaSE(Java2 Platform Standard Edition,java平臺標準版),JavaEE(Java 2 Platform,Enterprise Edition,java平臺企業版),JavaME(Java 2 Platform Micro Edition,java平臺微型版)。
Java SE(Java Platform,Standard Edition)這個版本以前叫做J2SE,后來版本號從1.4直接跳到5.0,其實也就是1.5,所以就叫成Java SE 5.0。目前Java開發人員使用較多的版本是5.0,當然還有Java SE 6.0這個更新的版本。它允許開發和部署在桌面、服務器、嵌入式環境和實時環境中使用的Java 應用程序。Java SE還包含了支持Java Web服務開發的類,并為Java EE這個版本提供基礎。
雖說桌面應用程序,Java一直不被看好,但也稍微提一下,負責桌面GUI開發的類庫我知道的有:JDK自帶的主要是AWT/SWING這個Java原生類庫;也可以使用IBM的SWT/JFace這個第三方類庫。開發工具我了解的有:NetBeans(最近已經是6.0final版了,做GUI有使用VB的感覺),Eclipse(SWT/JFace這個項目其實就是做Eclipse項目時擴展出來的,所以對SWT/JFace支持的也不錯)。Java EE(Java Platform,Enterprise Edition)這個版本以前叫做J2EE,也就是大家可能聽得比較多的,也是Java比較流行的領域,Java的企業級版本。Java EE下有很多流行的開發框架,像Struts、Spring、Hibernate這種流行的所謂SSH組合等。
Java平臺由Java虛擬機(Java Virtual Machine)和Java 應用編程接口(Application Programming Interface、簡稱API)構成。Java 應用編程接口為Java應用提供了一個獨立于操作系統的標準接口,可分為基本部分和擴展部分。在硬件或操作系統平臺上安裝一個Java平臺之后,Java應用程序就可運行。現在Java平臺已經嵌入了幾乎所有的操作系統。這樣Java程序可以只編譯一次,就可以在各種系統中運行。Java應用編程接口已經從1.1x版發展到1.2版。目前常用的Java平臺基于Java1.4,最近版本為Java1.7。
2. 第二章 系統分析
2.1系統需求
我們在設計游戲的時候有以下一些要求:
一 軟件的界面簡潔明了,操作簡單容易。我們設計的軟件界面必須是簡潔的,游戲需要設計得易操作。
二 軟件具有人工智能算法原理要簡單,并且運行快速。游戲是需要快速反應的。我們需要使用簡單實用的智能算法。
三 游戲要設置幾個難度,便于不同玩家選擇.玩家的游戲水平不一樣,我們設置不同難度供各個水平的玩家選擇。
游戲玩法及規則
現代五子棋專用棋盤為十五路(15X15),共225個交叉點。棋盤正中一點為天元。對局開始時,先由執黑棋一方將一枚棋子落在天元點上,然后由執白棋一方在黑棋周圍的交叉點上落子。但是,為了尊重對方和禮貌起見,持白棋的一方通常將盤面的第二著棋布在自己河界的一側,即直止或斜止。此后黑白雙方輪流落子,直到某一方首先在棋盤的橫線、縱線或斜線上形成連續五子或五子以上〔僅對白棋而言〕,則該方就算獲勝 。連珠五子棋的一個特點是先行的一方優勢很大,因此在職業比賽中對黑方做了種種限制,以利公平競爭。五子棋的比賽規則如下:
1、黑先、白后,從天元開始相互順序落子;
2、最先在棋盤橫向、縱向或斜向形成連續的同色五個棋子的一方為勝;
3、 黑棋禁手判負、白棋無禁手。黑棋禁手有三、三”、四、四”和長連”, 包括四、三、三”和四、四、三”。黑棋只能以四、三”取勝;
4、如分不出勝負,則到為平局;
5、五連與禁手同時形成,判勝;
6、黑方禁手形成時,白方應立即指出。若白方未發現或發現后不立即指出,反而繼續落子,則禁手失效,不再判黑方負。
2.2系統的功能簡介
人機對弈的程序,至少應具備如下幾個部分:
1、某種在機器中表示棋局的方法,能夠讓程序知道博弈的狀態。
2、產生合法走法的規則,以使博弈公正地進行,并可以判斷人類對手是否亂走。
3、從所有合法走法中選擇最佳走法的技術。
4、一種評估局面優劣的方法,用以同上面的技術配合做出智能的選擇。
5、一個界面,有了它,這個程序才能用。
2.2.1 棋盤表示
棋盤表示就是使用一種數據結構來描述棋盤及棋盤上的棋子,通常使用一個二維數組。棋盤的數據表示直接影響到程序的時間及空間復雜度。為了追求更高的效率,研究人員針對不同棋類提出了多種不同的表示方法。有些方法具有更高的效率如比特棋盤表示法。
2.2.2 走法產生
博弈的規則決定了哪些走法是合法的。對有的游戲來說,這很簡單,比如五子棋,任何空白的位置都是合法的落子點。但是對于象棋來說,就有馬走日,象走田等一系列復雜的規則。走法產生是博弈程序中一個相當復雜而且耗費運算時間的過程。不過,通過良好的數據結構可以顯著的提高走法生成的速度。
2.2.3搜索技術
對于計算機來說,直接通過棋盤信息判斷走法的好壞并不精確。除了輸贏這樣的局面可以準確判斷外,其它的判斷都只能做到大致估計。判斷兩種走法孰優孰劣的一個好方法就是觀看棋局走下去的結果。也就是向下搜索若干步,然后比較發展下去的結果。為了避免差錯,我們假定對手的思考也和我們一樣,也就是,我們想到的內容,對手也想到了。這就是極大極小搜索算法的基本原則。極大極小搜索算法的時間復雜度是O(bn)。這里b是分枝因子,指棋局在各種情況下的合法走步的平均值;n是搜索的最大深度,也就是向下搜索的博弈雙方的走步之和。例如向下搜索甲乙雙方各走一步的情形,n就是2。顯然對于五子棋這種分枝因子在200左右的棋類游戲,時間開銷隨著n的增大會急劇的增長,不出幾層就會超出計算機的處理能力,這將導致在有限時間內得不到令人滿意的結果。
人們在開發高效的搜索算法上投入了大量的研究。在過去的幾十年中,一些相當成功的改進大大提高了極大極小搜索的效率。Alpha-Beta剪枝、迭代深化、置換表、歷史啟發等手段的綜合運用將搜索效率提高了幾個數量級。
2.2.4用戶功能
用戶可以直接使用的游戲功能,通過按鍵進行操作。每個用例的簡要說明如下:
1、新游戲:初始化相關變量,清空棋盤。
2、步數計算:計算當前是第幾步
4、棋子坐標:顯示當前所下棋子坐標。
6、下棋提示:提示該哪方下棋子。
7、重新開局:初始化相關變量,清空棋盤。
2.3系統的可行性分析
2.3.1經濟可行性
本游戲使用模塊化設計方案,易于編寫和維護,核心代碼易于移植,總體開發成本低。游戲短小精悍,對目標設備要求低,產品面向受眾廣,可以帶來可觀的經濟效益。
2.3.2技術可行性
JAVA提供了豐富的接口和類服務,本游戲的開發只需要用到基本的繪圖接口和系統的文件服務,實現起來非常簡單。使用JAVA封裝好的數據類可以簡化編碼實現,避免不必要的錯誤。對于以處理數據為主的棋類游戲,編碼實現沒有困難。
2.3.3系統安全性分析
本游戲的開發只使用很少的系統接口和系統服務,數據處理都是在程序內部解決,不涉及與其它程序的數據交互。使用JAVA定義好的構造法分配內存空間,這樣不會在構造出現異常時產生內存泄露。系統會根據已經入棧的對象指針,通過析構函數收回內存。所以即使程序因為內存不足無法運行,也不會因此而影響系統本身的穩定性和安全性。另外,使用模塊化方法進行設計編碼,可以很方便的調整算法的搜索深度,減小內存的使用量,提高程序的兼容性
3. 第三章 系統設計
3.1系統關鍵類介紹
1、Chess類是游戲的主類,負責初始化游戲棋盤,其實Chess類就是游戲的入口,只有啟動了此類,才有游戲菜單,才可以進行選擇游戲。代碼如下
setVisible(true);
setLayout(null);
Label label = new Label(Gobang v1.0, Label.CENTER);
add(label);
label.setBounds(10, 50, 440, 26);
label.setBackground(Color.orange);
add(chesspad);
chesspad.setBounds(10, 90, 440, 440);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
pack();
setSize(460, 540);
2、Evaluate類是用來估算估值點的坐標,返回的是這個點的價值。代碼如下:
int max_x, max_y, max; //定義坐標 x,y及最大值
public void evaluate(int shape[][][]) {
int i = 0, j = 0;
for (i = 0; i < 19; i++)
for (j = 0; j < 19; j++) {
switch (shape[i][j][0]) {
case 5:
shape[i][j][4] = 200;
break;
case 4:
switch (shape[i][j][1]) {
case 4:
shape[i][j][4] = 150 + shape[i][j][2] + shape[i][j][3];
break;
case 3:
shape[i][j][4] = 100 + shape[i][j][2] + shape[i][j][3];
break;
default:
shape[i][j][4] = 50 + shape[i][j][2] + shape[i][j][3];
}
break;
case 3:
switch (shape[i][j][1]) {
case 3:
shape[i][j][4] = 75 + shape[i][j][2] + shape[i][j][3];
break;
default:
shape[i][j][4] = 20 + shape[i][j][2] + shape[i][j][3];
}
break;
case 2:
shape[i][j][4] = 10 + shape[i][j][1] + shape[i][j][2]
+ shape[i][j][3];
break;
case 1:
shape[i][j][4] = shape[i][j][0] + shape[i][j][1]
+ shape[i][j][2] + shape[i][j][3];
default:
shape[i][j][4] = 0;
}
}
int x = 0, y = 0;
max = 0;
for (x = 0; x < 19; x++)
for (y = 0; y < 19; y++)
if (max < shape[x][y][4]) {
max = shape[x][y][4];
max_x = x;
max_y = y;
}
}
3.2勝負判斷
Judge類中的judge方法是通過掃描當前點周圍的同色棋子數進行判斷,如果勝利則返回True,否則返回False。這個方法需要配合使用,電腦會在下子之后調用這個方法。這個方法實現的偽代碼如下:
static boolean judge(int a[][], int color) {
int i, j, flag;
for (i = 0; i < 19; i++) {
flag = 0;
for (j = 0; j < 19; j++)
if (a[i][j] == color) {
flag++;
if (flag == 5)
return true;
} else
flag = 0;
}
for (j = 0; j < 19; j++) {
flag = 0;
for (i = 0; i < 19; i++)
if (a[i][j] == color) {
flag++;
if (flag == 5)
return true;
} else
flag = 0;
}
for (j = 4; j < 19; j++) {
flag = 0;
int m = j;
for (i = 0; i <= j; i++) {
if (a[i][m--] == color) {
flag++;
if (flag == 5)
return true;
} else
flag = 0;
}
}
for (j = 14; j >= 0; j--) {
flag = 0;
int m = j;
for (i = 0; i <= 18 - j; i++) {
if (a[i][m++] == color) {
flag++;
if (flag == 5)
return true;
} else
flag = 0;
}
}
for (i = 14; i >= 0; i--) {
flag = 0;
int n = i;
for (j = 0; j < 19 - i; j++) {
if (a[n++][j] == color) {
flag++;
if (flag == 5)
return true;
} else
flag = 0;
}
}
for (j = 14; j >= 0; j--) {
flag = 0;
int m = j;
for (i = 18; i >= j; i--) {
if (a[i][m++] == color) {
flag++;
if (flag == 5)
return true;
} else
?
總結
以上是生活随笔為你收集整理的基于java五子棋游戏设计与实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wxpython 可视化开发pdf_Mi
- 下一篇: 用java创建UDF,并用于Hive