0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用C语言实现国际象棋项目

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程学习基地 2021-11-21 16:40 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

这篇文章主要为大家详细介绍了C语言实现——《国际象棋项目》它和中国象棋可不一样哟!文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下!

游戏介绍:

国际象棋(Chess),又称西洋棋,是一种二人对弈的棋类游戏。

棋盘为正方形,由64个黑白(深色与浅色)相间的格子组成;棋子分黑白(深色与浅色)两方共32枚,每方各16枚。虽然汉语称之为西洋棋或国际象棋,但是实际上它起源于亚洲,后由阿拉伯人传入欧洲,成为国际通行棋种。

行棋规则

国际象棋是双方对下的,一方用白棋,一方用黑棋。对局由执白者先行,每次走一步,双方轮流行棋,直到对局结束。各种棋子的一般走法如下:

王(K):横、直、斜都可以走,但每次限走一步。王是不可以送吃的,即任何被敌方控制的格子,己方王都不能走进去。否则,算“送王”犯规,三次就要判负。

(1)除易位时外,王可走到不被对方棋子攻击的任何相邻格子,而且只能走一步(着)。

(2)易位是由王和己方任何一个车一起进行的仍被视作王的一步(着)的走法。

后(Q):横、直、斜都可以走,步数不受限制,但不能越子。

车(R):横、竖均可以走,步数不受限制,不能斜走。除王车易位外不能越子。

象(B):只能斜走。格数不限,不能越子。开局时每方有两象,一个占白格,一个占黑格。

马(N):每步棋先横走或直走一格,然后再往外斜走一格;或者先斜走一格,最后再往外横走或竖走一格(即走“日”字)。可以越子,没有中国象棋中的“蹩马腿”限制。

兵(P):只能向前直走,每次只能走一格。但走第一步时,可以走一格或两格。兵的吃子方法与行棋方向不一样,它是直走斜吃,即如果兵的斜进一格内有对方棋子,就可以吃掉它而占据该格。

行棋规则大家一定要理解,因为这个关系到你实现这个国际象棋项目的规则逻辑部分!

插件:图形库插件easyX,涉及图片素材可以自行百度找也可以关注文末领取;

源代码示例:

#include  //要先安装 easyX 到你的编译器 #include 
#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("
");  }}
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
", 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;  }  

}

未完成的棋子代码,大家也可以自己先去想想试试,每一次的思考就是你进步的过程!

责任编辑:haq


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144599
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73137

原文标题:C语言项目实战:《国际象棋》零基础项目!200 行源代码示例

文章出处:【微信号:cyuyanxuexi,微信公众号:C语言编程学习基地】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    为什么单片机还在用C语言编程?

    的缺陷 高级语言存在的目的是可以实现更为优化的算法,更多的是为了方便的执行方案,但是,高级语言对程序存储空间的占用要比汇编和C语言多很多。
    发表于 11-28 07:37

    请问如何用C语言列举当前所有网口?

    何用C语言列举当前所有网口?
    发表于 11-25 07:23

    C语言特性

    数据,实现对设备的精准控制,同时降低功耗,延长设备的使用寿命。 2、可移植性:跨平台的通行证 C 语言具有良好的可移植性,这意味着用 C 语言
    发表于 11-24 07:01

    C++ 与 Python:树莓派上哪种语言更优?

    Python是树莓派上的首选编程语言,我们的大部分教程都使用它。然而,C++在物联网项目中同样广受欢迎且功能强大。那么,在树莓派项目中选择哪种语言
    的头像 发表于 07-24 15:32 642次阅读
    <b class='flag-5'>C</b>++ 与 Python:树莓派上哪种<b class='flag-5'>语言</b>更优?

    单片机C语言实例(350+例)

    350+单片机C语言实例! 纯分享帖,需要者可点击附件免费获取完整资料~~~【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,删除内容!
    发表于 05-22 21:47

    中软国际在大型银行AI项目领域实现重大突破

    近日,中软国际成功中标某全国性股份制银行2025年大模型算力扩容项目,标志着中软国际在大型银行AI项目领域实现重大突破,进一步巩固了其在金融
    的头像 发表于 05-06 11:46 855次阅读
    中软<b class='flag-5'>国际</b>在大型银行AI<b class='flag-5'>项目</b>领域<b class='flag-5'>实现</b>重大突破

    深入理解C语言C语言循环控制

    C语言编程中,循环结构是至关重要的,它可以让程序重复执行特定的代码块,从而提高编程效率。然而,为了避免程序进入无限循环,C语言提供了多种循环控制语句,如break、continue和
    的头像 发表于 04-29 18:49 1733次阅读
    深入理解<b class='flag-5'>C</b><b class='flag-5'>语言</b>:<b class='flag-5'>C</b><b class='flag-5'>语言</b>循环控制

    SAP实施专家解答:如何用DeepSeek-R1实现需求沟通效率倍增

    工博科技分享AI工具链在IT项目中的深度应用:通过DeepSeek-R1实现智能会议记录结构化(2小时会议5分钟生成决策表)和精准多语言文档翻译(错误率降低14%),帮助IT团队将重复性工作耗时减少
    的头像 发表于 04-28 09:13 574次阅读

    为什么学了C语言,却写不出像样的项目

    在学习编程的路上,C语言几乎是每个程序员的“必修课”。不管你是打算从事嵌入式开发、系统编程,还是想要深入理解操作系统的底层原理,C语言都是一块重要的基石。然而许多人在学习
    的头像 发表于 03-14 17:37 681次阅读
    为什么学了<b class='flag-5'>C</b><b class='flag-5'>语言</b>,却写不出像样的<b class='flag-5'>项目</b>?

    单片机C语言编程宝典大全,初学必备【强推下载!】

    资料介绍:包含 1. 51单片机入门教程 2. 初学者适用:单片机C语言实例100例(代码及释义) 3. 51单片机C语言快速上手 4. 51单片机
    发表于 03-14 11:03

    限时免积分下载:增量式与位置式PID算法的C语言实现分享

    前面咱们有分享对PID算法离散化和增量式PID算法原理进行来探索,之后又使用Matlab进行了仿真实验,对PID三个参数又有了更深入的认识,接下来我们来使用C语言进行PID算法实现,并且结合控制电机的
    发表于 03-05 18:32

    PID控制算法的C语言实现:PID算法原理

    在工业应用中 PID 及其衍生算法是应用最广泛的算法之一,是当之无愧的万能算法,如果能够熟练掌握 PID 算法的设计与实现过程,对于一般的研发人员来讲,应该是足够应对一般研发问题了,而难能可贵
    发表于 02-26 15:24

    EE-188:使用C语言在ADSP-219x DSP上实现中断驱动系统

    电子发烧友网站提供《EE-188:使用C语言在ADSP-219x DSP上实现中断驱动系统.pdf》资料免费下载
    发表于 01-15 16:06 0次下载
    EE-188:使用<b class='flag-5'>C</b><b class='flag-5'>语言</b>在ADSP-219x DSP上<b class='flag-5'>实现</b>中断驱动系统

    AKI跨语言调用库神助攻C/C++代码迁移至HarmonyOS NEXT

    量;某知名社交电商平台使用后减少了50%以上跨语言调用接口代码量;某图像处理软件所有C++代码复用通过AKI来实现。使用AKI后这些项目不仅减少了
    发表于 01-02 17:08

    基于FPGA实现图像直方图设计

    直方图统计的原理 直方图统计从数学上来说,是对图像中的像素点进行统计。图像直方图统计常用于统计灰度图像,表示图像中各个灰度级出现的次数或者概率。统计直方图的实现采用C/C++或者其他高级语言实
    的头像 发表于 12-24 10:24 1198次阅读
    基于FPGA<b class='flag-5'>实现</b>图像直方图设计