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

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

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

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

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

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

e.检查移动是否有效。

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


#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

希望有帮助
https://b23.tv/53HsTvr