#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