欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言實現(xiàn)中國象棋

 更新時間:2022年05月10日 14:37:17   作者:冰凌呀  
這篇文章主要為大家詳細介紹了C語言實現(xiàn)中國象棋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了C語言實現(xiàn)中國象棋的具體代碼,供大家參考,具體內(nèi)容如下

運行截圖

實現(xiàn)思路

老套路,二維數(shù)組存儲棋盤,宏定義各種棋子,每次棋子的移動實質(zhì)為二維數(shù)組的賦值。
重點是判斷棋子是否可移動到目標位置,移動有兩種可能,一是單純移動,二是吃子移動。主要飛將的特殊規(guī)則。廢話不多說,貼源碼(主要下面是兩個源文件哦)

源碼

main.c

#include<stdio.h>
#include<string.h>
#include<windows.h>
//自定義源文件(棋譜結(jié)構(gòu))?
#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)
//當(dāng)前玩家
#define red 1
#define black 0?

//地圖?
int map[ROWS][COLS]={white};
//棋步?
char step[20];

//初始化地圖?
void InitializeMap()
{
?? ?int i,j;
?? ?for(i=0;i<ROWS;i++)
?? ?{
?? ??? ?for(j=0;j<COLS;j++)
?? ??? ?{
?? ??? ??? ?map[i][j]=white;
?? ??? ?}
?? ?}
?? ?
/*
? ? ? 0 1 2 3 4 5 6 7 8
?? ?0車馬象士將士象馬車
?? ?1
?? ?2 ?砲 ? ? ? ? ?砲
?? ?3卒 ?卒 ?卒 ?卒 ?卒
?? ?4
?? ?5
?? ?6兵 ?兵 ?兵 ?兵 ?兵
?? ?7 ?炮 ? ? ? ? ?炮
?? ?8 ?
?? ?9車馬相仕帥仕相馬車?
*/
?? ?//黑方子力配置?
?? ?map[0][0]=Ju;
?? ?map[0][1]=Ma;
?? ?map[0][2]=Xiang;
?? ?map[0][3]=Shi;
?? ?map[0][4]=Jiang;
?? ?map[0][5]=Shi;
?? ?map[0][6]=Xiang;
?? ?map[0][7]=Ma;
?? ?map[0][8]=Ju;
?? ?map[2][1]=Pao;
?? ?map[2][7]=Pao;
?? ?map[3][0]=Zu;
?? ?map[3][2]=Zu;
?? ?map[3][4]=Zu;
?? ?map[3][6]=Zu;
?? ?map[3][8]=Zu;
?? ?//紅方子力配置
?? ?map[6][0]=bing;
?? ?map[6][2]=bing;
?? ?map[6][4]=bing;
?? ?map[6][6]=bing;
?? ?map[6][8]=bing;?
?? ?map[7][1]=pao;
?? ?map[7][7]=pao;
?? ?map[9][0]=ju;
?? ?map[9][1]=ma;
?? ?map[9][2]=xiang;
?? ?map[9][3]=shi;
?? ?map[9][4]=shuai;
?? ?map[9][5]=shi;
?? ?map[9][6]=xiang;
?? ?map[9][7]=ma;
?? ?map[9][8]=ju;
}

//打印地圖
void displayMap()
{
?? ?int i,j,k;
?? ?printf(" ");
?? ?for(k=0;k<COLS;k++)
?? ?{
?? ??? ?printf(" %d",k);
?? ?}
?? ?printf("\n");
?? ?for(i=0;i<ROWS;i++)
?? ?{
?? ??? ?printf("%d ",i);
?? ??? ?for(j=0;j<COLS;j++)
?? ??? ?{
?? ??? ??? ?if(map[i][j]==white)
?? ??? ??? ?{
?? ??? ??? ??? ?NONECOLOR;
?? ??? ??? ??? ?printf(" ?");
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?if(isred)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?REDCOLOR;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else if(isblack)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?GREENCOLOR;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?switch(map[i][j])
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?case ju:
?? ??? ??? ??? ??? ??? ?printf("車");
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ?case Ju:
?? ??? ??? ??? ??? ??? ?printf("車");
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ?case ma:
?? ??? ??? ??? ??? ??? ?printf("馬");
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ?case Ma:
?? ??? ??? ??? ??? ??? ?printf("馬");
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ?case xiang:
?? ??? ??? ??? ??? ??? ?printf("相");
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ?case Xiang:
?? ??? ??? ??? ??? ??? ?printf("象");
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ?case shi:
?? ??? ??? ??? ??? ??? ?printf("仕");
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ?case Shi:
?? ??? ??? ??? ??? ??? ?printf("士");
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ?case shuai:
?? ??? ??? ??? ??? ??? ?printf("帥");
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ?case Jiang:
?? ??? ??? ??? ??? ??? ?printf("將");
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ?case pao:
?? ??? ??? ??? ??? ??? ?printf("炮");
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ?case Pao:
?? ??? ??? ??? ??? ??? ?printf("砲");
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ?case bing:
?? ??? ??? ??? ??? ??? ?printf("兵");
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ?case Zu:
?? ??? ??? ??? ??? ??? ?printf("卒");
?? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?}?? ?
?? ??? ??? ?}
?? ??? ?}?? ?
?? ??? ?NONECOLOR;
?? ??? ?printf("\n");
?? ?}?? ?
?? ?/*
?? ?char border[][3]={"九","八","七","六","五","四","三","二","一"};
?? ?printf(" ?");
?? ?for(k=0;k<9;k++)
?? ?{
?? ??? ?printf("%s",border[k]);
?? ?}
?? ?*/
?? ?printf("\n\n");?
}?

//將(x1,y1)的棋子移動到(x2,y2)?
void movePiece(int x1,int y1,int x2,int y2)
{
?? ?map[x2][y2]=map[x1][y1];
?? ?map[x1][y1]=white;
}

//獲取玩家需要移動的棋子位置和移動到的目標位置
int getInput(int *x1,int *y1,int *x2,int *y2)
{
?? ?printf("\n輸入棋子坐標和目的坐標(全為-1時表示查看當(dāng)前棋譜):\n");
?? ?scanf("%d %d %d %d",x1,y1,x2,y2);
?? ?if((*x1)<0||(*x1)>ROWS||(*y1)<0||(*y1)>COLS||(*x2)<0||(*x2)>ROWS||(*y2<0)||(*y2)>COLS)
?? ?{
?? ??? ?return 0;
?? ?}
?? ?else if((*x1)==(*x2)&&(*y1)==(*y2))
?? ?{
?? ??? ?return 0;
?? ?}
?? ?return 1;
}?

//判斷是否已經(jīng)結(jié)束游戲(-1:黑勝 0:還沒結(jié)束 1:紅勝)?
int isOver()
{
?? ?int i,j;
?? ?//沒有將時紅勝,沒有帥時黑勝
?? ?int haveShuai=0,haveJiang=0;
?? ?for(i=0;i<ROWS;i++)
?? ?{
?? ??? ?for(j=0;j<COLS;j++)
?? ??? ?{
?? ??? ??? ?if(map[i][j]==shuai)
?? ??? ??? ?{
?? ??? ??? ??? ?haveShuai=1;?? ??? ?
?? ??? ??? ?}?? ?
?? ??? ??? ?else if(map[i][j]==Jiang)
?? ??? ??? ?{
?? ??? ??? ??? ?haveJiang=1;
?? ??? ??? ?}
?? ??? ?}?? ?
?? ?}?? ?
?? ?if(haveShuai==0)
?? ?{
?? ??? ?return -1;
?? ?}
?? ?else if(haveJiang==0)
?? ?{
?? ??? ?return 1;
?? ?}
?? ?else
?? ?{
?? ??? ?return 0;
?? ?}
}?

//輸出贏家?
void displayWinner(int winner)
{
?? ?if(winner==1)
?? ?{
?? ??? ?printf("紅勝!\n");
?? ?}
?? ?else if(winner==-1)
?? ?{
?? ??? ?printf("黑勝!\n");
?? ?}
}

//打印當(dāng)前回合的玩家
void displayPlayer(int player)
{
?? ?printf("=======");
?? ?if(player==red)
?? ?{
?? ??? ?printf("紅方回合");?
?? ?}
?? ?else if(player==black)
?? ?{
?? ??? ?printf("黑方回合"); ?? ?
?? ?}
?? ?printf("=======");?? ?
}?

//交替到對方回合?
void exchangePlayer(int *player)
{
?? ?if((*player)==red)
?? ?{
?? ??? ?*player=black;
?? ?}
?? ?else if((*player)==black)
?? ?{
?? ??? ?*player=red;
?? ?}
}

//坐標(x1,y1)上的棋子是否能移動到(x2,y2)上?
int canMove(int x1,int y1,int x2,int y2,int player)
{
?? ?//當(dāng)(x2,y2)為己方棋子時,不可以
?? ?if(map[x2][y2]>0&&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;j<end;j++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?if(map[i][j]!=white)
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?return 0;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?else if(y1==y2)
?? ??? ??? ?{
?? ??? ??? ??? ?start=x1;
?? ??? ??? ??? ?end=x2;
?? ??? ??? ??? ?j=y1;
?? ??? ??? ??? ?if(x1>x2)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?start=x2;
?? ??? ??? ??? ??? ?end=x1;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?for(i=start+1;i<end;i++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?if(map[i][j]!=white)
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?return 0;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?else
?? ??? ??? ?{
?? ??? ??? ??? ?return 0;
?? ??? ??? ?}
?? ??? ??? ?break;
?? ??? ?case ma:
?? ??? ?case Ma:
?? ??? ??? ?if(abs(x1-x2)==1&&y1-y2==2)
?? ??? ??? ?{
?? ??? ??? ??? ?eye_x=x1;
?? ??? ??? ??? ?eye_y=y1-1;
?? ??? ??? ?}
?? ??? ??? ?else if(abs(x1-x2)==1&&y1-y2==-2)
?? ??? ??? ?{
?? ??? ??? ??? ?eye_x=x1;
?? ??? ??? ??? ?eye_y=y1+1;
?? ??? ??? ?}
?? ??? ??? ?else if(abs(y1-y2)==1&&x1-x2==2)
?? ??? ??? ?{
?? ??? ??? ??? ?eye_x=x1-1;
?? ??? ??? ??? ?eye_y=y1;
?? ??? ??? ?}
?? ??? ??? ?else if(abs(y1-y2)==1&&x1-x2==-2)
?? ??? ??? ?{
?? ??? ??? ??? ?eye_x=x1+1;
?? ??? ??? ??? ?eye_y=y1;
?? ??? ??? ?}
?? ??? ??? ?if(eye_x==-1&&eye_y==-1)
?? ??? ??? ?{
?? ??? ??? ??? ?return 0;
?? ??? ??? ?}
?? ??? ??? ?else if(map[eye_x][eye_y]!=white)
?? ??? ??? ?{
?? ??? ??? ??? ?return 0;
?? ??? ??? ?}
?? ??? ??? ?break;
?? ??? ?case xiang:
?? ??? ?case Xiang:
?? ??? ??? ?//相(象)過河?
?? ??? ??? ?if((player==red&&x2<5)||(player==black&&x2>4))?
?? ??? ??? ?{
?? ??? ??? ??? ?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;i<end;i++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?if(map[i][j]!=white)
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?return 0;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ?}?
?? ??? ??? ?else if(y2<3||y2>5||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;j<end;j++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?if(map[i][j]!=white)
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?count++;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ??? ?if(count>1)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?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;i<end;i++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?if(map[i][j]!=white)
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?count++;
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ??? ?if(count>1)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?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;i<x1;i++)
?? ?{
?? ??? ?if(map[i][j]==piece)
?? ??? ?{
?? ??? ??? ?last=1;
?? ??? ??? ?break;
?? ??? ?}
?? ?}
?? ?for(i=x1+1;i<ROWS;i++)
?? ?{
?? ??? ?if(map[i][j]==piece)
?? ??? ?{
?? ??? ??? ?next=1;
?? ??? ??? ?break;
?? ??? ?}
?? ?}
?? ?if(last==1&&next==1)
?? ?{
?? ??? ?strcat(step,"中");
?? ?}?? ?
?? ?else if(last==1)
?? ?{
?? ??? ?if(player==red)
?? ??? ?{
?? ??? ??? ?strcat(step,"后");
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?strcat(step,"前");
?? ??? ?}
?? ?}
?? ?else if(next==1)
?? ?{
?? ??? ?if(player==red)
?? ??? ?{
?? ??? ??? ?strcat(step,"前");
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?strcat(step,"后");
?? ??? ?}
?? ?}
?? ?strcat(step,getPieceName(map[x1][y1]));
?? ?if(last==0&&next==0)
?? ?{
?? ??? ?if(player==red)
?? ??? ?{
?? ??? ??? ?strcat(step,border_red[y1]);
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?strcat(step,border_black[y1]);?? ?
?? ??? ?}
?? ?}
?? ?if(x1==x2)
?? ?{
?? ??? ?strcat(step,"平");
?? ??? ?if(player==red)
?? ??? ?{
?? ??? ??? ?strcat(step,border_red[y2]);
?? ??? ?}
?? ??? ?else
?? ??? ?{
?? ??? ??? ?strcat(step,border_black[y2]);?? ?
?? ??? ?}
?? ??? ?return;
?? ?}
?? ?int distance=x2-x1;
?? ?switch(map[x1][y1])
?? ?{
?? ??? ?case Ju:
?? ??? ?case Jiang:
?? ??? ?case Pao:
?? ??? ?case Zu:
?? ??? ??? ?if(distance>0)
?? ??? ??? ?{
?? ??? ??? ??? ?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);
?? ?//游戲是否已經(jīng)結(jié)束?
?? ?int isEnd=0;
?? ?//坐標
?? ?int x1,y1,x2,y2;?
?? ?//輸入是否合法
?? ?int inputRight;?
?? ?//移動是否成功
?? ?int moveSuccess;?
?? ?//當(dāng)前玩家
?? ?int player=red;?
?? ?while(!isEnd)
?? ?{
?? ??? ?system("cls");?? ??? ??? ??? ??? ??? ??? ?//清屏
?? ??? ?displayMap();?? ??? ??? ??? ??? ??? ??? ?//打印現(xiàn)在棋局
?? ??? ?displayPlayer(player);?? ??? ??? ??? ??? ?//當(dāng)前玩家回合?
?? ??? ?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("當(dāng)前棋步為-->>%s\n",step);//打印當(dāng)前棋步?
?? ??? ??? ??? ??? ?system("pause");
?? ??? ??? ??? ??? ?movePiece(x1,y1,x2,y2);?? ?
?? ??? ??? ??? ??? ?exchangePlayer(&player);?? ?//移動成功,輪到對方回合?? ??? ??? ??? ??? ??? ??? ?
?? ??? ??? ??? ??? ?isEnd=isOver();?? ??? ??? ??? ?//判斷棋局是否已經(jīng)結(jié)束?? ??? ?
?? ??? ??? ??? ?}
?? ??? ??? ?}?? ?
?? ??? ?}?
?? ?}
?? ?system("cls");
?? ?displayMap();?? ??? ??? ??? ??? ??? ??? ??? ?//打印現(xiàn)在棋局
?? ?displayWinner(isEnd);
?? ?saveManual(m,"manual.txt");
?? ?return 0;
}

manual.c

#ifndef manual_c
#define manual_c
#define MAXCOUNT 200
//棋譜結(jié)構(gòu)?
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("當(dāng)前棋譜為空!\n");?? ?
?? ?}?
?? ?int i;
?? ?for(i=0;i<m.count;i++)
?? ?{
?? ??? ?if(i%2==0)
?? ??? ?{
?? ??? ??? ?printf("%d-->>",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;i<m.count;i++)
?? ?{
?? ??? ?fprintf(fp,"%s\n",m.step[i]);
?? ?}
?? ?fclose(fp);
?? ?printf("\n棋譜保存成功!\n");
}

//讀取棋譜
void readManual(manual *m,char filepath[])
{
?? ?int i=0;
?? ?FILE *fp=fopen(filepath,"r");
?? ?if(fp==NULL)
?? ?{
?? ??? ?printf("棋譜文件丟失!\n");
?? ??? ?return;
?? ?}
?? ?while(1)
?? ?{
?? ??? ?if(fscanf(fp,"%s",m->step[i])==EOF)
?? ??? ?{
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?i++;
?? ?}
?? ?m->count=i;
?? ?fclose(fp);?? ?
}?
#endif

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • c語言中的二級指針做函數(shù)參數(shù)說明

    c語言中的二級指針做函數(shù)參數(shù)說明

    這篇文章主要介紹了c語言中的二級指針做函數(shù)參數(shù)說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • C++ Boost Random隨機函數(shù)詳解

    C++ Boost Random隨機函數(shù)詳解

    Boost是為C++語言標準庫提供擴展的一些C++程序庫的總稱。Boost庫是一個可移植、提供源代碼的C++庫,作為標準庫的后備,是C++標準化進程的開發(fā)引擎之一,是為C++語言標準庫提供擴展的一些C++程序庫的總稱
    2022-11-11
  • C語言中的時間函數(shù)clock()和time()你都了解嗎

    C語言中的時間函數(shù)clock()和time()你都了解嗎

    這篇文章主要為大家詳細介紹了C語言中的時間函數(shù)clock()和time(),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • Qt教程之QSqlQueryModel的使用詳解

    Qt教程之QSqlQueryModel的使用詳解

    QSqlQueryModel是QSqlTableModel的父類,它封裝了執(zhí)行SELECT語句從數(shù)據(jù)庫查詢數(shù)據(jù)的功能,本文將為大家介紹一下QSqlQueryModel的使用,需要的可以參考一下
    2022-11-11
  • C語言實現(xiàn)簡單推箱子小游戲

    C語言實現(xiàn)簡單推箱子小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • c++類型轉(zhuǎn)換及RTTI運行階段類型識別

    c++類型轉(zhuǎn)換及RTTI運行階段類型識別

    這篇文章主要為大家介紹了c++類型轉(zhuǎn)換及RTTI運行階段類型識別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2023-05-05
  • 深入解析C語言中的內(nèi)存分配相關(guān)問題

    深入解析C語言中的內(nèi)存分配相關(guān)問題

    這篇文章主要深入地介紹了C語言中的內(nèi)存分配,C語言編程中的內(nèi)存泄漏問題一直以來都是C編程中的一大棘手問題,本文從malloc和指針等方面對C內(nèi)存進行了深層次講解,強烈推薦!需要的朋友可以參考下
    2015-08-08
  • C++實現(xiàn)小型復(fù)數(shù)計算器

    C++實現(xiàn)小型復(fù)數(shù)計算器

    這篇文章主要為大家詳細介紹了C++實現(xiàn)小型復(fù)數(shù)計算器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 在C++?中慎用setjmp和longjmp解析

    在C++?中慎用setjmp和longjmp解析

    setjmp和longjmp是C語言中用于實現(xiàn)非局部跳轉(zhuǎn)的函數(shù),setjmp和longjmp 是 C 語言中一個很強大的函數(shù),這篇文章主要介紹了在C++?中慎用setjmp和longjmp的相關(guān)知識,需要的朋友可以參考下
    2023-06-06
  • C++面試八股文之如何避免死鎖詳解

    C++面試八股文之如何避免死鎖詳解

    在C++中,鎖(Lock)是一種同步工具,用于保護共享資源,防止多個線程同時訪問,那么如何避免死鎖的情況出現(xiàn)呢,下面就為大家簡單講講
    2023-07-07

最新評論