《java語言程序設(shè)計(jì)》課程設(shè)計(jì)中國象棋對(duì)弈系統(tǒng)(源碼)_第1頁
《java語言程序設(shè)計(jì)》課程設(shè)計(jì)中國象棋對(duì)弈系統(tǒng)(源碼)_第2頁
《java語言程序設(shè)計(jì)》課程設(shè)計(jì)中國象棋對(duì)弈系統(tǒng)(源碼)_第3頁
《java語言程序設(shè)計(jì)》課程設(shè)計(jì)中國象棋對(duì)弈系統(tǒng)(源碼)_第4頁
《java語言程序設(shè)計(jì)》課程設(shè)計(jì)中國象棋對(duì)弈系統(tǒng)(源碼)_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、數(shù)學(xué)與應(yīng)用數(shù)學(xué)專業(yè)java課程設(shè)計(jì)報(bào)告 java語言程序設(shè)計(jì)課程設(shè)計(jì)姓 名: 王 * 學(xué) 號(hào): 指導(dǎo)教師: 班 級(jí): 所在院系: java語言程序設(shè)計(jì)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)項(xiàng)目名稱:中國象棋對(duì)弈系統(tǒng)作者姓名與單位:王浩 數(shù)學(xué)與應(yīng)用數(shù)學(xué)專業(yè) 數(shù)學(xué)081班摘要:本文主要是運(yùn)用java實(shí)現(xiàn)具有一定功能的中國象棋對(duì)弈系統(tǒng)軟件,主要功能如下:a、 象棋對(duì)弈:紅方先走,然后黑方再走,紅黑交替,直到一方獲勝。b、 新游戲:任何時(shí)候可以重新開始一盤新的對(duì)弈。c、 悔棋:當(dāng)走錯(cuò)棋的時(shí)候可以悔棋。d、 信息提示:提示當(dāng)前信息狀態(tài)。e、 簡單的幫助文檔:象棋規(guī)則介紹、軟件的簡單介紹和編制說明關(guān)鍵詞:java、中國象棋對(duì)弈系統(tǒng)

2、 正文:一 程序設(shè)計(jì)說明1.1程序的設(shè)計(jì)及實(shí)現(xiàn)本系統(tǒng)主要有以下4個(gè)模塊,每個(gè)模塊對(duì)應(yīng)一個(gè)程序包:1、engine:搜索引擎包,系統(tǒng)的核心部分。2、message:網(wǎng)絡(luò)對(duì)戰(zhàn)過程中各種消息及其傳遞機(jī)制的類實(shí)現(xiàn)包。3、main:主界面實(shí)現(xiàn)包。4、pieces:棋子及其相關(guān)類實(shí)現(xiàn)包?,F(xiàn)就各個(gè)包中的要點(diǎn)給與說明。1.1.1 搜索引擎的實(shí)現(xiàn)(engine包)(1) bitboard.java:位棋盤的實(shí)現(xiàn),見2.4節(jié)。(2) ccevalue.java:評(píng)價(jià)函數(shù)知識(shí)類。本程序使用開源軟件“夢(mèng)入神蛋”的快速評(píng)價(jià)函數(shù)。該函數(shù)包含子力價(jià)值和棋子所在位置的獎(jiǎng)勵(lì)值。子力價(jià)值分別是:帥-0, 仕- 40, 象-40,

3、 馬-88, 車-200, 炮-96, 兵-9。帥是無價(jià)的,用0表示。以馬為例,位置的獎(jiǎng)勵(lì)值如下:0, -3, 5, 4, 2, 2, 5, 4, 2, 2,-3, 2, 4, 6,10,12,20,10, 8, 2,2, 4, 6,10,13,11,12,11,15, 2,0, 5, 7, 7,14,15,19,15, 9, 8,2,-10, 4,10,15,16,12,11, 6, 2,0, 5, 7, 7,14,15,19,15, 9, 8,2, 4, 6,10,13,11,12,11,15, 2,-3, 2, 4, 6,10,12,20,10, 8, 2,0, -3, 5, 4, 2,

4、 2, 5, 4, 2, 2 上面的每行代表棋盤的一條縱線。其中,-10所在的位置是“窩心馬”,所以要罰10分。(3) chessposition.java:動(dòng)態(tài)局面類包含對(duì)局過程中的動(dòng)態(tài)信息,主要實(shí)現(xiàn)的是2.4節(jié)的各類位棋盤和移子函數(shù)。(4) movestruct.java:著法表示類。(5) premove.java:偽合法著法生成模塊,見4.1。(6) movesortstruct.java:合法著法的生成及其排序算法,見4.2。(7) searchmove.java:搜索算法,實(shí)現(xiàn)如下功能:1)主置換表及開局庫2)alpha-beta搜索算法3)針對(duì)吃子著法的靜態(tài)搜索算法4)適應(yīng)性空著

5、裁剪算法:見5.5.2,根據(jù)不同情況來調(diào)整r值的做法,稱為“適應(yīng)性空著裁剪”(adaptive null-move pruning),它首先由ernst heinz發(fā)表在1999年的icca雜志上。其內(nèi)容可以概括為:a. 深度小于或等于6時(shí),用r = 2的空著裁剪進(jìn)行搜索b. 深度大于8時(shí),用r = 3; c. 深度是6或7時(shí),如果每方棋子都大于或等于3個(gè),則用 r = 3,否則用 r = 2。5)帶時(shí)間控制的迭代加深搜索算法:每次加深搜索都判斷時(shí)間是否夠用。6)“將軍”擴(kuò)展(加深)搜索算法:當(dāng)搜索到己方被“將”時(shí),增加搜索的深度。7)主要變例搜索算法1.1.2 信息傳輸機(jī)制(message包

6、)在對(duì)弈過程中(主要是網(wǎng)絡(luò)對(duì)弈)需要在對(duì)弈雙方之間傳輸各類信息,抽象為各類消息。如時(shí)間規(guī)則的協(xié)定、各方的走子信息等。每方都有消息接收、消息處理和消息發(fā)送程序(outermsgreceiver、localmsgreceiver,qzmessagehandler,messagesender)。己方的messagesender與對(duì)方的outermsgreceiver通過接口srconnection連接。所有接收的消息放入消息隊(duì)列qzmsgqueue中,等待消息處理進(jìn)程qzmessagehandler來處理。所有的消息都封裝在qzmessage類對(duì)象中,消息的類型通過消息的header類型(以靜態(tài)常量

7、存放在msgheader類中)來區(qū)分。1.1.3 棋子(pieces包)qizi.java包含棋子的信息,如棋子的(在棋盤上的)位置、圖片、名稱、類型、狀態(tài)等。piecesfactory.java以“工廠”模式提供根據(jù)棋子類型或其他信息生成相關(guān)qizi對(duì)象的方法。1.2主控模塊(main包)實(shí)現(xiàn)了程序界面與消息傳遞、搜索引擎的集成。(1) newboard.java:棋盤坐標(biāo)系統(tǒng)及其界面的實(shí)現(xiàn)。(2) cchessapp.java:主界面類,以內(nèi)部類實(shí)現(xiàn)了qzmessagehandler接口、計(jì)時(shí)規(guī)則timerule接口以及事件的處理程序,根據(jù)需要生成其他的并發(fā)線程如消息接收、處理和發(fā)送,機(jī)器

8、思考(啟動(dòng)搜索引擎),計(jì)時(shí)顯示等。(3) setruledialog.java:設(shè)置規(guī)則的對(duì)話框。(4) setsysinfodialog.java:設(shè)置系統(tǒng)的一些屬性如對(duì)戰(zhàn)模式、連接端口等。(5) translation.java:提供了一系列實(shí)用方法主要有:1)fen串與局面chessposition對(duì)象之間的轉(zhuǎn)換2)不同著法表示(見第一章)之間的轉(zhuǎn)換。如“炮二平五”與“ch2-e2”及“62.5或c2.5“(c和6代表炮)這幾種表示法之間的轉(zhuǎn)換3)棋譜文件的讀入和存儲(chǔ)。4)開局庫的生成:將近年實(shí)戰(zhàn)的棋譜文件(可能有幾種格式)整理生成開局庫。2、 運(yùn)行結(jié)果:3、 設(shè)計(jì)體會(huì):本次課程設(shè)計(jì)主要

9、是運(yùn)用本學(xué)期所學(xué)到的java基礎(chǔ)知識(shí)來設(shè)計(jì)一個(gè)符合要求的中國象棋對(duì)弈系統(tǒng),這期間我遇到了很多的困難,發(fā)現(xiàn)了很多的問題,正是在解決問題的期間我才慢慢地熟悉了java的基礎(chǔ)知識(shí),才慢慢學(xué)會(huì)了如何去按照給定的要求設(shè)計(jì)出合適的java系統(tǒng)。通過本次課程設(shè)計(jì),我明白了一個(gè)道理:無論做什么事情,都必需養(yǎng)成嚴(yán)謹(jǐn),認(rèn)真,善思的工作作風(fēng)遇到問題最好的辦法就是請(qǐng)教別人,因?yàn)槊總€(gè)人掌握的情況都不一樣,一個(gè)人不可能做到處處都懂,必須發(fā)揮群眾的力量,復(fù)雜的事情才能夠簡單化。這一點(diǎn)我深有體會(huì),在很多時(shí)候,我遇到的困難或許別人之前就遇到過,向他們請(qǐng)教遠(yuǎn)比自己在那邊摸索來得簡單,來得快。附件程序代碼:import java.

10、awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.io.*;public class chesspublic static void main(string args)new chessmainframe(中國象棋:觀棋不語真君子,棋死無悔大丈夫);class chessmainframe extends jframe implements actionlistener,mouselistener,runnable/玩家jlabel play = new jlabel32;/棋盤j

11、label image;/窗格container con;/工具欄jtoolbar jmain;/重新開始jbutton anew;/悔棋jbutton repent;/退出jbutton exit;/當(dāng)前信息jlabel text;/保存當(dāng)前操作vector var;/規(guī)則類對(duì)象(使于調(diào)用方法)chessrule rule;/* 單擊棋子* chessmanclick = true 閃爍棋子 并給線程響應(yīng)* chessmanclick = false 吃棋子 停止閃爍 并給線程響應(yīng)*/boolean chessmanclick;/* 控制玩家走棋* chessplayclick=1 黑棋走棋

12、* chessplayclick=2 紅棋走棋 默認(rèn)紅棋* chessplayclick=3 雙方都不能走棋*/int chessplayclick=2;/控制棋子閃爍的線程thread tmain;/把第一次的單擊棋子給線程響應(yīng)static int man,i;chessmainframe()new chessmainframe(中國象棋);/* 構(gòu)造函數(shù)* 初始化圖形用戶界面*/chessmainframe(string title)/獲行客格引用con = this.getcontentpane();con.setlayout(null);/實(shí)例化規(guī)則類rule = new chessr

13、ule();var = new vector();/創(chuàng)建工具欄jmain = new jtoolbar();text = new jlabel(歡迎使用象棋對(duì)弈系統(tǒng));/當(dāng)鼠標(biāo)放上顯示信息text.settooltiptext(信息提示);anew = new jbutton( 新 游 戲 );anew.settooltiptext(重新開始新的一局);exit = new jbutton( 退 出 );exit.settooltiptext(退出象棋程序程序);repent = new jbutton( 悔 棋 );repent.settooltiptext(返回到上次走棋的位置);/把組件

14、添加到工具欄jmain.setlayout(new gridlayout(0,4);jmain.add(anew);jmain.add(repent);jmain.add(exit);jmain.add(text);jmain.setbounds(0,0,558,30);con.add(jmain);/添加棋子標(biāo)簽drawchessman();/注冊(cè)按扭監(jiān)聽anew.addactionlistener(this);repent.addactionlistener(this);exit.addactionlistener(this);/注冊(cè)棋子移動(dòng)監(jiān)聽for (int i=0;i screens

15、ize.height)framesize.height = screensize.height;if (framesize.width screensize.width)framesize.width = screensize.width;this.setlocation(screensize.width - framesize.width) / 2 - 280 ,(screensize.height - framesize.height ) / 2 - 350); /設(shè)置this.seticonimage(new imageicon(image紅將.gif).getimage();this.

16、setresizable(false);this.settitle(title);this.setsize(558,670);this.show();/* 添加棋子方法*/public void drawchessman()/流程控制int i,k;/圖標(biāo)icon in;/黑色棋子/車in = new imageicon(image黑車.gif);for (i=0,k=24;i2;i+,k+=456)playi = new jlabel(in);playi.setbounds(k,56,55,55);playi.setname(車1);/馬in = new imageicon(image黑馬.

17、gif);for (i=4,k=81;i6;i+,k+=342)playi = new jlabel(in);playi.setbounds(k,56,55,55);playi.setname(馬1);/相in = new imageicon(image黑象.gif);for (i=8,k=138;i10;i+,k+=228)playi = new jlabel(in);playi.setbounds(k,56,55,55);playi.setname(象1);/士in = new imageicon(image黑士.gif);for (i=12,k=195;i14;i+,k+=114)pla

18、yi = new jlabel(in);playi.setbounds(k,56,55,55);playi.setname(士1);/卒in = new imageicon(image黑卒.gif);for (i=16,k=24;i21;i+,k+=114)playi = new jlabel(in);playi.setbounds(k,227,55,55);playi.setname(卒1 + i);/炮in = new imageicon(image黑炮.gif);for (i=26,k=81;i28;i+,k+=342)playi = new jlabel(in);playi.setbo

19、unds(k,170,55,55);playi.setname(炮1 + i);/將in = new imageicon(image黑將.gif);play30 = new jlabel(in);play30.setbounds(252,56,55,55);play30.setname(將1);/紅色棋子/車in = new imageicon(image紅車.gif);for (i=2,k=24;i4;i+,k+=456)playi = new jlabel(in);playi.setbounds(k,569,55,55);playi.setname(車2);/馬in = new image

20、icon(image紅馬.gif);for (i=6,k=81;i8;i+,k+=342)playi = new jlabel(in);playi.setbounds(k,569,55,55);playi.setname(馬2);/相in = new imageicon(image紅象.gif);for (i=10,k=138;i12;i+,k+=228)playi = new jlabel(in);playi.setbounds(k,569,55,55);playi.setname(象2);/士in = new imageicon(image紅士.gif);for (i=14,k=195;i

21、16;i+,k+=114)playi = new jlabel(in);playi.setbounds(k,569,55,55);playi.setname(士2);/兵in = new imageicon(image紅卒.gif);for (i=21,k=24;i26;i+,k+=114)playi = new jlabel(in);playi.setbounds(k,398,55,55);playi.setname(卒2 + i);/炮in = new imageicon(image紅炮.gif);for (i=28,k=81;i 15 & man 25 & man =0 & man 3

22、& man 7 & man 11 & man 15 & man 25 & man =0 & man 3 & man 7 & man 11 & man 16)rule.chaprule(man,playman,play,me);/移動(dòng)將、帥else if (man = 30 | man = 31)rule.willrule(man,playman,play,me);/是否走棋錯(cuò)誤(是否在原地沒有動(dòng))if (ex = playman.getx() & ey = playman.gety()text.settext( 黑棋走棋);chessplayclick=1;else text.settext(

23、 紅棋走棋);chessplayclick=2;/else if/當(dāng)前沒有操作(停止閃爍)chessmanclick=false;/if/單擊棋子else/第一次單擊棋子(閃爍棋子)if (!chessmanclick)for (int i=0;i32;i+)/被單擊的棋子if (me.getsource().equals(playi)/告訴線程讓該棋子閃爍man=i;/開始閃爍chessmanclick=true;break;/for/if/第二次單擊棋子(吃棋子)else if (chessmanclick)/當(dāng)前沒有操作(停止閃爍)chessmanclick=false;for (i=0

24、;i 15 & man 25 & man =0 & man 3 & man 7 & man 11 & man 15 & man 25 & man =0 & man 3 & man 7 & man 11 & man 16)rule.chaprule(man,playman,playi,play);/將、帥吃棋規(guī)則else if (man = 30 | man = 31)rule.willrule(man,playman,playi,play);playman.setvisible(true);/是否走棋錯(cuò)誤(是否在原地沒有動(dòng))if (ex = playman.getx() & ey = play

25、man.gety()text.settext( 黑棋走棋);chessplayclick=1;break;else text.settext( 紅棋走棋);chessplayclick=2;break;/else if /if/for/是否勝利if (!play31.isvisible()joptionpane.showconfirmdialog(this,黑棋勝利,玩家一勝利,joptionpane.default_option,joptionpane.warning_message);/雙方都不可以在走棋了chessplayclick=3;text.settext( 黑棋勝利);/if e

26、lse if (!play30.isvisible()joptionpane.showconfirmdialog(this,紅棋勝利,玩家二勝利,joptionpane.default_option,joptionpane.warning_message);chessplayclick=3;text.settext( 紅棋勝利);/else if/else/elsepublic void mousepressed(mouseevent me)public void mousereleased(mouseevent me)public void mouseentered(mouseevent m

27、e)public void mouseexited(mouseevent me)/* 定義按鈕的事件響應(yīng)*/public void actionperformed(actionevent ae) /重新開始按鈕if (ae.getsource().equals(anew)int i,k;/重新排列每個(gè)棋子的位置/黑色棋子 /車for (i=0,k=24;i2;i+,k+=456)playi.setbounds(k,56,55,55);/馬for (i=4,k=81;i6;i+,k+=342)playi.setbounds(k,56,55,55);/相for (i=8,k=138;i10;i+,

28、k+=228)playi.setbounds(k,56,55,55);/士for (i=12,k=195;i14;i+,k+=114)playi.setbounds(k,56,55,55);/卒for (i=16,k=24;i21;i+,k+=114)playi.setbounds(k,227,55,55);/炮for (i=26,k=81;i28;i+,k+=342)playi.setbounds(k,170,55,55);/將play30.setbounds(252,56,55,55);/紅色棋子/車for (i=2,k=24;i4;i+,k+=456)playi.setbounds(k,

29、569,55,55);/馬for (i=6,k=81;i8;i+,k+=342)playi.setbounds(k,569,55,55);/相for (i=10,k=138;i12;i+,k+=228)playi.setbounds(k,569,55,55);/士for (i=14,k=195;i16;i+,k+=114)playi.setbounds(k,569,55,55);/兵for (i=21,k=24;i26;i+,k+=114)playi.setbounds(k,398,55,55);/炮for (i=28,k=81;i30;i+,k+=342)playi.setbounds(k,

30、455,55,55);/帥play31.setbounds(252,569,55,55);chessplayclick = 2;text.settext( 紅棋走棋);for (i=0;i32;i+)playi.setvisible(true);/清除vector中的內(nèi)容var.clear();/悔棋按鈕else if (ae.getsource().equals(repent)try/獲得setvisible屬性值string s = (string)var.get(var.size()-4);/獲得x坐標(biāo)int x = integer.parseint(string)var.get(var

31、.size()-3);/獲得y坐標(biāo)int y = integer.parseint(string)var.get(var.size()-2);/獲得索引int m = integer.parseint(string)var.get(var.size()-1);/賦給棋子playm.setvisible(true);playm.setbounds(x,y,55,55);if (playm.getname().charat(1) = 1)text.settext( 黑棋走棋);chessplayclick = 1; elsetext.settext( 紅棋走棋);chessplayclick =

32、2;/刪除用過的坐標(biāo)var.remove(var.size()-4);var.remove(var.size()-3);var.remove(var.size()-2);var.remove(var.size()-1);/停止旗子閃爍chessmanclick=false;catch(exception e)/退出else if (ae.getsource().equals(exit)int j=joptionpane.showconfirmdialog(this,真的要退出嗎?,退出,joptionpane.yes_option,joptionpane.question_message);i

33、f (j = joptionpane.yes_option)system.exit(0);/*定義中國象棋規(guī)則的類*/class chessrule /*卒子的移動(dòng)規(guī)則*/public void armsrule(int man,jlabel play,mouseevent me)/黑卒向下if (man 27 & (me.gety()-play.gety() 86 & (me.getx()-play.getx() 0)/當(dāng)前記錄添加到集合(用于悔棋)var.add(string.valueof(play.isvisible();var.add(string.valueof(play.getx();var.add(string.valueof(play.gety();var.add(string.valueof(man);play.setbounds(play.getx(),

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論