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

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

3天内不再提示

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

C语言编程学习基地 来源:C语言编程学习基地 作者:C语言编程学习基地 2021-11-19 10:30 次阅读

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

游戏介绍:

中国象棋是由两人轮流走子,在战法上遵循古代孙子兵法中的“不战而屈人之兵,善之善者也”的作战思想,以“将死”或“困毙”对方将(帅)为胜的一种二人对抗性游戏。对局时,由执红棋的一方先走,双方轮流各走一招,直至分出胜、负、和,对局即终了。在棋战中,人们可以从攻与防、虚与实、整体与局部等复杂关系的变化中提升思维能力。

每种棋子的行棋规则大家如果有不懂的地方,可以去了解一下,都很简单。你想要做出本项目,了解规则是必不可少的。

本项目编译环境:VS2019/VS2013;

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

效果图展示

配套讲解教程:中国象棋游戏教程——哔哩哔哩

源代码示例:

#include#include#define INTERVAL 50  //前面的间隔#define CHESS_GRID_SIZE 70  //格子宽度#define ROW  10#define COL  9enum PIECES//枚举棋子{  車,馬,象,士,将,砲,卒,  俥,马,相,仕,帥,炮,兵,  SPACE,BEGIN,END};//红黑方棋子、int redChess[] = { 車, 馬, 象, 士, 将, 砲, 卒};int blackChess[] = { 俥, 马, 相, 仕, 帥, 炮, 兵 };const char*chessName[] = { "車", "馬", "象", "士", "将", "砲", "卒", "俥", "马", "相", "仕", "帥", "炮", "兵" };struct Chess//棋子属性{  int x;  int y;  int id;//哪个棋子  int type;//是哪一方的棋子 红,黑?  bool river;//判断小兵是否过了河};struct Chess  map[ROW][COL];//结构体数组,用来保存每一个点的信息POINT begin = { -1, -1 }, end = { -1, -1 };//保存前后两次点击的数组下标int state = BEGIN;//初始化游戏数据void GameInit(){  for (int i = 0; i < ROW; i++)  {    for (int k = 0; k < COL; k++)    {      int chessname = SPACE;      int mcolor = BLACK;      //黑棋      if (i <= 4)      {        mcolor = BLACK;        //初始化第一行的棋子,        if (i == 0)        {          if (k <= 4)          {            chessname = blackChess[k];          }          else          {            chessname = blackChess[8-k];          }        }        //设置炮        if (i == 2 && (k == 1 || k == 7))        {          chessname = blackChess[砲];        }        //设置小兵        if (i == 3 && k % 2 == 0)        {          chessname = blackChess[卒];        }
      }      //紅棋      else       {        mcolor = RED;        //初始化第一行的棋子,        if (i == 9)        {          if (k <= 4)          {            chessname = redChess[k];          }          else          {            chessname = redChess[8 - k];          }        }        //设置炮        if (i == 7 && (k == 1 || k == 7))        {          chessname = redChess[炮];        }        //设置小兵        if (i == 6 && k % 2 == 0)        {          chessname = redChess[兵];        }      }      map[i][k].id = chessname;      map[i][k].river = false;      map[i][k].type = mcolor;      map[i][k].x = k*CHESS_GRID_SIZE + INTERVAL;      map[i][k].y = i*CHESS_GRID_SIZE + INTERVAL;    }  }}//游戏的绘制函数void GameDraw(){  //设置背景颜色 red black   setbkcolor(RGB(252, 215, 162));  cleardevice();
  //绘制棋盘  setlinecolor(BLACK);  setlinestyle(PS_SOLID, 2);  for (int i = 0; i < 10; i++)  {    //画横线    line(INTERVAL, i*CHESS_GRID_SIZE + INTERVAL, 8 * CHESS_GRID_SIZE + INTERVAL, i*CHESS_GRID_SIZE + INTERVAL);    //画竖线    if (i < 9)    {      line(i*CHESS_GRID_SIZE + INTERVAL, INTERVAL, i*CHESS_GRID_SIZE + INTERVAL, 9 * CHESS_GRID_SIZE + INTERVAL);    }  }  rectangle(INTERVAL - 5, INTERVAL - 5, 8 * CHESS_GRID_SIZE + INTERVAL+5, 5+9 * CHESS_GRID_SIZE + INTERVAL);  //楚河汉界显示  setfillcolor(RGB(252, 215, 162));  fillrectangle(INTERVAL, 4 * CHESS_GRID_SIZE + INTERVAL, 8 * CHESS_GRID_SIZE + INTERVAL, 5 * CHESS_GRID_SIZE + INTERVAL);  //显示文字  char river[20] = "楚河        汉界";  settextstyle(50, 0, "楷体");  settextcolor(BLACK);  setbkmode(TRANSPARENT);  outtextxy(INTERVAL+100, 4 * CHESS_GRID_SIZE + INTERVAL+10, river);  //画九宫格    //画上面  line(3 * CHESS_GRID_SIZE + INTERVAL, INTERVAL, 5 * CHESS_GRID_SIZE + INTERVAL, 2 * CHESS_GRID_SIZE + INTERVAL);  line(3 * CHESS_GRID_SIZE + INTERVAL, 2 * CHESS_GRID_SIZE + INTERVAL, 5 * CHESS_GRID_SIZE + INTERVAL, INTERVAL);     //画下面  line(3 * CHESS_GRID_SIZE + INTERVAL, 7 * CHESS_GRID_SIZE + INTERVAL, 5 * CHESS_GRID_SIZE + INTERVAL, 9 * CHESS_GRID_SIZE + INTERVAL);  line(3 * CHESS_GRID_SIZE + INTERVAL, 9 * CHESS_GRID_SIZE+INTERVAL,5*CHESS_GRID_SIZE+INTERVAL,7*CHESS_GRID_SIZE+INTERVAL);  //画棋子  settextstyle(30, 0, "楷体");  for (int i = 0; i < ROW; i++)  {    for (int k = 0; k < COL; k++)    {      if (map[i][k].id != SPACE)      {        setlinecolor(map[i][k].type);        fillcircle(map[i][k].x, map[i][k].y, 30);        fillcircle(map[i][k].x, map[i][k].y, 25);        settextcolor(map[i][k].type);        outtextxy(map[i][k].x-10, map[i][k].y-10, chessName[map[i][k].id]);      }          }  }}void MouseControl(){  if (MouseHit())  {    MOUSEMSG msg = GetMouseMsg();    if (msg.uMsg == WM_LBUTTONDOWN)    {      //获取鼠标点击的数组的下标      int row = (msg.y-INTERVAL)/CHESS_GRID_SIZE;      int col = (msg.x-INTERVAL)/CHESS_GRID_SIZE;      if (state == BEGIN)      {        state = END;        begin.x = row;        begin.y = col;      }      else if (state == END)      {        state = BEGIN;        begin.x = row;        begin.y = col;      }      printf("%d,%d  %d
", row, col, state);    }  }}void chessMove(){  if (begin.x != -1 && end.x != -1 && !(begin.x == end.x &&begin.y == end.y))  {    map[end.x][end.y].id = map[begin.x][begin.y].id;    map[end.x][end.y].type = map[begin.x][begin.y].type;    map[end.x][end.y].river = map[begin.x][begin.y].river;    map[begin.x][begin.y].id = SPACE;  }
}int main555(){    //创建一个图形窗口  initgraph(800,800,SHOWCONSOLE);  GameInit();  printf("欢迎来到顽石老师课堂,中国象棋");  BeginBatchDraw();  while (1)  {    GameDraw();    FlushBatchDraw();    MouseControl();    chessMove();  }  return 0;}

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

    关注

    180

    文章

    7604

    浏览量

    136780
  • 代码
    +关注

    关注

    30

    文章

    4787

    浏览量

    68569

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    使用C语言实现函数模板

      用C语言能不能实现一个通用的函数,既能完成整数的相加,又能完成浮点数的相加?
    的头像 发表于 11-09 11:38 386次阅读

    C语言与Java语言的对比

    C语言和Java语言都是当前编程领域中的重要成员,它们各自具有独特的优势和特点,适用于不同的应用场景。以下将从语法特性、内存管理、跨平台性、性能、应用领域等多个方面对C
    的头像 发表于 10-29 17:31 324次阅读

    PLC编程语言C语言的区别

    在工业自动化和计算机编程领域中,PLC(可编程逻辑控制器)编程语言C语言各自扮演着重要的角色。尽管两者都是编程语言,但它们在多个方面存在显著的区别。本文将从多个维度深入探讨PLC编程
    的头像 发表于 06-14 17:11 2816次阅读

    何用C语言实现高效查找(二分法)

    今天给分享一下使用C语言实现二分算法,主要包含以下几部分内容:二分查找算法介绍二分查找算法使用场景二分查找算法代码实现二分查找算法实现过程用C
    的头像 发表于 06-04 08:04 1131次阅读
    如<b class='flag-5'>何用</b><b class='flag-5'>C</b><b class='flag-5'>语言实现</b>高效查找(二分法)

    使用C语言实现的CRC计算单元的例子

    使用C语言实现的CRC计算单元的例子
    的头像 发表于 05-16 16:16 978次阅读

    嵌入式编程,如何用 C 语言实现状态机设计?

    状态机模式是一种行为模式,通过多态实现不同状态的调转行为的确是一种很好的方法,只可惜在嵌入式环境下,有时只能写纯C代码,并且还需要考虑代码的重入和多任务请求跳转等情形,因此实现起来着实需要一番考虑
    发表于 04-23 11:00

    C语言实现Web参数传递

    电子发烧友网站提供《C语言实现Web参数传递.docx》资料免费下载
    发表于 03-24 09:14 2次下载

    嵌入式系统中C语言结构体的基础实现与应用

    C语言中的数组只能允许程序员定义存储相同类型数据。但是结构是C语言编程中允许您存储不同数据类型的数据。
    发表于 03-12 14:29 501次阅读
    嵌入式系统中<b class='flag-5'>C</b><b class='flag-5'>语言</b>结构体的基础<b class='flag-5'>实现</b>与应用

    c语言,c++,java,python区别

    C语言C++、Java和Python是四种常见的编程语言,各有优点和特点。 C语言
    的头像 发表于 02-05 14:11 2385次阅读

    vb语言c++语言的区别

    VB语言C++语言是两种不同的编程语言,虽然它们都属于高级编程语言,但在设计和用途上有很多区别。下面将详细比较VB
    的头像 发表于 02-01 10:20 2302次阅读

    C语言能够实现单片机功能,为什么还要使用汇编呢?

    C语言能够实现单片机功能,为什么还要使用汇编呢? C语言是一种高级编程语言,它具有跨平台、可移植
    的头像 发表于 01-15 14:59 1057次阅读

    ADUC7061如何使用C语言实现EEPROM功能?

    我使用ADUC7061做的信号采集,现在客户需要实现EEPROM功能来保存3-5个数据,请问如何使用C语言实现?不使用外部EEPROM 专用IC。
    发表于 01-12 06:56

    单轴PSO视觉飞拍与精准输出:EtherCAT超高速实时运动控制卡XPCIE1032H上位机C#开发(七)

    正运动威廉希尔官方网站 EtherCAT控制卡在VS平台采用C#语言实现的各种PSO功能。
    的头像 发表于 01-03 09:50 1043次阅读
    单轴PSO视觉飞拍与精准输出:EtherCAT超高速实时运动控制卡XPCIE1032H上位机<b class='flag-5'>C</b>#开发(七)

    怎么写出效率高、思路清晰的C语言程序?

    要用C语言的思维方式来进行程序的构架构建 要有良好的C语言算法基础,以此来实现程序的逻辑构架 灵活运用
    的头像 发表于 01-02 14:20 567次阅读