Java象棋人机对弈程序

合集下载

基于Android技术的中国象棋人机对弈游戏的设计与实现

基于Android技术的中国象棋人机对弈游戏的设计与实现

西安邮电大学毕业设计(论文)题目:基于android技术的中国象棋人机对弈游戏的设计与实现目录摘要 (I)ABSTRACT .................................................... I I 1 绪论. (1)1.1 研究背景 (1)1.1.1中国象棋背景 (1)1.1.2 Android系统简介 (1)1.2 本论文研究意义 (3)2设计相关技术理论 (5)2.1 游戏系统开发平台及搭建 (5)2.2 可行性研究 (6)3游戏系统功能分析与设计 (7)3.1 界面的需求分析 (7)3.2游戏走棋需求设计分析 (7)3.3类框架的设计 (8)4 游戏系统的设计与实现 (9)4.1游戏界面的设计 (9)4.1.1 共有类ChessActivity的实现 (9)4.1.2 辅助界面相关类的实现 (9)4.1.3 游戏界面相关类的实现 (9)4.2 中国象棋的规则及走法的实现 (10)4.2.1行棋规则 (10)4.2.2棋盘的表示 (22)4.3 游戏人机会话的实现 (23)4.3.1 着法的生成 (23)4.3.2 搜索算法 (24)4.3.3 局面评估 (26)5 游戏系统模块的设计实现 (28)5.1 欢迎界面 (28)5.2菜单界面 (28)5.3 帮助界面 (30)5.4游戏界面 (30)6 运行测试 (34)7 结束语 (35)致谢 (36)参考文献 (37)附录: (38)译文 (48)摘要中国象棋是一款智力休闲游戏,具有历史悠久而且拥有巨大的游戏爱好者群体,他们以中国象棋陶冶情操、锻炼智力、体验象棋带来的快乐,中国象棋还是一个老少皆宜的娱乐游戏。

随着手持设备、智能手机的普及,搭载Android操作系统的智能手机也已经走进了千家万户,当人们闲暇偶尔需要娱乐时,却发现没有实物象棋,该软件不失为一个很好的替代品,供大家进行娱乐享受,尤其是在现在这个快节奏的社会中,人们更满足于手机的使用,可以方便地随意移动,不像实物象棋那样静静的坐着。

Java五子棋游戏源代码(人机对战)

Java五子棋游戏源代码(人机对战)

//Java编程:五子棋游戏源代码import java.awt.*;import java.awt.event.*;import java.applet.*;import javax.swing.*;import java.io.PrintStream;import javax.swing.JComponent;import javax.swing.JPanel;/**main方法创建了ChessFrame类的一个实例对象(cf),*并启动屏幕显示显示该实例对象。

**/public class FiveChessAppletDemo {public static void main(String args[]){ChessFrame cf = new ChessFrame();cf.show();}}/**类ChessFrame主要功能是创建五子棋游戏主窗体和菜单**/class ChessFrame extends JFrame implements ActionListener { private String[] strsize={"20x15","30x20","40x30"};private String[] strmode={"人机对弈","人人对弈"};public static boolean iscomputer=true,checkcomputer=true; private int width,height;private ChessModel cm;private MainPanel mp;//构造五子棋游戏的主窗体public ChessFrame() {this.setTitle("五子棋游戏");cm=new ChessModel(1);mp=new MainPanel(cm);Container con=this.getContentPane();con.add(mp,"Center");this.setResizable(false);this.addWindowListener(new ChessWindowEvent());MapSize(20,15);JMenuBar mbar = new JMenuBar();this.setJMenuBar(mbar);JMenu gameMenu = new JMenu("游戏");mbar.add(makeMenu(gameMenu, new Object[] {"开局", "棋盘","模式", null, "退出"}, this));JMenu lookMenu =new JMenu("视图");mbar.add(makeMenu(lookMenu,new Object[] {"Metal","Motif","Windows"},this));JMenu helpMenu = new JMenu("帮助");mbar.add(makeMenu(helpMenu, new Object[] {"关于"}, this));}//构造五子棋游戏的主菜单public JMenu makeMenu(Object parent, Object items[], Object target){ JMenu m = null;if(parent instanceof JMenu)m = (JMenu)parent;else if(parent instanceof String)m = new JMenu((String)parent);elsereturn null;for(int i = 0; i < items.length; i++)if(items[i] == null)m.addSeparator();else if(items[i] == "棋盘"){JMenu jm = new JMenu("棋盘");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int j=0;j<strsize.length;j++){rmenu=makeRadioButtonMenuItem(strsize[j],target);if (j==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}else if(items[i] == "模式"){JMenu jm = new JMenu("模式");ButtonGroup group=new ButtonGroup();JRadioButtonMenuItem rmenu;for (int h=0;h<strmode.length;h++){rmenu=makeRadioButtonMenuItem(strmode[h],target);if(h==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}elsem.add(makeMenuItem(items[i], target));return m;}//构造五子棋游戏的菜单项public JMenuItem makeMenuItem(Object item, Object target){ JMenuItem r = null;if(item instanceof String)r = new JMenuItem((String)item);else if(item instanceof JMenuItem)r = (JMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}//构造五子棋游戏的单选按钮式菜单项public JRadioButtonMenuItem makeRadioButtonMenuItem( Object item, Object target){JRadioButtonMenuItem r = null;if(item instanceof String)r = new JRadioButtonMenuItem((String)item);else if(item instanceof JRadioButtonMenuItem)r = (JRadioButtonMenuItem)item;elsereturn null;if(target instanceof ActionListener)r.addActionListener((ActionListener)target);return r;}public void MapSize(int w,int h){setSize(w * 20+50 , h * 20+100 );if(this.checkcomputer)this.iscomputer=true;elsethis.iscomputer=false;mp.setModel(cm);mp.repaint();}public boolean getiscomputer(){return this.iscomputer;}public void restart(){int modeChess = cm.getModeChess();if(modeChess <= 3 && modeChess >= 1){cm = new ChessModel(modeChess);MapSize(cm.getWidth(),cm.getHeight());}else{System.out.println("\u81EA\u5B9A\u4E49");}}public void actionPerformed(ActionEvent e){String arg=e.getActionCommand();try{if (arg.equals("Windows"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");else if(arg.equals("Motif"))UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");elseUIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel" ); SwingUtilities.updateComponentTreeUI(this);}catch(Exception ee){}if(arg.equals("20x15")){this.width=20;this.height=15;cm=new ChessModel(1);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("30x20")){this.width=30;this.height=20;cm=new ChessModel(2);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("40x30")){this.width=40;this.height=30;cm=new ChessModel(3);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人机对弈")){this.checkcomputer=true;this.iscomputer=true;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人人对弈")){this.checkcomputer=false;this.iscomputer=false;cm=new ChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("开局")){restart();}if(arg.equals("关于"))JOptionPane.showMessageDialog(this, "五子棋游戏测试版本", "关于", 0);if(arg.equals("退出"))System.exit(0);}}/**类ChessModel实现了整个五子棋程序算法的核心*/class ChessModel {//棋盘的宽度、高度、棋盘的模式(如20×15)private int width,height,modeChess;//棋盘方格的横向、纵向坐标private int x=0,y=0;//棋盘方格的横向、纵向坐标所对应的棋子颜色,//数组arrMapShow只有3个值:1,2,3,-5,//其中1代表该棋盘方格上下的棋子为黑子,//2代表该棋盘方格上下的棋子为白子,//3代表为该棋盘方格上没有棋子,//-5代表该棋盘方格不能够下棋子private int[][] arrMapShow;//交换棋手的标识,棋盘方格上是否有棋子的标识符private boolean isOdd,isExist;public ChessModel() {}//该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘public ChessModel(int modeChess){this.isOdd=true;if(modeChess == 1){PanelInit(20, 15, modeChess);}if(modeChess == 2){PanelInit(30, 20, modeChess);}if(modeChess == 3){PanelInit(40, 30, modeChess);}}//按照棋盘模式构建棋盘大小private void PanelInit(int width, int height, int modeChess){this.width = width;this.height = height;this.modeChess = modeChess;arrMapShow = new int[width+1][height+1];for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){arrMapShow[i][j] = -5;}}}//获取是否交换棋手的标识符public boolean getisOdd(){return this.isOdd;}//设置交换棋手的标识符public void setisOdd(boolean isodd){if(isodd)this.isOdd=true;elsethis.isOdd=false;}//获取某棋盘方格是否有棋子的标识值public boolean getisExist(){return this.isExist;}//获取棋盘宽度public int getWidth(){return this.width;}//获取棋盘高度public int getHeight(){return this.height;}//获取棋盘模式public int getModeChess(){return this.modeChess;}//获取棋盘方格上棋子的信息public int[][] getarrMapShow(){return arrMapShow;}//判断下子的横向、纵向坐标是否越界private boolean badxy(int x, int y){if(x >= width+20 || x < 0)return true;return y >= height+20 || y < 0;}//计算棋盘上某一方格上八个方向棋子的最大值,//这八个方向分别是:左、右、上、下、左上、左下、右上、右下public boolean chessExist(int i,int j){if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2)return true;return false;}//判断该坐标位置是否可下棋子public void readyplay(int x,int y){if(badxy(x,y))return;if (chessExist(x,y))return;this.arrMapShow[x][y]=3;}//在该坐标位置下棋子public void play(int x,int y){if(badxy(x,y))return;if(chessExist(x,y)){this.isExist=true;return;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}//计算机走棋/**说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,*最后得出棋子数最大值的坐标,下子**/public void computerDo(int width,int height){int max_black,max_white,max_temp,max=0;setisOdd(true);System.out.println("计算机走棋...");for(int i = 0; i <= width; i++){for(int j = 0; j <= height; j++){if(!chessExist(i,j)){//算法判断是否下子max_white=checkMax(i,j,2);//判断白子的最大值max_black=checkMax(i,j,1);//判断黑子的最大值max_temp=Math.max(max_white,max_black);if(max_temp>max){max=max_temp;this.x=i;this.y=j;}}}}setX(this.x);setY(this.y);this.arrMapShow[this.x][this.y]=2;}//记录电脑下子后的横向坐标public void setX(int x){this.x=x;}//记录电脑下子后的纵向坐标public void setY(int y){this.y=y;}//获取电脑下子的横向坐标public int getX(){return this.x;}//获取电脑下子的纵向坐标public int getY(){return this.y;}//计算棋盘上某一方格上八个方向棋子的最大值,//这八个方向分别是:左、右、上、下、左上、左下、右上、右下public int checkMax(int x, int y,int black_or_white){int num=0,max_num,max_temp=0;int x_temp=x,y_temp=y;int x_temp1=x_temp,y_temp1=y_temp;//judge rightfor(int i=1;i<5;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}//judge leftx_temp1=x_temp;for(int i=1;i<5;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num<5)max_temp=num;//judge upx_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}//judge downy_temp1=y_temp;for(int i=1;i<5;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;//judge left_upx_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}//judge right_downx_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;//judge right_upx_temp1=x_temp;y_temp1=y_temp;num=0;for(int i=1;i<5;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}//judge left_downx_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<5;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white) num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;max_num=max_temp;return max_num;}//判断胜负public boolean judgeSuccess(int x,int y,boolean isodd){ int num=1;int arrvalue;int x_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;int x_temp1=x_temp,y_temp1=y_temp;//判断右边for(int i=1;i<6;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}//判断左边x_temp1=x_temp;for(int i=1;i<6;i++){if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;//判断上方x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}//判断下方y_temp1=y_temp;for(int i=1;i<6;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;//判断左上x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1-=1;if(y_temp1<0 || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}//判断右下x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height || x_temp1>this.width) break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}if(num==5)return true;//判断右上x_temp1=x_temp;y_temp1=y_temp;num=1;for(int i=1;i<6;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0 || x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue) num++;elsebreak;}//判断左下x_temp1=x_temp;y_temp1=y_temp;for(int i=1;i<6;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height || x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)return true;return false;}//赢棋后的提示public void showSuccess(JPanel jp){JOptionPane.showMessageDialog(jp,"你赢了,好厉害!","win",RMATION_MESSAGE);}//输棋后的提示public void showDefeat(JPanel jp){JOptionPane.showMessageDialog(jp,"你输了,请重新开始!","lost",RMATION_MESSAGE);}}/**类MainPanel主要完成如下功能:*1、构建一个面板,在该面板上画上棋盘;*2、处理在该棋盘上的鼠标事件(如鼠标左键点击、鼠标右键点击、鼠标拖动等)**/class MainPanel extends JPanelimplements MouseListener,MouseMotionListener{private int width,height;//棋盘的宽度和高度private ChessModel cm;//根据棋盘模式设定面板的大小MainPanel(ChessModel mm){cm=mm;width=cm.getWidth();height=cm.getHeight();addMouseListener(this);}//根据棋盘模式设定棋盘的宽度和高度public void setModel(ChessModel mm){cm = mm;width = cm.getWidth();height = cm.getHeight();}//根据坐标计算出棋盘方格棋子的信息(如白子还是黑子),//然后调用draw方法在棋盘上画出相应的棋子public void paintComponent(Graphics g){super.paintComponent(g);for(int j = 0; j <= height; j++){for(int i = 0; i <= width; i++){int v = cm.getarrMapShow()[i][j];draw(g, i, j, v);}}}//根据提供的棋子信息(颜色、坐标)画棋子public void draw(Graphics g, int i, int j, int v){int x = 20 * i+20;int y = 20 * j+20;//画棋盘if(i!=width && j!=height){g.setColor(Color.white);g.drawRect(x,y,20,20);}//画黑色棋子if(v == 1 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.black);g.fillOval(x-8,y-8,16,16);}//画白色棋子if(v == 2 ){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.white);g.fillOval(x-8,y-8,16,16);}if(v ==3){g.setColor(Color.cyan);g.drawOval(x-8,y-8,16,16);}}//响应鼠标的点击事件,根据鼠标的点击来下棋,//根据下棋判断胜负等public void mousePressed(MouseEvent evt){int x = (evt.getX()-10) / 20;int y = (evt.getY()-10) / 20;System.out.println(x+" "+y);if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){cm.play(x,y);System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]);repaint();if(cm.judgeSuccess(x,y,cm.getisOdd())){cm.showSuccess(this);evt.consume();ChessFrame.iscomputer=false;}//判断是否为人机对弈if(ChessFrame.iscomputer&&!cm.getisExist()){puterDo(cm.getWidth(),cm.getHeight());repaint();if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){cm.showDefeat(this);evt.consume();}}}}public void mouseClicked(MouseEvent evt){}public void mouseReleased(MouseEvent evt){}public void mouseEntered(MouseEvent mouseevt){}public void mouseExited(MouseEvent mouseevent){}public void mouseDragged(MouseEvent evt){}//响应鼠标的拖动事件public void mouseMoved(MouseEvent moveevt){int x = (moveevt.getX()-10) / 20;int y = (moveevt.getY()-10) / 20;cm.readyplay(x,y);repaint();}}class ChessWindowEvent extends WindowAdapter{ public void windowClosing(WindowEvent e){ System.exit(0);}ChessWindowEvent(){}}。

java课程设计---中国象棋对弈系统

java课程设计---中国象棋对弈系统

java课程设计---中国象棋对弈系统⽬录摘要 (1)关键字 (1)正⽂ (2)1、程序设计说明 (2)1.1 程序的设计及实现 (2)1.1.1搜索引擎的实现(engine包) (2)1.1.2信息传输机制(message包) (3)1.1.3棋⼦(pieces包) (3)1.2 主控模块(main包) (3)2、运⾏结果 (5)3、设计体会 (6)附件 (7)程序代码 (7)参考⽂献资料 (41)1中国象棋对弈系统Java语⾔程序设计实验报告实验项⽬名称:中国象棋对弈系统作者姓名与单位:李⾮计算机101摘要:本⽂主要是运⽤java实现具有⼀定功能的中国象棋对弈系统软件,主要功能如下:a、象棋对弈:红⽅先⾛,然后⿊⽅再⾛,红⿊交替,直到⼀⽅获胜。

b、新游戏:任何时候可以重新开始⼀盘新的对弈。

c、悔棋:当⾛错棋的时候可以悔棋。

d、信息提⽰:提⽰当前信息状态。

e、简单的帮助⽂档:象棋规则介绍、软件的简单介绍和编制说明关键词:java、中国象棋对弈系统2正⽂:⼀程序设计说明1.1程序的设计及实现2、message:⽹络对战过程中各种消息及其传递机制的类实现包。

3、main:主界⾯实现包。

4、pieces:棋⼦及其相关类实现包。

现就各个包中的要点给与说明。

1.1.1 搜索引擎的实现(engine包)(1) BitBoard.java:位棋盘的实现,见2.4节。

(2) CCEvalue.java:评价函数知识类。

本程序使⽤开源软件“梦⼊神蛋”的快速评价函数。

该函数包含⼦⼒价值和棋⼦所在位置的奖励值。

⼦⼒价值分别是:帅-0, 仕-40, 象-40, 马-88, 车-200, 炮-96, 兵-9。

帅是⽆价的,⽤0表⽰。

以马为例,位置的奖励值如下: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,2,5,4,2,2上⾯的每⾏代表棋盘的⼀条纵线。

java课程设计中国象棋

java课程设计中国象棋

象棋程序设计1.课程设计目的Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。

面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承,很好的融合了“面向对象”、“跨平台”和“编程简洁”等特性。

随着Java语言的不断发展,它的应用前景将更为宽阔。

本课程设计主要是使用Swing这个Java自带的图形开发工具实现中国象棋棋子及棋盘的绘制,并根据相应的象棋规则,实现在电脑上虚拟出可以供两个人对弈的象棋游戏,从而达到了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,熟练的应用面向对象的思想和设计方法解决实际问题的能力的目的。

2.设计方案论证2.1程序功能象棋是中国一种流传十分广泛的游戏。

下棋双方根据自己对棋局形式的理解和对棋艺规律的掌握,调动车马,组织兵力,协调作战在棋盘--这块特定的战场上进行着象征性的军事战斗。

本程序的功能就是将棋盘和棋子在电脑上模拟出来,双方可以通过鼠标对己方棋子的操作进行对弈。

2.2设计思路象棋,人人会走,把己方的棋子按不同棋子的规则放在棋盘合适的位置上。

象棋包含三个要素:棋盘、棋子和规则。

在本象棋程序的设计上,也大致遵循这三个要素,但是细化为四个方面:棋盘、棋盘上可以走棋的落子点、棋子和象棋规则。

棋盘其实就是一张棋盘的图形,我们要在计算机上的棋盘上落子并不像在现实生活中那么容易,这里说的棋盘充其量只是背景,真正落子的地方必须是我们在图形界面上设定的落子点,不同棋子只能按照各自的规则在这些设定的位置上摆放、搏杀。

2.3设计方法根据前面的细化,程序中分别设计了四个类对应棋盘、落子点、棋子和象棋规则这四个方面。

四个类几乎包括了程序的全部,程序框图如下图所示:图1 程序功能框图2.4详细设计 2.4.1棋子类ChessSwing 中并没有棋子这个组建类,所以我们必须设计一个组件,棋子其实就是圆形 的JLabel ,但Swing 中的JLabel 组件是方形的,没关系,利用JLabel 我们可以创建 圆形的JLabel 组件——Chess 。

棋牌游戏——中国象棋人机对弈

棋牌游戏——中国象棋人机对弈
走法类ChessMove的介绍 思考时间线程TimeThread的介绍
Android游戏开发
1-15
象棋规则类的实现
会玩中国象棋的人都知道,象棋的规则是很多的,“马 走日,象走田”等,GuiZe类就是对这些规则进行封装 的类,当玩家需要走某步棋时,需要通过该类判断是否 可以走。
象棋规则类GuiZe的框架 走法判断方法canMove的架构 帅、士、象、兵的规则介绍 将、车、马、炮的规则介绍 走法产生方法allPossibleMoves的架构 走法产生方法allPossibleMoves的完善
Android游戏开发
1-11
辅助界面相关类的实现
接下来将对本游戏的除了主游戏界面之外的其他界面以 及相关线程进行介绍,开发步骤如下。
欢迎界面WelcomeView的介绍 欢迎界面动画生成类WelcomeViewThread的介绍 菜单界面MenuView的介绍 帮助界面HelpView的介绍
Android游戏开发
Android游戏开发
1-16
帅、士的走法
Android游戏开发
1-17
象、兵的走法
Android游戏开发
1-18
车、马的走法
Android游戏开发
1-19
炮的走法
Android游戏开发
1-20
游戏界面的完善
前面已经将游戏界面需要的地图以及实体进行了介绍, 接下来将使用之前开发的各个类来完善游戏的主界面, 完成本游戏的开发。
Android游戏开发
1-23
易则易知,简则易从。 易知则有亲,易从则有功。 有亲则可久,有功则可大。 可久则贤人之德,可大则贤人之业。 ——《易经》
Android游戏开发 Android游戏开发

中国象棋双人远程对弈

中国象棋双人远程对弈

中国象棋双人远程对弈—需求规格说明书1.引言1.1编写目的如今越来越多的人都渐渐地离中国经典棋牌类游戏——象棋远去,借此书17章的课题,我们小组为“中国象棋双人远程对弈”程序编写需求分析,借此重拾对中国文化的信心。

本说明书的预期读者为业务或需求分析人员,测试人员,用户文档编写者,项目管理人员。

1.2项目背景随着网络技术的不断发展和普及,网络游戏也有了长足的发展,网络棋牌类游戏作为其中的一分支,也备受瞩目,通过网络,人们可以在更大的范围内和他人对弈,可以增强棋艺的技术文化交流,也可以增加玩家自身水平,其中象棋作为中国经典的棋牌类游戏,魅力不可小觑。

通过以上简单分析,为了满足长远对弈的需求,“中国象棋双人网上对弈”有了开发的必要,在这样的背景下,我们小组计划开发一款这样的象棋软件。

以下是对该软件的需求规格说明。

1.3定义P2P:端对端模式端到端模式的特别是两个客户端程序直接通过网络相互连通进行游戏,参于中国象棋对弈的玩家只有两人。

这时客户端程序也可以作为服务端,具体操作如下:a.选择游戏模式为点对点模式。

b.作为客户端的一方点击连接按钮在弹出的对话框中输入对方的IP地址进行连接。

c.作为服务器的一方会监听客户端的连接请求,并对来到的请求进行响应。

d.待服务端用户同意连接请求后,双方中的任意一方都可以点击开始按钮进行游戏,点击开始游戏的一方为红方。

e.游戏过程中可以悔棋、求和和认输等操作,同时程序自动判断胜负。

C/S:服务器模式服务器模式的特别是所有的游戏玩家都集中连接服务器,在统一的平台下集中游戏。

在连接好服务器之后可以在房间里选择空位,棋桌的另一方如果也有玩家占位,则可以进行游戏。

功能简述如下:a.选择服务器模式。

b.正常运行服务器程序。

c.客户端点击连接,填入服务器所在的地址,连接成功点击显示房间。

d.双击一个空位准备游戏。

e.待对面的位置有玩家入坐就可以开始游戏,过程同端到端模式。

31.4参考资料《软件工程原理与应用》,曾强聪,赵歆编著,清华大学出版社2.系统概述2.1系统定义(目标)开发双人对弈中国象棋,实现双人远程对弈功能,并且软件界面友好,操作方便。

中国象棋源代码Java程序

中国象棋源代码Java程序

import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.io.*;public class Chess{public static void main(String args[]){new ChessMainFrame("中国象棋:观棋不语真君子,棋死无悔大丈夫");}}class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runnable{//玩家JLabel play[] = new JLabel[32];//棋盘JLabel image;//窗格Container con;//工具栏JToolBar jmain;//重新开始JButton anew;//悔棋JButton repent;//退出JButton exit;//当前信息JLabel text;//保存当前操作Vector Var;//规则类对象(使于调用方法)ChessRule rule;/**** 单击棋子** chessManClick = true 闪烁棋子并给线程响应** chessManClick = false 吃棋子停止闪烁并给线程响应*/boolean chessManClick;/**** 控制玩家走棋** chessPlayClick=1 黑棋走棋** chessPlayClick=2 红棋走棋默认红棋** chessPlayClick=3 双方都不能走棋*/int chessPlayClick=2;//控制棋子闪烁的线程Thread tmain;//把第一次的单击棋子给线程响应static int Man,i;ChessMainFrame(){new ChessMainFrame("中国象棋");}/**** 构造函数** 初始化图形用户界面*/ChessMainFrame(String Title){//获行客格引用con = this.getContentPane();con.setLayout(null);//实例化规则类rule = new ChessRule();Var = new Vector();//创建工具栏jmain = new JToolBar();text = new JLabel("欢迎使用象棋对弈系统");//当鼠标放上显示信息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.add(repent);jmain.add(exit);jmain.add(text);jmain.setBounds(0,0,558,30);con.add(jmain);//添加棋子标签drawChessMan();//注册按扭监听anew.addActionListener(this);repent.addActionListener(this);exit.addActionListener(this);//注册棋子移动监听for (int i=0;i<32;i++){con.add(play[i]);play[i].addMouseListener(this);}//添加棋盘标签con.add(image = new JLabel(new ImageIcon("image\\Main.GIF")));image.setBounds(0,30,558,620);image.addMouseListener(this);//注册窗体关闭监听this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent we){System.exit(0);}});//窗体居中Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();Dimension frameSize = 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 - 280 ,(screenSize.height - frameSize.height ) / 2 - 350);//设置this.setIconImage(new ImageIcon("image\\红将.GIF").getImage());this.setResizable(false);this.setTitle(Title);this.setSize(558,670);this.show();}/**** 添加棋子方法*/public void drawChessMan(){//流程控制int i,k;//图标Icon in;//黑色棋子//车in = new ImageIcon("image\\黑车.GIF");for (i=0,k=24;i<2;i++,k+=456){play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("车1");}//马in = new ImageIcon("image\\黑马.GIF");for (i=4,k=81;i<6;i++,k+=342){play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("马1");}//相in = new ImageIcon("image\\黑象.GIF");for (i=8,k=138;i<10;i++,k+=228){play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("象1");}//士in = new ImageIcon("image\\黑士.GIF"); for (i=12,k=195;i<14;i++,k+=114){ play[i] = new JLabel(in);play[i].setBounds(k,56,55,55);play[i].setName("士1");}//卒in = new ImageIcon("image\\黑卒.GIF"); for (i=16,k=24;i<21;i++,k+=114){ play[i] = new JLabel(in);play[i].setBounds(k,227,55,55);play[i].setName("卒1" + i);}//炮in = new ImageIcon("image\\黑炮.GIF"); for (i=26,k=81;i<28;i++,k+=342){ play[i] = new JLabel(in);play[i].setBounds(k,170,55,55);play[i].setName("炮1" + i);}//将in = new ImageIcon("image\\黑将.GIF"); play[30] = new JLabel(in);play[30].setBounds(252,56,55,55);play[30].setName("将1");//红色棋子//车in = new ImageIcon("image\\红车.GIF"); for (i=2,k=24;i<4;i++,k+=456){play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("车2");}//马in = new ImageIcon("image\\红马.GIF"); for (i=6,k=81;i<8;i++,k+=342){play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("马2");}//相in = new ImageIcon("image\\红象.GIF"); for (i=10,k=138;i<12;i++,k+=228){ play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("象2");}//士in = new ImageIcon("image\\红士.GIF"); for (i=14,k=195;i<16;i++,k+=114){ play[i] = new JLabel(in);play[i].setBounds(k,569,55,55);play[i].setName("士2");}//兵in = new ImageIcon("image\\红卒.GIF"); for (i=21,k=24;i<26;i++,k+=114){ play[i] = new JLabel(in);play[i].setBounds(k,398,55,55);play[i].setName("卒2" + i);}//炮in = new ImageIcon("image\\红炮.GIF"); for (i=28,k=81;i<30;i++,k+=342){ play[i] = new JLabel(in);play[i].setBounds(k,455,55,55);play[i].setName("炮2" + i);}//帅in = new ImageIcon("image\\红将.GIF"); play[31] = new JLabel(in);play[31].setBounds(252,569,55,55);play[31].setName("帅2");}/**** 线程方法控制棋子闪烁*/public void run(){while (true){//单击棋子第一下开始闪烁if (chessManClick){play[Man].setVisible(false);//时间控制try{tmain.sleep(200);}catch(Exception e){}play[Man].setVisible(true);}//闪烁当前提示信息以免用户看不见else {text.setVisible(false);//时间控制try{tmain.sleep(250);}catch(Exception e){}text.setVisible(true);}try{tmain.sleep(350);}catch (Exception e){}}}/**** 单击棋子方法*/public void mouseClicked(MouseEvent me){System.out.println("Mouse");//当前坐标int Ex=0,Ey=0;//启动线程if (tmain == null){tmain = new Thread(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);}//移动炮else if (Man > 25 && Man < 30){rule.cannonRule(play[Man],play,me);}//移动车else if (Man >=0 && Man < 4){rule.cannonRule(play[Man],play,me);}//移动马else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play,me);}//移动相、象else if (Man > 7 && Man < 12){rule.elephantRule(Man,play[Man],play,me);}//移动仕、士else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play,me);}//移动将、帅else if (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//该黑棋走棋的时候else if (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);}//移动炮else if (Man > 25 && Man < 30){rule.cannonRule(play[Man],play,me);}//移动车else if (Man >=0 && Man < 4){rule.cannonRule(play[Man],play,me);}//移动马else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play,me);}//移动相、象else if (Man > 7 && Man < 12){rule.elephantRule(Man,play[Man],play,me);}//移动仕、士else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play,me);}//移动将、帅else if (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;}}//else if//当前没有操作(停止闪烁)chessManClick=false;}//if//单击棋子else{//第一次单击棋子(闪烁棋子)if (!chessManClick){for (int i=0;i<32;i++){//被单击的棋子if (me.getSource().equals(play[i])){//告诉线程让该棋子闪烁Man=i;//开始闪烁chessManClick=true;break;}}//for}//if//第二次单击棋子(吃棋子)else if (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]);}//炮吃规则else if (Man > 25 && Man < 30){rule.cannonRule(0,play[Man],play[i],play,me);}//车吃规则else if (Man >=0 && Man < 4){rule.cannonRule(1,play[Man],play[i],play,me);}//马吃规则else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play[i],play,me);}//相、象吃规则else if (Man > 7 && Man < 12){rule.elephantRule(play[Man],play[i],play);}//士、仕吃棋规则else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play[i],play);}//将、帅吃棋规则else if (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//该黑棋吃棋的时候else if (chessPlayClick == 1 &&play[Man].getName().charAt(1) == '1'){Ex = play[Man].getX();Ey = play[Man].getY();//卒吃规则if (Man > 15 && Man < 26){rule.armsRule(play[Man],play[i]);}//炮吃规则else if (Man > 25 && Man < 30){rule.cannonRule(0,play[Man],play[i],play,me);}//车吃规则else if (Man >=0 && Man < 4){rule.cannonRule(1,play[Man],play[i],play,me);}//马吃规则else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play[i],play,me);}//相、象吃规则else if (Man > 7 && Man < 12){rule.elephantRule(play[Man],play[i],play);}//士、仕吃棋规则else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play[i],play);}//将、帅吃棋规则else if (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=1;break;}else {text.setText(" 红棋走棋");chessPlayClick=2;break;}}//else if}//if}//for//是否胜利if (!play[31].isVisible()){JOptionPane.showConfirmDialog(this,"黑棋胜利","玩家一胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);//双方都不可以在走棋了chessPlayClick=3;text.setText(" 黑棋胜利");}//ifelse if (!play[30].isVisible()){JOptionPane.showConfirmDialog(this,"红棋胜利","玩家二胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);chessPlayClick=3;text.setText(" 红棋胜利");}//else if}//else}//else}public void mousePressed(MouseEvent me){}public void mouseReleased(MouseEvent me){}public void mouseEntered(MouseEvent me){}public void mouseExited(MouseEvent me){}/**** 定义按钮的事件响应*/public void actionPerformed(ActionEvent ae) { //重新开始按钮if (ae.getSource().equals(anew)){int i,k;//重新排列每个棋子的位置//黑色棋子//车for (i=0,k=24;i<2;i++,k+=456){play[i].setBounds(k,56,55,55);}//马for (i=4,k=81;i<6;i++,k+=342){play[i].setBounds(k,56,55,55);}//相for (i=8,k=138;i<10;i++,k+=228){play[i].setBounds(k,56,55,55);}//士for (i=12,k=195;i<14;i++,k+=114){play[i].setBounds(k,56,55,55);}//卒for (i=16,k=24;i<21;i++,k+=114){ play[i].setBounds(k,227,55,55); }//炮for (i=26,k=81;i<28;i++,k+=342){ play[i].setBounds(k,170,55,55); }//将play[30].setBounds(252,56,55,55);//红色棋子//车for (i=2,k=24;i<4;i++,k+=456){ play[i].setBounds(k,569,55,55); }//马for (i=6,k=81;i<8;i++,k+=342){ play[i].setBounds(k,569,55,55); }//相for (i=10,k=138;i<12;i++,k+=228){ play[i].setBounds(k,569,55,55); }//士for (i=14,k=195;i<16;i++,k+=114){ play[i].setBounds(k,569,55,55); }//兵for (i=21,k=24;i<26;i++,k+=114){ play[i].setBounds(k,398,55,55); }//炮for (i=28,k=81;i<30;i++,k+=342){ play[i].setBounds(k,455,55,55); }//帅play[31].setBounds(252,569,55,55);chessPlayClick = 2;text.setText(" 红棋走棋");for (i=0;i<32;i++){play[i].setVisible(true);}//清除Vector中的容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()-2));//获得索引int M = Integer.parseInt((String)Var.get(Var.size()-1));//赋给棋子play[M].setVisible(true);play[M].setBounds(x,y,55,55);if (play[M].getName().charAt(1) == '1'){text.setText(" 黑棋走棋");chessPlayClick = 1;}else{text.setText(" 红棋走棋");chessPlayClick = 2;}//删除用过的坐标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);if (j == JOptionPane.YES_OPTION){System.exit(0);}}}/*定义中国象棋规则的类*/class ChessRule {/**卒子的移动规则*/public void armsRule(int Man,JLabel play,MouseEvent me){ //黑卒向下if (Man < 21){//向下移动、得到终点的坐标模糊成合法的坐标if ((me.getY()-play.getY()) > 27 && (me.getY()-play.getY()) < 86 && (me.getX()-play.getX()) < 55 && (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()) <= 112){play.setBounds(play.getX()+57,play.getY(),55,55);}//向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() > 284 && (play.getX() - me.getX()) >= 2 && (play.getX() - me.getX()) <=58){//模糊坐标play.setBounds(play.getX()-57,play.getY(),55,55);}}//红卒向上else{//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//向上移动、得到终点的坐标模糊成合法的坐标if ((me.getX()-play.getX()) >= 0 && (me.getX()-play.getX()) <= 55 && (play.getY()-me.getY()) >27 && play.getY()-me.getY() < 86){play.setBounds(play.getX(),play.getY()-57,55,55);}//向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 341 && (me.getX() - play.getX()) >= 57 && (me.getX() - play.getX()) <= 112){play.setBounds(play.getX()+57,play.getY(),55,55);}//向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 341 && (play.getX() - me.getX()) >= 3 && (play.getX() - me.getX()) <=58){play.setBounds(play.getX()-57,play.getY(),55,55);}}}//卒移动结束/**卒吃棋规则*/public void armsRule(JLabel play1,JLabel play2){//向右走if ((play2.getX() - play1.getX()) <= 112 && (play2.getX() - play1.getX()) >= 57 && (play1.getY() - play2.getY()) < 22 && (play1.getY() - play2.getY()) > -22 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){//黑棋要过河才能右吃棋if (play1.getName().charAt(1) == '1' && play1.getY() > 284 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}//红棋要过河才左能吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() < 341 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}}//向左走else if ((play1.getX() - play2.getX()) <= 112 && (play1.getX() - play2.getX()) >= 57 && (play1.getY() - play2.getY()) < 22 && (play1.getY() - play2.getY()) > -22 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){//黑棋要过河才能左吃棋if (play1.getName().charAt(1) == '1' && play1.getY() > 284 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}//红棋要过河才能右吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() < 341 && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}}//向上走else if (play1.getX() - play2.getX() >= -22 && play1.getX() - play2.getX() <= 22 && play1.getY() - play2.getY() >= -112 && play1.getY() - play2.getY() <= 112){//黑棋不能向上吃棋if (play1.getName().charAt(1) == '1' && play1.getY() < play2.getY() && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}//红棋不能向下吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() > play2.getY() && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),55,55);}}//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play1.isVisible()));Var.add(String.valueOf(play1.getX()));Var.add(String.valueOf(play1.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play2.isVisible()));Var.add(String.valueOf(play2.getX()));Var.add(String.valueOf(play2.getY()));Var.add(String.valueOf(i));}//卒吃结束/**炮、车移动规则*/public void cannonRule(JLabel play,JLabel playQ[],MouseEventme){//起点和终点之间是否有棋子int Count = 0;//上、下移动if (play.getX() - me.getX() <= 0 && play.getX() - me.getX() >= -55){//指定所有模糊Y坐标for (int i=56;i<=571;i+=57){//移动的Y坐标是否有指定坐标相近的if (i - me.getY() >= -27 && i - me.getY() <= 27){//所有的棋子for (int j=0;j<32;j++){//找出在同一条竖线的所有棋子、并不包括自己if (playQ[j].getX() - play.getX() >= -27 && playQ[j].getX() - play.getX() <= 27 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//从起点到终点(从左到右)for (int k=play.getY()+57;k<i;k+=57){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getY() < i && playQ[j].getY() > play.getY()){//中间有一个棋子就不可以从这条竖线过去Count++;break;}}//for//从起点到终点(从右到左)for (int k=i+57;k<play.getY();k+=57){//找起点和终点的棋子if (playQ[j].getY() < play.getY() && playQ[j].getY() > i){Count++;break;}}//for}//if}//for//起点和终点没有棋子就可以移动了if (Count == 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(),i,55,55);break;}}//if}//for}//if//左、右移动else if (play.getY() - me.getY() >=-27 && play.getY() - me.getY() <= 27){//指定所有模糊X坐标for (int i=24;i<=480;i+=57){//移动的X坐标是否有指定坐标相近的if (i - me.getX() >= -55 && i-me.getX() <= 0){//所有的棋子for (int j=0;j<32;j++){//找出在同一条横线的所有棋子、并不包括自己if (playQ[j].getY() - play.getY() >= -27 && playQ[j].getY() - play.getY() <= 27 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//从起点到终点(从上到下)for (int k=play.getX()+57;k<i;k+=57){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getX() < i && playQ[j].getX() > play.getX()){//中间有一个棋子就不可以从这条横线过去Count++;break;}}//for//从起点到终点(从下到上)for (int k=i+57;k<play.getX();k+=57){//找起点和终点的棋子if (playQ[j].getX() < play.getX() && playQ[j].getX() > i){Count++;break;}}//for}//if}//for//起点和终点没有棋子if (Count == 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(i,play.getY(),55,55);break;}}//if}//for}//else}//炮、车移动方法结束/**炮、车吃棋规则*/public void cannonRule(int Chess,JLabel play,JLabel playTake,JLabel playQ[],MouseEvent me){//起点和终点之间是否有棋子int Count = 0;//所有的棋子for (int j=0;j<32;j++){//找出在同一条竖线的所有棋子、并不包括自己if (playQ[j].getX() - play.getX() >= -27 && playQ[j].getX() - play.getX() <= 27 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//自己是起点被吃的是终点(从上到下)for (int k=play.getY()+57;k<playTake.getY();k+=57){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getY() < playTake.getY() && playQ[j].getY() > play.getY()){//计算起点和终点的棋子个数Count++;break;}}//for//自己是起点被吃的是终点(从下到上)for (int k=playTake.getY();k<play.getY();k+=57){//找起点和终点的棋子if (playQ[j].getY() < play.getY() && playQ[j].getY() > playTake.getY()){Count++;break;}}//for}//if//找出在同一条竖线的所有棋子、并不包括自己else if (playQ[j].getY() - play.getY() >= -10 && playQ[j].getY() - play.getY() <= 10 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//自己是起点被吃的是终点(从左到右)for (int k=play.getX()+50;k<playTake.getX();k+=57){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getX() < playTake.getX() && playQ[j].getX() > play.getX()){Count++;break;}}//for//自己是起点被吃的是终点(从右到左)for (int k=playTake.getX();k<play.getX();k+=57){//找起点和终点的棋子if (playQ[j].getX() < play.getX() && playQ[j].getX() > playTake.getX()){Count++;break;}}//for}//if}//for//起点和终点之间要一个棋子是炮的规则、并不能吃自己的棋子if (Count == 1 && Chess == 0 && playTake.getName().charAt(1) != play.getName().charAt(1)){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(playTake.isVisible()));Var.add(String.valueOf(playTake.getX()));Var.add(String.valueOf(playTake.getY()));Var.add(String.valueOf(i));playTake.setVisible(false);play.setBounds(playTake.getX(),playTake.getY(),55,55);}//起点和终点之间没有棋子是车的规则、并不能吃自己的棋子else if (Count ==0 && Chess == 1 && playTake.getName().charAt(1) != play.getName().charAt(1)){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(playTake.isVisible()));Var.add(String.valueOf(playTake.getX()));Var.add(String.valueOf(playTake.getY()));Var.add(String.valueOf(i));playTake.setVisible(false);play.setBounds(playTake.getX(),playTake.getY(),55,55);}}//炮、车吃棋方法结束/**马移动规则*/public void horseRule(JLabel play,JLabel playQ[],MouseEvent me){ //保存坐标和障碍int Ex=0,Ey=0,Move=0;//上移、左边if (play.getX() - me.getX() >= 2 && play.getX() - me.getX() <= 57 && play.getY() - me.getY() >= 87 && play.getY() - me.getY() <= 141){ //合法的Y坐标for (int i=56;i<=571;i+=57){//移动的Y坐标是否有指定坐标相近的if (i - me.getY() >= -27 && i - me.getY() <= 27){Ey = i;break;}}//合法的X坐标for (int i=24;i<=480;i+=57){//移动的X坐标是否有指定坐标相近的if (i - me.getX() >= -55 && i-me.getX() <= 0){Ex = i;break;}}//正前方是否有别的棋子for (int i=0;i<32;i++){if (playQ[i].isVisible() && play.getX() - playQ[i].getX() == 0 && play.getY() - playQ[i].getY() == 57 ){Move = 1;break;}}//可以移动该棋子if (Move == 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(Ex,Ey,55,55);}}//if//左移、上边else if (play.getY() - me.getY() >= 27 && play.getY() - me.getY() <= 86 && play.getX() - me.getX() >= 70 && play.getX() - me.getX() <= 130){//Yfor (int i=56;i<=571;i+=57){if (i - me.getY() >= -27 && i - me.getY() <= 27){Ey = i;}}//Xfor (int i=24;i<=480;i+=57){if (i - me.getX() >= -55 && i-me.getX() <= 0){Ex = i;}}//正左方是否有别的棋子for (int i=0;i<32;i++){if (playQ[i].isVisible() && play.getY() - playQ[i].getY() == 0 && play.getX() - playQ[i].getX() == 57 ){Move = 1;break;}}if (Move == 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(Ex,Ey,55,55);}}//else//下移、右边else if (me.getY() - play.getY() >= 87 && me.getY() - play.getY() <= 141 && me.getX() - play.getX() <= 87 && me.getX() - play.getX() >= 2 ){//Yfor (int i=56;i<=571;i+=57){if (i - me.getY() >= -27 && i - me.getY() <= 27){Ey = i;}}//Xfor (int i=24;i<=480;i+=57){if (i - me.getX() >= -55 && i-me.getX() <= 0){Ex = i;}}//正下方是否有别的棋子for (int i=0;i<32;i++){if (playQ[i].isVisible() && play.getX() - playQ[i].getX() == 0 && playQ[i].getY() - play.getY() == 57 ){Move = 1;break;}}if (Move == 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(Ex,Ey,55,55);}}//else//上移、右边else if (play.getY() - me.getY() >= 87 && play.getY() - me.getY() <= 141 && me.getX() - play.getX() <= 87 && me.getX() - play.getX() >= 30 ){//合法的Y坐标for (int i=56;i<=571;i+=57){if (i - me.getY() >= -27 && i - me.getY() <= 27){。

中国象棋人人对战

中国象棋人人对战

中国象棋----人人对战设计学号:系别:姓名:班级:成员:中国象棋--人人对战设计1 、问题定义中国象棋在单击游戏可执行文件进入游戏,游戏系统初始化游戏界面,进入游戏系统后,用户可能单击棋子,再点击相应棋子坐标或棋子,实现棋子移动、吃棋子功能。

实现人机对弈。

用户在对弈中,可以实现悔棋、新游戏、退出游戏功能。

系统的用例图如下所示:图1系统用例图2 、可行性研究用户进入系统,进入游戏,把自己的电脑设为主机实现人机对弈。

从功能上基本能满足用户的需求。

性能稳定可靠。

3、需求分析3.1象棋棋子走法规则和功能分析(1) 中国象棋是双方在有着9调竖线和10条横线的棋盘上对弈,竖线和横线的交叉称为棋点或对弈点,每个棋子都是在棋点上行走,而不是在方格中行走。

(2) 河界将棋盘分成两等份,每一边都有一块有9个点组成的九宫,棋子“将”,“帅”和“士”只能在九宫内移动,并且“将”和“帅”每一步只可以水平或垂直移动一个棋点;“士”只能在九宫内移动,并且它每一步只可以沿着对角线移动一个棋点;“象”必须一次沿着对角线方向走两个棋点,但它不能过河也不能跳过或穿越障碍,即“象”不能别眼,“马”没一步只可以水平或垂直移动两个棋点,但必须按对角线向左或向右移动。

中国象棋的“马”不能跳过障碍,即马不能别腿。

“车”可以水平或垂直方向移动入一个无障碍的点。

“炮”移动起来和车类似,但它必须跳过一个棋子来吃掉对方的一个棋子。

“兵”每步只能向前移动一个棋子过河以后,它便增加了向左右移动的能力,并不允许向后移动。

3.2 系统数据流图(1)0层数据流图图2 0层数据流图(2)1层数据流图图3 1层数据流图(3)2层数据流图图4 2层数据流图3.3数据字典设计3.4状态转换图下图图5 状态转换图:4、总体设计4.1总体流程图和中国象棋功能模块中国象棋游戏需要实现的基本功能应包括以下几个方面:(1) 提供棋盘和棋子;(2) 设定棋子的走棋规则;(3) 可以悔棋、重来、退出;(4) 判断胜负。

中国象棋实验报告

中国象棋实验报告

本科学生综合性实验报告课程名称:Java程序设计中国象棋项目成员学号班级B02班项目名称中国象棋指导教师开课学期2013 至2014 学年第1 学期完成时间2013 年12 月25 日1.引言 (1)1.1开发背景 (1)1.2国内外象棋发展状况 (1)1.3开发目标 (2)1.4开发环境 (2)2.设计思路 (2)2.1设计步骤 (2)2.2设计流程图 (3)3.设计技术 (3)3.1io技术 (3)3.2多线程 (4)3.3swing (4)4.设计规则 (4)4.1走棋规则 (4)4.2吃棋规则 (4)5.代码实现 (4)6.程序测试 (5)6.1步骤一:点击运行 (5)6.2步骤二: (6)7.总结与提升 (10)1.引言1.1开发背景中国象棋游戏流传至今已经有数千年的历史了,是一种古老的文化,它集文化、科学、艺术、竞技于一体,有利于开发人的智慧,锻炼人的思维,培养人的毅力,增强人的竞争意识。

自从计算机发明,向各个领域发展,到成为我们现在每天工作和生活必不可少的一部分的这个过程中,电子游戏也逐步渗入我们每个人的娱乐活动中。

在计算机已经普及的今天,对于可以用计算机进行程序编辑的人来说,开发属于自己的游戏,已经不再是梦想,中国象棋历史悠久不仅源远流长,而且基础广泛,作为一项智力运动更成为我们游戏开发的首选对象。

中国象棋是一项智力游戏,以往都是人和人下棋,现在有了计算机我们可以和计算机竞技,人可以与计算机进行对弈。

控制计算机的是人类,而人工智能是综合性很强的一门边缘学科,它的中心任务是研究如何使计算机去做那些过去只能靠人的智力才能做的工作。

因此,对游戏开发过程中的人工智能技术的研究自然也就成了业界的一个热门研究方向。

1.2国内外象棋发展状况中国象棋游戏流传至今已经有数千年的历史了,是一种古老的文化,它集文化、科学、艺术、竞技于一体,有利于开发人的智慧,锻炼人的思维,培养人的毅力,增强人的竞争意识。

基于JAVA语言的中国象棋设计与实现设计

基于JAVA语言的中国象棋设计与实现设计

基于JAVA语言的中国象棋设计与实现设计题目:基于JA V A语言的中国象棋设计与实现毕业设计(论文)原创性声明和使用授权说明原创性声明本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。

尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。

对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作者签名:日期:指导教师签名:日期:使用授权说明本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:日期:【摘要】电脑在中国象棋上的运用还刚刚起步,尽管国内涌现出一大批中国象棋的专业网站和专业软件,但是由于缺乏必要的基础工作,电脑技术在中国象棋上的应用优势还无法体现出来,随着人工智能及计算机硬件的发展,计算机象棋程序的水平也不断地得到提高。

本文通过研究中国象棋的国内外研究现状、分析中国象棋的需求和用JA V A 语言设计中国象棋程序的可行性,同时根据国际象棋程序设计的一些成功经验,主要借鉴了位棋盘、Zobrist键值等,针对中国象棋程序设计的一系列问题,总结出一些中国象棋程序的设计方法。

根据该方法设计出了符合中国象棋行棋和吃子规则,能够判断胜负,能够实现悔棋、重新开始等多种功能,而且界面十分美观的中国象棋程序,并给出了JA V A语言的实现方法。

关键词:中国象棋,位棋盘,Zobrist键值,着发生成【Abstract】The implement of playing Chinese Chess on computer has just started. Although large numbers of professional websites and professional chess software arised in domestic, the lack of necessary basic work causes the advantage of computer technology applications in Chinese chess can’t be reflected. With the development of artificial intelligence and computer hardware, the level of computer chess program continues to be improved.This paper studies the research status of Chinese chess, analyzes the demand of Chinese chess, and learns the feasibility of Chinese chess that is designed by Java language. At the same time, the function is designed with the successful experience of chess program, such as the place board, Zobrist keys, etc. Chinese chess program is summarized some ways to design Chinese chess program for solve a range of issues. Follow this ways, it designs all the rules and funtions which adapt to the requirement of Chinese chess, including of movement, judgement, undo, re-start and so on.The application gives the implementation method in JA V A language and beautiful interface.Keywords: Chinese Chess, bit board, zobrist keys目录1绪论 (1)1.1研究背景 (1)1.2研究意义 (1)1.3预期目标 (1)2分析 (3)2.1需求分析 (3)2.2可行性分析 (3)2.3功能分析 (3)2.4硬件环境 (4)2.4.1开发环境 (4)2.4.2运行环境 (4)3界面设计框架 (5)3.1程序的框架 (5)3.2.基本数据结构——位棋盘 (5)3.2.1 什么是位棋盘 (5)3.2.2 位棋盘的作用 (6)3.2.3 位棋盘的基本运算 (6)3.2.4 Java中位棋盘的实现 (6)3.3.基本数据结构——Zobrist键值 (9)3.3.1 比较局面的方法 (9)3.3.2 Zobrist键值的工作原理 (9)3.3.3 Zobrist键值的实现方法 (10)3.3.4 Java中实现Zobrist键值 (10)4系统实现 (12)4.1着法生成 (12)4.1.1伪合法着法的生成 (12)4.1.2 合法着法的生成 (17)4.2算法实现 (20)4.2.1 行棋规则算法实现 (20)4.2.2界面功能算法实现 (23)5结论 (26)参考文献 (27)附录 (28)附录1算法主程序 (28)附录2程序截图 (53)外文文献与翻译 (54)致谢 (63)1绪论1.1研究背景计算机现在已经成为每天工作和生活必不可少的一部分,电子游戏在计算机产业的带动下也逐步深入我们每个人的娱乐活动中,棋牌游戏作为休闲类电子游戏,相对于角色扮演类游戏和即时战略类游戏等其它游戏,具有上手快、游戏时间短的特点,更利于用户进行放松休闲,为人们所喜爱,特别是棋类游戏,方便、快捷、操作简单,在休闲娱乐中占主要位置。

Java语言课程设计中国象棋打谱系统

Java语言课程设计中国象棋打谱系统

目录1.绪论 (2)1.1引言 (2)1.2主要设计内容 (3)2.开发工具简介 (3)2.1 java语言概述 (3)2.2 java语言的特点 (4)2.3 关于ECLIPSE (5)3.程序设计需求分析 (7)3.1任务概述 (7)3.2综合要求 (7)3.3 设计基本要求 (7)4.程序的总体设计 (8)4.1线程的设计 (8)4.2线程的生命周期 (9)5.程序的详细设计 (11)5.1程序流程图 (11)5.2数据字典 (12)5.3运行结果及界面 (16)6.实验总结 (18)参考文献 (18)附录(部分源代码) (19)1.绪论1.1引言象棋水平的发展是需要靠信息技术来推动的,国际象棋有两个很好的范例,一个是象棋棋谱编辑和对弈程序的公共平台——WinBoard平台,另一个是商业的国际象棋数据库和对弈软件——ChessBase,他们为国际象棋爱好者和研究者提供了极大的便利。

国际象棋软件有着成功的商业运作,已发展成一种产业。

然而,电脑在中国象棋上的运用还刚刚起步,尽管国内涌现出一大批中国象棋的专业网站和专业软件,但是由于缺乏必要的基础工作,电脑技术在中国象棋上的应用优势还无法体现出来。

在设计中国象棋软件过程中,国际象棋软件有很多值得借鉴的成功经验和优秀的思想。

例如 B. Moreland,微软(Microsoft)的程序设计师,业余从事国际象棋引擎Ferret的开发,他的一系列关于国际象棋程序设计的文章非常值得其他棋类程序设计人员借鉴。

然而,中国象棋与国际象棋存在着很大的差异,因此国际象棋的某些成熟技术,无法直接应用于中国象棋,需要对其加以改进和创新。

1.2主要设计内容本课题采用Java语言编写这个中国象棋对弈系统程序。

主要工作内容:搜集相关资料,准备参考资料,学习掌握开发方法、开发工具,需求分析,确定游戏程序实施方案,根据要求设计具体的流程图,编写程序,修改、完善程序,系统调试、测试,优化处理。

基于Java的中国象棋游戏设计 论文03854

基于Java的中国象棋游戏设计 论文03854

本科毕业论文(设计)题目:基于Java的中国象棋游戏设计摘要:随着社会的发展,科学技术不断提高,人们的娱乐活动不断地增加,中国象棋作为中华民族的传统文化,不仅在国内深受群众喜爱,而且流传国外。

开发中国象棋游戏软件,推广我们传统的象棋文化。

本文通过运用Java语言、软件工程的知识,参考网上一些文献资料的设计思路,开发出中国象棋对弈游戏系统,程序实现了游戏计时、悔棋、和棋、认输等功能。

通过对系统进行详细地需求分析,设计出了系统的逻辑模型,并且对各个功能进行了详细的分析,对中国象棋规则进行了详细地算法描述,最后对该程序的功能进行了测试与总结。

关键词:JA V A;中国象棋;对弈;游戏目录1 绪论 (1)1.1 项目开发的背景及意义 (1)1.2 研究现状及发展趋势 (1)1.3 研究目标 (1)2 可行性研究 (2)2.1 技术可行性 (2)2.1.1 使用java技术的优点 (2)2.1.2 Eclipse简介 (3)2.2 经济可行性 (3)2.3 社会可行性 (3)3 需求分析及总体设计 (4)3.1 需求分析 (4)3.2 总体设计 (4)3.2.1 总体结构设计 (4)3.2.2 棋盘棋子的设计 (5)3.3 类图说明 (6)4 详细设计 (9)4.1 程序流程设计 (9)4.2 开始游戏设计 (9)4.3 功能设计 (12)4.3.1 计时功能 (12)4.3.2 悔棋功能 (12)4.3.3 求和和认输 (12)4.3.4 信息帮助 (13)4.4 界面设计 (14)4.5 走棋和吃棋规则设计 (14)5 系统测试与总结 (16)5.1 系统测试 (16)5.1.1 系统功能测试 (16)5.1.2 运行效果测试 (17)5.2 总结与展望 (18)参考文献 (20)1 绪论1.1项目开发的背景及意义随着电子信息技术的不断发展以及网络技术的普及,网络能够提供多样、便捷的服务,已经成为人们生产生活中不可缺少的重要组成部分。

基于Android平台的中国象棋人机对弈游戏开发_毕设论文

基于Android平台的中国象棋人机对弈游戏开发_毕设论文

学位论文诚信声明书本人郑重声明:所呈交的学位论文(设计)是我个人在导师指导下进行的研究(设计)工作及取得的研究(设计)成果。

除了文中加以标注和致谢的地方外,论文(设计)中不包含其他人或集体已经公开发表或撰写过的研究(设计)成果,也不包含本人或其他人在其它单位已申请学位或为其他用途使用过的成果。

与我一同工作的同志对本研究(设计)所做的任何贡献均已在论文中做了明确的说明并表示了致谢。

申请学位论文(设计)与资料若有不实之处,本人愿承担一切相关责任。

学位论文(设计)作者签名:日期:学位论文知识产权声明书本人完全了解学校有关保护知识产权的规定,即:在校期间所做论文(设计)工作的知识产权属西安科技大学所有。

学校有权保留并向国家有关部门或机构送交论文的复印件和电子版。

本人允许论文(设计)被查阅和借阅;学校可以公布本学位论文(设计)的全部或部分内容并将有关内容编入有关数据库进行检索,可以采用影印、缩印或其它复制手段保存和汇编本学位论文。

保密论文待解密后适用本声明。

学位论文(设计)作者签名:指导教师签名:年月日论文题目:基于Android平台的中国象棋人机对弈游戏开发专业:电子信息科学与技术学生:签名:__________指导教师:张龙妹签名:__________摘要随着生活节奏的加快,智能手机的发展,人们在智能手机上进行娱乐的机会越来越多,这在一定程度上推动了手机游戏的发展。

Android是开放性体系架构,不仅具有非常好的开发、调试环境,而且还支持各种可扩展的用户体验,包括丰富的图形组件、多媒体支持功能以及强大的浏览器。

因此,对于软件从业人员来说,Android平台具有无限的吸引力。

本文研究和分析了Android平台下的中国象棋的相关技术,设计和实现了基于Android平台的中国象棋人机对弈游戏。

并对游戏的运行情况进行了测试,测试结果表明,游戏移植到手机上运行良好,基本符合设计初衷。

通过本论文的设计和实现,掌握了Android平台下游戏开发的相关技术和设计流程,为以后从事进一步的研究和软件开发工作奠定了基础。

中国象棋人机对弈游戏的设计与实现 简单参考

中国象棋人机对弈游戏的设计与实现 简单参考

中国象棋人机对弈游戏的设计与实现摘要象棋程序的实现可以被分为人工智能和界面程序辅助两大部分。

人工智能部分主要体现计算机的下棋思路,既计算机如何进行思考并以最佳走法完成下一步,先由相应的搜索算法进行搜索,并对各种可能的走法进行估值,从中选择胜利面最大的一步;而界面及程序辅助部分主要便于用户通过以前的下棋步骤,更好地调整下棋思路,着法显示使用户能够清楚地知道下棋过程,更准确地把握整个局面。

本文首先研究了中国象棋在计算机中的表示问题,接着讨论如何产生着法一系列相关内容。

其次研究了博弈树的极小极大搜索技术及在此基础上发展起来的Alpha-Beta剪枝算法,使用MFC文档视图体系结构和Visual C++开发工具,实现了一个具有一定棋力的中国象棋人机对弈程序。

关键词:中国象棋;人工智能;博弈树;Alpha-Beta搜索The Design and Implementation of Chinese ChessAbstractThe implementation of a chess program can be decomposed into two major parts: the artificial intelligence and the user interface and program assist. The part of artificial intelligence shows the way of computer thinking, and which step is the best step would be decided by it. Firstly, the computer uses search algorithms to search, and then evaluates every impossible step, finally choses the best one, the other part is used for the player to adjust his thought to the currently phases. The display of step list makes player know the process of chess distinctly, and let player make a better choice.This paper firstly studies how to represent a chess board in computer, then discusses how to generate legal moves. Secondly, this paper studies the mini-max searching procedure of Game Tree, and the Alpha-Beta pruning algorithm. A Chess-playing system is designed and developed, which is built on the integrated computer MFC SDI document view architecture by using Visual C++.Key words: Chinese chess; Artificial Intelligence; Game tree; Alpha-Beta searching象棋设计研究方法对于象棋来说,核心设计主要包括人工智能算法的以及整个游戏中界面及程序辅助部分的实现,主要用Visual C++ 进行开发,里面的MFC类库,使游戏开发更加方便,并利用人工智能相关搜索算法实现人工智能的着法生成,从而完善整个游戏的功能。

基于JAVA中国象棋网络对弈软件毕业设计

基于JAVA中国象棋网络对弈软件毕业设计

摘要中国象棋网络版是一款可以实现多人同时在线的网络对弈象棋软件。

中国象棋网络版采用C/S架构,由跨平台的Java语言和MySQ L数据库开发,在开发过程中使用了多线程、java swing、Socket编程以及TCP和UDP协议等技术。

中国象棋网络版提供了:棋友状态列表,弈棋邀请,观看他人弈棋,棋谱记录和保存,在线交流,快速注册等功能。

服务端提供了:发布系统消息提示,服务器状态显示,在线棋友管理等功能。

最后,对系统进行测试表明,系统功能达到了预期的要求,实现与同类的象棋软件如QQ象棋类似的功能,具有界面友好,操作简便,运行稳定的特点,完成设计要求的功能。

本系统不足之处在于没有实现人机对弈、聊天记录的本机存储,将在以后的更新版本中逐步完善。

关键词:对弈,Java,多线程AbstractChinese chess online is a software can support multiplayer play chess online at the same time .The chinese chess online, based on the architecture of C/S, is developed by MySQL database and Java, a cross-platform language. In the development, multi-thread, Java swing, Socket programming and TCP/UDP protocol are applied. First, the newer can fast register and then get an account in the network version. The players can invite others to join, watch others playing, communicate with others online and hold chess-playing records. Of course ,there exists a status bar to check the states of all chess players. Here the service releases the notes of the system information, displays the state of itself, and deal with chess players online, etc. The test of the system indicates, all the expected functions have been realized. It has the similar functions just like the QQ chess, an online software of kind. The interface is on good terms, and the operation is easy, and also it runs stably. However, disappointingly, the computer can't be an opponent of the players, and the users' computer can't keep the chat records itself. These are both the weak points and the improvements will be made in the new version.Keywords: chess-playing , Java, Multithreading目录1. 前言 (1)1.1课题的研究目的和意义 (1)1.2开发和运行环境 (1)1.2.1开发环境 (1)1.2.2运行环境 (1)2.JAVA和网络套接字技术 (2)2.1J AVA简介 (2)2.2J AVA图形技术 (2)2.3J AVA事件响应技术 (4)2.3.1鼠标事件响应 (4)2.3.2键盘事件响应 (4)2.4网络网络通信技术 (4)2.4.1 TCP (4)2.4.2 UDP (4)2.4.3 Socket (5)2.4.4 Java实现 (5)3.中国象棋网络版架构设计与通信设计 (7)3.1中国象棋网络版架构分析与设计 (7)3.2中国象棋网络版数据通信设计与实现 (7)3.2.1通信协议选择 (7)3.2.2数据类型分析 (9)3.2.3数据格式设计 (11)3.2.4数据通信与处理伪码示例 (13)4.中国象棋网络版客户端实现 (16)4.1客户端基础架构 (16)4.2客户端GUI设计 (16)4.2.1弈棋主面板 (16)4.2.2用户列表面板 (17)4.2.3棋谱记录面板 (17)4.2.4用户交流面板 (17)4.3客户端类设计 (18)4.3.1 chessboardP (18)4.3.2 userP (18)4.3.3 chessstateP (19)4.3.4 chatP (19)4.3.5数据处理相关类 (19)4.4客户端主要算法伪码示例 (20)4.4.1棋子和棋盘状态维护算法简介 (20)4.4.2棋盘规则马规则伪码示例 (20)4.4.3棋子选择和移动伪码示例 (20)4.4.4棋谱生成部分伪码示例 (21)4.4.5棋局结果判定伪码示例 (22)4.4.6通信数据处理和分发算法简介 (22)4.4.7棋子选中闪烁算法简介 (22)5.中国象棋网络版服务器端实现 (23)5.1服务器端基础架构 (23)5.2服务器端GUI设计 (24)5.3服务器端类设计 (25)5.3.1 serverGUI (25)5.3.2 serverListener (25)5.3.3 chessroom (26)5.3.4 databaseinterface (26)5.4数据库相关开发 (26)5.4.1数据库需求分析 (26)5.4.2数据库表设计 (26)5.5服务器端主要算法伪码示例 (27)5.5.1登录注册时与数据库交互伪码示例 (27)5.5.2弈棋聊天用户列表维护数据转发算法简介 (28)5.5.3 MD5加密产生密匙伪码示例 (28)5.5.4踢用户下线伪码示例 (28)6.中国象棋网络版运行测试 (30)6.1.客户端功能测试 (30)6.1.1用户上线响应异常 (30)6.1.2弈棋过程中将可以出九宫异常 (31)6.2服务器端测试 (32)6.2.1用户下线后服务器在线用户数统计异常 (32)6.2.2对正在弈棋的用户强制下线异常 (33)6.3测试总结 (33)结束语 (34)致谢 (35)参考文献 (36)附录 (37)1.前言1.1 课题的研究目的和意义本课题的目的是采用Java语言编写实现网络象棋对弈软件,实现中国象棋的网络对弈,拥有用户列表、棋谱查看保存、在线交流等功能。

局域网的象棋对战

局域网的象棋对战

说明本系统是一款基于Eclipse平台开发的局域网象棋对战游戏,采用Java GUI技术绘制界面,面向连接的Socket实现局域网联机,多线程同步用户信息数据。

系统分为服务器端和客户端,服务器端起到处理用户联网信息并转发数据的作用,客户端主要实现象棋对弈。

该象棋游戏界面友好,操作方便,能满足广大象棋爱好者的日常对弈需求。

目录摘要 (I)Abstract (II)1引言 (1)1.1课题背景 (1)1.2中国象棋发展现状 (1)2 开发环境与相关技术 (1)2.1 Java语言 (1)2.2 开发工具 (2)2.3 技术 (3)2.3.1 面向对象设计 (3)2.3.2 Java GUI技术 (3)2.3.3 JAVA多线程技术 (5)2.3.4 点对点通信 (6)2.3.5 TCP/IP协议 (7)3需求分析 (8)3.1 任务概述 (8)3.2 需求分析 (8)3.2.1 联机操作功能 (8)3.2.2 象棋对弈功能 (8)4总体设计 (9)4.1 系统结构图 (9)4.2 类框架设计 (9)4.2.1 服务器端 (9)4.2.2 客户端 (10)4.3 需要解决的问题 (11)5系统实现 (13)5.1 棋盘设计 (13)5.2 规则制定 (16)5.2.1 规则说明 (16)5.2.2 规则算法 (17)6运行测试 (23)6.1 服务端 (23)6.2 客户端 (24)7 总结 (27)致谢 (27)参考文献 (27)基于局域网的中国象棋游戏摘要:中国象棋具有悠久的历史。

战国时期,已经有了关于象棋的正式记载,新中国建立之后,象棋进入了一个崭新的发展阶段。

随着信息技术的发展,人民生活水平的不断提高。

联网游戏作为一种娱乐手段,正以其独特的魅力吸引着越来越多的玩家。

为了满足广大象棋爱好者也可以享受到网络所带来的便利,本设计在当前局域网条件下实现了中国象棋的网络对战。

鉴于局域网的特点和游戏本身的要求,本设计采用C/S架构来实现相互之间的通信。

中国象棋计算机对弈软件的设计与实现

中国象棋计算机对弈软件的设计与实现


3 系统的详细设计与实现
本文采用 Java 程序设计语言开发,通过 MyEclipse 2014 开发平 台,使用 MySQL 数据库进行四人象棋计算机对弈软件的开发,实现 了数据的添加、删除、修改和查询等功能,用户只需要选择一种游戏 模式,输入账号和密码,即可开始玩 4 人游戏。
3.1 模式选择界面
3.2 登录界面
图 1 模式选择界面
3.3 游戏界面
图 2 登录界面
4 结论
图 3 玩游戏界面
四人象棋计算机对弈软件可以实现不同地域、不同模式的多人游 戏,并且继承了传统中国象棋的行棋规则,解决了传统象棋缺乏团队 配合的问题,提高了玩家兴趣,同时,增加了一些新的布局和游戏规 则以及游戏的难度,促进了中国象棋业的推广与发展。
RefreshRoomList
token
加入游戏接口
createRoom movepriece
Token,account toekn,data
创建房间接口 棋子走棋接口
Joinroom
roomNum,account,token
加入游戏接口
CheckChange
Token,account
判断棋盘是否改变接
备注
6 AUTO_INCREMENT T 用户 ID
PRIMARY KEY
40
NOT NULL
用户帐号
20
NOT NULL
用户密码
20
NOT NUห้องสมุดไป่ตู้L
用户的邮

20
NOT NULL
用户的名

由于用户在互联网中玩游戏时,要登录自己的游戏账号,用户的 信息需要创建数据表进行存储,使用这些数据可以登录及找回密码。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Java象棋人机对弈程序——源代码和系统说明文档一、系统功能人机对弈,鼠标操作。

二、系统界面界面用到的棋子如下:棋盘:需要保存为gif文件。

三、源代码import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;import java.io.*;//主类public class Chess{public static void main(String args[]){new ChessMainFrame("象棋");}}//主框架类class ChessMainFrame extends JFrame implements ActionListener,MouseListener,Runnable {//玩家JLabel play[] = new JLabel[32];//棋盘JLabel image;//窗格Container con;//工具栏JToolBar jmain;//重新开始JButton anew;//悔棋JButton repent;//打开JButton showOpen;//保存JButton showSave;//退出JButton exit;//当前信息JLabel text;//保存当前操作Vector FileVar;Vector Var;//规则类对象(使于调用方法)ChessRule rule;/*单击棋子**********************************//*chessManClick = true 闪烁棋子并给线程响应*//*chessManClick = false 吃棋子停止闪烁并给线程响应*/boolean chessManClick;/*控制玩家走棋****************************//*chessPlayClick=1 黑棋走棋*//*chessPlayClick=2 红棋走棋默认红棋*//*chessPlayClick=3 双方都不能走棋*/int chessPlayClick=2;//控制棋子闪烁的线程Thread tmain;//把第一次的单击棋子给线程响应static int Man,i;ChessMainFrame(){}ChessMainFrame(String Title){//获行客格引用con = this.getContentPane();con.setLayout(null);//实例化规则类rule = new ChessRule();FileVar = new Vector();Var = new Vector();//创建工具栏jmain = new JToolBar();text = new JLabel(" 热烈欢迎");text.setToolTipText("提示信息");anew = new JButton(" 新游戏" );anew.setToolTipText("重新开始新的一局");exit = new JButton(" 退出");exit.setToolTipText("退出本程序");repent = new JButton(" 悔棋");repent.setToolTipText("返回到上次走棋的位置");showOpen = new JButton("打开");showOpen.setToolTipText("打开以前棋局");showSave = new JButton("保存");showSave.setToolTipText("保存当前棋局");//把组件添加到工具栏jmain.setLayout(new GridLayout(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 (int i=0;i<32;i++){con.add(play[i]);play[i].addMouseListener(this);}//添加棋盘标签con.add(image = new JLabel(new ImageIcon("CChess.GIF")));image.setBounds(0,0,445,498);image.addMouseListener(this);//注册窗体关闭监听this.addWindowListener(new WindowAdapter(){public void windowClosing(WindowEvent we){System.exit(0);}});//窗体居中Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();Dimension frameSize = 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(new ImageIcon("相1.gif").getImage());this.setResizable(false);this.setTitle(Title);this.setSize(450,555);this.show();}/*添加棋子方法************/public void drawChessMan(){//流程控制int i,k;//图标Icon in;//黑色棋子//车in = new ImageIcon("车1.GIF");for (i=0,k=10;i<2;i++,k+=385){play[i] = new JLabel(in);play[i].setBounds(k,10,40,40);play[i].setName("车1");}//马in = new ImageIcon("马1.GIF");for (i=4,k=60;i<6;i++,k+=285){play[i] = new JLabel(in);play[i].setBounds(k,10,40,40);play[i].setName("马1");}//相in = new ImageIcon("相1.GIF");for (i=8,k=105;i<10;i++,k+=195) {play[i] = new JLabel(in);play[i].setBounds(k,10,40,40);play[i].setName("相1");}//士in = new ImageIcon("士1.GIF");for (i=12,k=155;i<14;i++,k+=95) {play[i] = new JLabel(in);play[i].setBounds(k,10,40,40);play[i].setName("士1");}//卒in = new ImageIcon("卒1.GIF");for (i=16,k=10;i<21;i++,k+=96.5) {play[i] = new JLabel(in);play[i].setBounds(k,160,40,40);play[i].setName("卒1" + i);}//炮in = new ImageIcon("炮1.GIF");for (i=26,k=60;i<28;i++,k+=289) {play[i] = new JLabel(in);play[i].setBounds(k,110,40,40);play[i].setName("炮1" + i);}//将in = new ImageIcon("将1.GIF"); play[30] = new JLabel(in);play[30].setBounds(205,10,40,40); play[30].setName("将1");//红色棋子//车in = new ImageIcon("车2.GIF");for (i=2,k=10;i<4;i++,k+=385){play[i] = new JLabel(in);play[i].setBounds(k,450,40,40);play[i].setName("车2");}//马in = new ImageIcon("马2.GIF");for (i=6,k=60;i<8;i++,k+=285){play[i] = new JLabel(in);play[i].setBounds(k,450,40,40);play[i].setName("马2");}//相in = new ImageIcon("相2.GIF");for (i=10,k=105;i<12;i++,k+=195) {play[i] = new JLabel(in);play[i].setBounds(k,450,40,40);play[i].setName("相2");}//士in = new ImageIcon("士2.GIF");for (i=14,k=155;i<16;i++,k+=95) {play[i] = new JLabel(in);play[i].setBounds(k,450,40,40);play[i].setName("士2");}//兵in = new ImageIcon("兵2.GIF");for (i=21,k=10;i<26;i++,k+=96.5) {play[i] = new JLabel(in);play[i].setBounds(k,300,40,40);play[i].setName("兵2" + i);}//炮in = new ImageIcon("炮2.GIF");for (i=28,k=60;i<30;i++,k+=289) {play[i] = new JLabel(in);play[i].setBounds(k,350,40,40);play[i].setName("炮2" + i);}//帅in = new ImageIcon("帅2.GIF");play[31] = new JLabel(in);play[31].setBounds(205,450,40,40);play[31].setName("帅2");}/*线程方法控制棋子闪烁*/public void run(){while (true){//单击棋子第一下开始闪烁if (chessManClick){play[Man].setVisible(false);//时间控制try{tmain.sleep(500);}catch(Exception e){}play[Man].setVisible(true);}//闪烁当前提示信息以免用户看不见else{text.setVisible(false);//时间控制try{tmain.sleep(500);}catch(Exception e){}text.setVisible(true);}try{tmain.sleep(500);}catch (Exception e){}}}/*单击棋子方法************************/ public void mouseClicked(MouseEvent me){System.out.println("Mouse");//当前坐标int Ex=0,Ey=0;//启动线程if (tmain == null){tmain = new Thread(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);}//移动炮else if (Man > 25 && Man < 30){rule.cannonRule(play[Man],play,me);}//移动车else if (Man >=0 && Man < 4){rule.cannonRule(play[Man],play,me);}//移动马else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play,me);}//移动相、象else if (Man > 7 && Man < 12){rule.elephantRule(Man,play[Man],play,me);}//移动仕、士else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play,me);}//移动将、帅else if (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//该黑棋走棋的时候else if (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);}//移动炮else if (Man > 25 && Man < 30){rule.cannonRule(play[Man],play,me);}//移动车else if (Man >=0 && Man < 4){rule.cannonRule(play[Man],play,me);}//移动马else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play,me);}//移动相、象else if (Man > 7 && Man < 12){rule.elephantRule(Man,play[Man],play,me);}//移动仕、士else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play,me);}//移动将、帅else if (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;}}//else if//当前没有操作(停止闪烁)chessManClick=false;}//if//单击棋子else{//第一次单击棋子(闪烁棋子)if (!chessManClick){for (int i=0;i<32;i++){//被单击的棋子if (me.getSource().equals(play[i])){//告诉线程让该棋子闪烁Man=i;//开始闪烁chessManClick=true;break;}}//for}//if//第二次单击棋子(吃棋子)else if (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]);}//炮吃规则else if (Man > 25 && Man < 30){rule.cannonRule(0,play[Man],play[i],play,me);}//车吃规则else if (Man >=0 && Man < 4){rule.cannonRule(1,play[Man],play[i],play,me);}//马吃规则else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play[i],play,me);}//相、象吃规则else if (Man > 7 && Man < 12){rule.elephantRule(play[Man],play[i],play);}//士、仕吃棋规则else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play[i],play);}//将、帅吃棋规则else if (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//该黑棋吃棋的时候else if (chessPlayClick == 1 && play[Man].getName().charAt(1) == '1'){Ex = play[Man].getX();Ey = play[Man].getY();//卒、兵吃规则if (Man > 15 && Man < 26){rule.armsRule(play[Man],play[i]);}//炮吃规则else if (Man > 25 && Man < 30){rule.cannonRule(0,play[Man],play[i],play,me);}//车吃规则else if (Man >=0 && Man < 4){rule.cannonRule(1,play[Man],play[i],play,me);}//马吃规则else if (Man > 3 && Man < 8){rule.horseRule(play[Man],play[i],play,me);}//相、象吃规则else if (Man > 7 && Man < 12){rule.elephantRule(play[Man],play[i],play);}//士、仕吃棋规则else if (Man > 11 && Man < 16){rule.chapRule(Man,play[Man],play[i],play);}//将、帅吃棋规则else if (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=1;break;}else{text.setText(" 红棋走棋");chessPlayClick=2;break;}}//else if}//if}//for//是否胜利if (!play[31].isVisible()){JOptionPane.showConfirmDialog(this,"黑棋胜利","玩家一胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);//双方都不可以在走棋了chessPlayClick=3;text.setText(" 黑棋胜利");}//ifelse if (!play[30].isVisible()){JOptionPane.showConfirmDialog(this,"红棋胜利","玩家二胜利",JOptionPane.DEFAULT_OPTION,JOptionPane.WARNING_MESSAGE);chessPlayClick=3;text.setText(" 红棋胜利");}//else if}//else}//else}public void mousePressed(MouseEvent me){}public void mouseReleased(MouseEvent me){}public void mouseEntered(MouseEvent me){}public void mouseExited(MouseEvent me){}/*单击按扭*********************************/public void actionPerformed(ActionEvent ae){//重新开始if (ae.getSource().equals(anew)){int i,k;//重新排列每个棋子的位置//车for (i=0,k=10;i<2;i++,k+=385){play[i].setBounds(k,10,40,40);}//马for (i=4,k=60;i<6;i++,k+=285){play[i].setBounds(k,10,40,40);}//相for (i=8,k=105;i<10;i++,k+=195){play[i].setBounds(k,10,40,40);}//士for (i=12,k=155;i<14;i++,k+=95){play[i].setBounds(k,10,40,40);}//卒for (i=16,k=10;i<21;i++,k+=96.5){play[i].setBounds(k,160,40,40);}//炮for (i=26,k=60;i<28;i++,k+=289){play[i].setBounds(k,110,40,40);}//将play[30].setBounds(205,10,40,40);//红色棋子//车for (i=2,k=10;i<4;i++,k+=385){play[i].setBounds(k,450,40,40);}//马for (i=6,k=60;i<8;i++,k+=285){play[i].setBounds(k,450,40,40);}//相for (i=10,k=105;i<12;i++,k+=195){play[i].setBounds(k,450,40,40);}//士for (i=14,k=155;i<16;i++,k+=95){play[i].setBounds(k,450,40,40);}//兵for (i=21,k=10;i<26;i++,k+=96.5){play[i].setBounds(k,300,40,40);}//炮for (i=28,k=60;i<30;i++,k+=289){play[i].setBounds(k,350,40,40);}//帅play[31].setBounds(205,450,40,40);chessPlayClick = 2;text.setText(" 红棋走棋");for (i=0;i<32;i++){play[i].setVisible(true);}for (i=0;i<Var.size();i++){Var.remove(i);}}//悔棋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()-2));//获得索引int M = Integer.parseInt((String)Var.get(Var.size()-1));//赋给棋子play[M].setVisible(true);play[M].setBounds(x,y,40,40);if (play[M].getName().charAt(1) == '1'){text.setText(" 黑棋走棋");chessPlayClick = 1;}else{text.setText(" 红棋走棋");chessPlayClick = 2;}//删除用过的坐标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(showOpen)){try{//打开对话框JFileChooser jfcOpen = new JFileChooser("打开棋局");int v=jfcOpen.showOpenDialog(this);if (v != JFileChooser.CANCEL_OPTION){//删除集合所有信息Var.removeAllElements();FileVar.removeAllElements();//打开文件获得所有数据FileInputStream fileIn = new FileInputStream(jfcOpen.getSelectedFile());ObjectInputStream objIn = new ObjectInputStream(fileIn);FileVar = (Vector)objIn.readObject();fileIn.close();objIn.close();//集合内容对应棋子坐标int k=0;for (int i=0;i<32;i++){play[i].setBounds(((Integer)FileVar.get(k)).intValue(),((Integer)FileVar.get(k+1)).intValue(),40,4 0);//被吃掉的棋子不显示if (!((Boolean)FileVar.elementAt(k+2)).booleanValue()){play[i].setVisible(false);}k+=3;}//当前该哪方棋子走棋if (((String)stElement()).toString().equals(" 红棋走棋")){text.setText(((String)stElement()).toString());chessPlayClick = 2;}else if (((String)stElement()).toString().equals(" 黑棋走棋")){text.setText(((String)stElement()).toString());chessPlayClick = 1;}else if (((String)stElement()).toString().substring(5).equals("利")){text.setText(((String)stElement()).toString());chessPlayClick = 3;}}}catch(Exception e){System.out.println("ERROR ShowOpen");}}//保存当前棋局else if (ae.getSource().equals(showSave)){try{//保存对话框JFileChooser jfcSave = new JFileChooser("保存当前棋局");int v=jfcSave.showSaveDialog(this);if (v != JFileChooser.CANCEL_OPTION){FileVar.removeAllElements();//保存所有棋子的坐标和是否可见for (int i=0;i<32;i++){FileVar.addElement(new Integer(play[i].getX()));FileVar.addElement(new Integer(play[i].getY()));FileVar.addElement(new Boolean(play[i].isVisible()));}//保存当前该哪方吃棋FileVar.add(text.getText());//保存到文件FileOutputStream fileOut = newFileOutputStream(jfcSave.getSelectedFile());ObjectOutputStream objOut = new ObjectOutputStream(fileOut);objOut.writeObject(FileVar);objOut.close();fileOut.close();}}catch(Exception e){System.out.println("ERROR ShowSave");}}//退出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);}}}/*规则类*/class ChessRule{/*卒移动规则******************************************/public void armsRule(int Man,JLabel play,MouseEvent me){//黑卒向下if (Man < 21){//向下移动、得到终点的坐标模糊成合法的坐标if ((me.getY()-play.getY()) > 40 && (me.getY()-play.getY()) < 80 &&(me.getX()-play.getX()) < 30 && (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()+45,40,40);}//向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() >= 250 && (me.getX() - play.getX()) >= 30 && (me.getX() - play.getX()) <= 90){play.setBounds(play.getX()+48,play.getY(),40,40);}//向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() >= 250 && (play.getX() - me.getX()) >= 20 && (play.getX() - me.getX()) <=90){//模糊坐标play.setBounds(play.getX()-48,play.getY(),40,40);}}//红卒向上else{//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//向上移动、得到终点的坐标模糊成合法的坐标if ((me.getX()-play.getX()) > 0 && (me.getX()-play.getX()) < 30 &&(play.getY()-me.getY()) >20 && play.getY()-me.getY() < 70){play.setBounds(play.getX(),play.getY()-48,40,40);}//向右移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 210 && (me.getX() - play.getX()) >= 30 && (me.getX() - play.getX()) <= 90){play.setBounds(play.getX()+50,play.getY(),40,40);}//向左移动、得到终点的坐标模糊成合法的坐标、必须过河else if (play.getY() <= 210 && (play.getX() - me.getX()) >= 20 && (play.getX() - me.getX()) <=60){play.setBounds(play.getX()-52,play.getY(),40,40);}}}//卒移动结束/*卒吃棋规则**********************************/public void armsRule(JLabel play1,JLabel play2){//向右走if ((play2.getX() - play1.getX()) <= 60 && (play2.getX() - play1.getX()) >= 40 && (play1.getY() - play2.getY()) < 10 && (play1.getY() - play2.getY()) > -10 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){//黑棋要过河才能右吃棋if (play1.getName().charAt(1) == '1' && play1.getY() >= 250 &&play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),40,40);}//红棋要过河才左能吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() <= 210 &&play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),40,40);}}//向左走else if ((play1.getX() - play2.getX()) <= 60 && (play1.getX() - play2.getX()) >= 40 && (play1.getY() - play2.getY()) < 10 && (play1.getY() - play2.getY()) > -10 && play2.isVisible() && play1.getName().charAt(1)!=play2.getName().charAt(1)){//黑棋要过河才能左吃棋if (play1.getName().charAt(1) == '1' && play1.getY() >= 250 &&play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),40,40);}//红棋要过河才能右吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() <= 210 &&play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),40,40);}}//向上走else if (play1.getX() - play2.getX() >= -10 && play1.getX() - play2.getX() <= 10 && play1.getY() - play2.getY() >= -70 && play1.getY() - play2.getY() <= 70){//黑棋不能向上吃棋if (play1.getName().charAt(1) == '1' && play1.getY() < play2.getY() &&play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),40,40);}//红棋不能向下吃棋else if (play1.getName().charAt(1) == '2' && play1.getY() > play2.getY() && play1.getName().charAt(1) != play2.getName().charAt(1)){play2.setVisible(false);//把对方的位置给自己play1.setBounds(play2.getX(),play2.getY(),40,40);}}//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play1.isVisible()));Var.add(String.valueOf(play1.getX()));Var.add(String.valueOf(play1.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play2.isVisible()));Var.add(String.valueOf(play2.getX()));Var.add(String.valueOf(play2.getY()));Var.add(String.valueOf(i));}//卒吃结束/*炮、车移动规则************************************************/public void cannonRule(JLabel play,JLabel playQ[],MouseEvent me){//起点和终点之间是否有棋子int Count = 0;//上、下移动if (play.getX() - me.getX() <= 10 && play.getX() - me.getX() >= -30){//指定所有模糊Y坐标for (int i=30;i<=462;i+=48){//移动的Y坐标是否有指定坐标相近的if (i - me.getY() >= -10 && i - me.getY() <= 30){//所有的棋子for (int j=0;j<32;j++){//找出在同一条竖线的所有棋子、并不包括自己if (playQ[j].getX() - play.getX() >= -10 && playQ[j].getX() - play.getX() <= 10 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//从起点到终点(从左到右)for (int k=play.getY()+50;k<i;k+=50){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getY() < i && playQ[j].getY() >play.getY()){//中间有一个棋子就不可以从这条竖线过去Count++;break;}}//for//从起点到终点(从右到左)for (int k=i+50;k<play.getY();k+=50){//找起点和终点的棋子if (playQ[j].getY() < play.getY() && playQ[j].getY() > i){Count++;break;}}//for}//if}//for//起点和终点没有棋子就可以移动了if (Count == 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(),i-17,40,40);break;}}//if}//for}//if//左、右移动else if (play.getY() - me.getY() >=-35 && play.getY() - me.getY() <= 10){//指定所有模糊X坐标for (int i=30;i<=420;i+=48){//移动的X坐标是否有指定坐标相近的if (i - me.getX() >= -35 && i-me.getX() <= 10){//所有的棋子for (int j=0;j<32;j++){//找出在同一条横线的所有棋子、并不包括自己if (playQ[j].getY() - play.getY() >= -10 && playQ[j].getY() - play.getY() <= 10 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//从起点到终点(从上到下)for (int k=play.getX()+50;k<i;k+=50){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getX() < i && playQ[j].getX() >play.getX()){//中间有一个棋子就不可以从这条横线过去Count++;break;}}//for//从起点到终点(从下到上)for (int k=i+50;k<play.getX();k+=50){//找起点和终点的棋子if (playQ[j].getX() < play.getX() && playQ[j].getX() > i){Count++;break;}}//for}//if}//for//起点和终点没有棋子if (Count == 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(i-20,play.getY(),40,40);break;}}//if}//for}//else}//炮、车移动方法结束/*炮、车吃棋规则**************************************************************************/ public void cannonRule(int Chess,JLabel play,JLabel playTake,JLabel playQ[],MouseEvent me){//起点和终点之间是否有棋子int Count = 0;//所有的棋子for (int j=0;j<32;j++){//找出在同一条竖线的所有棋子、并不包括自己if (playQ[j].getX() - play.getX() >= -10 && playQ[j].getX() - play.getX() <= 10 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//自己是起点被吃的是终点(从上到下)for (int k=play.getY()+50;k<playTake.getY();k+=50){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getY() < playTake.getY() && playQ[j].getY() >play.getY()){//计算起点和终点的棋子个数Count++;break;}}//for//自己是起点被吃的是终点(从下到上)for (int k=playTake.getY();k<play.getY();k+=50){//找起点和终点的棋子if (playQ[j].getY() < play.getY() && playQ[j].getY() >playTake.getY()){Count++;break;}}//for}//if//找出在同一条竖线的所有棋子、并不包括自己else if (playQ[j].getY() - play.getY() >= -10 && playQ[j].getY() - play.getY() <= 10 && playQ[j].getName()!=play.getName() && playQ[j].isVisible()){//自己是起点被吃的是终点(从左到右)for (int k=play.getX()+50;k<playTake.getX();k+=50){//大于起点、小于终点的坐标就可以知道中间是否有棋子if (playQ[j].getX() < playTake.getX() && playQ[j].getX() >play.getX()){Count++;break;}}//for//自己是起点被吃的是终点(从右到左)for (int k=playTake.getX();k<play.getX();k+=50){//找起点和终点的棋子if (playQ[j].getX() < play.getX() && playQ[j].getX() >playTake.getX()){Count++;break;}}//for}//if}//for//起点和终点之间要一个棋子是炮的规则、并不能吃自己的棋子if (Count == 1 && Chess == 0 && playTake.getName().charAt(1) !=play.getName().charAt(1)){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(playTake.isVisible()));Var.add(String.valueOf(playTake.getX()));Var.add(String.valueOf(playTake.getY()));Var.add(String.valueOf(i));playTake.setVisible(false);play.setBounds(playTake.getX(),playTake.getY(),40,40);}//起点和终点之间没有棋子是车的规则、并不能吃自己的棋子else if (Count ==0 && Chess == 1 && playTake.getName().charAt(1) !=play.getName().charAt(1)){//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(play.isVisible()));Var.add(String.valueOf(play.getX()));Var.add(String.valueOf(play.getY()));Var.add(String.valueOf(Man));//当前记录添加到集合(用于悔棋)Var.add(String.valueOf(playTake.isVisible()));Var.add(String.valueOf(playTake.getX()));Var.add(String.valueOf(playTake.getY()));Var.add(String.valueOf(i));playTake.setVisible(false);play.setBounds(playTake.getX(),playTake.getY(),40,40);}}//炮、车吃棋方法结束/*马移动规则***************************************************/public void horseRule(JLabel play,JLabel playQ[],MouseEvent me){//保存坐标和障碍int Ex=0,Ey=0,Move=0;//上移、左边if (play.getX() - me.getX() >= 10 && play.getX() - me.getX() <= 50 && play.getY() - me.getY() >= 60 && play.getY() - me.getY() <= 100){//合法的Y坐标for (int i=30;i<=462;i+=48){//移动的Y坐标是否有指定坐标相近的if (i - me.getY() >= -10 && i - me.getY() <= 30){Ey = i;break;}}。

相关文档
最新文档