王建国66 2022-10-31 21:36 采纳率: 77.8%
浏览 33
已结题

国际象棋游戏,只需能够移动,在对话框有显示棋盘即可

你想要建模一场象棋,包括棋盘,方块和棋子。对于这个问题,您需要对棋盘建模(作为二维棋盘数组);棋盘上的每个棋盘子可以是空的,也可以包含一个棋子。棋子依次有颜色和它在棋盘上的当前位置。

a.有一个抽象类ChessPiece,它提供了一个具体的方法和属性来表示棋子的位置,还有一个抽象方法isMoveLegal。

b.你从ChessPiece继承了许多具体的类。,卒,车,骑士等),他们的责任是提供一个具体的实现是MoveLegal为自己的特点。

c.设置单板的启动状态。

d.允许玩家指定一个移动。

e.检查移动是否有效。

f.如果下步有效,则下步,更新所涉及的棋子,更新棋盘,并将棋盘显示给玩家。

  • 写回答

2条回答 默认 最新

  • Jackyin0720 2022-10-31 22:19
    关注
    
    #include <graphics.h> //要先安装 easyX 到你的编译器 
    #include <stdio.h>
     
    #define SPACE  80
     
    //记录一个棋子落点
    struct MyPoint{
        int x;
        int y;
    };
     
    //用来保存 单数次 鼠标左键点击  和双数次鼠标左键点击
    struct MyPoint set[2];
    int n = 0;//记录当前是第N次鼠标左键按下
     
    //图片变量
    IMAGE 黑棋盘img, 白棋盘img, 卒子A黑img, 卒子B黑img, 车A黑img, 车B黑img, 国王A黑img, 国王B黑img, 马A黑img, 马B黑img, 象A黑img, 象B黑img, 皇后A黑img, 皇后B黑img, 卒子A白img, 卒子B白img, 车A白img, 车B白img, 国王A白img, 国王B白img, 马A白img, 马B白img, 象A白img, 象B白img, 皇后A白img, 皇后B白img;
    //枚举  为了代码容易阅读而写
    enum state{
        黑棋盘, 白棋盘,
        卒子A黑, 卒子B黑, 车A黑, 车B黑, 国王A黑, 国王B黑, 马A黑, 马B黑, 象A黑, 象B黑, 皇后A黑, 皇后B黑,
        卒子A白, 卒子B白, 车A白, 车B白, 国王A白, 国王B白, 马A白, 马B白, 象A白, 象B白, 皇后A白, 皇后B白
    };
     
     
    //1 游戏初始化  做窗口  定义图片变量  加载图片   数据
    void initGame();
     
    //2 绘制界面
     
    //2.1 图形界面
    void drawGame(int map[8][8]);
    //2.2 命令行界面
    void printGame(int map[8][8]);
     
    //3 控制游戏
    //3.1 鼠标控制下棋
    void xiaqi(int map[8][8]);
     
    //3.1 落子
    void luozi(int map[8][8]);
     
    int main(){
        //地图
        int map[8][8] = {
            { 车B白, 马B黑, 象B白, 国王B黑, 皇后B白, 象B黑, 马B白, 车B黑 },
            { 卒子B黑, 卒子B白, 卒子B黑, 卒子B白, 卒子B黑, 卒子B白, 卒子B黑, 卒子B白 },
            { 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘 },
            { 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘 },
            { 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘 },
            { 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘, 黑棋盘, 白棋盘 },
            { 卒子A白, 卒子A黑, 卒子A白, 卒子A黑, 卒子A白, 卒子A黑, 卒子A白, 卒子A黑 },
            { 车A黑, 马A白, 象A黑, 皇后A白, 国王A黑, 象A白, 马A黑, 车A白 }
        };
     
        initGame();
     
        //创建线程  实时获取鼠标情况  根据鼠标情况来修改界面
     
        while (1){
            drawGame(map);
            printGame(map);
            xiaqi(map); //获取鼠标的坐标  和 鼠标是否按下    getMouseMsg  阻塞
            //Sleep(20);
        }
     
     
     
        return 0;
    }
     
    //1 游戏初始化  做窗口  定义图片变量  加载图片   数据
    void initGame(){
        //            窗口宽    窗口高     自带命令行窗口
        initgraph(8 * SPACE, 8 * SPACE, SHOWCONSOLE);
        //把素材放到和源程序文件一起(编译器运行)
        //把素材放到和可执行程序文件(*.exe)一起(直接双击运行)
     
        loadimage(&黑棋盘img, L"黑棋盘.bmp", SPACE, SPACE, true);
        loadimage(&白棋盘img, L"白棋盘.bmp", SPACE, SPACE, true);
        loadimage(&卒子A黑img, L"卒子A黑.bmp", SPACE, SPACE, true);
        loadimage(&卒子B黑img, L"卒子B黑.bmp", SPACE, SPACE, true);
        loadimage(&车A黑img, L"车A黑.bmp", SPACE, SPACE, true);
        loadimage(&车B黑img, L"车B黑.bmp", SPACE, SPACE, true);
        loadimage(&国王A黑img, L"国王A黑.bmp", SPACE, SPACE, true);
        loadimage(&国王B黑img, L"国王B黑.bmp", SPACE, SPACE, true);
        loadimage(&马A黑img, L"马A黑.bmp", SPACE, SPACE, true);
        loadimage(&马B黑img, L"马B黑.bmp", SPACE, SPACE, true);
        loadimage(&象A黑img, L"象A黑.bmp", SPACE, SPACE, true);
        loadimage(&象B黑img, L"象B黑.bmp", SPACE, SPACE, true);
        loadimage(&皇后A黑img, L"皇后A黑.bmp", SPACE, SPACE, true);
        loadimage(&皇后B黑img, L"皇后B黑.bmp", SPACE, SPACE, true);
        loadimage(&卒子A白img, L"卒子A白.bmp", SPACE, SPACE, true);
        loadimage(&卒子B白img, L"卒子B白.bmp", SPACE, SPACE, true);
        loadimage(&车A白img, L"车A白.bmp", SPACE, SPACE, true);
        loadimage(&车B白img, L"车B白.bmp", SPACE, SPACE, true);
        loadimage(&国王A白img, L"国王A白.bmp", SPACE, SPACE, true);
        loadimage(&国王B白img, L"国王B白.bmp", SPACE, SPACE, true);
        loadimage(&马A白img, L"马A白.bmp", SPACE, SPACE, true);
        loadimage(&马B白img, L"马B白.bmp", SPACE, SPACE, true);
        loadimage(&象A白img, L"象A白.bmp", SPACE, SPACE, true);
        loadimage(&象B白img, L"象B白.bmp", SPACE, SPACE, true);
        loadimage(&皇后A白img, L"皇后A白.bmp", SPACE, SPACE, true);
        loadimage(&皇后B白img, L"皇后B白.bmp", SPACE, SPACE, true);
    }
     
    //2 绘制界面
     
    //2.1 图形界面
    void drawGame(int map[8][8]){
        for (int i = 0; i < 8; i++){
            for (int j = 0; j < 8; j++){
                switch (map[i][j]){
                case 黑棋盘:putimage(j*SPACE, i*SPACE, &黑棋盘img);    break;
                case 白棋盘:putimage(j*SPACE, i*SPACE, &白棋盘img);    break;
                case 卒子A黑:putimage(j*SPACE, i*SPACE, &卒子A黑img);    break;
                case 卒子B黑:putimage(j*SPACE, i*SPACE, &卒子B黑img);    break;
                case 车A黑:    putimage(j*SPACE, i*SPACE, &车A黑img);    break;
                case 车B黑:    putimage(j*SPACE, i*SPACE, &车B黑img);    break;
                case 国王A黑:putimage(j*SPACE, i*SPACE, &国王A黑img);    break;
                case 国王B黑:putimage(j*SPACE, i*SPACE, &国王B黑img);    break;
                case 马A黑:    putimage(j*SPACE, i*SPACE, &马A黑img);    break;
                case 马B黑:    putimage(j*SPACE, i*SPACE, &马B黑img);    break;
                case 象A黑:    putimage(j*SPACE, i*SPACE, &象A黑img);    break;
                case 象B黑:    putimage(j*SPACE, i*SPACE, &象B黑img);    break;
                case 皇后A黑:putimage(j*SPACE, i*SPACE, &皇后A黑img);    break;
                case 皇后B黑:putimage(j*SPACE, i*SPACE, &皇后B黑img);    break;
                case 卒子A白:putimage(j*SPACE, i*SPACE, &卒子A白img);    break;
                case 卒子B白:putimage(j*SPACE, i*SPACE, &卒子B白img);    break;
                case 车A白:    putimage(j*SPACE, i*SPACE, &车A白img);    break;
                case 车B白:    putimage(j*SPACE, i*SPACE, &车B白img);    break;
                case 国王A白:putimage(j*SPACE, i*SPACE, &国王A白img);    break;
                case 国王B白:putimage(j*SPACE, i*SPACE, &国王B白img);    break;
                case 马A白:    putimage(j*SPACE, i*SPACE, &马A白img);    break;
                case 马B白:    putimage(j*SPACE, i*SPACE, &马B白img);    break;
                case 象A白:    putimage(j*SPACE, i*SPACE, &象A白img);    break;
                case 象B白:    putimage(j*SPACE, i*SPACE, &象B白img);    break;
                case 皇后A白:putimage(j*SPACE, i*SPACE, &皇后A白img);    break;
                case 皇后B白:putimage(j*SPACE, i*SPACE, &皇后B白img);    break;
                default:break;
                }
            }
        }
    }
    //2.2 命令行界面
    void printGame(int map[8][8]){
        //system("cls");//清屏
        for (int i = 0; i < 8; i++){
            for (int j = 0; j < 8; j++){
                printf("%02d  ", map[i][j]);
            }
            printf("\n");
        }
    }
     
    void xiaqi(int map[8][8]){
        //点两下   //第一下 选中棋子  //第二下  落子
                    //偶数次            //奇数次
        int idx = n % 2;
        MOUSEMSG msg;
     
        msg = GetMouseMsg();//获取鼠标信息
        if (msg.mkLButton){//鼠标左键按下
            set[idx].x = msg.x /SPACE;
            set[idx].y = msg.y / SPACE;
            printf("坐标:%d %d  下标:%d %d\n", msg.x, msg.y, set[idx].x, set[idx].y);
            if (1 == idx){//落子
                luozi(map);
            }
     
            n++;
        }
     
    }
     
    //3.1 落子
    void luozi(int map[8][8]){
     
        
        switch (map[set[0].y][set[0].x]){//判断 set[0]  位置是什么棋子    
        case 卒子A黑:
            //判断 能不能移动到  set[1]位置    如果能  就移动
            if (set[0].y - set[1].y == 1){//往上走一格
                map[set[0].y][set[0].x] = 黑棋盘;//本来位置变成黑棋盘
                map[set[1].y][set[1].x] = 卒子A白;//目的地位置变成卒子A白
            }
            break;
        case 卒子A白:
            //判断 能不能移动到  set[1]位置    如果能  就移动
            if (set[0].y - set[1].y == 1){//往上走一格
                map[set[0].y][set[0].x] = 白棋盘;//本来位置变成黑棋盘
                map[set[1].y][set[1].x] = 卒子A黑;//目的地位置变成卒子A白
            }
            break;
        }
        
     
     
    }
    

    参考链接:https://blog.csdn.net/qq_42366672/article/details/121426226

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月1日
  • 创建了问题 10月31日

悬赏问题

  • ¥15 加装宝马安卓中控改变开机画面
  • ¥15 STK安装问题问问大家,这种情况应该怎么办
  • ¥15 更换了一个新的win10系统,再下载VS时碰到的问题,是C++组件的?
  • ¥15 关于罗技鼠标宏lua文件的问题
  • ¥15 halcon ocr mlp 识别问题
  • ¥15 已知曲线满足正余弦函数,根据其峰值,还原出整条曲线
  • ¥20 无法创建新的堆栈防护界面
  • ¥15 sessionStorage在vue中的用法
  • ¥15 wordpress更换域名后用户图片头像不显示
  • ¥15 如何在ubunto上安装CEF (Chromium Embedded Framework),并且基于qt实现打开一个web