C语言实现中国象棋

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

本文实例为大家分享了C语言实现中国象棋的具体代码,供大家参考,具体内容如下

运行截图

实现思路

老套路,二维数组存储棋盘,宏定义各种棋子,每次棋子的移动实质为二维数组的赋值。
重点是判断棋子是否可移动到目标位置,移动有两种可能,一是单纯移动,二是吃子移动。主要飞将的特殊规则。废话不多说,贴源码(主要下面是两个源文件哦)

源码

main.c

#include #include #include //自定义源文件(棋谱结构)  #include"manual.c" //棋盘行列  #define ROWS 10 #define COLS 9 //空地  #define white 0 //红方棋子  #define isred (map[i][j]>0&&map[i][j]<10) #define ju 1 #define ma 2 #define xiang 3 #define shi 4 #define shuai 5 #define pao 6 #define bing 7 //黑方棋子 #define isblack (map[i][j]>10) #define Ju 11 #define Ma 12 #define Xiang 13 #define Shi 14 #define Jiang 15 #define Pao 16 #define Zu 17  //控制输出颜色  #define NONECOLOR SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),7) #define REDCOLOR SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED) #define GREENCOLOR SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN) //当前玩家 #define red 1 #define black 0  //地图  int map[ROWS][COLS]={white}; //棋步  char step[20]; //初始化地图  void InitializeMap() {     int i,j;     for(i=0;iROWS||(*y1)<0||(*y1)>COLS||(*x2)<0||(*x2)>ROWS||(*y2<0)||(*y2)>COLS)     {         return 0;     }     else if((*x1)==(*x2)&&(*y1)==(*y2))     {         return 0;     }     return 1; }  //判断是否已经结束游戏(-1:黑胜 0:还没结束 1:红胜)  int isOver() {     int i,j;     //没有將时红胜,没有帥时黑胜     int haveShuai=0,haveJiang=0;     for(i=0;i0&&map[x2][y2]<10&&player==red||map[x2][y2]>10&&player==black)     {         return 0;         }      int piece=map[x1][y1];     int i,j;     int start,end;     int eye_x=-1,eye_y=-1;     int count=0;     switch(piece)     {         //車、车          case ju:         case Ju:             if(x1==x2)             {                 start=y1;                 end=y2;                 i=x1;                 if(y1>y2)                 {                     start=y2;                     end=y1;                 }                 for(j=start+1;jx2)                 {                     start=x2;                     end=x1;                 }                 for(i=start+1;i4))              {                 return 0;             }             else if(abs(x1-x2)==2&&abs(y1-y2)==2)             {                 eye_x=(x1+x2)/2;                 eye_y=(y1+y2)/2;                 if(map[eye_x][eye_y]!=white)                 {                     return 0;                 }             }             else             {                 return 0;             }             break;         case shi:         case Shi:             //出九宫             if(player==red&&(x2<7||y2<3||y2>5)||player==black&&(x2>2||y2<3||y2>5))             {                 return 0;                 }              //不是走的斜一格              else if(abs(x1-x2)!=1||abs(y1-y2)!=1)             {                 return 0;             }             break;         case shuai:         case Jiang:             //飞将             if((player==red&&x2<3||player==black&&x2>6)&&y1==y2)             {                 start=x1;                 end=x2;                 j=y1;                 if(x1>x2)                 {                     start=x2;                     end=x1;                     }                     for(i=start+1;i5||player==red&&x2<7||player==black&&x2>2||abs(x1-x2)+abs(y1-y2)!=1)             {                 return 0;             }             break;         case pao:         case Pao:             if(x1==x2)             {                 start=y1;                 end=y2;                 i=x1;                 if(y1>y2)                 {                     start=y2;                     end=y1;                 }                 for(j=start+1;j1)                 {                     return 0;                 }                 else if(count==1)                 {                     if(map[x2][y2]>10&&player==red||map[x2][y2]>0&&map[x2][y2]<10&&player==black)                     {                         return 1;                     }                     else                     {                         return 0;                     }                 }             }             else if(y1==y2)             {                 start=x1;                 end=x2;                 j=y1;                 if(x1>x2)                 {                     start=x2;                     end=x1;                 }                 for(i=start+1;i1)                 {                     return 0;                 }                 else if(count==1)                 {                     if(map[x2][y2]>10&&player==red||map[x2][y2]>0&&map[x2][y2]<10&&player==black)                     {                         return 1;                     }                     else                     {                         return 0;                     }                 }             }             else             {                 return 0;             }             break;         case bing:         case Zu:             //不是横或纵走一格              if((abs(x1-x2)+abs(y1-y2))!=1)             {                 return 0;             }             //没过河时便左右移动              if(player==red&&x1>=5&&(abs(y1-y2)==1)||player==black&&(x1<=4)&&(abs(y1-y2)==1))             {                 return 0;             }             //往后退              else if(player==red&&(x1-x2==-1)||player==black&&(x2-x1==-1))             {                 return 0;             }             break;     }     return 1; }  //获得棋子名字  char *getPieceName(int piece) {     switch(piece)     {         case Ju:             return "车";         case ju:             return "車";         case Ma:             return "马";         case ma:             return "馬";         case Xiang:             return "象";         case xiang:             return "相";         case Shi:             return "士";         case shi:             return "仕";         case Jiang:             return "將";         case shuai:             return "帥";         case Pao:             return "砲";         case pao:             return "炮";         case Zu:             return "卒";         case bing:             return "兵";     }     return ""; } //获得棋步  void getStep(int x1,int y1,int x2,int y2,int player) {     //清空之前棋步      step[0]='\0';     char border_red[][3]={"九","八","七","六","五","四","三","二","一"};     char border_black[][3]={"1","2","3","4","5","6","7","8","9"};     int i,j;     int piece=map[x1][y1];     int last=0,next=0;     j=y1;     for(i=0;i0)             {                 strcat(step,"进");             }             else             {                 strcat(step,"退");             }             strcat(step,border_black[abs(distance)-1]);             break;         case Ma:         case Xiang:         case Shi:             if(distance>0)             {                 strcat(step,"进");             }             else             {                 strcat(step,"退");             }             strcat(step,border_black[y2]);             break;         case ju:         case shuai:         case pao:         case bing:             if(distance>0)             {                 strcat(step,"退");             }             else             {                 strcat(step,"进");             }             strcat(step,border_red[9-abs(distance)]);             break;         case ma:         case xiang:         case shi:             if(distance>0)             {                 strcat(step,"退");             }             else             {                 strcat(step,"进");             }             strcat(step,border_red[y2]);             break;     } } int main() {     InitializeMap();     //棋谱      manual m;     //初始化棋谱      initializeManual(&m);     //游戏是否已经结束      int isEnd=0;     //坐标     int x1,y1,x2,y2;      //输入是否合法     int inputRight;      //移动是否成功     int moveSuccess;      //当前玩家     int player=red;      while(!isEnd)     {         system("cls");                            //清屏         displayMap();                            //打印现在棋局         displayPlayer(player);                    //当前玩家回合          inputRight=getInput(&x1,&y1,&x2,&y2);    //接收玩家输入         if(x1==-1&&x2==-1&&y1==-1&&y2==-1)        //请求打印棋谱          {             displayManual(m);                    //打印棋谱          }         if(inputRight)                            //输入成功          {                                                 //是否选择己方棋子              if(map[x1][y1]>0&&map[x1][y1]<10&&player==red||map[x1][y1]>10&&player==black)             {                                                 //是否可以移动                  moveSuccess=canMove(x1,y1,x2,y2,player);                 if(moveSuccess)                    //可以移动                  {                                //按照输入移动棋子                      getStep(x1,y1,x2,y2,player);                     insertStep(step,&m);        //添加棋步到棋谱中                      printf("当前棋步为-->>%s\n",step);//打印当前棋步                      system("pause");                     movePiece(x1,y1,x2,y2);                         exchangePlayer(&player);    //移动成功,轮到对方回合                                                 isEnd=isOver();                //判断棋局是否已经结束                         }             }             }      }     system("cls");     displayMap();                                //打印现在棋局     displayWinner(isEnd);     saveManual(m,"manual.txt");     return 0; }

manual.c

#ifndef manual_c #define manual_c #define MAXCOUNT 200 //棋谱结构  typedef struct manual {     int count;     char step[MAXCOUNT][20];     }manual; //初始化棋谱  void initializeManual(manual *m) {     m->count=0; } //打印棋谱  void displayManual(manual m) {     printf("\n");     if(m.count==0)     {         printf("当前棋谱为空!\n");         }      int i;     for(i=0;i>",i/2+1);         }         printf("%s  ",m.step[i]);         if(i%2==1)         {             printf("\n");         }     }     printf("\n");     system("pause");  } //添加棋步 void insertStep(char step[],manual *m) {     if(m->count>=MAXCOUNT)     {         return;     }     int i=m->count;     strcpy(m->step[i],step);     i++;     m->count=i;     }  //删除棋步 void deleteStep(manual *m) {     int i=m->count;     i--;     m->count=i;     }  //保存棋谱  void saveManual(manual m,char filepath[]) {     int i;     FILE *fp=fopen(filepath,"w");     for(i=0;istep[i])==EOF)         {             break;         }         i++;     }     m->count=i;     fclose(fp);     }  #endif

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持0133技术站。

以上就是C语言实现中国象棋的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » C语言