




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、Java語言程序設計實驗報告實驗項目名稱:中國象棋對弈系統(tǒng)作者姓名與單位:李明 數(shù)學與應用數(shù)學專業(yè) 數(shù)學081班摘要:本文主要是運用java實現(xiàn)具有一定功能的中國象棋對弈系統(tǒng)軟件,主要功能如下:a、 象棋對弈:紅方先走,然后黑方再走,紅黑交替,直到一方獲勝。b、 新游戲:任何時候可以重新開始一盤新的對弈。c、 悔棋:當走錯棋的時候可以悔棋。d、 信息提示:提示當前信息狀態(tài)。e、 簡單的幫助文檔:象棋規(guī)則介紹、軟件的簡單介紹和編制說明關鍵詞:java、中國象棋對弈系統(tǒng) 正文:一 程序設計說明1.1程序的設計及實現(xiàn)本系統(tǒng)主要有以下4個模塊,每個模塊對應一個程序包:1、engine:搜索引擎包,系統(tǒng)
2、的核心部分。2、message:網(wǎng)絡對戰(zhàn)過程中各種消息及其傳遞機制的類實現(xiàn)包。3、main:主界面實現(xiàn)包。4、pieces:棋子及其相關類實現(xiàn)包。現(xiàn)就各個包中的要點給與說明。1.1.1 搜索引擎的實現(xiàn)(engine包)(1) BitBoard.java:位棋盤的實現(xiàn),見2.4節(jié)。(2) CCEvalue.java:評價函數(shù)知識類。本程序使用開源軟件“夢入神蛋”的快速評價函數(shù)。該函數(shù)包含子力價值和棋子所在位置的獎勵值。子力價值分別是:帥-0, 仕- 40, 象-40, 馬-88, 車-200, 炮-96, 兵-9。帥是無價的,用0表示。以馬為例,位置的獎勵值如下:0, -3, 5, 4, 2,
3、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, 2, 5, 4, 2, 2 上面的每行代表棋盤的一條縱線。其中,-10所在的位置是“窩心馬”,所以要罰10分。(3) Chess
4、Position.java:動態(tài)局面類包含對局過程中的動態(tài)信息,主要實現(xiàn)的是2.4節(jié)的各類位棋盤和移子函數(shù)。(4) MoveStruct.java:著法表示類。(5) PreMove.java:偽合法著法生成模塊,見4.1。(6) MoveSortStruct.java:合法著法的生成及其排序算法,見4.2。(7) SearchMove.java:搜索算法,實現(xiàn)如下功能:1)主置換表及開局庫2)Alpha-Beta搜索算法3)針對吃子著法的靜態(tài)搜索算法4)適應性空著裁剪算法:見5.5.2,根據(jù)不同情況來調(diào)整R值的做法,稱為“適應性空著裁剪”(Adaptive Null-Move Pruning
5、),它首先由Ernst Heinz發(fā)表在1999年的ICCA雜志上。其內(nèi)容可以概括為:a. 深度小于或等于6時,用R = 2的空著裁剪進行搜索b. 深度大于8時,用R = 3; c. 深度是6或7時,如果每方棋子都大于或等于3個,則用 R = 3,否則用 R = 2。5)帶時間控制的迭代加深搜索算法:每次加深搜索都判斷時間是否夠用。6)“將軍”擴展(加深)搜索算法:當搜索到己方被“將”時,增加搜索的深度。7)主要變例搜索算法1.1.2 信息傳輸機制(message包)在對弈過程中(主要是網(wǎng)絡對弈)需要在對弈雙方之間傳輸各類信息,抽象為各類消息。如時間規(guī)則的協(xié)定、各方的走子信息等。每方都有消息接
6、收、消息處理和消息發(fā)送程序(OuterMsgReceiver、LocalMsgReceiver,QzMessageHandler,MessageSender)。己方的MessageSender與對方的OuterMsgReceiver通過接口SrConnection連接。所有接收的消息放入消息隊列QzMsgQueue中,等待消息處理進程QzMessageHandler來處理。所有的消息都封裝在QzMessage類對象中,消息的類型通過消息的Header類型(以靜態(tài)常量存放在MsgHeader類中)來區(qū)分。1.1.3 棋子(pieces包)Qizi.java包含棋子的信息,如棋子的(在棋盤上的)位
7、置、圖片、名稱、類型、狀態(tài)等。PiecesFactory.java以“工廠”模式提供根據(jù)棋子類型或其他信息生成相關Qizi對象的方法。1.2主控模塊(main包)實現(xiàn)了程序界面與消息傳遞、搜索引擎的集成。(1) NewBoard.java:棋盤坐標系統(tǒng)及其界面的實現(xiàn)。(2) CChessApp.java:主界面類,以內(nèi)部類實現(xiàn)了QzMessageHandler接口、計時規(guī)則TimeRule接口以及事件的處理程序,根據(jù)需要生成其他的并發(fā)線程如消息接收、處理和發(fā)送,機器思考(啟動搜索引擎),計時顯示等。(3) SetRuleDialog.java:設置規(guī)則的對話框。(4) SetSysInfoDi
8、alog.java:設置系統(tǒng)的一些屬性如對戰(zhàn)模式、連接端口等。(5) Translation.java:提供了一系列實用方法主要有:1)FEN串與局面ChessPosition對象之間的轉(zhuǎn)換2)不同著法表示(見第一章)之間的轉(zhuǎn)換。如“炮二平五”與“Ch2-e2”及“62.5或C2.5“(C和6代表炮)這幾種表示法之間的轉(zhuǎn)換3)棋譜文件的讀入和存儲。4)開局庫的生成:將近年實戰(zhàn)的棋譜文件(可能有幾種格式)整理生成開局庫。2、 運行結果:3、 設計體會:本次課程設計主要是運用本學期所學到的Java基礎知識來設計一個符合要求的中國象棋對弈系統(tǒng),這期間我遇到了很多的困難,發(fā)現(xiàn)了很多的問題,正是在解決問
9、題的期間我才慢慢地熟悉了Java的基礎知識,才慢慢學會了如何去按照給定的要求設計出合適的java系統(tǒng)。通過本次課程設計,我明白了一個道理:無論做什么事情,都必需養(yǎng)成嚴謹,認真,善思的工作作風遇到問題最好的辦法就是請教別人,因為每個人掌握的情況都不一樣,一個人不可能做到處處都懂,必須發(fā)揮群眾的力量,復雜的事情才能夠簡單化。這一點我深有體會,在很多時候,我遇到的困難或許別人之前就遇到過,向他們請教遠比自己在那邊摸索來得簡單,來得快。附件程序代碼:import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.ut
10、il.*;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;/棋盤JLabel image;/窗格Container con;/工具欄JToolBar jmain;/重新開始JButton anew
11、;/悔棋JButton repent;/退出JButton exit;/當前信息JLabel text;/保存當前操作Vector Var;/規(guī)則類對象(使于調(diào)用方法)ChessRule rule;/* 單擊棋子* chessManClick = true 閃爍棋子 并給線程響應* chessManClick = false 吃棋子 停止閃爍 并給線程響應*/boolean chessManClick;/* 控制玩家走棋* chessPlayClick=1 黑棋走棋* chessPlayClick=2 紅棋走棋 默認紅棋* chessPlayClick=3 雙方都不能走棋*/int chess
12、PlayClick=2;/控制棋子閃爍的線程Thread tmain;/把第一次的單擊棋子給線程響應static int Man,i;ChessMainFrame()new ChessMainFrame(中國象棋);/* 構造函數(shù)* 初始化圖形用戶界面*/ChessMainFrame(String Title)/獲行客格引用con = this.getContentPane();con.setLayout(null);/實例化規(guī)則類rule = new ChessRule();Var = new Vector();/創(chuàng)建工具欄jmain = new JToolBar();text = new
13、JLabel(歡迎使用象棋對弈系統(tǒng));/當鼠標放上顯示信息text.setToolTipText(信息提示);anew = new JButton( 新 游 戲 );anew.setToolTipText(重新開始新的一局);exit = new JButton( 退 出 );exit.setToolTipText(退出象棋程序程序);repent = new JButton( 悔 棋 );repent.setToolTipText(返回到上次走棋的位置);/把組件添加到工具欄jmain.setLayout(new GridLayout(0,4);jmain.add(anew);jmain.a
14、dd(repent);jmain.add(exit);jmain.add(text);jmain.setBounds(0,0,558,30);con.add(jmain);/添加棋子標簽drawChessMan();/注冊按扭監(jiān)聽anew.addActionListener(this);repent.addActionListener(this);exit.addActionListener(this);/注冊棋子移動監(jiān)聽for (int i=0;i screenSize.height)frameSize.height = screenSize.height;if (frameSize.wid
15、th screenSize.width)frameSize.width = screenSize.width;this.setLocation(screenSize.width - frameSize.width) / 2 - 280 ,(screenSize.height - frameSize.height ) / 2 - 350); /設置this.setIconImage(new ImageIcon(image紅將.GIF).getImage();this.setResizable(false);this.setTitle(Title);this.setSize(558,670);th
16、is.show();/* 添加棋子方法*/public void drawChessMan()/流程控制int i,k;/圖標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黑馬.GIF);for (i=4,k=81;i6;i+,k+=342)playi = new JLabel(in);playi.setB
17、ounds(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)playi = new JLabel(in);playi.setBounds(k,56,55,55);playi.setName(士1)
18、;/卒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.setBounds(k,170,55,55);playi.setName(炮1 + i);/將in = new ImageIcon(imag
19、e黑將.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 ImageIcon(image紅馬.GIF);for (i=6,k=81;i8;i+,k+=342)playi = new JLabel(i
20、n);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;i16;i+,k+=114)playi = new JLabel(in);playi.setBounds(k,569,55,55);
21、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 & Man 7 & Man 11 & Man 15 & Man 25 & Man =0 & Man 3 & Man 7 & Man
22、 11 & Man 16)rule.chapRule(Man,playMan,play,me);/移動將、帥else if (Man = 30 | Man = 31)rule.willRule(Man,playMan,play,me);/是否走棋錯誤(是否在原地沒有動)if (Ex = playMan.getX() & Ey = playMan.getY()text.setText( 黑棋走棋);chessPlayClick=1;else text.setText( 紅棋走棋);chessPlayClick=2;/else if/當前沒有操作(停止閃爍)chessManClick=false;
23、/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)/當前沒有操作(停止閃爍)chessManClick=false;for (i=0;i 15 & Man 25 & Man =0 & Man 3 & Man 7 & Man 11 & Man 15 & Man 2
24、5 & 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);/是否走棋錯誤(是否在原地沒有動)if (Ex = playMan.getX() & Ey = playMan.getY()text.setText( 黑棋走棋);chessPlayClick=1;break;else text.se
25、tText( 紅棋走棋);chessPlayClick=2;break;/else if /if/for/是否勝利if (!play31.isVisible()JOptionPane.showConfirmDialog(this,黑棋勝利,玩家一勝利,JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);/雙方都不可以在走棋了chessPlayClick=3;text.setText( 黑棋勝利);/if else if (!play30.isVisible()JOptionPane.showConfirmDialog(this,紅棋勝
26、利,玩家二勝利,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 me)public void mouseExited(MouseEvent me)/* 定義按鈕的事件響應*/public void
27、 actionPerformed(ActionEvent ae) /重新開始按鈕if (ae.getSource().equals(anew)int i,k;/重新排列每個棋子的位置/黑色棋子 /車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+,k+=228)playi.setBounds(k,56,55,55);/士for (i=12,k=195;i14;i+,k+=11
28、4)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,569,55,55);/馬for (i=6,k=81;i8;i+,k+=342)playi.setBounds(k,569,55,
29、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,455,55,55);/帥play31.setBounds(252,569,55,55);chessPlayClick = 2;t
30、ext.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坐標int x = Integer.parseInt(String)Var.get(Var.size()-3);/獲得Y坐標int y = Integer.parseInt(String)Var.get(Var.size
31、()-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 = 2;/刪除用過的坐標Var.remove(Var.size()-4);Var.remove(Var.size()-3);Var.r
32、emove(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);if (j = JOptionPane.YES_OPTION)System.exit(0);/*定義中國象棋規(guī)則的類*/class
33、ChessRule /*卒子的移動規(guī)則*/public void armsRule(int Man,JLabel play,MouseEvent me)/黑卒向下if (Man 27 & (me.getY()-play.getY() 86 & (me.getX()-play.getX() 0)/當前記錄添加到集合(用于悔棋)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(),play.getY()+57,55,55);/向右移動、得到終點的坐標模糊成合法的坐標、必須過河else if (play.getY() 284 & (me.getX() - play.getX() = 57 & (me.getX() - play.getX() 284 & (play.getX() - me.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 消防安全生產(chǎn)合同責任狀
- 合同范本:單位定期存單質(zhì)押貸款
- 度勞動和社會保障合同代理協(xié)議
- 債權資產(chǎn)買賣合同
- 度標準工廠租賃合同
- 雇傭勞動合同模板合同
- 股票基金權益分配合同范本
- 寵物收養(yǎng)家庭寵物養(yǎng)護與寵物友好公共設施考核試卷
- 地震勘探儀器在復雜地質(zhì)條件下的應用考核試卷
- 鉛筆筆芯安全課件下載
- 2025年全國高考體育單招政治時事填空練習50題(含答案)
- 2025教科版一年級科學下冊教學計劃
- 中華人民共和國學前教育法-知識培訓
- 2023年新高考(新課標)全國2卷數(shù)學試題真題(含答案解析)
- 事業(yè)單位工作人員獎勵審批表
- 山東省技能大賽青島選拔賽-世賽選拔項目52樣題(平面設計技術)
- 城市社會學課件
- 人教版六年級美術下冊全冊課件【完整版】
- GB/T 9788-1988熱軋不等邊角鋼尺寸、外形、重量及允許偏差
- 教科版三年級下冊科學全冊完整課件
- 胃瘍(慢性消化性潰瘍)中醫(yī)護理方案
評論
0/150
提交評論