Java象棋人机对弈程序.docx
- 文档编号:13583899
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:76
- 大小:183.12KB
Java象棋人机对弈程序.docx
《Java象棋人机对弈程序.docx》由会员分享,可在线阅读,更多相关《Java象棋人机对弈程序.docx(76页珍藏版)》请在冰点文库上搜索。
Java象棋人机对弈程序
Java象棋人机对弈程序
源代码和系统说明文档
系统功能人机对弈,鼠标操作。
系统界面界面用到的棋子如下:
棋盘:
需要保存为gif文件
三、源代码
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjava.util.*;
importjava.io.*;
//主类
publicclassChess
{
publicstaticvoidmain(Stringargs[])
{
newChessMainFrame("象棋");
}}
//主框架类
classChessMainFrameextendsJFrameimplementsActionListener,MouseListener,Runnable{
//玩家
JLabelplay[]=newJLabel[32];
//棋盘JLabelimage;
//窗格Containercon;
//工具栏JToolBarjmain;
//重新开始
JButtonanew;
//悔棋
JButtonrepent;
//打开
JButtonshowOpen;
//保存
JButtonshowSave;
//退出JButtonexit;
//当前信息
JLabeltext;
//保存当前操作
VectorFileVar;
VectorVar;
//规则类对象(使于调用方法)
ChessRulerule;
/*单击棋子**********************************//*chessManClick=true闪烁棋子并给线程响应*//*chessManClick=false吃棋子停止闪烁并给线程响应*/booleanchessManClick;
/*控制玩家走棋
/*chessPlayClick=1
/*chessPlayClick=2
/*chessPlayClick=3
黑棋走棋*/
红棋走棋默认红棋*/双方都不能走棋*/
intchessPlayClick=2;
//控制棋子闪烁的线程
Threadtmain;
//把第一次的单击棋子给线程响应staticintMan,i;
ChessMainFrame(){}
ChessMainFrame(StringTitle)
{
//获行客格引用
con=this.getContentPane();con.setLayout(null);
//实例化规则类
rule=newChessRule();FileVar=newVector();Var=newVector();
//创建工具栏jmain=newJToolBar();
text=newJLabel("热烈欢迎");text.setToolTipText("提示信息");anew=newJButton("新游戏");anew.setToolTipText("重新开始新的一局");exit=newJButton("退出");exit.setToolTipText("退出本程序");repent=newJButton("悔棋");repent.setToolTipText("返回到上次走棋的位置");showOpen=newJButton("打开");showOpen.setToolTipText("打开以前棋局");showSave=newJButton("保存");showSave.setToolTipText("保存当前棋局");
//把组件添加到工具栏jmain.setLayout(newGridLayout(0,6));jmain.add(anew);
jmain.add(repent);jmain.add(showOpen);jmain.add(showSave);jmain.add(exit);jmain.add(text);
jmain.setBounds(0,500,450,30);con.add(jmain);
//添加棋子标签drawChessMan();
/*注册监听者*/
//注册按扭监听anew.addActionListener(this);repent.addActionListener(this);exit.addActionListener(this);
showOpen.addActionListener(this);showSave.addActionListener(this);
//注册棋子移动监听
for(inti=0;i<32;i++)
{con.add(play[i]);play[i].addMouseListener(this);
}
//添加棋盘标签
con.add(image=newJLabel(newImageIcon("CChess.GIF")));image.setBounds(0,0,445,498);image.addMouseListener(this);
//注册窗体关闭监听
this.addWindowListener(newWindowAdapter()
{
publicvoidwindowClosing(WindowEventwe)
{System.exit(0);
}
});
//窗体居中
DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();
DimensionframeSize=this.getSize();
if(frameSize.height>screenSize.height)
{frameSize.height=screenSize.height;
}
if(frameSize.width>screenSize.width)
{
frameSize.width=screenSize.width;
}
this.setLocation((screenSize.width-frameSize.width)/2-200,(screenSize.height-frameSize.height)/2-290);
this.setIconImage(newImageIcon("相1.gif").getImage());this.setResizable(false);
this.setTitle(Title);this.setSize(450,555);this.show();
}
/*添加棋子方法************/
publicvoiddrawChessMan()
{
//流程控制inti,k;//图标Iconin;
//黑色棋子//车in=newImageIcon("车1.GIF");
for(i=0,k=10;i<2;i++,k+=385)
{
play[i]=newJLabel(in);play[i].setBounds(k,10,40,40);play[i].setName("车1");
}
//马
in=newImageIcon("马1.GIF");
for(i=4,k=60;i<6;i++,k+=285)
{
play[i]=newJLabel(in);play[i].setBounds(k,10,40,40);play[i].setName("马1");
}
//相
in=newImageIcon("相1.GIF");
for(i=8,k=105;i<10;i++,k+=195)
{play[i]=newJLabel(in);play[i].setBounds(k,10,40,40);play[i].setName("相1");
}
//士
in=newImageIcon("士1.GIF");
for(i=12,k=155;i<14;i++,k+=95)
{play[i]=newJLabel(in);play[i].setBounds(k,10,40,40);play[i].setName("士1");
}
//卒
in=newImageIcon("卒1.GIF");
for(i=16,k=10;i<21;i++,k+=96.5)
{play[i]=newJLabel(in);play[i].setBounds(k,160,40,40);play[i].setName("卒1"+i);
}
//炮
in=newImageIcon("炮1.GIF");
for(i=26,k=60;i<28;i++,k+=289)
{play[i]=newJLabel(in);play[i].setBounds(k,110,40,40);play[i].setName("炮1"+i);
}
//将
in=newImageIcon("将1.GIF");play[30]=newJLabel(in);play[30].setBounds(205,10,40,40);play[30].setName("将1");
//红色棋子//车
in=newImageIcon("车2.GIF");
for(i=2,k=10;i<4;i++,k+=385)
{
play[i]=newJLabel(in);play[i].setBounds(k,450,40,40);play[i].setName("车2");
}
//马
in=newImageIcon("马2.GIF");
for(i=6,k=60;i<8;i++,k+=285)
{
play[i]=newJLabel(in);play[i].setBounds(k,450,40,40);play[i].setName("马2");
}
//相
in=newImageIcon("相2.GIF");
for(i=10,k=105;i<12;i++,k+=195)
{
play[i]=newJLabel(in);play[i].setBounds(k,450,40,40);play[i].setName("相2");
}
//士
in=newImageIcon("士2.GIF");
for(i=14,k=155;i<16;i++,k+=95)
{
play[i]=newJLabel(in);play[i].setBounds(k,450,40,40);play[i].setName("士2");
}
//兵
in=newImageIcon("兵2.GIF");
for(i=21,k=10;i<26;i++,k+=96.5)
{play[i]=newJLabel(in);play[i].setBounds(k,300,40,40);play[i].setName("兵2"+i);
}
//炮
in=newImageIcon("炮2.GIF");
for(i=28,k=60;i<30;i++,k+=289)
{
play[i]=newJLabel(in);play[i].setBounds(k,350,40,40);play[i].setName("炮2"+i);
//帅
in=newImageIcon("帅2.GIF");play[31]=newJLabel(in);play[31].setBounds(205,450,40,40);play[31].setName("帅2");
}
/*线程方法控制棋子闪烁*/
publicvoidrun()
{
while(true)
{//单击棋子第一下开始闪烁if(chessManClick)
{play[Man].setVisible(false);
//时间控制
try
{tmain.sleep(500);
}
catch(Exceptione){}
play[Man].setVisible(true);
}
//闪烁当前提示信息以免用户看不见else
{
text.setVisible(false);
//时间控制
try
{tmain.sleep(500);
}
catch(Exceptione){}
text.setVisible(true);
}
try
{tmain.sleep(500);
}
catch(Exceptione){}
}
}
/*单击棋子方法************************/publicvoidmouseClicked(MouseEventme){
System.out.println("Mouse");
//当前坐标intEx=0,Ey=0;
//启动线程
if(tmain==null)
{
tmain=newThread(this);tmain.start();
}
//单击棋盘(移动棋子)
if(me.getSource().equals(image))
{
//该红棋走棋的时候
if(chessPlayClick==2&&play[Man].getName().charAt
(1)=='2'){
Ex=play[Man].getX();
Ey=play[Man].getY();
//移动卒、兵
if(Man>15&&Man<26){
rule.armsRule(Man,play[Man],me);
}
//移动炮
elseif(Man>25&&Man<30){
rule.cannonRule(play[Man],play,me);
}
//移动车
elseif(Man>=0&&Man<4)
{
rule.cannonRule(play[Man],play,me);
}
//移动马
elseif(Man>3&&Man<8){
rule.horseRule(play[Man],play,me);
}
//移动相、象
elseif(Man>7&&Man<12){
rule.elephantRule(Man,play[Man],play,me);
}
//移动仕、士
elseif(Man>11&&Man<16){
rule.chapRule(Man,play[Man],play,me);
}
//移动将、帅
elseif(Man==30||Man==31){
rule.willRule(Man,play[Man],play,me);
//是否走棋错误(是否在原地没有动)
if(Ex==play[Man].getX()&&Ey==play[Man].getY())
{
text.setText("红棋走棋");chessPlayClick=2;
}
else
{
text.setText("黑棋走棋");chessPlayClick=1;
}
}//if
//该黑棋走棋的时候
elseif(chessPlayClick==1&&play[Man].getName().charAt
(1)=='1'){
Ex=play[Man].getX();
Ey=play[Man].getY();
//移动卒、兵
if(Man>15&&Man<26)
{rule.armsRule(Man,play[Man],me);
}
//移动炮
elseif(Man>25&&Man<30)
{rule.cannonRule(play[Man],play,me);
}
//移动车
elseif(Man>=0&&Man<4)
{rule.cannonRule(play[Man],play,me);
}
//移动马
elseif(Man>3&&Man<8)
{rule.horseRule(play[Man],play,me);
}
//移动相、象
elseif(Man>7&&Man<12)
{rule.elephantRule(Man,play[Man],play,me);
}
//移动仕、士
elseif(Man>11&&Man<16)
{rule.chapRule(Man,play[Man],play,me);
}
//移动将、帅
elseif(Man==30||Man==31)
{rule.willRule(Man,play[Man],play,me);
}
//是否走棋错误(是否在原地没有动)
if(Ex==play[Man].getX()&&Ey==play[Man].getY())
{
text.setText("黑棋走棋");chessPlayClick=1;
}
else
{
text.setText("红棋走棋");chessPlayClick=2;
}
}//elseif
//当前没有操作(停止闪烁)chessManClick=false;
}//if
//单击棋子
else
{
//第一次单击棋子(闪烁棋子)
if(!
chessManClick)
{
for(inti=0;i<32;i++)
{
//被单击的棋子
if(me.getSource().equals(play[i]))
{
//告诉线程让该棋子闪烁
Man=i;
//开始闪烁
chessManClick=true;break;
}
}//for
}//if
//第二次单击棋子(吃棋子)
elseif(chessManClick)
{
//当前没有操作(停止闪烁)chessManClick=false;
for(i=0;i<32;i++)
{
//找到被吃的棋子
if(me.getSource().equals(play[i]))
{
//该红棋吃棋的时候
if(chessPlayClick==2&&play[Man].getName().charAt
(1)=='2'){
Ex=play[Man].getX();
Ey=play[Man].getY();
//卒、兵吃规则
if(Man>15&&Man<26)
{rule.armsRule(play[Man],play[i]);
}
//炮吃规则
elseif(Man>25&&Man<30)
{rule.cannonRule(0,play[Man],play[i],play,me);
}
//车吃规则
elseif(Man>=0&&Man<4)
{rule.cannonRule(1,play[Man],play[i],play,me);
}
//马吃规则
elseif(Man>3&&Man<8)
{
rule.horseRule(play[Man],play[i],play,me);
}
//相、象吃规则
elseif(Man>7&&Man<12)
{
rule.elephantRule(play[Man],play[i],play);
}
//士、仕吃棋规则
elseif(Man>11&&Man<16)
{rule.chapRule(Man,play[Man],play[i],play);
}
//将、帅吃棋规则
elseif(Man==30||Man==31)
{rule.willRule(Man,play[Man],play[i],play);play[Man].setVisible(true);
}
//是否走棋错误(是否在原地没有动)
if(Ex==play[Man].getX()&&Ey==play[Man].getY())
{
text.setText("红棋走棋");chessPlayClick=2;
break;
}
else
{
text.setText("黑棋走棋");
chessPlayClick=1;
break;
}
}//if
//该黑棋吃棋的时候
'1')
elseif(chessPlayClick==1&&play[Man].getName().charAt
(1)==
{
Ex=play[Man].getX();
Ey=play[Man].getY();
//卒、兵吃规则
if(Man>15&&Man<26)
{
rule.armsRule(play[Man],play[i]);
}
//炮吃规则
elseif(Man>25&&Man<30)
{rule.cannonRule(0,play[Man],play[i],play,me);
}
//车吃规则
elseif(Man>=0&&Man<4)
{rule.cannonRule(1,play[Man],play[i],play,me);
}
//马吃规则
elseif(Man>3&&Man<8)
{
rule.horseRule(play[Man],play[i],play,me);
}
//相、象吃规则
elseif(Man>7&&Man<12)
{
rule.elephantRule(play[Man],play[i],play);
}
//士、仕吃棋规则
elseif(Man>11&&Man<16)
{rule.chapRule(Man,play[Man],play[i],play);
}
//将、帅吃棋规则
elseif(Man==30||Man==31)
{
rule.willRule(Man,play[Man],play[i],play);
play[Man].setVisible(true);
//是否走棋错误(是否在原地没有动)
if(Ex==play[Ma
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 象棋 人机 对弈 程序