中国象棋c语言
㈠ c语言实现中国象棋马的走法
首先要定义一个ChessBoard[10][9];
其次计算出马所在的轮斗旦当销蠢前位置chessboard[x][y];
然后计算出四个马腊扰腿的位置,分别是chessboard[x-1][y],[x+1][y],[x][y-1],[x][y+1]
最后判断八个位置是否可行。
㈡ 博雅象棋只能说给的语言是什么
中国象棋作为中华文化的瑰宝,所承载的益智文化源远流长。棋盘上十横九竖,九十个交叉点,旗子纵横驰骋,延续着古人作战时“擒贼先擒王”的战略布局,可谓是猛源古代文化益智益心的智力传承。而有别于朝鲜象棋、国际象棋,中国象棋属于“象棋C语言”(象棋China),是中国古代智慧的结晶。
而作为现代计算机程序编辑语言的代表—— “C语言”,它承载着是现代科技探索的广阔可能性。博雅互动作为一家棋牌科技型公司,秉持着做中国百年棋牌文化的传播者,也投入了大量的科技人才,用来构建链接科技与文化的桥梁。
博雅中国象棋于2012年就在手机端上线,真正做到了代表科技的“C语言”来承载 “中国象棋C语言”。
在“博雅杯”象棋公益赛的决赛现场,也看到了这种新科技与老文化传承的交替。决赛环节大家还是运用“老文化”中的实体棋在棋盘猛消上厮杀。每个人都凝神静气枝知知,表情严肃。
㈢ c语言 象棋 走法 表示
语言象棋走法分三种:进、退、平。
象棋棋盘的九条竖线从左到右排列为:
红方:一、二、三、四、五、六、七、八、九
黑方:1、2、3、4、5、6、7、8、9
进:如马二进三,就是马从第二条竖线向前方(对方的方向)走到第三条竖线上。
退:如车一退一,就是把车向后(自己的方向)走一个格子;车一平二,就是向后走两个格子。   ——(兵、卒不可退)
平:如炮二平五,就是第二条线的炮走到第五条线上。 ——(马不可平)
如果两只马在同一条线上,那么可以说成前马进一、后马退三......
红棋与黑棋不同:如果红棋走炮二平五,黑棋也想走同样的棋路,就要写成炮2平5.
㈣ 求用C语言做的中国象棋程序,人人对战的,不必人机对战,能在TC下运行的,谢谢了
#include <graphics.h>
#include<conio.h>
#include<string.h>
#include<bios.h>
void qizi(int,int,char *);
void qipan();
void jiemian();
main()
{
  int gdriver,gmode,i=0,c=0;
  gdriver=DETECT;
  gmode=0;
  printf("%d,%d",gdriver,gmode);
  registerbgidriver(EGAVGA_driver);
  initgraph(&gdriver,&gmode,"c:\\tc");
while(c!=27)
  {
    c=getch();
    clrscr();
    jiemian(i);
	if(c==80)
	{
	 i++;
	 if(i==4)
	 {
		i=0;
	 }
	}
	if(i==1)
	{
	if(c==13)
	{
	clrscr();
	qipan();
	break;
	}
	}
     }
  getch();
  closegraph();
  restorecrtmode();
  return 0;
  }
void qipan()
{
int i,j;
char *a1="A",*a2="B",*a3="C",*a4="D",*a5="E",*a6="F",*a7="G",*a8="H",*a9="I",
	*a10="J",*a11="K",*a12="L",*a13="M",*a14="N";
setbkcolor(GREEN);
setlinestyle(0,0,3);
setcolor(1);
rectangle(20,20,360,400);
rectangle(30,30,350,390);
for(i=1;i<8;i++)
{
  setlinestyle(0,0,3);
  line(i*40+30,30,i*40+30,190);
  line(i*40+30,230,i*40+30,390);
 }
for(j=1;j<9;j++)
{
  setlinestyle(0,0,3);
  line(30,j*40+30,350,j*40+30);
}
  setlinestyle(3,0,3);
  line(150,30,230,110);
  line(230,30,150,110);
  line(150,310,230,390);
  line(230,310,150,390);
  setusercharsize(4,1,2,1);
  settextstyle(1,0,4);
  outtextxy(70,195,"chinese   chess");
  qizi(190,30,a1);
  qizi(150,30,a2);
  qizi(230,30,a2);
  qizi(110,30,a3);
  qizi(270,30,a3);
  qizi(70,30,a4);
  qizi(310,30,a4);
  qizi(30,30,a5);
  qizi(350,30,a5);
  qizi(70,110,a6);
  qizi(310,110,a6);
  qizi(30,150,a7);
  qizi(110,150,a7);
  qizi(190,150,a7);
  qizi(270,150,a7);
  qizi(350,150,a7);
  qizi(190,390,a8);
  qizi(150,390,a9);
  qizi(230,390,a9);
  qizi(110,390,a10);
  qizi(270,390,a10);
  qizi(70,390,a11);
  qizi(310,390,a11);
  qizi(30,390,a12);
  qizi(350,390,a12);
  qizi(70,310,a13);
  qizi(310,310,a13);
  qizi(30,270,a14);
  qizi(110,270,a14);
  qizi(190,270,a14);
  qizi(270,270,a14);
  qizi(350,270,a14);
  setcolor(BLUE);
  rectangle(30,410,610,460);
  setcolor(4);
  outtextxy(40,420,"A->shuai B->shi C->xiang D->ma E->che F->pao G->bing");
  setcolor(8);
  outtextxy(40,440,"H->jiang I->shi J->xiang K->ma L->che M->pao N->zu");
  return;
}
void qizi(int x,int y,char *q)
{
  int *p="G";
  if(strcmp(q,p)<1)
  {
  setlinestyle(0,0,3);
  setcolor(RED);
  circle(x,y,15);
  setfillstyle(0,3);
  floodfill(x,y,RED);
  }
  else
  {
  setlinestyle(0,0,3);
  setcolor(DARKGRAY);
  circle(x,y,15);
  setfillstyle(0,3);
  floodfill(x,y,DARKGRAY);
   }
  settextstyle(0,0,2);
  outtextxy(x-7,y-7,q);
  return;
 }
void jiemian(int i)
{
  setbkcolor(GREEN);
  settextstyle(1,0,8);
  setcolor(BLUE);
  outtextxy(50,70,"chinese chess");
   settextstyle(0,0,3);
  setcolor(RED);
  outtextxy(260,215,"start");
  outtextxy(260,255,"again");
  outtextxy(260,295,"undo");
  outtextxy(260,335,"exit");
  rectangle(250,210+i*40,390,240+i*40);
  }
㈤ 急需用c语言写中国象棋的代码,只要红色方布局和走棋
接上面中国象棋代码:
if( check_turn == 12) //相的走法规范
{ if((x == check_x && y == check_y))
{temp = turn; temp1 = turn1; turn = 'O'; turn1 = 'N'; num--;
printf("三思而后行 "); printf("还是你的回合"); Sleep(500);
}
else if( x >= 15 &&(abs(y - check_y) == 8 && abs(x - check_x) == 4))
{if((x == 22 && (y == 11 || y == 27))||(x == 18 &&
( y == 3 || y == 19 || y == 35)) ||(x == 14 && (y == 11|| y ==27)))
{ if( map[(x+check_x)/2][(y+check_y)/2] == '+') check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else {printf("棋子卡住,不可执行"); Sleep(500); } }
else {printf("不合法的下法 ");Sleep(500); }
}
else {printf("不合法的下法 "); Sleep(500); }
}
if( check_turn == 13) //士的走法规范
{ if((x == check_x && y == check_y))
{temp = turn; temp1 = turn1; turn = 'O'; turn1 = 'N'; num--;
printf("三思而后行 "); printf("还是你的回合"); Sleep(500); }
else if( abs(x - check_x)== 2 && abs( y - check_y) == 4 &&((x==22 &&(y == 15
|| y == 23)) || ( x == 20 && y == 19) || ( x == 18 && ( y == 15 || y == 23)))) {check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map); }
else { printf("不合法的下法 "); Sleep(500); } }
if( check_turn == 14) //将的走法规范
{ if((x == check_x && y == check_y))
{ temp = turn; temp1 = turn1; turn = 'O'; turn1 = 'N'; num--;
printf("三思而后行 "); printf("还是你的回合"); Sleep(500); }
else if( ((abs(x - check_x)== 2 && abs( y - check_y) == 0 )|| (abs(x - check_x)== 0
&&abs( y - check_y) == 4)) && x >= 18 && x <= 22 && y >= 15 && y <= 23 )
{ check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map); }
else { printf("不合法的下法 "); Sleep(500); } }
if( check_turn == 15) //炮的走法规范
{ if((x == check_x && y == check_y))
{ temp = turn; temp1 = turn1; turn = 'O'; turn1 = 'N'; num--;
printf("三思而后行 "); printf("还是你的回合"); Sleep(500); }
else if( y == check_y )
{ int check_pao = 0;
if( x > check_x)
{ for(j = check_x + 2; j<= x ;j = j+ 2)
{ if(map[j][y] == '+' ); else check_pao++;}
if(check_pao == 1&& temp == '+') // 直线行走但不可吃棋子 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else if( check_pao == 2 && temp != '+') //跳跃吃棋 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else { printf("不合法的下法 "); Sleep(500); } }
else { for(j = check_x - 2; j>= x;j = j - 2)
{ if(map[j][y] == '+' ); else { check_pao++;} }
if(check_pao == 1&& temp == '+') //直线行走但不可吃棋子 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else if( check_pao == 2 && temp != '+') //跳跃吃棋 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else { printf("不合法的下法 "); Sleep(500); } }
}
else if( x == check_x )
{ int check_pao = 0;
if( y > check_y)
{ for(j = check_y + 4; j<= y ;j = j+4)
{ if(map[x][j] == '+' ); else check_pao++;}
if(check_pao == 1&& temp == '+') //直线行走但不可吃棋子 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else if( check_pao == 2 && temp != '+') //跳跃吃棋 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else { printf("不合法的下法 "); Sleep(500); } }
else {for(j = check_y - 4; j>= y;j = j - 4)
{if(map[x][j] == '+' ); else check_pao++;}
if(check_pao == 1&& temp == '+') //直线行走但不可吃棋子 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else if( check_pao == 2 && temp != '+') //跳跃吃棋 check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else { printf("不合法的下法 "); Sleep(500); } }
}
else { printf("不合法的下法 ");Sleep(500); }
}
if( check_turn == 16) //卒的走法规范
{ if ( x >= 14)
{ if((x == check_x && y == check_y))
{ temp = turn; temp1 = turn1; turn = 'O'; turn1 = 'N'; num--;
printf("三思而后行 "); printf("还是你的回合"); Sleep(500); }
else if( x == check_x - 2 && y == check_y) check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else { printf("不合法的下法 "); Sleep(500); }
}
else{ if((x == check_x && y == check_y))
{ temp = turn; temp1 = turn1; turn = 'O'; turn1 = 'N'; num--;
printf("三思而后行 "); printf("还是你的回合"); Sleep(500); }
else if((x - check_x == 0 && abs(y-check_y) ==4) ||( x - check_x == -2
&& abs(y-check_y) == 0)) check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else { printf("不合法的下法 "); Sleep(500); } }
}
}
else { if( check_turn == 20) //车的走法规范 (帅方)
{ if((x == check_x && y == check_y))
{ temp = turn; temp1 = turn1; turn = 'O'; turn1 = 'N'; num--;
printf("三思而后行 "); printf("还是你的回合"); Sleep(500); }
else if( y == check_y )
{ if( x > check_x)
{ for(j = check_x + 2; j < x;j = j + 2)
{ if(map[j][y] == '+'); else {printf("不合法的下法 "); Sleep(500); break; } }
if( j >= x) check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
}
if( x < check_x)
{ for(j = check_x - 2; j > x;j = j - 2)
{ if(map[j][y] == '+'); else { printf("不合法的下法 "); Sleep(500); break; } }
if( j <= x) check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
}
}
else if( x == check_x )
{ if( y > check_y)
{ for(j = check_y + 4; j < y;j = j + 4)
{ if(map[x][j] == '+'); else { printf("不合法的下法 "); Sleep(500); break; } }
if( j >= y) check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
}
if( y < check_y)
{ for(j = check_y - 4; j > y;j = j - 4)
{ if(map[x][j] == '+'); else { printf("不合法的下法 ");Sleep(500); break; } }
if( j <= y) check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
}
}
else { printf("不合法的下法 "); Sleep(500); }
}
if( check_turn == 21) //马的走法规范
{ if((x == check_x && y == check_y))
{ temp = turn; temp1 = turn1; turn = 'O'; turn1 = 'N'; num--;
printf("三思而后行 ");printf("还是你的回合"); Sleep(500); }
else if( (abs( x - check_x) == 2&& abs( y - check_y) == 8)&&
map[check_x][(y+check_y)/2] =='+')
{ check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map); }
else if( (abs( x - check_x) == 4&& abs( y - check_y) == 4)&&
map[(x + check_x)/2][check_y] == '+' )
{ check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map); }
else { printf("不合法的下法 ");Sleep(500); } }
if( check_turn == 22) //相的走法规范
{ if((x == check_x && y == check_y))
{ temp = turn; temp1 = turn1; turn = 'O'; turn1 = 'N'; num--;
printf("三思而后行 ");printf("还是你的回合"); Sleep(500); }
else if( x <= 12 && (abs(y - check_y) == 8 && abs(x - check_x) == 4))
{ if((x == 4 && (y == 11 || y == 27))||(x == 8 && ( y == 3 || y == 19 || y == 35))
||(x == 12 && (y == 11|| y ==27)))
{ if( map[(x+check_x)/2][(y+check_y)/2] == '+') check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else { printf("棋子卡住,不可执行");Sleep(500); } }
else {printf("不合法的下法 ");Sleep(500); }
}
else { printf("不合法的下法 ");Sleep(500); } }
if( check_turn == 23) //士的走法规范
{ if((x == check_x && y == check_y))
{ temp = turn; temp1 = turn1; turn = 'O'; turn1 = 'N'; num--;
printf("三思而后行 ");printf("还是你的回合"); Sleep(500); }
else if( abs(x - check_x)== 2 && abs( y - check_y) == 4 &&((x==4 &&
(y == 15 || y == 23)) || ( x == 6 && y == 19) || ( x == 8 && ( y == 15 || y == 23))))
{ check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map); }
else { printf("不合法的下法 ");Sleep(500); } }
if( check_turn == 24) //将的走法规范
{ if((x == check_x && y == check_y))
{ temp = turn; temp1 = turn1; turn = 'O'; turn1 = 'N'; num--;
printf("三思而后行 ");printf("还是你的回合"); Sleep(500); }
else if( ((abs(x - check_x)== 2 && abs( y - check_y) == 0 )|| (abs(x - check_x)== 0 &&abs( y - check_y) == 4)) && x >= 4 && x <= 8 && y >= 15 && y <= 23 )
{ check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map); }
else {printf("不合法的下法 ");Sleep(500); } }
if( check_turn == 25) //炮的走法规范
{ if((x == check_x && y == check_y))
{ temp = turn; temp1 = turn1; turn = 'O'; turn1 = 'N'; num--;
printf("三思而后行 ");printf("还是你的回合"); Sleep(500); }
else if( y == check_y )
{ int check_pao = 0;
if( x > check_x)
{ for(j = check_x + 2; j<= x ;j = j+ 2)
{ if(map[j][y] == '+' ); else check_pao++;}
if(check_pao == 1&& temp == '+') //直线行走但不可吃棋子 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else if( check_pao == 2 && temp != '+') //跳跃吃棋 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else { printf("不合法的下法 ");Sleep(500); } }
else { for(j = check_x - 2; j>= x;j = j - 2)
{ if(map[j][y] == '+' ); else { check_pao++;} }
if(check_pao == 1&& temp== '+') //直线行走但不可吃棋子 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else if( check_pao == 2 && temp != '+') //跳跃吃棋 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else { printf("不合法的下法 ");Sleep(500); } }
}
else if( x == check_x )
{ int check_pao = 0;
if( y > check_y)
{ for(j = check_y + 4; j<= y ;j = j+4)
{ if(map[x][j] == '+' ); else check_pao++;}
if(check_pao == 1&& temp == '+') //直线行走但不可吃棋 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else if( check_pao == 2 && temp != '+') //跳跃吃棋 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else { printf("不合法的下法 ");Sleep(500); } }
else { for(j = check_y - 4 ; j>= y;j = j - 4)
{ if(map[x][j] == '+' ); else check_pao++;}
if(check_pao ==1&& temp == '+') //直线行走但不可吃棋子 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else if( check_pao == 2&& temp != '+') //跳跃吃棋 check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else { printf("不合法的下法 ");Sleep(500); } }
}
else { printf("不合法的下法 ");Sleep(500); }
}
if( check_turn == 26) //卒的走法规范
{ if( x <= 12)
{ if((x == check_x && y == check_y))
{ temp = turn; temp1 = turn1; turn = 'O'; turn1 = 'N'; num--;
printf("三思而后行 "); printf("还是你的回合"); Sleep(500); }
else if( x == check_x + 2 && y == check_y) check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else { printf("不合法的下法 ");Sleep(500); } }
else{ if((x == check_x && y == check_y))
{ temp = turn; temp1 = turn1; turn = 'O'; turn1 = 'N'; num--;
printf("三思而后行 ");printf("还是你的回合"); Sleep(500); }
else if((x - check_x == 0 && abs(y-check_y) ==4) ||( x - check_x == 2
&& abs(y-check_y) == 0)) check_main2(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
else { printf("不合法的下法 ");Sleep(500); } }
}
}
}
}
system("cls");
if( if_return) return;
for(i = 0; i < 27; i++)puts(map[i]);
}
Sleep(5000);
}
int main( )
{ while(1)
{ xiangqi( );
printf(" 重来,请按键. ");
getch( );
}
return 0;
}
㈥ 求C语言程序,在中国象棋棋盘上,放置一个马,能够不重复走过棋盘的每一个位置,输出九十个坐标
#include<stdio.h>  
/* 
问题描述:在n*m的棋盘上,马只能走日字。马从(x,y)出发,把棋盘的每一个点都走一遍,且只走一次, 
 
找出所有路径。 
*/  
void find(int x,int y,int dep);  
int check(int x,int y);  
void output();  
  
int n=5,m=4;  
int fx[8]={1,2,2,1,-1,-2,-2,-1};  
int fy[8]={2,1,-1,-2,-2,-1,1,2};  
int a[5][4];  
int dep,x,y,count;  
int main()  
{  
    int i,j;  
    dep=1;////记录递归深度,即走过的点的个数,当dep=n*m,找到一组解  
    count=0;  
  
    printf("Please input the original point:\n");  
    scanf("%d%d",&x,&y);  
  
    if(x<0 || x>4 || y<0 || y>3)  
    {  
        printf("wrong data!\n");  
        return 1;  
    }  
  
    for(i=0;i<n;i++)  
    {  
        for(j=0;j<m;j++)  
        {  
            a[i][j]=0;  
        }  
    }  
  
    a[x][y]=1;  
  
    find(x,y,2);  
    if(count==0)  
    {  
        printf("NO solution!\n");  
    }  
    else  
    {  
        printf("Total count=%d\n",count);  
    }  
    return 0;  
}  
  
void find(int x,int y,int dep)  
{  
    int i;  
    int xx,yy;  
    for(i=0;i<8;i++)//加上方向增量,形成新的坐标  
    {  
        xx=x+fx[i];  
        yy=y+fy[i];  
  
        if(check(xx,yy)==1)//判断坐标是否出界,或者已经走过  
        {  
            a[xx][yy]=dep;//走向新的坐标  
            if(dep==n*m)  
            {  
                output();  
            }  
            else  
            {  
                find(xx,yy,dep+1);//从新的坐标出发,递归下一层  
            }  
            a[xx][yy]=0;//回溯,恢复未走标志  
        }  
    }  
}  
  
int check(int x,int y)  
{  
    int flag = 1;  
    if(x<0 || x>4 || y<0 || y>3)  
    {  
        flag = 0;  
    }  
    if(a[x][y]!=0)  
    {  
        flag=0;  
    }  
    return flag;  
}  
  
void output()  
{  
    count++;  
    printf("\ncount=%d\n",count);  
  
    int i,j;  
    for(i=0;i<n;i++)  
    {  
        for(j=0;j<m;j++)  
        {  
            printf("%4d",a[i][j]);  
        }  
        printf("\n");  
    }  
}  
//原始文件请参考:CSDN马的遍历问题
㈦ 急需用c语言写中国象棋的代码,只要红色方布局和走棋
#include #include #include #include #include
int x,y,i,j,k,p,q, num = 1, round;  //象棋游戏的全局变量
int place_x1 = 0,place_y1 = 0,place_x2 = 0,place_y2 = 0;
int check_x,check_y,check_turn;  //基本参数
char ch, turn = 'O',turn1 = 'N',temp,temp1;
char check_1[9][3] ={"车","马","象","士","将","炮","兵","+-"};  //取棋子时只判断前8合法
char check_2[9][3] ={"车","马","相","仕","帅","炮","卒","+-"};      //下棋时多一空位合法
char check[3];
void check_main1(char* temp,char* temp1,char* turn,char* turn1,int *num,int *if_return,char map[100][100])
{  //(象棋函数 判断 将方 下棋是否合法
check[0] = *temp;  check[1] = *temp1;  check[2] = '\0';  char a,b;
for ( i = 0; i < 8; i++)
    { if ( strcmp(check_2[i],check) == 0)
         {  *temp = *turn;  *temp1 = *turn1;  *turn = 'O';  *turn1 = 'N';
           if( i < 7){ printf(" 帅方的%s被吃\n",check_2[i]);  Sleep(500); } *num = *num + 1;
               for( k = 4; k <= 8; k = k + 2)   //判断 帅 是否死亡
                { for(j = 15; j <= 23; j= j+ 4)
                      { if (map[k][j] == check_2[4][0] && map[k][j+1] == check_2[4][1])
                         { place_x2 = k;  place_y2 = j;  break; }  }
                   if( j <= 23) break;
                }
               if( k == 10)
                     {printf(" 帅 被将死 将方获得胜利\n"); printf("按任意键返回菜单");
                      getch( );  *if_return = 1; return;
                     }
               for( k = 18; k <= 22; k = k + 2)   //判断 将 是否死亡
                     {for(j = 15; j <= 23; j= j+ 4)
                       {if(map[k][j] == check_1[4][0] && map[k][j+1] == check_1[4][1])
                           {place_x1 = k;  place_y1 = j;  break; }  }
                      if( j <= 23) break;
                     }
               if ( k == 24)
                     {printf(" 将 被将死 帅方获得胜利\n"); printf("按任意键返回菜单");
                      getch( );  *if_return = 1;  return;
                     }
               if ( place_y1 == place_y2)
{for( k = place_x2 + 2; k <= place_x1 - 2; k = k +2) {if(map[k][place_y1] != '+') break;}
                      if( k == place_x1)
                            {if(round == 1) printf(" 将方对将 帅方胜利");
                             else if( round == 2) printf(" 帅方对将 将方胜利");
                             printf("按任意键返回菜单");  getch( );  *if_return = 1;  return;
                            }         
                      }
                 break;
               }   
     }  // for ( i = 0; i < 8; i++)循环结束
       if( i == 8) {printf("不合法的走法\n"); Sleep(500); }
}
void check_main2(char* temp,char* temp1,char* turn,char* turn1,int *num,int *if_return,char map[100][100])
{   //象棋函数 判断 帅方 下棋是否合法
check[0] = *temp;  check[1] = *temp1;  check[2] = '\0';  char a,b;
for ( i = 0; i < 8; i++)       
       {if ( strcmp(check_1[i],check) == 0)
         { *temp = *turn;  *temp1 = *turn1;  *turn = 'O';  *turn1 = 'N';
            if( i < 7) {printf(" 将方的%s被吃",check_1[i]);  Sleep(500); }    *num = *num + 1;
              for( k = 4; k <= 8; k = k + 2)   //判断 帅 是否死亡
                {for(j = 15; j <= 23; j= j+ 4)
                     {if(map[k][j] == check_2[4][0]  && map[k][j+1] == check_2[4][1])
                         {place_x2 = k;  place_y2 = j;  break; }  }
                 if( j <= 23) break;
                }
              if( k == 10)
                {printf(" 帅 被将死 将方获得胜利\n");printf("按任意键返回菜单");  getch( );
                 *if_return = 1;  return;
                }
              for( k = 18; k <= 22; k = k + 2)   //判断 将 是否死亡
                {for(j = 15; j <= 23; j= j+ 4)
                      {if(map[k][j] == check_1[4][0] && map[k][j+1] == check_1[4][1])
                            {place_x1 = k;  place_y1 = j;  break; }   }
                  if( j <= 23) break;
                }
              if( k == 24)
                  {printf(" 将 被将死 帅方获得胜利\n");printf("按任意键返回菜单");  getch( );
                    *if_return = 1;  return; }
              if( place_y1 == place_y2)
 {for( k=place_x2 + 2; k <= place_x1 - 2; k=k +2) {if(map[k][place_y1] != '+') break; }
              if( k == place_x1)
{if(round==1)printf(" 将方对将 帅方胜利");else if(round==2)printf(" 帅方对将 将方胜利");
                  printf("按任意键返回菜单");  getch( );  *if_return = 1;  return;  }
                }
               break;
           }    
        } // for ( i = 0; i < 8; i++)循环结束
if( i == 8) {printf("不合法的走法\n"); Sleep(500); }     
}
void xiangqi( )   //象棋主程序
{ char map[100][100]= { "[[===================================]]",
                      "[| ①将         【象棋】        ②帅 |]",
                      "[[===================================]]",
                      "[[-----------------------------------]]",
                      "[[ 车—-马—-相—-仕—-帅—-仕—-相—-马—-车]]",
                      "[[ |   |   |   | \\ | / |   |   |   | ]]",
                      "[[ +-—-+-—-+-—-+-—-+-—-+-—-+-—-+-—-+-]]",
                      "[[ |   |   |   | / | \\ |   |   |   | ]]", 
                      "[[ +-—-炮—-+-—-+-—-+-—-+-—-+-—-炮—-+-]]",
                      "[[ |   |   |   |   |   |   |   |   | ]]",
                      "[[ 卒—-+-—-卒—-+-—-卒—-+-—-卒—-+-—-卒]]",
                      "[[ |   |   |   |   |   |   |   |   | ]]",
                      "[[ +-—-+-—-+-—-+-—-+-—-+-—-+-—-+-—-+-]]",
                      "[[===================================]]",
                      "[[ +-—-+-—-+-—-+-—-+-—-+-—-+-—-+-—-+-]]",
                      "[[ |   |   |   |   |   |   |   |   | ]]",
                      "[[ 兵—-+-—-兵—-+-—-兵—-+-—-兵—-+-—-兵]]",
                      "[[ |   |   |   |   |   |   |   |   | ]]",
                      "[[ +-—-炮—-+-—-+-—-+-—-+-—-+-—-炮—-+-]]",
                      "[[ |   |   |   | \\ | / |   |   |   | ]]",
                      "[[ +-—-+-—-+-—-+-—-+-—-+-—-+-—-+-—-+-]]",
                      "[[ |   |   |   | / | \\ |   |   |   | ]]",
                      "[[ 车—-马—-象—-士—-将—-士—-象—-马—-车]]",
                      "[[-----------------------------------]]",
                      "[[===================================]]"};
       int if_return = 0;
       system("mode con cols=45 lines=32");   //迷你界面
    system("color 70");
    printf("[[==================================]]\n");
    printf("[[ -------------------------------- ]]\n");
    printf("[[ |                              | ]]\n");
    printf("[[ |       【<>】       | ]]\n");
    printf("[[ |                              | ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |  控制wasd双方轮流控制指针下棋| ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |  键盘输入大小写 ' M '        | ]]\n");
    printf("[[ |  都视为确认下棋              | ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |  为了方便区分棋子             | ]]\n");
    printf("[[ |  后手方全设为繁体复杂字体    | ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |------------------------------| ]]\n");
    printf("[[ |  我已阅读规则,按任意键继续  | ]]\n");
    printf("[[ |------------------------------| ]]\n");
       printf("[[==================================]]\n");
       getch( );  system("mode con cols=45 lines=32");   //迷你界面
    system("color 70");
       for ( i = 0; i < 27; i++){ puts(map[i]);  Sleep(100); }
   x = 6, y = 19;  temp = map[x][y];  temp1 = map[x][y+1]; 
    while(num)
    { if (num % 2 == 1 &&num / 2 % 2 == 0){ printf("  现在是'将'的回合\n");round = 1; }
        else if( num %2 == 1){ printf("  现在轮到'帅'的回合了\n");round = 2; }
     ch = getch( );
     if ( ch == 's')   //下移
     { if ( map[x+1][y]!= '-')
        {map[x][y] =temp;  map[x][y+1] = temp1;  x = x + 2;  
temp = map[x][y];  temp1 = map[x][y+1];  map[x][y] = turn;  map[x][y+1] = turn1; }
      }
    else if ( ch == 'a')   //左移
     { if (map[x][y-1]!=' ')
        {map[x][y] =temp;  map[x][y+1] = temp1; y = y - 4;  
  temp = map[x][y];  temp1 = map[x][y+1];  map[x][y] = turn;  map[x][y+1] = turn1; }
     }
    else if ( ch == 'w')   //上移
     { if ( map[x-1][y]!= '-')
        {map[x][y] =temp;  map[x][y+1] = temp1; x = x - 2;  temp = map[x][y];  
       temp1 = map[x][y+1]; map[x][y] = turn;  map[x][y+1] = turn1;  }
      }
    else if ( ch == 'd')   //右移
     { if (map[x][y+2]!=']')
        {map[x][y] =temp;  map[x][y+1] = temp1; y = y + 4;  temp = map[x][y];
        temp1 = map[x][y+1]; map[x][y] = turn;  map[x][y+1] = turn1;  }
     }
    else if( ch == 'm' || ch =='M')  //M确认要移动的棋子,或确认要移到的目的地
     { if (num % 2 == 1 && temp != '+' && temp1 != '-')   //取棋
        {check[0] = temp;  check[1] = temp1;  check[2] = '\0';
               if ( round == 1)
                { for (  i = 0; i < 7; i++)    //将方
                      { if ( strcmp(check_1[i],check) == 0)
                          {turn = temp;  turn1 = temp1;  temp = '+';  temp1 = '-';
                           check_x = x;  check_y = y;  check_turn = 10 + i;  num++;   break; }    
                       }
                     if( i == 7){ printf("这不是你的棋子\n"); Sleep(500); }
                }
               else if( round == 2)
                {for ( i = 0; i < 7; i++)   //帅方
                    { if( strcmp(check_2[i],check) == 0)
                        {turn = temp;  turn1 = temp1;  temp = '+';  temp1 = '-';
                         check_x = x;  check_y = y;  check_turn = 20 + i;   num++;   break;  }    
                    }
                 if( i == 7){ printf("这不是你的棋子\n"); Sleep(500); }
                }
              }
              else if( num % 2 == 0)  //放棋
               { char check_1[8][3] ={"车","马","象","士","将","炮","卒","+-"};
                 char check_2[8][3] ={"俥","马","相","仕","帅","軳","兵","+-"};
                    //中界 楚河上下坐标 12  15 往下2  往右4
                if( check_turn < 20)  //将方
                   {if( check_turn == 10)  //车的走法规范
                      { if((x == check_x && y == check_y))
                           {temp = turn;  temp1 = turn1;  turn = 'O';  turn1 = 'N';  num--;
                            printf("三思而后行\n"); printf("还是你的回合"); Sleep(500);  }
                        else if( y == check_y )
                             { if( x > check_x)
                                { for(j = check_x + 2; j < x;j = j + 2)
                     { if(map[j][y] == '+'); else{printf("不合法的下法\n"); Sleep(500); break; } }
                              if( j >= x) check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
                               }
                      if( x  check_x){ for(j = check_x - 2; j > x;j = j - 2)
                       { if(map[j][y] == '+'); else{printf("不合法的下法\n"); Sleep(500); break; }
                     }
           if( j <= x)check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
                                    }  
                               }
                             else if( x == check_x )
                                   {if( y > check_y)
                                     {for(j = check_y + 4; j < y;j = j + 4)
                                           {if(map[x][j] == '+'); else {printf("不合法的下法\n"); Sleep(500);  break; }
                                           }
                                          if( j >= y) check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
                                      }
                                     if( y < check_y)
                                          {for(j = check_y - 4; j > y;j = j - 4)
                                            { if(map[x][j] == '+'); else { printf("不合法的下法\n"); Sleep(500);  break; }
                                            }
                                           if( j <= y) check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map);
                                          }    
                                    }   
                                   else { printf("不合法的下法\n"); Sleep(500); }
                                   }
                      if( check_turn == 11)  //马的走法规范
                          {if((x == check_x && y == check_y))
                              {  temp = turn;  temp1 = turn1;  turn = 'O';  turn1 = 'N';  num--;
                                 printf("三思而后行\n"); printf("还是你的回合"); Sleep(500);  }
                     else if( (abs( x - check_x) == 2&& abs( y - check_y) == 8)&& map[check_x][(y+check_y)/2] =='+')
                {check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map); }
                     else if( (abs( x - check_x) == 4&& abs( y - check_y) == 4)&& map[(x + check_x)/2][check_y] == '+' )
                {check_main1(&temp,&temp1,&turn,&turn1,&num,&if_return,map); }
                     else { printf("不合法的下法\n");Sleep(500); }
                     }  //其余代码在后续
㈧ C语言做的中国象棋,分享,问怎么在WIN7下运行
#include <stdio.h>
#include <memory.h>
typedef struct
{
int x, y;
}item;
item move[4] = {{-2,1}, {-1,2}, {1,2}, {2,1}};
int map[5][9], sx, sy;
//判断是否在地图中,防止越孝姿界
int checkIn(int x, int y)
{
if(x >= 0 && x <= 4 && y >= 0 && y <= 8)
return 1;
return 0;
}
//输出最终结果
void output()
{
int i, j;
for(i = 0; i <= 4; i++)
{
for(j = 0; j <= 8; j++)
printf("%d ",map[i][j]);
putchar('\n');
}
printf("共计%d步。", map[0][8]);
}
//从x y开始寻兆锋找能否到达终点,能返回1,不能返回0,step表示当前的步数。
int findPath(int x, int y, int step)
{
int i;
map[x][y] = step;
//终点
if(x == 0 && y == 8)
{
output();
return 1;
}
//向右边4个方向前进
for(i = 0; i < 4; i++)
if(checkIn(x+move[i].x, y+move[i].y))
if(findPath(x+move[i].x, y+move[i].y, step+1) == 1)
return 1;
//四个方向均无法到达终点,回溯并返回0
map[x][y] = 0;
return 0;
}
int main(int argc, char ** argv)
{
memset(map, 0, sizeof(map));
printf("请输入起点<x,y>\n"族慎晌);
scanf("%d,%d", &sx, &sy);
findPath(sx, sy, 1);
return 0;
}
㈨ 用C语言输出中国象棋棋盘的源代码!!急!急!急!
密码:yq12
㈩ 急求:C语言编写的中国象棋游戏一个
先弄明白数据的结构:
MantisChessDef.h里的东西一定要先看一下, 否则会摸不到头脑的。
还有棋盘坐标: 
象棋棋盘大小9x10,为了便于编程,规定棋盘每条边留有一个元素的边界。
这样局衡棋盘大小(包括边界)变成11x12。棋盘x坐标轴向右,y轴向下。
黑棋永远在上方,在标准开局时左上角的黑车坐标是(1,1)。 
局面用这三个变量表示:
static  POINT g_pointChessman[32]; //棋子坐标
static  int g_iChessmanMap[11][12]; //棋位状态
static  int g_iSide;    //轮到哪方走
智能部分有几个函数的前三个参数就是这个东西, 应该不难理解吧?
---------------------------------------------------------------------------------------
search函数:
先说明一下, 经常有朋友问我要原理, 但我公开源代码是给大家一个参考, 而不是什么教程,所以我不想说那些理论的东西。
基本原理是春腊磨α-β搜索, 很多人工智能的教科书上都有讲到, 没看过的的赶快去找一本来啃一啃; 
虽然这些书上的文字大多晦涩难懂,但毕竟讲得明明白白。 
没有书的朋友请发挥一下主观能动性, 去找一找,不要来问我要, 因为我也没有。 
我在这里只分析一下search函数:
弄懂α-β搜索后来看看这个博弈树, 看怎么编程实现它。
先规定一下, 我们用一个整数表示局面的好坏.
这个数越大说明局面对 "走棋方" 越有利,0表示双方实力相等。
1a( 1) ┬ 2a(-1) ┬ 3a(-1)
    │     └ 3b( 1)
    └ 2b(-5) ┬ 3c( 2)
         ├ 3d(-4)
         └ 3e( 5)
分析一下这棵树,有这么个特点: 父结点的值 = -MAX(子结点的值)
我们还知道1、每个结点对应一个局面。2、底层的结点的值是"估"出来的。
于是我们可以写出伪代码了:
伪代码: 搜索一个结点下的分支, 得到这个结点的值。
参数: 局面,搜索深度
返回值:结点的值
int search(局面,int depth)
{
 if(depth!=0)//不是底层结点
 {
  枚举出所有子结点(列出所有走法);
  int count=子结点数;
  int maxvalue= -∞;
  for(int i=0;i<count;i++)//遍历所有结点
  {
   算出子结点局面;
   maxvalue=max(maxvalue,search(子结点局面,depth-1));
  }
  return -maxvalue;
 }
 else //是底层结点
 {
  return 估计值;
 }
}
这就是搜索算法的框架, 用到了递归。
MantisChess的智能部分函数都在MantisChessThink.cpp里, 其中search是搜索扒斗, 跟上面的这个search差不多,我把它出来注释一下:
int Search(int tmap[11][12],POINT tmanposition[32],int &tside,int man, POINT point,int upmax,int depth)
{
 //前面的三个参数就是局面。
 //man 和point 是走法,用来计算本结点的局面。 这里是把计算局面放在函数的开头,跟上面的伪代码不太一样。 
 //upmax: up - 上一层, max - 最大值, 这是α-β的剪枝用到的东西, 后面再讲。
 //depth: 搜索深度
 int ate,cur,maxvalue,curvalue,xs,ys;
 int count;
 //#####################这一段是计算本结点的局面#########################################
 ate=32;
 //移动棋子:
 xs=tmanposition[man].x;ys=tmanposition[man].y;    //原坐标
 if (SideOfMan[tmap[point.x][point.y]]==!tside) //目标点有对方的棋子
 {
  ate=tmap[point.x][point.y];     //记录下被吃掉的棋子
  if(ate==0 || ate==16)
  {
   return 9999;
  }
  tmanposition[ate].x=0;      //目标点的棋子被吃掉
 }
 tmap[point.x][point.y]=man;      //这两行是:
 tmap[xs][ys]=32;       //在map上的移动
 tmanposition[man]=point;       
 tside=!tside;
 //####################################################################################
 depth--;  
  
 if(depth>0) //不是底层结点
 {
  int chessman[125];
  POINT targetpoint[125];
  if(EnumList(tmap,tmanposition,tside,chessman,targetpoint,count)) //枚举出所有子结点(列出所有走法)
  {
   //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   //这里是剪枝(不是α-β剪枝), 原理是在正式搜索之前先用较浅的搜索来得到误差较大的值
   //然后根据这些值来对子结点排序, 只保留最好的S_WIDTH个结点进行正式搜索。
   //显然,这个剪枝有一定的风险
   if(depth>=2 && count>S_WIDTH+2)
   {
    int value[125];
    cur=0;
    maxvalue=-10000;
    while(cur< count)
    {
     curvalue=Search(tmap,tmanposition,tside,chessman[cur],targetpoint[cur],-10000,depth-2);
     value[cur]=curvalue;
     if(curvalue>maxvalue)maxvalue=curvalue;
     cur ++;
    }
    ::Mantis_QuickSort(value,chessman,targetpoint,0,count-1); //排序
    count=S_WIDTH;//剪枝
   }
   //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
   maxvalue=-10000;
   cur=0;
   while(cur< count)
   {
    curvalue=Search(tmap,tmanposition,tside,chessman[cur],targetpoint[cur],maxvalue,depth);
    if(curvalue>maxvalue)maxvalue=curvalue;
    if(curvalue>=-upmax)goto _ENDSUB; //α-β剪枝, 符合剪枝条件的就Cut掉。 这里用了goto语句了, 千万别学我。
    cur ++;
   }
  }
  else maxvalue=9800;
 }
 else //是底层结点
 {
  maxvalue=Value(tmap,tmanposition,tside); //估值
 }
_ENDSUB:
 //返回之前要恢复父结点的局面
 //####################################################################################
 tmanposition[man].x=xs;       //这两行是:
 tmanposition[man].y=ys;       //在face上的恢复
 tmap[xs][ys]=man;         //在map上的恢复
 if(ate!=32)
 {
  tmanposition[ate]=point;
  tmap[point.x][point.y]=ate;
 }
 else tmap[point.x][point.y]=32;
 tside=!tside;
 //####################################################################################
 return -maxvalue;
}
上面的代码用到了α-β剪枝, 举个例子就明白了:
还是这个博弈树,从上往下遍历。
1a( 1) ┳ 2a(-1) ┳ 3a(-1)
    ┃     ┗ 3b( 1)
    ┗ 2b(-5) ┯ 3c( 2)
         ├ 3d(-4)
         └ 3e( 5)
2a遍历完后 upmax=-1, 继续遍历完3c后返回2b, 发现3c=2>-upmax,  这时就不用管3d和3e了, 因为无论他们的值是多少 2b=-max(3c,3d,3e)<2a 一定成立,
也就是说2b可以安全地剪掉。这就是α-β剪枝。
从上面的代码来看我的MantisChess算法与标准的α-β剪枝搜索并没有什么不同, 只不过加了排序和剪枝而已。
