中国象棋人人对战

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

中国象棋----人人对战设计
学号:
系别:
姓名:
班级:
成员:
中国象棋--人人对战设计
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) 判断胜负。

根据对中国象棋游戏的功能分析,设计得到中国象棋游戏的总流程图如图6
图6总体流程图
4.2各部分功能流程图
4.2.1开始游戏
该功能为本游戏的最核心的部分,它实现了中国象棋游戏的最主要的操作,是其他功能的基础。

开始游戏流程图如图7所示:
5
5
图8 系统总体结构图
5.2 棋盘、棋子绘制的算法设计
本中国象棋有限的棋盘和棋子采用的都是图片,采用图片比较简单,不用绘制那么多条线,用图片来代替棋盘和棋子。

建立坐标系,只需使用函数调用图片文件,把象棋图片有序的排列,再使用排列棋子的函数把棋子有序排列。

其中,棋盘距页面左边距离为24,上面为56,棋盘一格为57,棋子直径为55,棋子间的距离为2,例如从上面开始,黑棋子“车”的坐标为(24,56),黑马为(81,56),红“车”的坐标(24,596),依此类推就可以计算各棋子的坐标,这样算法较易实现。

5.3 棋种走棋规则的算法设计
5.3.1“车”的走棋规则的算法设计
“车”,它只能走直线,且中间不能有任何棋子,设计时分为两种情况来考虑,一种是纵向行走;一种是横向行走。

用if语句来判断实现,例如车纵向行走,首先,用if来判断棋子是否纵向行走,接着再用另一判断语句if来判断中间有没别的棋子。

横向行走同理。

如果棋子车符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

现在假设车的棋点坐标为(i,j),i为横坐标,j为纵坐标,再设x,y为棋盘内任意值。

算法设计流程图如图9所示:
图9 “车”的走棋规则算法设计流程图
5.3.2 “马”的走棋规则的算法设计
“马”,它只能走“日”字格,而且马腿不能被其它的棋子压到。

设计时可
两种情况来考虑,一种是横向走两个棋点,纵向走一个棋点;一种是纵向走两个棋点,横向走一个棋点。

用if语句来判断。

首先,用if来判断棋子是否横向走两个棋点,纵向走一个棋点,接着再用判断语句if来判断马腿是否被其它棋子压着。

纵向走“日”同理。

如果棋子马符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

现在假设马的棋点坐标为(a,b),a为横坐标,b为纵坐标,再设x,y为棋盘内任意值。

算法设计流程图如图10所示:
图10 “马”的走棋规则算法设计流程图
5.3.3 “卒”的走棋规则的算法设计
“卒”,它的行走规则分两种情况。

一种是棋子没过河界,另一种是棋子过了河界。

用if语句来判断,首先,用if语句来设定棋子没过河界,接着设定棋子在没过河界的情况下只能向前行走一个棋点;然后用if语句来设定棋子过了河界,紧接着设定棋子在过了河界的情况下只能向前、向左、向右行走一个棋点。

如果棋子卒符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

现在假设卒的棋点坐标为(i,j),i为横坐标,j为纵坐标,再设x,y为棋盘内任意值。

算法设计流程图如图11所示:
图11 “卒”的走棋规则算法设计流程图
5.3.4 “将”的走棋规则的算法设计
“将”,它只能在“九宫”中行走,而且每次只能横着或者纵着行走一棋点。

直接用if语句来判断,首先,用if来判断棋子是否是在“九宫”里行走,接着判断棋子是否是横向或纵向只走一个棋点。

如果棋子将符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

现在假设将的棋点坐标为(i,j),i为横坐标,j为纵坐标,再设x,y为棋盘内任意值。

算法设计流程图如图12所示:
图12“将”的走棋规则算法设计流程图
5.3.5 “炮”的走棋规则的算法设计
“炮”,它只能走直线,且中间有且只能有一个棋子。

假设现在坐标为(i,j),则算法设计流程图如图13所示:
图13“炮”的走棋规则算法设计流程图
5.3.6 “象”的走棋规则的算法设计
“象”,它只能走“田”字格,而且不能过河,象腿不能被其它的棋子压到。

这样只有一种情况考虑,那就是纵向走两个棋点,横向也走两个棋点。

用if语句来判断,首先,用if来判断棋子是否走"田"字格,而且不能过河,接着再用判断语句if来判断象腿是否被其它棋子压着。

如果棋子象走动符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

现在假设象的棋点坐标为(i,j),i为横坐标,j为纵坐标,再设x,y为棋盘内任意值。

算法设计流程图如图14所示:
图14“象”的走棋规则算法设计流程图
5.3.7 “士”的走棋规则的算法设计
“士”,它只能在“九宫”中行走,而且每次只能斜着行走一格。

这样只有一种情况来考虑,即纵向走一个棋点,横向走一个棋点。

if语句来判断,如果棋子士符合以上的走棋规则,则可以走动,否则棋子强制放回原处。

现在假设士的棋点坐标为(i,j),i为横坐标,j为纵坐标,再设x,y为棋盘内任意值。

算法设计流程图如图15所示:
图15 “士”的走棋规则算法设计流程图
6、编码
见附页。

7、运行结果测试与分析
下图是进入游戏主界面后的游戏界面。

图16 游戏主界面
7.1测试进入主界面后工具栏的各功能
进入游戏主界面,在主界面的工具栏中,分别有“悔棋”、”退出”“新游戏”功能按钮。

可以点击“退出”结束游戏系统。

在游戏过程中点击“悔棋”实现棋子返回上一步的位置。

在游戏过程中点击“新游戏”结束当前的游戏,开始新的游戏。

7.2对“车”、“马”、“象”、“士”、“卒”、“炮”、“将”走法的测试
“车”的测试,拖动“车”使其隔棋子或按斜角线走动,结果“车”不能被移动,拖动其按直线在界面范围内上下左右移动,结果可以移动,但中间隔了棋子,其不能被移动。

“马”的测试,拖动“马”使其按上下左右方向在主界面中移动,结果不可能移动“马”。

按向左或右走一格,再向上或下走二格时,其中上下左右没有棋子挡着时,可以移动,按向左或右走二格,再向上或下走二格时,其中上下左右没有棋子挡着时,可以移动,中间有棋子时,则移动不了。

“象”、“相”的测试,在主界面范围内,移动象、相向左或右走二格再向上
或下行两格(“田”字格),如果在“田”字中间的十字上有棋子,则象或相,移动不了。

相反则可以移。

拖动“象”、“相”按其它任意方向或方式走,棋子无法移动。

“士”、“仕”的测试,拖动“士”、“仕”“九宫”中斜向走一格,结果可以移动,相反,使其按上下左右移动则不可动,向“九宫”外走则棋子不动。

“炮”的测试,拖动“炮”纵、横行,若在纵、横行中,前方有一个棋子,在这个棋子前方有对方的棋子,则可以行走,吃掉对方的棋子。

若纵、横方向没有棋子挡住,则可以纵、横走。

拖动“炮”斜着走,则其不可移动。

“将”的测试,拖其在“九宫”中行走,当其不在“九宫”中行走时,将会停在原处,不能移动。

在“九宫”中其可以纵、横、斜着行走。

“卒”、“兵”的测试,当其没有过河时,拖其向后、左、右行时,则其停在原处,不能移动,拖其向前行时,其可以移动。

当其过的楚河汉界后,可以向前左、右行,当拖其向后行时,棋子无法向后移动。

通过对软件各功能的测试发现,该软件各功能都能实现,性能可靠!
附件:源代码(以上的设计思想是根据下面的代码分析的)
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);
}
/**
** 添加棋子方法
*/
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(" 黑棋胜利");
}//if
else 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 (rstart()){
//清除Vector中的内容Var.clear();}
public void rstart(){
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);
}
}
}
//悔棋按钮
else if (back()){
//删除用过的坐标
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){
}}
public void back(){
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;
}
}
//退出
else if (exit()){}
public void 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)){
//把对方的位置给自己
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)){
//把对方的位置给自己
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[],MouseEvent me){ //起点和终点之间是否有棋子
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()));。

相关文档
最新文档