主頁 >  其他 > C語言象棋小程式1.0版(def C++版)

C語言象棋小程式1.0版(def C++版)

2021-11-07 09:54:27 其他

做了一周,用def C++搞了個實作雙人對抗的象棋小程式,瀉藥,已經是在笑帶學生惹,歡迎白嫖,歡迎各位大佬指點問題,歡迎提問😀😀,原理是用一個二維陣列當棋盤,玩家輸入來控制棋子的移動,下棋方式是輸入兩個坐標,用逗號隔開,系統判斷輸入的位置是否符合該棋子的移動邏輯,勝利條件是吃掉對方的將,演示如下

開局先輸入兩位玩家的名字,準備好了輸入1就開始游戲,輸入0還能重新更改名字(這里不演示了),第二位輸入的玩家先手,當然也可以在開始游戲的時候輸入‘q’ ,先手的玩家自動跳過一回合,輪到下一位玩家開始下棋

棋盤顯示棋子種類個數,以及誰的回合,控制的是哪一方的棋子比較直觀顯示出來

輸入的格式如下,比如我(帥陣營)開局想炮二平五(架中炮)應該這樣輸入

從8行2列坐標,移動到8行5列坐標(注意!!不支持中文逗號),此時棋盤是這樣的,其實我也想做炮二平五的中文輸入...下次一定吧,等1.1版本唄(說真的

而在二維陣列中的儲存是這樣的

我做了一個debug的函式可以隨時把這個二維陣列輸出出來,主要作用還是在開發的時候看看坐標有沒有錯,棋子是否移動了位置而又發出警報,移動位置有沒有到達預期之類的錯誤

這個debug函式主要作用,把這個二維陣列的儲存的字串都輸出出來,原理如下:

int debug(int size1,char size[size1+1][size1])//測驗函式 
{
	int i,j;//行列 
	for(i=0;i<10;i++)//棋盤行 
	{
	for(j=0;j<9;j++)//棋盤列 
	{
	printf("%c ",size[i][j]);
    }
    printf("\n");
	}
}

而輸出到棋盤上,還要進行美化,美化的部分結構方法如下:

原理就是,打個比方,我檢測到了這里有一粒石頭,于是我向上面報告說這里有一塊大蛋糕,這樣,原本不好看的東西,就因為我們而讓他變好看了,

紅芝鳥玩家跳馬

答火雞玩家也跳馬,注意,雖然傌在行為10的坐標,此時輸入會多出來一個三位數,但是這是沒問題的,演示如下

系統會自動分辨出坐標是幾位數,并作出判斷你想要移動的方式

吃子的判定如下,先讓對面方跳個象

稍微提一下,每個棋子我都做了相應的移動限制,不合理的移動會有提示的

炮吃兵(這里只是作為演示,現實中可別這樣學我下棋)輸入演示如下

棋盤變化如下

此時下方棋子數也跟著變少了

此時將軍了是吧,此時我們讓紅鳥玩家走一步閑棋來進行我們的勝利判定

OK已經勝利了,此時輸入1,重新開始一局新游戲,輸入0結束游戲

這里就不展開了,代碼如下,歡迎白嫖😀,有問題也歡迎一起討論丫

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct Player//定義玩家資訊 
{
	char name[16];//姓名 
	int coinCount;//棋子數量 
	int s;//將,士,象,馬,炮,車 ,兵
	int i;
	int x;
	int m;
	int c;
	int p;
	int b;
	int first;//先手后手 
	int camp;//陣營,將,帥 
}play;

    play Player[2];//定義兩個玩家 
	char size[10][9];//定義b p c m x i s 棋子的棋盤 

int main()
{	
	printf("-----歡迎使用象棋小程式-----\n");

	int sizePu(int size1,char size[size1+1][size1]);//輸出當前棋盤 
	int sizeNew(int size1,char size[size1+1][size1]);//新棋盤 
	int sizeCol(int size1,char size[size1+1][size1],char coin[10]);//下棋控制的棋子 
	int length(char coin[]);//判斷長度的方法 
	int camps(int i);//判斷陣營 
	
	int i,j;//臨時變數 行,列 
	
	for(i=0;i<2;i++)//輸入姓名,開始游戲 
    {
    	printf("請輸入第%d位玩家姓名:",i+1);
    	scanf("%s",Player[i].name);
    	printf("%s玩家做好準備!!\n\n",Player[i].name);
	}
	
	//區分陣營 
	Player[0].camp=0;//將 
	Player[1].camp=1;//帥 
	
	do{//做開始游戲準備 
		i=0;
		printf("------現在開始游戲嗎?(1 or 0)------\n");
		scanf("%d",&i);
		if(i==0)
		{
		for(j=0;j<2;j++)//輸入姓名,開始游戲 
        {
    	printf("\n請重新輸入第%d位玩家姓名:",j+1);
    	scanf("%s",Player[j].name);
    	printf("%s玩家做好準備!!\n\n",Player[j].name);
    	Player[j].coinCount=16;
	    }
		}
		else if(i!=1&&i!=0)printf("請重新輸入\n"); 
	  }while(i!=1);
	printf("------------------------首局--------------------------\n\n"); 
    	
	//int debug(int size1,char size[size1+1][size1]);//測驗函式 
	//debug(9,size);//測驗函式 
	
	int star=0;//游戲進行條件 
	int player=1;//1,2玩家回圈輸入 
	char coin[10];//玩家輸入 
	int trans;//交換先后手 
	int p1=0,p2=0;//游戲比分
	int game=0;//游戲局數 
	
	printf("\n--------------------%s玩家先手----------------------\n",Player[player].name);
	Player[0].first=0;//先手1,后手0
	Player[1].first=1;//先手1,后手0
	
	sizeNew(9,size);//整理棋盤 
	sizePu(9,size);//輸出棋盤 
	
	
	do{//比賽判斷 
	   printf("\n%s玩家回合\n",Player[player].name);//下棋開始 
	   
	   printf("你的棋局是:");//局勢判斷 
	   camps(Player[player].camp);//判斷陣營 
	   printf("\n你的步驟為(上步坐標,下步坐標):");//輸入提示 
	   scanf("%s",coin);//讀取玩家輸入 
	   
	   if(coin[0]=='q')//跳過這個玩家的回合 Debug快速下棋用 
	   {
	   	camps(Player[player].camp);//判斷陣營 
	   	printf("玩家跳過本回合下一步\n");
	   	player++; 
	     if(player==2)//使player回圈,1,2玩家 
	     player=0;
	     
	   trans=Player[0].first;
	   Player[0].first=Player[1].first;
	   Player[1].first=trans;//交換1,2玩家先后順序,全域變數 
	   sizePu(9,size);//輸出棋盤  
	   	continue;
	   }
	   
	   
	   if(length(coin)<5||length(coin)>7)
	   {
	   	printf("\n請重新輸入\n");
	   	continue;
	   }
	   if(sizeCol(9,size,coin)==1)//下棋控制的棋子)
	   {
	   	printf("坐標出錯,請重新輸入\n");
	   	continue;
	   }
	   
	   
	   
	   player++;
	   if(player==2)//使player回圈,1,2玩家 
	   player=0;
	   
	   trans=Player[0].first;
	   Player[0].first=Player[1].first;
	   Player[1].first=trans;//交換1,2玩家先后順序,全域變數 
	   
	   
	   sizePu(9,size);//輸出棋盤 
	   
	   for(i=0;i<2;i++)//判斷勝負 
	   {
	   	if(Player[i].s==0)//將被吃了 
		   {
		   	sizePu(9,size);//輸出棋盤
		   	if(i==0)//帥 
		   	{
		   	//Player[i].camp=3;
		   	//Player[i+1].camp=1;
		   	printf("\n\n----------------------%s玩家勝利----------------------\n\n",Player[i+1].name);	
			}
		   
		   	else if(i==1)//將 
		   	{
		   	//Player[i].camp=2;
		   	//Player[i-1].camp=0;
		   	printf("\n\n----------------------%s玩家勝利----------------------\n\n",Player[i-1].name);	
			}
		   	
 
		   	
		   	game+=1;//玩了一把游戲 
		   	
		   	printf("\n-------------------------是否繼續游戲?-------------------------\n");
		   	printf("\n------------------- 1         or         0 ---------------------\n");
		   	
		   	int k=0;//判斷輸入合法性
		   	do{
		   	scanf("%s",coin);//讀取玩家輸入
		   	if(coin[0]=='1')//開始新回合
	        {
	         k=1; 
	   	     sizeNew(9,size);//整理棋盤
	   	     sizePu(9,size);//輸出棋盤
	        }
	        else if(coin[0]=='0')
			 {
			 	k=1;
			 	printf("游戲結束");
				star=1;
			 }
			 else 
			 printf("\n請重新輸入:");
			 }while(k!=1);
		   	
		   }
	   }
	   
	  }while(star!=1);//游戲結束 
      printf("\n感謝你的游玩");
	
	return 0;
}

int sizeNew(int size1,char size[size1+1][size1])//新棋盤的布局 
{
	int i,j;//行,列 

	for(i=0;i<10;i++)
	{
	for(j=0;j<9;j++)
	{
		switch(i)
		{
			case 0:
				{
					//玩家1
					switch(j)
					{//車,馬,象,士,帥,士,象,馬,車 (第1排 
						case 0:size[i][j]='c';
						break; 
						case 1:size[i][j]='m';
						break; 
						case 2:size[i][j]='x';
						break; 
						case 3:size[i][j]='i';
						break; 
						case 4:size[i][j]='s';
						break; 
						case 5:size[i][j]='i';
						break; 
						case 6:size[i][j]='x';
						break; 
						case 7:size[i][j]='m';
						break; 
						case 8:size[i][j]='c';
					}break;
				}
			case 2:
				{
				    switch(j)
					{//炮(第2排 
						case 1:size[i][j]='p';
						break; 
						case 7:size[i][j]='p';
						break; 
						default:size[i][j]='+'; 
						
					}	
				}break; 
			case 3:
			    {
			    	switch(j)
					{//兵(第4排 
						case 0:size[i][j]='b';
						break; 
						case 2:size[i][j]='b';
						break; 
						case 4:size[i][j]='b';
						break; 
						case 6:size[i][j]='b';
						break; 
						case 8:size[i][j]='b';
						break; 
						default:size[i][j]='+'; 
					}	
				}break;
				//玩家2 
			case 6:
			    {
			    	switch(j)
					{//兵(第6排 
						case 0:size[i][j]='B';
						break; 
						case 2:size[i][j]='B';
						break; 
						case 4:size[i][j]='B';
						break; 
						case 6:size[i][j]='B';
						break; 
						case 8:size[i][j]='B';
						break; 
						default:size[i][j]='+'; 
					}	
				}break; 
			case 7:
				{
				    switch(j)
					{//炮(第7排 
						case 1:size[i][j]='P';
						break; 
						case 7:size[i][j]='P';
						break; 
						default:size[i][j]='+'; 
					}	
				}break; 
			case 9:
				{
					//玩家1
					switch(j)
					{//車,馬,象,士,帥,士,象,馬,車 (第9排 
						case 0:size[i][j]='C';
						break; 
						case 1:size[i][j]='M';
						break; 
						case 2:size[i][j]='X';
						break; 
						case 3:size[i][j]='I';
						break; 
						case 4:size[i][j]='S';
						break; 
						case 5:size[i][j]='I';
						break; 
						case 6:size[i][j]='X';
						break; 
						case 7:size[i][j]='M';
						break; 
						case 8:size[i][j]='C';
					}break; 
				}
				default:size[i][j]='+'; 
		}
	}	
	}
} 

int sizePu(int size1,char size[size1+1][size1])//輸出當前棋盤 ,美化輸出 
{
	
	int i,j;//行,列 
	int sizes();//判斷棋子的型別 大小寫 
	int sizee();//判斷棋子的后手型別 
    int later;//后手變數 
	int first;//先手變數
	
	first=sizes();//判斷誰先手
	later=sizee();//判斷誰后手
	
	for(i=0;i<2;i++)//清空輸入 
	{
		Player[i].coinCount=0;//將,士,象,馬,炮,車 ,兵
    	Player[i].s=0;
		Player[i].i=0;
		Player[i].x=0;
		Player[i].m=0;
		Player[i].c=0;
		Player[i].p=0;
		Player[i].b=0;	
	}

	if((Player[first].camp==0)||(Player[first].camp==2))//將 
	{
	printf("|");
    for(i=0;i<9;i++)
	{
	printf("---%d--",i+1);
	}
	printf("|\n");//1-9坐標位置 	 
	
	for(i=0;i<10;i++)
	{
	printf("|");
	for(j=0;j<9;j++)
	{
		switch(size[i][j])
		{//黑棋 
			case 'b':printf("-(卒)-");Player[first].b+=1;break;
			case 'p':printf("-(砲)-");Player[first].p+=1;break;
			case 'c':printf("-(車)-");Player[first].c+=1;break;
			case 'm':printf("-(馬)-");Player[first].m+=1;break;
			case 'x':printf("-(象)-");Player[first].x+=1;break;
			case 'i':printf("-(士)-");Player[first].i+=1;break;
			case 's':printf("-(將)-");Player[first].s+=1;break;
		//紅棋
			case 'B':printf("-(兵)-");Player[later].b+=1;break;
			case 'P':printf("-(炮)-");Player[later].p+=1;break;
			case 'C':printf("-(車)-");Player[later].c+=1;break;
			case 'M':printf("-(傌)-");Player[later].m+=1;break;
			case 'X':printf("-(相)-");Player[later].x+=1;break;
			case 'I':printf("-(仕)-");Player[later].i+=1;break;
			case 'S':printf("-(帥)-");Player[later].s+=1;break;
			default: printf("---%c--",size[i][j]);
		}	
	}
		printf("|%d\n",i+1);
		if(i<9&&i!=4)
		{
		printf("|   |     |     |     |     |     |     |     |     |  |\n");//棋盤 
		printf("|   |     |     |     |     |     |     |     |     |  |\n");
		}
		else if(i==4)
	    {
		printf("|   |         楚河          |          漢界         |  |\n");//棋盤
		printf("|   |                       |                       |  |\n");
		}
		
	}
	printf("|");
    for(i=0;i<9;i++)
	{
		printf("---%d--",i+1);
	}
	printf("|\n");//1-9坐標位置 
	//輸出棋子個數量 
	printf("\n%d將,%d士,%d象,%d車,%d馬,%d砲,%d卒\n",
	Player[first].s,Player[first].i,Player[first].x,
	Player[first].c,Player[first].m,Player[first].p,Player[first].b);
	printf("\n%d帥,%d仕,%d相,%d車,%d傌,%d炮,%d兵\n",
    Player[later].s,Player[later].i,Player[later].x,
	Player[later].c,Player[later].m,Player[later].p,Player[later].b);
	}
	
	else if((Player[first].camp==1)||(Player[first].camp==3))//帥 
	{
	printf("|");
    for(i=0;i<9;i++)
	{
	printf("---%d--",i+1);
	}
	printf("|\n");//1-9坐標位置 	 
	
	for(i=0;i<10;i++)
	{
	printf("|");
	for(j=0;j<9;j++)
	{
		switch(size[i][j])
		{//黑棋 
			case 'b':printf("-(卒)-");Player[later].b+=1;break;
			case 'p':printf("-(砲)-");Player[later].p+=1;break;
			case 'c':printf("-(車)-");Player[later].c+=1;break;
			case 'm':printf("-(馬)-");Player[later].m+=1;break;
			case 'x':printf("-(象)-");Player[later].x+=1;break;
			case 'i':printf("-(士)-");Player[later].i+=1;break;
			case 's':printf("-(將)-");Player[later].s+=1;break;
		//紅棋
			case 'B':printf("-(兵)-");Player[first].b+=1;break;
			case 'P':printf("-(炮)-");Player[first].p+=1;break;
			case 'C':printf("-(車)-");Player[first].c+=1;break;
			case 'M':printf("-(傌)-");Player[first].m+=1;break;
			case 'X':printf("-(相)-");Player[first].x+=1;break;
			case 'I':printf("-(仕)-");Player[first].i+=1;break;
			case 'S':printf("-(帥)-");Player[first].s+=1;break;
			default: printf("---%c--",size[i][j]);
		}
		
	}
		printf("|%d\n",i+1);
		if(i<9&&i!=4)
		{
		printf("|   |     |     |     |     |     |     |     |     |  |\n");//棋盤 
		printf("|   |     |     |     |     |     |     |     |     |  |\n");
		}
		else if(i==4)
	   {
		printf("|   |         楚河          |          漢界         |  |\n");//棋盤
		printf("|   |                       |                       |  |\n");
		}
		
	}
	printf("|");
    for(i=0;i<9;i++)
	{
		printf("---%d--",i+1);
	}
	printf("|\n");//1-9坐標位置 
	//輸出棋子個數量 
	printf("\n%d帥,%d仕,%d相,%d車,%d傌,%d炮,%d兵\n",
	Player[first].s,Player[first].i,Player[first].x,
	Player[first].c,Player[first].m,Player[first].p,Player[first].b);
	printf("\n%d將,%d士,%d象,%d車,%d馬,%d砲,%d卒\n",
    Player[later].s,Player[later].i,Player[later].x,
	Player[later].c,Player[later].m,Player[later].p,Player[later].b);
	}
	
	 /* Player[i].coinCount=16;//將,士,象,馬,炮,車 ,兵
    	Player[i].s=1;
		Player[i].i=2;
		Player[i].x=2;
		Player[i].m=2;
		Player[i].c=2;
		Player[i].p=2;
		Player[i].b=5;    */
	
	
}

int debug(int size1,char size[size1+1][size1])//測驗函式 
{
	int i,j;
	for(i=0;i<10;i++)
	{
	for(j=0;j<9;j++)
	{
	printf("%c ",size[i][j]);
    }
    printf("\n");
	}
}

int sizeCol(int size1,char size[size1+1][size1],char coin[10])//下棋控制的棋子 
{
	int x[3],y[3];//棋子的坐標
	int xy[2];//1,2坐標
	int i=0,j=0;//臨時變數 
	
	int sizeMove(int size1,char size[size1+1][size1],int x[2]);//控制棋子的移動,x為兩個坐標 
	
	if(1)
	{//判斷輸入是否合法 
	x[0]=0;x[1]=0,x[2]=0,y[1]=0,y[2]=0,y[0]=0;//置零 
	for(;i<3;i++)//對輸入的讀取 
	{
		switch(coin[i])
		{//記錄前兩個棋子 
		    case ',':break;
			case '0':x[i]=0;break;
			case '1':x[i]=1;break;
			case '2':x[i]=2;break;
			case '3':x[i]=3;break;
			case '4':x[i]=4;break;
			case '5':x[i]=5;break;
			case '6':x[i]=6;break;
			case '7':x[i]=7;break;
			case '8':x[i]=8;break;
			case '9':x[i]=9;break;
		}	
	}
	
	if(coin[2]!=',')//對i進行判斷,是否處理完x的坐標 
	i=3;
	else i=2;
	
	for(;coin[i]!='\0';i++)
	{
		switch(coin[i])
		{//記錄后兩個棋子 
		    case ',':break; 
			case '0':y[j]=0;j++;break;
			case '1':y[j]=1;j++;break;
			case '2':y[j]=2;j++;break;
			case '3':y[j]=3;j++;break;
			case '4':y[j]=4;j++;break;
			case '5':y[j]=5;j++;break;
			case '6':y[j]=6;j++;break;
			case '7':y[j]=7;j++;break;
			case '8':y[j]=8;j++;break;
			case '9':y[j]=9;j++;break;
		}
	}
	}
	
	printf("\n玩家走棋:");
	if(x[2]==0&&x[0]!=0&&x[1]!=0)
	{
		printf("%d,%d—>",x[0],x[1]);//10初始的移動坐標
		xy[0]=x[0]*10+x[1];//讓坐標變成2位數 
	}
    
    else if(x[1]==0&&x[0]==1&&x[2]!=0)
    {
    	printf("%d%d,%d—>",x[0],x[1],x[2]);//100初始的移動坐標
    	xy[0]=x[0]*100+x[1]*10+x[2];//讓坐標變成2位數 
	}
     
    
    if(y[2]==0&&y[0]!=0&&y[1]!=0)
    {
    	printf("%d,%d\n",y[0],y[1]);//10變化的移動坐標    
    	xy[1]=y[0]*10+y[1];//讓坐標變成2位數 
	}
    
    else if(y[1]==0&&y[0]==1&&y[2]!=0)
    {
    	 printf("%d%d,%d\n",y[0],y[1],y[2]);//100變化的移動坐標    
    	 xy[1]=y[0]*100+y[1]*10+y[2];//讓坐標變成2位數
	}
   
    else return 1;//坐標錯誤 

    if(sizeMove(9,size,xy)==0)
    {
    //int debug(int size1,char size[size1+1][size1]);//測驗函式 
	//debug(9,size);//測驗函式 
	return 1;//出錯 
	}
	//printf("%d,%d,%d%d,%d,%d\n",x[0],x[1],x[2],y[0],y[1],y[2]);//從一個坐標跳到另外一個坐標 
	return 0;
}

int sizeMove(int size1,char size[size1+1][size1],int x[2])//控制棋子的移動,x為兩個坐標 
{
	int camps(int i);//判斷陣營
	int sizes();//判斷棋子的型別 大小寫 
	int end=0;
	
	int k,i[2],j[2],camp;
	for(k=0;k<2;k++)//對坐標進行拆開 
	{
	if(x[k]>=100)
	{
		i[k]=10;
		j[k]=x[k]-100;
	}
	else if(x[k]<=100)
	{
	    i[k]=x[k]/10;
	    j[k]=x[k]%10;
	}
	}
	//交換元素 
    char c1=size[i[0]-1][j[0]-1];//映射真實坐標 
    char c2=size[i[1]-1][j[1]-1];//映射真實坐標 
    
    camp=sizes();
    switch(Player[camp].camp)//判斷大小寫 陣營 
	{
		case 0://0是判斷將 
			{
				switch(c1)//映射真實坐標 
				{//車,馬,象,士,帥,士,象,馬,車
				        case 'c':{
				        	int c(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy為坐標
							if(c(9,size,i,j,'c')==1)
							return 0;//出錯 
							break;
						}
						case 'm':{
							int m(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy為坐標
							if(m(9,size,i,j,'m')==1)
							return 0;//出錯 
							break;
						}
						case 'x':{
							int x(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy為坐標
							if(x(9,size,i,j,'x')==1)
							return 0;//出錯
							break;
						}
						case 'i':{
							int i1(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy為坐標
							if(i1(9,size,i,j,'i')==1)
							return 0;//出錯 
							break;
						} 
						case 's':{
							int s(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy為坐標
							if(s(9,size,i,j,'s')==1)
							return 0;//出錯 
							break;
						}
						case 'b':{
							int b(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy為坐標
							if(b(9,size,i,j,'b')==1)
							return 0;//出錯 
							break;
						}
						case 'p':{
							int p(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy為坐標
							if(p(9,size,i,j,'p')==1)
							return 0;//出錯 
							break;
						}
						
						default:
						{
						printf("請控制");
						camps(Player[camp].camp);
						printf("的棋子\n");
						return 0;///回傳0  
						}
				}
			}break;
		case 1://1是判斷帥
			{
				switch(c1)//映射真實坐標 
				{//車,馬,象,士,帥,士,象,馬,車
				        case 'C':{
				        	int c(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy為坐標
				        	if(c(9,size,i,j,'C')==1)
							return 0;//出錯 
							break;
						}
						case 'M':{
							int m(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy為坐標
							if(m(9,size,i,j,'M')==1)
							return 0;//出錯 
							break;
						}
						case 'X':{
							int x(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy為坐標
							if(x(9,size,i,j,'X')==1)
							return 0;//出錯
							break;
						}
						case 'I':{
							int i1(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy為坐標
							if(i1(9,size,i,j,'I')==1)
							return 0;//出錯 
							break;
						} 
						case 'S':{
							int s(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy為坐標
							if(s(9,size,i,j,'S')==1)
							return 0;//出錯 
							break;
						}
						case 'B':{
							int b(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy為坐標
							if(b(9,size,i,j,'B')==1)
							return 0;//出錯 
							break;
						}
						case 'P':{
							int p(int size1,char size[size1+1][size1],int x[2], int y[2],char c1);//格局,xy為坐標
							if(p(9,size,i,j,'P')==1)
							return 0;//出錯 
							break;
						}
						
						default:
						{
						printf("請控制");
						camps(Player[camp].camp);
						printf("的棋子\n");
						return 0;//回傳0   
						}
						   
				}
			}break;
	}
	return 1;
}
int length(char coin[])//判斷輸入的長度的方法,以及輸入的合法性 
{
	int i,j=0,doc=0,num;
	for(i=0;coin[i]!='\0';i++)
	{
		num=coin[i];
		j++;
		if(coin[i]==',')
		{
		doc=1;//要有逗號 
		}
		if(num<=48&&num>=57)//防止越界 
		return 0;
	}
	if(doc==1)
	return j;
	
	else return 0;
} 

int camps(int i)//判斷陣營 
{
	if(i==0)
	{
		printf("“將”"); 
		return 1;
	}
	if(i==1)
	{
		printf("“帥”"); 
		return 0;
	}
	if(i==2)
	{
		printf("“⊙”"); 
		return 1;
	}
	if(i==3)
	{
		printf("“〇”");
		return 0;
	}
}

int sizes()//判斷棋子的先手型別 
{
	int i;
	for(i=0;i<2;i++)
	{
		if(Player[i].first==1)
		{
			return i;//回傳一個先手的值 
		}
	}
}
int sizee()//判斷棋子的后手型別 
{
	int i;
	for(i=0;i<2;i++)
	{
		if(Player[i].first==0)
		{
			return i;//回傳一個后手的值 
		}
	}
}

int b(int size1,char size[size1+1][size1],int x[2], int y[2],char c1)//兵 V
{
	int sizes();//判斷棋子的型別 大小寫 
	int sizee();//判斷棋子的后手型別 
    int later;//后手變數 
	int first;//先手變數
	first=sizes();//判斷誰先手
	later=sizee();//判斷誰后手 
	
	int chuhan(int x,char c1);//楚河漢界 
	int len(int size1,char size[size1+1][size1],int x[2], int y[2]);//移動距離
	
	if((y[0]==y[1]&&x[0]!=x[1]&&x[1]<=10&&x[1]>=1)||(x[0]==x[1]&&y[0]!=y[1]&&y[1]<=10&&y[1]>=1))//兵的路徑合法 
	{
	if(len(9,size,x,y)!=1)//判斷兵走的距離
	{
		sized(9,size,x[0]-1,y[0]-1);
		printf("不能走大于1的距離\n");
		return 1;
	}
	
	switch(c1)
	{
		case 'b':
			{
			if(chuhan(x[1],c1)==1)//沒過河 
	        {
		    if(y[1]!=y[0])//不能橫走 
		    {
		    sized(9,size,x[0]-1,y[0]-1);
		    printf("未過河不能平\n");
		    return 1;
	       	}
	        }
	        if(x[1]<x[0])
	        {
		    sized(9,size,x[0]-1,y[0]-1);
		    printf("不能退\n");
		    return 1;
	        }
				
				if(size[x[1]-1][y[1]-1]=='+')//判斷走棋還是吃 
				{	
					size[x[1]-1][y[1]-1]=c1;//下棋 
	                size[x[0]-1][y[0]-1]='+';
	                return 0; 
				}
				else if(size[x[1]-1][y[1]-1]!='+')
				{
					switch(size[x[1]-1][y[1]-1])
					{
					case 'B':break;
			        case 'P':break;
			        case 'C':break;
		        	case 'M':break;
			        case 'X':break;
			        case 'I':break;
			        case 'S':break;
			        default:
					{
						printf("\n不能吃自己的棋子\n");
						return 1;
					}
					}
					printf("玩家:%s ",Player[first].name);//玩家1名字 
					sized(9,size,x[0]-1,y[0]-1);//輸出棋子 
					printf(" 吃了 ");//玩家名字 
					printf("玩家:%s ",Player[later].name);//玩家2名字 
					sized(9,size,x[1]-1,y[1]-1);//輸出棋子
					printf("\n");// 
				}
				break;
			}
		case 'B':
			{
			if(chuhan(x[1],c1)!=1)//沒過河 
	        {
		    if(y[1]!=y[0])//不能橫走 
		    {
		    sized(9,size,x[0]-1,y[0]-1);
		    printf("未過河不能平\n");
		    return 1;
	       	} 	
	        }
	        if(x[1]>x[0])
	        {
		    sized(9,size,x[0]-1,y[0]-1);
		    printf("不能退\n");
		    return 1;
	        }
				
				if(size[x[1]-1][y[1]-1]=='+')//判斷走棋還是吃 
				{
					size[x[1]-1][y[1]-1]=c1;//下棋 
	                size[x[0]-1][y[0]-1]='+';
	                return 0; 
			    }
				else if(size[x[1]-1][y[1]-1]!='+')
				{
					switch(size[x[1]-1][y[1]-1])
					{
					case 'b':break;
			        case 'p':break;
			        case 'c':break;
		        	case 'm':break;
			        case 'x':break;
			        case 'i':break;
			        case 's':break;
			        default:
					{
						//size[x[0]-1][y[0]-1]=c1;//恢復棋子 
						printf("\n不能吃自己的棋子\n");
						return 1;
					}
					}
				    printf("玩家:%s ",Player[first].name);//玩家1名字 
					sized(9,size,x[0]-1,y[0]-1);//輸出棋子 
					printf(" 吃 ");//玩家名字 
					printf("玩家:%s ",Player[later].name);//玩家2名字 
					sized(9,size,x[1]-1,y[1]-1);//輸出棋子
					printf("\n");//  
				}
				break; 
			}
	}
			size[x[1]-1][y[1]-1]=c1;//下棋 
	        size[x[0]-1][y[0]-1]='+';		
	}
	else return 1;  
	
	return 0;
}	
int p(int size1,char size[size1+1][size1],int x[2], int y[2],char c1)//炮 V
{
    int sizes();//判斷棋子的型別 大小寫 
	int sizee();//判斷棋子的后手型別 
    int later;//后手變數 
	int first;//先手變數
	first=sizes();//判斷誰先手 
	later=sizee();//判斷誰后手 
	
	int jump;//判斷跳躍的棋子 
	jump=cp(9,size,x,y);
	
	int cp(int size1,char size[size1+1][size1],int x[2], int y[2]);//車炮移動判定 
	void sized(int size1,char size[size1+1][size1],int i,int j);//回傳棋子的值
	
	if((y[0]==y[1]&&x[0]!=x[1]&&x[1]<=10&&x[1]>=1)||(x[0]==x[1]&&y[0]!=y[1]&&y[1]<=10&&y[1]>=1))//炮的路徑合法 
	{
	if(jump>=2)//判斷車中間棋子 
	{
		sized(9,size,x[0]-1,y[0]-1);
		printf("不能跨多于兩個棋子移動\n");
		return 1;
	}
	switch(c1)
	{
		case 'p':
			{
				if(size[x[1]-1][y[1]-1]=='+'&&jump==0)//判斷走棋還是吃 
				{
					size[x[1]-1][y[1]-1]=c1;//下棋 
	                size[x[0]-1][y[0]-1]='+';
	                return 0;
				}
				else if(size[x[1]-1][y[1]-1]!='+'&&jump==1)
				{
					switch(size[x[1]-1][y[1]-1])
					{
					case 'B':break;
			        case 'P':break;
			        case 'C':break;
		        	case 'M':break;
			        case 'X':break;
			        case 'I':break;
			        case 'S':break;
			        default:
					{
						printf("\n不能吃自己的棋子\n");
						return 1;
					}
					}
					printf("玩家:%s ",Player[first].name);//玩家1名字 
					sized(9,size,x[0]-1,y[0]-1);//輸出棋子 
					printf(" 吃了 ");//玩家名字 
					printf("玩家:%s ",Player[later].name);//玩家2名字 
					sized(9,size,x[1]-1,y[1]-1);//輸出棋子
					printf("\n");// 
				}
				else //if(jump==1&&size[x[1]-1][y[1]-1]=='+')
				{
					sized(9,size,x[0]-1,y[0]-1);
					printf("移動非法\n");
					return 1;
				}
				break; 
			}
		case 'P':
			{
				if(size[x[1]-1][y[1]-1]=='+'&&jump==0)//判斷走棋還是吃 
				{
					size[x[1]-1][y[1]-1]=c1;//下棋 
	                size[x[0]-1][y[0]-1]='+';
	                return 0; 
			    }
				else if(size[x[1]-1][y[1]-1]!='+'&&jump==1)
				{
					switch(size[x[1]-1][y[1]-1])
					{
					case 'b':break;
			        case 'p':break;
			        case 'c':break;
		        	case 'm':break;
			        case 'x':break;
			        case 'i':break;
			        case 's':break;
			        default:
					{
						//size[x[0]-1][y[0]-1]=c1;//恢復棋子 
						printf("\n不能吃自己的棋子\n");
						return 1;
					}
					}
				    printf("玩家:%s ",Player[first].name);//玩家1名字 
					sized(9,size,x[0]-1,y[0]-1);//輸出棋子 
					printf(" 吃 ");//玩家名字 
					printf("玩家:%s ",Player[later].name);//玩家2名字 
					sized(9,size,x[1]-1,y[1]-1);//輸出棋子
					printf("\n");//  
				}
				else //if(jump==1&&size[x[1]-1][y[1]-1]=='+')
				{
					sized(9,size,x[0]-1,y[0]-1);
					printf("移動非法\n");
					return 1;
				}
				break; 
			}
	}
			size[x[1]-1][y[1]-1]=c1;//下棋 
	        size[x[0]-1][y[0]-1]='+';		
	}
	else return 1;  
	
	return 0;
}
int c(int size1,char size[size1+1][size1],int x[2], int y[2],char c1)//車 V
{
	int sizes();//判斷棋子的型別 大小寫 
	int sizee();//判斷棋子的后手型別 
    int later;//后手變數 
	int first;//先手變數
	first=sizes();//判斷誰先手 
	later=sizee();//判斷誰后手 
	
	int cp(int size1,char size[size1+1][size1],int x[2], int y[2]);//車炮移動判定 
	void sized(int size1,char size[size1+1][size1],int i,int j);//回傳棋子的值
	
	if((y[0]==y[1]&&x[0]!=x[1]&&x[1]<=10&&x[1]>=1)||(x[0]==x[1]&&y[0]!=y[1]&&y[1]<=10&&y[1]>=1))//車的路徑合法 
	{
	if(cp(9,size,x,y)!=0)//判斷車中間棋子 
	{
		sized(9,size,x[0]-1,y[0]-1);
		printf("不能跨棋子移動\n");
		return 1;
	}
	switch(c1)
	{
		case 'c':
			{
				if(size[x[1]-1][y[1]-1]=='+')//判斷走棋還是吃 
				{
					size[x[1]-1][y[1]-1]=c1;//下棋 
	                size[x[0]-1][y[0]-1]='+';
	                return 0; 
				}
				else if(size[x[1]-1][y[1]-1]!='+')
				{
					
					switch(size[x[1]-1][y[1]-1])
					{
					case 'B':break;
			        case 'P':break;
			        case 'C':break;
		        	case 'M':break;
			        case 'X':break;
			        case 'I':break;
			        case 'S':break;
			        default:
					{
						printf("\n不能吃自己的棋子\n");
						return 1;
					}
					}
					printf("玩家:%s ",Player[first].name);//玩家1名字 
					sized(9,size,x[0]-1,y[0]-1);//輸出棋子 
					printf(" 吃了 ");//玩家名字 
					printf("玩家:%s ",Player[later].name);//玩家2名字 
					sized(9,size,x[1]-1,y[1]-1);//輸出棋子
					printf("\n");// 
				}
				break; 
			}
		case 'C':
			{
				if(size[x[1]-1][y[1]-1]=='+')//判斷走棋還是吃 
				{
					size[x[1]-1][y[1]-1]=c1;//下棋 
	                size[x[0]-1][y[0]-1]='+';
	                return 0; 
			    }
				else if(size[x[1]-1][y[1]-1]!='+')
				{		
					switch(size[x[1]-1][y[1]-1])
					{
					case 'b':break;
			        case 'p':break;
			        case 'c':break;
		        	case 'm':break;
			        case 'x':break;
			        case 'i':break;
			        case 's':break;
			        default:
					{
						//size[x[0]-1][y[0]-1]=c1;//恢復棋子 
						printf("\n不能吃自己的棋子\n");
						return 1;
					}
					}
				    printf("玩家:%s ",Player[first].name);//玩家1名字 
					sized(9,size,x[0]-1,y[0]-1);//輸出棋子 
					printf(" 吃 ");//玩家名字 
					printf("玩家:%s ",Player[later].name);//玩家2名字 
					sized(9,size,x[1]-1,y[1]-1);//輸出棋子
					printf("\n");//  
				}
				break; 
			}
	}
			size[x[1]-1][y[1]-1]=c1;//下棋 
	        size[x[0]-1][y[0]-1]='+';		
	}
	else return 1;  
	
	return 0;
}
int m(int size1,char size[size1+1][size1],int x[2], int y[2],char c1)//馬 V
{
	int sizes();//判斷棋子的型別 大小寫 
	int sizee();//判斷棋子的后手型別 
    int later;//后手變數 
	int first;//先手變數
	first=sizes();//判斷誰先手
	later=sizee();//判斷誰后手 
	
	int len(int size1,char size[size1+1][size1],int x[2], int y[2]);//移動距離
	void sized(int size1,char size[size1+1][size1],int i,int j);//回傳棋子的值
	
	if((x[0]==x[1])||(y[0]==y[1]))
	{
		sized(9,size,x[0]-1,y[0]-1);
		printf("走“日”字\n");
		return 1;
	}
	
	if((y[0]!=y[1]&&x[0]!=x[1]&&x[1]<=10&&x[1]>=1)||(x[0]!=x[1]&&y[0]!=y[1]&&y[1]<=10&&y[1]>=1))//馬路徑合法 
	{
	if(len(9,size,x,y)!=333)//判斷馬走的距離
	{
		sized(9,size,x[0]-1,y[0]-1);
		printf("走“日”字\n");
		return 1;
	}
	//馬腳的判斷 
	if(x[0]>x[1])//上+左右移動 
	{
		if(y[0]>y[1])//上+左移動 
		{
			if((y[0]-y[1]==2)&&(size[x[0]-1][y[0]-2]!='+'))
			{
				sized(9,size,x[0]-1,y[0]-1);
			    printf("腳\n");
				return 1;
			}
			else if((y[0]-y[1]==1)&&(size[x[0]-2][y[0]-1]!='+'))
			{
				sized(9,size,x[0]-1,y[0]-1);
			    printf("腳\n");
				return 1;
			}
		}
		else if(y[0]<y[1])//上+右移動
		{
			if((y[1]-y[0]==2)&&(size[x[0]-1][y[0]-2]!='+'))
			{
				sized(9,size,x[0]-1,y[0]-1);
			    printf("腳\n");
				return 1;
			}
			else if((y[1]-y[0]==1)&&(size[x[0]-2][y[0]-1]!='+'))
			{
				sized(9,size,x[0]-1,y[0]-1);
			    printf("腳\n");
				return 1;
			}
		}
	}
	if(x[0]<x[1])//下+左右移動 
	{
		if(y[0]>y[1])//下+左移動
		{
			if((y[0]-y[1]==2)&&(size[x[0]-1][y[0]-2]!='+'))
			{
				sized(9,size,x[0]-1,y[0]-1);
			    printf("腳\n");
				return 1;
			}
			else if((y[0]-y[1]==1)&&(size[x[0]][y[0]-1]!='+'))
			{
				sized(9,size,x[0]-1,y[0]-1);
			    printf("腳\n");
				return 1;
			}
		}
		else if(y[0]<y[1])//下+右移動
		{
			if((y[1]-y[0]==2)&&(size[x[0]-1][y[0]-2]!='+'))
			{
				sized(9,size,x[0]-1,y[0]-1);
			    printf("腳\n");
				return 1;
			}
			else if((y[1]-y[0]==1)&&(size[x[0]][y[0]-1]!='+'))
			{
				sized(9,size,x[0]-1,y[0]-1);
			    printf("腳\n");
				return 1;
			}
		}
	}
	
    switch(c1)
	{
		case 'm':
			{
		    
			if(size[x[1]-1][y[1]-1]=='+')//判斷走棋還是吃 
				{
					size[x[1]-1][y[1]-1]=c1;//下棋 
	                size[x[0]-1][y[0]-1]='+';
	                return 0;
				}
				else if(size[x[1]-1][y[1]-1]!='+')
				{
					switch(size[x[1]-1][y[1]-1])
					{
					case 'B':break;
			        case 'P':break;
			        case 'C':break;
		        	case 'M':break;
			        case 'X':break;
			        case 'I':break;
			        case 'S':break;
			        default:
					{
						printf("\n不能吃自己的棋子\n");
						return 1;
					}
					}
					printf("玩家:%s ",Player[first].name);//玩家1名字 
					sized(9,size,x[0]-1,y[0]-1);//輸出棋子 
					printf(" 吃了 ");//玩家名字 
					printf("玩家:%s ",Player[later].name);//玩家2名字 
					sized(9,size,x[1]-1,y[1]-1);//輸出棋子
					printf("\n");// 
				}
				break;
			}
		case 'M':
			{
				if(size[x[1]-1][y[1]-1]=='+')//判斷走棋還是吃 
				{
					size[x[1]-1][y[1]-1]=c1;//下棋 
	                size[x[0]-1][y[0]-1]='+';
	                return 0; 
			    }
				else if(size[x[1]-1][y[1]-1]!='+')
				{
					switch(size[x[1]-1][y[1]-1])
					{
					case 'b':break;
			        case 'p':break;
			        case 'c':break;
		        	case 'm':break;
			        case 'x':break;
			        case 'i':break;
			        case 's':break;
			        default:
					{
						//size[x[0]-1][y[0]-1]=c1;//恢復棋子 
						printf("\n不能吃自己的棋子\n");
						return 1;
					}
					}
				    printf("玩家:%s ",Player[first].name);//玩家1名字 
					sized(9,size,x[0]-1,y[0]-1);//輸出棋子 
					printf(" 吃 ");//玩家名字 
					printf("玩家:%s ",Player[later].name);//玩家2名字 
					sized(9,size,x[1]-1,y[1]-1);//輸出棋子
					printf("\n");//  
				}
				break; 
			}
	}
	size[x[1]-1][y[1]-1]=c1;//下棋 
	size[x[0]-1][y[0]-1]='+';
	return 0;
	}else return 1;
}
int x(int size1,char size[size1+1][size1],int x[2], int y[2],char c1)//象 V
{
	int sizes();//判斷棋子的型別 大小寫 
	int sizee();//判斷棋子的后手型別 
    int later;//后手變數 
	int first;//先手變數
	first=sizes();//判斷誰先手
	later=sizee();//判斷誰后手 
	
	int chuhan(int x,char c1);//楚河漢界
	int len(int size1,char size[size1+1][size1],int x[2], int y[2]);//移動距離
	void sized(int size1,char size[size1+1][size1],int i,int j);//回傳棋子的值
	
	if((x[0]==x[1])||(y[0]==y[1]))
	{
		sized(9,size,x[0]-1,y[0]-1);
		printf("走“田”字\n");
		return 1;
	}
	
	if((y[0]!=y[1]&&x[0]!=x[1]&&x[1]<=10&&x[1]>=1)||(x[0]!=x[1]&&y[0]!=y[1]&&y[1]<=10&&y[1]>=1))//象路徑合法 
	{
	if(len(9,size,x,y)!=222)//判斷象走的距離
	{
		sized(9,size,x[0]-1,y[0]-1);
		printf("走“田”字\n");
		return 1;
	}
	if(x[0]>x[1])//判斷象腳 象往上跳 
	{
	   if(y[0]>y[1])//判斷象腳 象往上跳 象往左跳
		{	
			if(size[x[1]][y[1]]!='+')
			{
			   sized(9,size,x[0]-1,y[0]-1);
			   printf("腳\n");
			   return 1;
			}
		}
		else if(y[0]<y[1])//判斷象腳 象往上跳 象往右跳
		{
			if(size[x[1]][y[0]]!='+')
			{
			   sized(9,size,x[0]-1,y[0]-1);
			   printf("腳\n");
			   return 1;
			}	
		}
		    	
	}
	else if(x[0]<x[1])//判斷象腳 象往下跳
	{
				if(y[0]>y[1])//判斷象腳 象往下跳 象往左跳
				{
				    if(size[x[0]][y[1]]!='+')
			        {
			         sized(9,size,x[0]-1,y[0]-1);
			         printf("腳\n");
			         return 1;
			        }	
				}
				else if(y[0]<y[1])//判斷象腳 象往下跳 象往右跳
				{
					if(size[x[0]][y[0]]!='+')
			        {
			         sized(9,size,x[0]-1,y[0]-1);
			         printf("腳\n");
			         return 1;
			        }	
				} 
    }
	
	switch(c1)
	{
		case 'x':
			{
			if(chuhan(x[1],c1)!=1)//過河 
		    {
		    sized(9,size,x[0]-1,y[0]-1);
		    printf("不能過河\n");
			return 1;
			}
		    
			if(size[x[1]-1][y[1]-1]=='+')//判斷走棋還是吃 
				{
					size[x[1]-1][y[1]-1]=c1;//下棋 
	                size[x[0]-1][y[0]-1]='+';
	                return 0;
				}
				else if(size[x[1]-1][y[1]-1]!='+')
				{
					switch(size[x[1]-1][y[1]-1])
					{
					case 'B':break;
			        case 'P':break;
			        case 'C':break;
		        	case 'M':break;
			        case 'X':break;
			        case 'I':break;
			        case 'S':break;
			        default:
					{
						printf("\n不能吃自己的棋子\n");
						return 1;
					}
					}
					printf("玩家:%s ",Player[first].name);//玩家1名字 
					sized(9,size,x[0]-1,y[0]-1);//輸出棋子 
					printf(" 吃了 ");//玩家名字 
					printf("玩家:%s ",Player[later].name);//玩家2名字 
					sized(9,size,x[1]-1,y[1]-1);//輸出棋子
					printf("\n");// 
				}
				break;
			}
		case 'X':
			{		
			
				
			if(chuhan(x[1],c1)==1)//過河 
		    {
		    sized(9,size,x[0]-1,y[0]-1);
		    printf("不能過河\n");
			return 1;
			}
				if(size[x[1]-1][y[1]-1]=='+')//判斷走棋還是吃 
				{
					size[x[1]-1][y[1]-1]=c1;//下棋 
	                size[x[0]-1][y[0]-1]='+';
	                return 0; 
			    }
				else if(size[x[1]-1][y[1]-1]!='+')
				{
					switch(size[x[1]-1][y[1]-1])
					{
					case 'b':break;
			        case 'p':break;
			        case 'c':break;
		        	case 'm':break;
			        case 'x':break;
			        case 'i':break;
			        case 's':break;
			        default:
					{
						//size[x[0]-1][y[0]-1]=c1;//恢復棋子 
						printf("\n不能吃自己的棋子\n");
						return 1;
					}
					}
				    printf("玩家:%s ",Player[first].name);//玩家1名字 
					sized(9,size,x[0]-1,y[0]-1);//輸出棋子 
					printf(" 吃 ");//玩家名字 
					printf("玩家:%s ",Player[later].name);//玩家2名字 
					sized(9,size,x[1]-1,y[1]-1);//輸出棋子
					printf("\n");//  
				}
				break; 
			}
	}
	size[x[1]-1][y[1]-1]=c1;//下棋 
	size[x[0]-1][y[0]-1]='+';
    }
    else 
	{
	sized(9,size,x[0]-1,y[0]-1);
	printf("路徑非法\n"); 
	return 1; 	
	}

	return 0;
}
int i1(int size1,char size[size1+1][size1],int x[2], int y[2],char c1)//士 V 
{
    int sizes();//判斷棋子的型別 大小寫 
	int sizee();//判斷棋子的后手型別 
    int later;//后手變數 
	int first;//先手變數
	first=sizes();//判斷誰先手
	later=sizee();//判斷誰后手 
	 
	int jiugong(int x[2], int y[2],char c1);//九宮 
	int len(int size1,char size[size1+1][size1],int x[2], int y[2]);//移動距離
	void sized(int size1,char size[size1+1][size1],int i,int j);//回傳棋子的值
		
	if((y[0]!=y[1]&&x[0]!=x[1]&&x[1]<=10&&x[1]>=1)||(x[0]!=x[1]&&y[0]!=y[1]&&y[1]<=10&&y[1]>=1))//士路徑合法 
	{
		
	if((x[0]==x[1])||(y[0]==y[1]))
	{
		sized(9,size,x[0]-1,y[0]-1);
		printf("非法s移動");
		return 1;
	}
	
	if(len(9,size,x,y)!=111)//判斷士走的距離
	{
		sized(9,size,x[0]-1,y[0]-1);
		printf("不能走大于1的距離\n");
		return 1;
	}
	if((jiugong(x,y,c1))!=1)//判斷九宮
	{
		sized(9,size,x[0]-1,y[0]-1);
		printf("不能出九宮\n");
		return 1;
	}
	switch(c1)
	{
		case 'i':
			{
				if(size[x[1]-1][y[1]-1]=='+')//判斷走棋還是吃 
				{
					size[x[1]-1][y[1]-1]=c1;//下棋 
	                size[x[0]-1][y[0]-1]='+';
	                return 0;
				}
				else if(size[x[1]-1][y[1]-1]!='+')
				{
					switch(size[x[1]-1][y[1]-1])
					{
					case 'B':break;
			        case 'P':break;
			        case 'C':break;
		        	case 'M':break;
			        case 'X':break;
			        case 'I':break;
			        case 'S':break;
			        default:
					{
						printf("\n不能吃自己的棋子\n");
						return 1;
					}
					}
					printf("玩家:%s ",Player[first].name);//玩家1名字 
					sized(9,size,x[0]-1,y[0]-1);//輸出棋子 
					printf(" 吃了 ");//玩家名字 
					printf("玩家:%s ",Player[later].name);//玩家2名字 
					sized(9,size,x[1]-1,y[1]-1);//輸出棋子
					printf("\n");// 
				}
				break;
			}
		case 'I':
			{		
				if(size[x[1]-1][y[1]-1]=='+')//判斷走棋還是吃 
				{
					size[x[1]-1][y[1]-1]=c1;//下棋 
	                size[x[0]-1][y[0]-1]='+';
	                return 0; 
			    }
				else if(size[x[1]-1][y[1]-1]!='+')
				{
					switch(size[x[1]-1][y[1]-1])
					{
					case 'b':break;
			        case 'p':break;
			        case 'c':break;
		        	case 'm':break;
			        case 'x':break;
			        case 'i':break;
			        case 's':break;
			        default:
					{
						//size[x[0]-1][y[0]-1]=c1;//恢復棋子 
						printf("\n不能吃自己的棋子\n");
						return 1;
					}
					}
				    printf("玩家:%s ",Player[first].name);//玩家1名字 
					sized(9,size,x[0]-1,y[0]-1);//輸出棋子 
					printf(" 吃 ");//玩家名字 
					printf("玩家:%s ",Player[later].name);//玩家2名字 
					sized(9,size,x[1]-1,y[1]-1);//輸出棋子
					printf("\n");//  
				}
				break; 
			}
	}
			size[x[1]-1][y[1]-1]=c1;//下棋 
	        size[x[0]-1][y[0]-1]='+';	
			return 0;	
	}
	else 
	{
	sized(9,size,x[0]-1,y[0]-1);
	printf("路徑非法\n"); 
	return 1; 	
	}
	
	return 0;
}
int s(int size1,char size[size1+1][size1],int x[2], int y[2],char c1)//將 V 
{
	int sizes();//判斷棋子的型別 大小寫 
	int sizee();//判斷棋子的后手型別 
    int later;//后手變數 
	int first;//先手變數
	first=sizes();//判斷誰先手
	later=sizee();//判斷誰后手 
	
	int jiugong(int x[2], int y[2],char c1);//九宮 
	int len(int size1,char size[size1+1][size1],int x[2], int y[2]);//移動距離
	void sized(int size1,char size[size1+1][size1],int i,int j);//回傳棋子的值
		
	if((y[0]==y[1]&&x[0]!=x[1]&&x[1]<=10&&x[1]>=1)||(x[0]==x[1]&&y[0]!=y[1]&&y[1]<=10&&y[1]>=1))//將的路徑合法 
	{
	if(len(9,size,x,y)!=1)//判斷將走的距離
	{
		sized(9,size,x[0]-1,y[0]-1);
		printf("不能走大于1的距離\n");
		return 1;
	}
	if((jiugong(x,y,c1))!=1)//判斷九宮
	{
		sized(9,size,x[0]-1,y[0]-1);
		printf("不能出九宮\n");
		return 1;
	}
	switch(c1)
	{
		case 's':
			{
				if(size[x[1]-1][y[1]-1]=='+')//判斷走棋還是吃 
				{
					size[x[1]-1][y[1]-1]=c1;//下棋 
	                size[x[0]-1][y[0]-1]='+';
	                return 0;
				}
				else if(size[x[1]-1][y[1]-1]!='+')
				{
					switch(size[x[1]-1][y[1]-1])
					{
					case 'B':break;
			        case 'P':break;
			        case 'C':break;
		        	case 'M':break;
			        case 'X':break;
			        case 'I':break;
			        case 'S':break;
			        default:
					{
						printf("\n不能吃自己的棋子\n");
						return 1;
					}
					}
					printf("玩家:%s ",Player[first].name);//玩家1名字 
					sized(9,size,x[0]-1,y[0]-1);//輸出棋子 
					printf(" 吃了 ");//玩家名字 
					printf("玩家:%s ",Player[later].name);//玩家2名字 
					sized(9,size,x[1]-1,y[1]-1);//輸出棋子
					printf("\n");// 
				}
				break;
			}
		case 'S':
			{				
				if(size[x[1]-1][y[1]-1]=='+')//判斷走棋還是吃 
				{
					size[x[1]-1][y[1]-1]=c1;//下棋 
	                size[x[0]-1][y[0]-1]='+';
	                return 0; 
			    }
				else if(size[x[1]-1][y[1]-1]!='+')
				{
					switch(size[x[1]-1][y[1]-1])
					{
					case 'b':break;
			        case 'p':break;
			        case 'c':break;
		        	case 'm':break;
			        case 'x':break;
			        case 'i':break;
			        case 's':break;
			        default:
					{
						//size[x[0]-1][y[0]-1]=c1;//恢復棋子 
						printf("\n不能吃自己的棋子\n");
						return 1;
					}
					}
				    printf("玩家:%s ",Player[first].name);//玩家1名字 
					sized(9,size,x[0]-1,y[0]-1);//輸出棋子 
					printf(" 吃 ");//玩家名字 
					printf("玩家:%s ",Player[later].name);//玩家2名字 
					sized(9,size,x[1]-1,y[1]-1);//輸出棋子
					printf("\n");//  
				}
				break; 
			}
	}
			size[x[1]-1][y[1]-1]=c1;//下棋 
	        size[x[0]-1][y[0]-1]='+';		
	}
	else return 1;  
	
	return 0;
}
void sized(int size1,char size[size1+1][size1],int i,int j)//回傳棋子的值 
{
	switch(size[i][j])
		{//黑棋 
			case 'b':printf("(卒)");break;
			case 'p':printf("(砲)");break;
			case 'c':printf("(車)");break;
			case 'm':printf("(馬)");break;
			case 'x':printf("(象)");break;
			case 'i':printf("(士)");break;
			case 's':printf("(將)");break;
		//紅棋
			case 'B':printf("(兵)");break;
			case 'P':printf("(炮)");break;
			case 'C':printf("(車)");break;
			case 'M':printf("(傌)");break;
			case 'X':printf("(相)");break;
			case 'I':printf("(仕)");break;
			case 'S':printf("(帥)");break;
			default: printf("%c",size[i][j]);
		}
}
int cp(int size1,char size[size1+1][size1],int x[2], int y[2])//車炮移動判定 
{
	int i,j;//從i到j,累+
	int coin;//棋子+1 
	coin=0;
	
    if(x[0]==x[1])
    {
    	i=y[0]-1;//初始坐標 
	    j=y[1]-1;//變化坐標
		
		int i1=x[0]-1;
	    if(i>j)
		{
			i-=1;
			for(;i>j;i--)
			{
				if(size[i1][i]!='+')
				coin++;
			}
		}
		else if(i<j)
		{
			i+=1;
			for(;i<j;i++)
			{
				if(size[i1][i]!='+')
				coin++;
			}
		}
	}
	else if(y[0]==y[1])
	{
		i=x[0]-1;//初始坐標 
	    j=x[1]-1;//變化坐標 
	    
	    int i1=y[0]-1;
	    if(i>j)
		{
			i-=1;
			for(;i>j;i--)
			{
				if(size[i][i1]!='+')
				coin++;
			}
		}
		else if(i<j)
		{
			i+=1;
			for(;i<j;i++)
			{
				if(size[i][i1]!='+')
				coin++;
			}
		}
	}
	return coin;	
}
int len(int size1,char size[size1+1][size1],int x[2], int y[2])//兵象馬仕移動距離
{
	int i,j;//從i到j,累+
	int len;//棋子+1 
	len=0;
	
	if(x[0]==x[1])
    {
    	i=y[0]-1;//初始坐標 
	    j=y[1]-1;//變化坐標
		
		int i1=x[0]-1;
	    if(i>j)
		{
			for(;i>j;i--)
			{
				len++;
			}
		}
		else if(i<j)
		{
			for(;i<j;i++)
			{
				len++;
			}
		}
	}
	else if(y[0]==y[1])
	{
		i=x[0]-1;//初始坐標 
	    j=x[1]-1;//變化坐標 
	    
	    int i1=y[0]-1;
	    if(i>j)
		{
			for(;i>j;i--)
			{
				len++;
			}
		}
		else if(i<j)
		{
			for(;i<j;i++)
			{
				len++;
			}
		}
	}
	else if((x[0]!=x[1])&&(y[0]!=y[1]))//士、象、馬走斜線 
	{
	   int len1=abs(x[1]-x[0]);
	   int len2=abs(y[1]-y[0]);
	   
	   if(len1==len2)
	   {
	   	if(len1==1)
	   	return 111;//士特別識別符號 
	   	else if(len1==2)
	   	return 222;//象特別識別符號
	   }
	   else if(len1+len2==3)//馬特別識別符號
	   return 333;
	   else return 0;
	}
	return len; 
}
int chuhan(int x,char c1)//楚河漢界
{
  switch(c1)
  {
  	case 'x': //象過河 
  	case 'b':{//卒過河 
  		if(x<5)
  		return 1;
	  }
	case 'X'://相過河
  	case 'B':{//兵過河
  		if(x<6)
  		return 1;
	  }
  }
  return 0;
}
int jiugong(int x[2], int y[2],char c1)//九宮 
{
  switch(c1)
  {
  	case 's':{//將出界 
  		if((y[1]>=4&&y[1]<=6)&&(x[1]>=1&&x[1]<=3))
  		return 1;
  		break; 
	  }
  	case 'S':{//將出界 
  		if((y[1]>=4&&y[1]<=6)&&(x[1]>=8&&x[1]<=10))
  		return 1;
  		break;
	  }
	case 'i':{//士出界 
  		if((y[1]>=4&&y[1]<=6)&&(x[1]>=1&&x[1]<=3))
  		return 1;
  		break; 
	  }
    case 'I':{//士出界 
  		if((y[1]>=4&&y[1]<=6)&&(x[1]>=8&&x[1]<=10))
  		return 1;
  		break;
      }
   }
  return 0;
}






轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/351133.html

標籤:其他

上一篇:C語言小游戲之掃雷完整版

下一篇:【計算機視覺-從入門到精通系列】 第二章 立體匹配(Stereo Matching)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more