java 实现《中国象棋》游戏

简介:

      中国象棋是起源于中国的一种棋,属于二人对抗性游戏的一种,在中国有着悠久的历史。由于用具简单,趣味性强,成为流行极为广泛的棋艺活动。
      中国象棋是中国棋文化,也是中华民族的文化瑰宝,它源远流长,趣味浓厚,基本规则简明易懂。中国象棋在中国的群众基础远远超过围棋,是普及最广的棋类项目,中国象棋已流传到十几个国家和地区。
      中国象棋使用方形格状棋盘,圆形棋子共有32个,红黑二色各有16个棋子,摆放和活动在交叉点上。双方交替行棋,先把对方的将(帅)“将死”的一方获胜。

主要需求

      按照中国象棋的规则,实现红黑棋对战,两个玩家自己玩。

实现棋盘

在这里插入图片描述

项目目录结构

在这里插入图片描述

部分实现代码

画图类:
/**
 * @author gjt
 * @version 1.0.0
 * @description 画图类
 */
public class Canvas extends JPanel {

    public static final int ROW_COUNT = 10;//棋盘行数
    public static final int COLUMN_COUNT = 9;//棋盘列数
    private int[][] map = new int[ROW_COUNT][COLUMN_COUNT];
    private Font font;
    public static final int BLACK = 1000;
    public static final int WHITE = 0;

    private boolean isBlack = false; //当前是谁下子
    private int selectColumn = -1;
    private int selectRow = -1;
    private ChessManager manager = new ChessManager();
    private Image mainGif;

    public Canvas(){//棋盘为10行9列,默认就好,不用改
        font = new Font("宋体",Font.BOLD,30);
        initMap();
        addMouseListener(new MouseAdapter(){
            @Override
            public void mouseClicked(MouseEvent e){
                //super.mouseClicked(e);
                //System.out.println(e.getButton());
                if(e.getButton()==MouseEvent.BUTTON1){
                    int x = e.getX();
                    int y = e.getY();
                    //System.out.println(e.getX()+","+e.getY()+"["+x+","+y+"]");
                    int r = (y - 25) /58;
                    int c = (x - 25) /58;
                    //System.out.println("r = "+r+", c = "+c);
                    //选子
                    if(selectColumn == -1&&map[r][c]!=0){
                        if(RangeChecker.selectInRange(map,r,c,isBlack)){//isBlack 是 红方
                            selectColumn = c;
                            selectRow = r;
                            repaint();
                        }
                        else{
                            showFail("请选择己方棋子");
                        }
                        return ;// 选子阶段结束
                    }

                    boolean valid  = RangeChecker.inRange(map, selectRow, selectColumn,r, c, isBlack);
                    if(!valid){
                        showFail("下子失败");
                    }

                    Chess chess = manager.getChess(map[selectRow][selectColumn]);
                    valid = chess.check(map, selectRow, selectColumn, r, c, isBlack);
                    if(!valid||(map[selectRow][selectColumn]<1000&&map[r][c]<1000&&map[r][c]!=0)||(map[selectRow][selectColumn]>1000&&map[r][c]>1000&&map[r][c]!=0)){
                        showFail("下子失败,规则不允许");
                        selectColumn = -1;
                        selectRow = -1;
                        repaint();
                        return ;
                    }

                    map[r][c] = map[selectRow][selectColumn];
                    map[selectRow][selectColumn] = 0;
                    selectColumn = -1;
                    selectRow = -1;
                    isBlack = !isBlack;//对方来下
                    repaint();
                }
            }
        });
    }
    protected void showFail(String msg) {
        System.out.println(msg);
    }

    public void initMap(){
        //初始化棋盘
        map=new int [][]{{1000+'C',1000+'H',1000+'E',1000+'S',1000+'G',1000+'S',1000+'E',1000+'H',1000+'C'}, {0,0,0,0,0,0,0,0,0,},
                {0,1000+'P',0,0,0,0,0,1000+'P',0},{1000+'A',0,1000+'A',0,1000+'A',0,1000+'A',0,1000+'A'},
                {0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0},
                {'A',0,'A',0,'A',0,'A',0,'A'},{0,'P',0,0,0,0,0,'P',0},
                {0,0,0,0,0,0,0,0,0},{'C','H','E','S','G','S','E','H','C'}};
        mainGif = ImageTools.loadImage("main.gif");
        manager.loadAllImage();
    }

    //内部类
    public static class MyPoint{
        public int r;
        public int c;
        public MyPoint(int r,int c) {
            this.r = r;
            this.c = c;
        }
    }

    @Override
    public void paint(Graphics g){
        super.paint(g);
        g.setFont(font);
        int w = this.getWidth();
        int h = this.getHeight();
        g.drawImage(mainGif, 0, 0,null);

        for(int r = 0;r<map.length;r++){
            for(int c = 0;c<map[r].length;c++){
                safelyDraw(g, manager.getImage(map[r][c]), 25+58*c, r*58+25);
            }
        }
        g.drawRect(25+58* selectColumn, 25+58* selectRow, 58, 58);
        g.drawString(isBlack?"黑方下棋":"红方下棋", 220 , 650);

    }

    public void safelyDraw(Graphics g,Image img,int x,int y){
        try {
            g.drawImage(img, x, y,null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public boolean isBlack() {
        return isBlack;
    }

    public void setBlack(boolean black) {
        isBlack = black;
    }

    public void setSelectColumn(int selectColumn) {
        this.selectColumn = selectColumn;
    }

    public void setSelectRow(int selectRow) {
        this.selectRow = selectRow;
    }
}

项目启动类
/**
 * @author Mr.Gao
 * @version 1.0.0
 * @description 项目启动类
 */
public class ChessStarter {

    public static void main(String[] args){
        JFrame f =new JFrame("中国象棋(Gao作品)");
        ImageIcon icon = new ImageIcon("image" + File.separator + "red_e.gif");
        f.setIconImage(icon.getImage());

        f.setSize(730,750);
        f.setLocationRelativeTo(null);
        f.setLayout(new BorderLayout());
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final Canvas canvas = new Canvas();
        f.add(canvas);

        JButton newStartGame = new JButton("新游戏");
        JButton startMusic = new JButton("播放音乐");
        JButton ExitGame = new JButton("退出游戏");

        //为新游戏按钮  添加事件
        newStartGame.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                canvas.initMap();//新游戏
                canvas.repaint();//新游戏后,出棋先后顺序互换
                canvas.setSelectColumn(-1);
                canvas.setSelectRow(-1);
                canvas.setBlack(!canvas.isBlack());
            }
        });

        //为退出按钮  添加事件
        ExitGame.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                int j=JOptionPane.showConfirmDialog(null, "真的要退出吗?","退出",JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);
                if(j==JOptionPane.YES_OPTION){
                    System.exit(0);
                }
            }
        });

        //为音乐播放按钮  添加事件
        startMusic.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                String filepath = "music" + File.separator + "music.wav";
                MusicPlayer musicPlayer = new MusicPlayer();
                musicPlayer.playMusic(filepath);//音乐播放
            }

        });
        f.add(newStartGame, BorderLayout.WEST);
        f.add(startMusic,BorderLayout.EAST);
        f.add(ExitGame,BorderLayout.SOUTH);
        f.setVisible(true);
    }
}

项目可用作毕业设计,获取源码咨询QQ:1657656774

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值