#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语言代码如下:
#include <stdioh>
#include <biosh>
#include <ctypeh>
#include <conioh>
#include <dosh>
#define CROSSRU 0xbf /右上角点/
#define CROSSLU 0xda /左上角点/
#define CROSSLD 0xc0 /左下角点/
#define CROSSRD 0xd9 /右下角点/
#define CROSSL 0xc3 /左边/
#define CROSSR 0xb4 /右边/
#define CROSSU 0xc2 /上边/
#define CROSSD 0xc1 /下边/
#define CROSS 0xc5 /十字交叉点/
/定义棋盘左上角点在屏幕上的位置/
#define MAPXOFT 5
#define MAPYOFT 2
/定义1号玩家的 *** 作键键码/
#define PLAY1UP 0x1157/上移--'W'/
#define PLAY1DOWN 0x1f53/下移--'S'/
#define PLAY1LEFT 0x1e41/左移--'A'/
#define PLAY1RIGHT 0x2044/右移--'D'/
#define PLAY1DO 0x3920/落子--空格键/
/定义2号玩家的 *** 作键键码/
#define PLAY2UP 0x4800/上移--方向键up/
#define PLAY2DOWN 0x5000/下移--方向键down/
#define PLAY2LEFT 0x4b00/左移--方向键left/
#define PLAY2RIGHT 0x4d00/右移--方向键right/
#define PLAY2DO 0x1c0d/落子--回车键Enter/
/若想在游戏中途退出, 可按 Esc 键/
#define ESCAPE 0x011b
/定义棋盘上交叉点的状态, 即该点有无棋子 /
/若有棋子, 还应能指出是哪个玩家的棋子 /
#define CHESSNULL 0 /没有棋子/
#define CHESS1 'O'/一号玩家的棋子/
#define CHESS2 'X'/二号玩家的棋子/
/定义按键类别/
#define KEYEX99v 0/退出键/
#define KEYFALLCHESS 1/落子键/
#define KEYMOVECURSOR 2/光标移动键/
#define KEYINVALID 3/无效键/
/定义符号常量: 真, 假 --- 真为1, 假为0 /
#define TRUE 1
#define FALSE 0
//
/ 定义数据结构 /
/棋盘交叉点坐标的数据结构/
struct point
{
int x,y;
};
或者下面这个:
#include <graphicsh>
#include <stdlibh>
#include <stdioh>
#include <conioh>
#define N 15
#define B 7
#define STOP -10000
#define OK 1
#define NO 0
#define UP 328
#define DOWN 336
#define LEFT 331
#define RIGHT 333
int a[N+1][N+1];
int zx,zy;
int write=1,biaoji=0;
struct zn{
long sum;
int y;
int x;
}w[N+1][N+1],max,max1;
void cbar(int i,int x,int y,int r);
void map(int a[][]);
int getkey();
int key();
void zuobiao(int x,int y,int i);
int tu(int a[][],int write);
int wtu(int a[][],int write);
int zhineng(int a[][]);
int zh5(int y,int x,int a[][]);
long zzh5(int b[][],int i);
main()
{
int i,j;
int gdriver=DETECT;
int gmode;
initgraph(&gdriver,&gmode,"");
zx=(N+1)/2;
zy=(N+1)/2;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
a[i][j]=0;
map(a);
i=1;
while(i)
{
int k,n;
k=wtu(a,write);
if(k==STOP) goto end;
map(a);
n=zhineng(a);
if(n==STOP) goto end;
map(a);
}
end:
;
}
int zhineng(int a[N+1][N+1])
{
int i,j;
int k;
maxsum=-1;
for(i=0;i<=N;i++)
for(j=0;j<+N;j++)
{
w[i][j]sum=0;
w[i][j]x=i;
w[i][j]y=j;
}
for(i=1;i<=N-4;i++)
for(j=1;j<=N-4;j++)
{
k=zh5(i,j,a);
if(k==STOP) return (STOP);
}
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
{
if(maxsum<w[i][j]sum)
{
maxsum=w[i][j]sum;
maxy=i;
maxx=j;
}
else if(maxsum==w[i][j]sum)
{
if(((maxy-zy)(maxy-zy)+(maxx-zx)(maxx-zx))>((i-zy)(i-zy)+(j-zx)(j-zx)))
maxsum=w[i][j]sum;
maxy=i;
maxx=j;
}
}
if(a[maxy][maxx]==0)
{
a[maxy][maxx]=-1;
zy=maxy;
zx=maxx;
}
}
int zh5(int y,int x,int a[N+1][N+1])
{
int i,j;
int b[6][6];
long c[13];
long d[6][6];
long temp;
for(i=y;i<=y+4;i++)
for(j=x;j<=x+4;j++)
b[i+1-y][j+1-x]=a[i][j];
c[1]=b[1][1]+b[1][2]+b[1][3]+b[1][4]+b[1][5];
c[2]=b[2][1]+b[2][2]+b[2][3]+b[2][4]+b[2][5];
c[3]=b[3][1]+b[3][2]+b[3][3]+b[3][4]+b[3][5];
c[4]=b[4][1]+b[4][2]+b[4][3]+b[4][4]+b[4][5];
c[5]=b[5][1]+b[5][2]+b[5][3]+b[5][4]+b[5][5];
c[6]=b[1][1]+b[2][1]+b[3][1]+b[4][1]+b[5][1];
c[7]=b[1][2]+b[2][2]+b[3][2]+b[4][2]+b[5][2];
c[8]=b[1][3]+b[2][3]+b[3][3]+b[4][3]+b[5][3];
c[9]=b[1][4]+b[2][4]+b[3][4]+b[4][4]+b[5][4];
c[10]=b[1][5]+b[2][5]+b[3][5]+b[4][5]+b[5][5];
c[11]=b[1][1]+b[2][2]+b[3][3]+b[4][4]+b[5][5];
c[12]=b[1][5]+b[2][4]+b[3][3]+b[4][2]+b[5][1];
for(i=1;i<=12;i++)
{
switch(c[i])
{
case 5:biaoji=1;return(STOP);
case -5:biaoji=-1;return(STOP);
case -4:c[i]=100000;break;
case 4:c[i]=100000;break;
case -3:c[i]=150;break;
case 3:c[i]=150;break;
case -2:c[i]=120;break;
case 2:c[i]=100;break;
case -1:c[i]=1;break;
case 1:c[i]=1;break;
default: c[i]=0;
}
}
for(i=1;i<=12;i++)
{
if(c[i]==150)
c[i]+=zzh5(b,i);
}
for(i=1;i<=5;i++)
for(j=1;j<=5;j++)
d[i][j]=0;
for(i=1;i<=5;i++)
for(j=1;j<=5;j++)
{
if(i==j) d[i][j]+=c[11];
if((i+j)==6) d[i][j]+=c[12];
d[i][j]+=c[i]+c[j+5];
}
for(i=1;i<=5;i++)
for(j=1;j<=5;j++)
{
if(b[i][j]!=0)
d[i][j]=-2;
}
max1sum=-1;
max1y=0;
max1x=0;
for(i=1;i<=5;i++)
for(j=1;j<=5;j++)
{
if(max1sum<d[i][j])
{
max1sum=d[i][j];
max1y=i;
max1x=j;
w[i+y-1][j+x-1]sum+=max1sum;
}
else if(max1sum==d[i][j])
{
if(((i+y-1-zy)(i+y-1-zy)+(j+x-1-zx)(j+x-1-zx))>((max1y+y-1-zy)(max1y+y-1-zy)+(max1x+x-1-zx)(max1x+x-1-zx)))
{
max1sum=d[i][j];
max1y=i;
max1x=j;
}
}
}
}
long zzh5(int b[6][6],int n)
{
int i,j,k,l,m;
switch(n)
{
case 1:i=b[1][1];j=b[1][2];k=b[1][3];l=b[1][4];m=b[1][5];break;
case 2:i=b[2][1];j=b[2][2];k=b[2][3];l=b[2][4];m=b[2][5];break;
case 3:i=b[3][1];j=b[3][2];k=b[3][3];l=b[3][4];m=b[3][5];break;
case 4:i=b[4][1];j=b[4][2];k=b[4][3];l=b[4][4];m=b[4][5];break;
case 5:i=b[5][1];j=b[5][2];k=b[5][3];l=b[5][4];m=b[5][5];break;
case 6:i=b[1][1];j=b[2][1];k=b[3][1];l=b[4][1];m=b[5][1];break;
case 7:i=b[1][2];j=b[2][2];k=b[3][2];l=b[4][2];m=b[5][2];break;
case 8:i=b[1][3];j=b[2][3];k=b[3][3];l=b[4][3];m=b[5][3];break;
case 9:i=b[1][4];j=b[2][4];k=b[3][4];l=b[4][4];m=b[5][4];break;
case 10:i=b[1][5];j=b[2][5];k=b[3][5];l=b[4][5];m=b[5][5];break;
case 11:i=b[1][1];j=b[2][2];k=b[3][3];l=b[4][4];m=b[5][5];break;
case 12:i=b[1][5];j=b[2][4];k=b[3][3];l=b[4][2];m=b[5][1];break;
}
if((i==0&&j==1&&k==1&&l==1&&m==0))
return (900);
if((i==0&&j==-1&&k==-1&&l==-1&&m==0))
return(1000);
if((i==0&&j==0&&k==1&&l==1&&m==1)||(i==1&&j==1&&k==1&&l==0&&m==0))
return(20);
if((i==0&&j==0&&k==-1&&l==-1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==0&&m==0))
return(20);
if((i==-1&&j==1&&k==1&&l==1&&m==1)||(i==1&&j==-1&&k==1&&l==1&&m==1)||(i==1&&j==1&&k==-1&&l==1&&m==1)||(i==1&&j==1&&k==1&&l==-1&&m==1)||(i==1&&j==1&&k==1&&l==1&&m==-1))
return(-60);
if((i==1&&j==-1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==-1&&m==1))
return(-60);
}
int wtu(int a[N+1][N+1],int write)
{
int i=1;
map(a);
zuobiao(zx,zy,1);
while(i)
{
int k;
k=tu(a,write);
if(k==OK) i=0;
if(k==STOP) return (STOP);
}
}
int getkey()
{
int key,lo,hi;
key=bioskey(0);
lo=key&0x00ff;
hi=(key&0xff00)>>8;
return((lo==0) hi+256:lo);
}
int key()
{
int k;
k=getkey();
switch(k)
{
case 27: return (STOP);
case 13:
case ' ': return (OK);
case 328: return (UP);
case 336: return (DOWN);
case 331: return (LEFT);
case 333: return (RIGHT);
default: return (NO);
}
}
void zuobiao(int x,int y,int i)
{
int r;
if(i!=0)
{
setcolor(GREEN);
for(r=1;r<=5;r++)
circle(75+25x,25+25y,r);
}
else
{
if(a[zy][zx]==1)
{
setcolor(8);
for(r=1;r<=5;r++)
circle(75+25x,25+25y,r);
}
else if(a[zy][zx]==-1)
{
setcolor(WHITE);
for(r=1;r<=5;r++)
circle(75+25x,25+25y,r);
}
else
{
setcolor(B);
for(r=1;r<=5;r++)
circle(75+25x,25+25y,r);
setcolor(RED); line(75+25zx-5,25+25zy,75+25x+5,25+25zy);
line(75+25zx,25+25zy-5,75+25zx,25+25zy+5);
}
}
}
int tu(int a[N+1][N+1],int write)
{
int k;
re:
k=key();
if(k==OK)
{
if(a[zy][zx]==0)
{
a[zy][zx]=write;
}
else
goto re;
}
if(k==STOP) return(STOP);
if(k==NO) goto re;
if(k==UP)
{
int i,j;
if(zy==1) j=zy;
else j=zy-1;
zuobiao(zx,zy,0);
zuobiao(zx,j,1);
zy=j;
goto re;
}
if(k==DOWN)
{
int i,j;
if(zy==N) j=zy;
else j=zy+1;
zuobiao(zx,zy,0);
zuobiao(zx,j,1);
zy=j;
goto re;
}
if(k==LEFT)
{
int i,j;
if(zx==1) i=zx;
else i=zx-1;
zuobiao(zx,zy,0);
zuobiao(i,zy,1);
zx=i;
goto re;
}
if(k==RIGHT)
{
int i,j;
if(zx==N) i=zx;
else i=zx+1;
zuobiao(zx,zy,0);
zuobiao(i,zy,1);
zx=i;
goto re;
}
}
void cbar(int i,int x,int y,int r)
{
if(i!=0)
{
if(i==1)
setcolor(8);
else if(i==-1)
setcolor(WHITE);
for(i=1;i<=r;i++)
{
circle(x,y,i);
}
}
}
void map(int a[N+1][N+1])
{
int i,j;
cleardevice();
setbkcolor(B);
setcolor(RED);
for(i=0;i<N;i++)
{
line(100,50+25i,75+N25,50+25i);
line(100+25i,50,100+25i,25+N25);
}
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
cbar(a[i][j],75+25j,25+25i,10);
}
#include<iostream>
#include<cstdlib>
using namespace std;
class CHESS
{
public:
CHESS();
void setStep(bool& ipjudge);//双人对战轮流走棋函数
void setStepC(bool& ipjudge);//人机对战走棋函数
void coutChess();//输出棋盘
void coutPW();//输出权值表
bool getTurn(){flag=!flag;return flag;}//轮流走棋控制函数
void flushChess();//刷新棋盘信息函数
void judgeWin();//判断是否赢棋函数
void winer();//赢家输出函数
int getAns(){return result;}//返回结果(赢家判断)
static int count;//走棋步数变量
private:
bool flag;//轮流走棋判断变量
int PW[16][16],tPW[4];//权值变量,最高权值变量
int result,num[2];//结果(赢家判断),玩家输入棋子坐标判断
char inPut[2],temp[2];//玩家输入数据,转换暂存数据
char CBoard[16][16];//棋盘数据
int judgeAWin(int a,int b);//判断是否A为赢家函数
int judgeBWin(int a,int b);//判断是否B为赢家函数
void cSetStep();//电脑走棋函数
void setPower();//初始化权值函数
int adddepth(int depth);//填充权值函数
void judgePw(int x,int y,int direction,int depth,char test);//棋子判断[x坐标,y坐标,方向(顺时针0-无,1-左,2-左上,3-上,4-右上),深度(depth),标识符(A/B)]
void getFinalPw();
//权值判断函数
};
int CHESS::count=0;
void VsComputer(); //人机对战
void VsPlayer(); //双人对战
int main()
{
int choose;
CHESS newP;
do
{
choose=0;
system("cls");
cout<<" 欢乐五子棋"<<endl<<endl;
cout<<"请选择:"<<endl<<endl;
cout<<"1:人机对战模式"<<endl<<endl;
cout<<"2:双人对战模式"<<endl<<endl;
cout<<"3:退出游戏"<<endl<<endl<<endl;
cout<<""<<endl;
cout<<""<<endl<<endl<<endl<<endl;
cout<<"请输入你的选择:";
cin>>choose;
if(choose==2)
VsPlayer();
else if(choose==1)
VsComputer();
else if(choose==3)
exit(0);
else
{
cout<<"输入错误,请重新输入!"<<endl;
system("pause");
}
}while(choose!=3);
return 0;
}
void VsComputer()
{
bool ipjudge;
CHESS newP;
do
{
newPcoutChess();
newPsetStepC(ipjudge);//人机对战函数
if(!ipjudge)
continue;
if(!newPgetTurn())
newPflushChess();
newPcoutChess();
newPjudgeWin();
CHESS::count++;
}while(newPgetAns()==0&&CHESS::count<256);
newPwiner();
}
void CHESS::setStepC(bool& ipjudge)
{
int i;
if(flag)
{
cout<<"棋手走棋:";
cin>>inPut;
for(i=0;i<=1;i++)
if(inPut[i]<'0'||(inPut[i]>'9'&&inPut[i]<'O')||(inPut[i]>'F'&&inPut[i]<'O')||inPut[i]>'f')
{
ipjudge=false;
cout<<"输入越界,请重新输入!";
system("pause");
break;
}
}
else
cSetStep();//轮到电脑走棋
}
void CHESS::cSetStep()
{
int i,j,depth=0;
setPower();
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
if(CBoard[i][j]=='+')//优化:排除周围全是+的情况
{
if(CBoard[i-1][j]=='O'||CBoard[i-1][j-1]=='O'||CBoard[i][j-1]=='O'||CBoard[i+1][j-1]=='O'||CBoard[i+1][j]=='O'||CBoard[i+1][j+1]=='O'||CBoard[i][j+1]=='O'||CBoard[i-1][j+1]=='O')
{
judgePw(i,j,0,depth,'O');
judgePw(i,j,0,depth,'X');
}
else if(CBoard[i-1][j]=='X'||CBoard[i-1][j-1]=='X'||CBoard[i][j-1]=='X'||CBoard[i+1][j-1]=='X'||CBoard[i+1][j]=='X'||CBoard[i+1][j+1]=='X'||CBoard[i][j+1]=='X'||CBoard[i-1][j+1]=='X')
{
judgePw(i,j,0,depth,'O');
judgePw(i,j,0,depth,'X');
}
}
}
}
getFinalPw();
//coutPW();
//system("pause");
if(tPW[0]>0)
CBoard[tPW[1]][tPW[2]]='X';
/else if(tPW[0]>0&&tPW[3]>1)
{
for(i=0;i<16;i++)
{
for(j=0;j<16;j++)
{
if(tPW[0]==PW[i][j])
if()
}
}
}/
else
{
cout<<"权值函数错误!";
system("pause");
exit(1);
}
}
void CHESS::judgePw(int x,int y,int direction,int depth,char test)
{
if(depth>=0&&depth<4)
{
if(direction==1)//左方
{
if(CBoard[x-depth-1][y]==test)
judgePw(x,y,1,depth+1,test);
else
PW[x][y]+=adddepth(depth);
}
else if(direction==2)//左上方
{
if(CBoard[x-depth-1][y-depth-1]==test)
judgePw(x,y,2,depth+1,test);
else
PW[x][y]+=adddepth(depth);
}
else if(direction==3)//正上方
{
if(CBoard[x][y-depth-1]==test)
judgePw(x,y,3,depth+1,test);
else
PW[x][y]+=adddepth(depth);
}
else if(direction==4)//右上方
{
if(CBoard[x+depth+1][y-depth-1]==test)
judgePw(x,y,4,depth+1,test);
else
PW[x][y]+=adddepth(depth);
}
else if(direction==5)//右方
{
if(CBoard[x+depth+1][y]==test)
judgePw(x,y,5,depth+1,test);
else
PW[x][y]+=adddepth(depth);
}
else if(direction==6)//右下方
{
if(CBoard[x+depth+1][y+depth+1]==test)
judgePw(x,y,6,depth+1,test);
else
PW[x][y]+=adddepth(depth);
}
else if(direction==7)//正下方
{
if(CBoard[x][y+depth+1]==test)
judgePw(x,y,7,depth+1,test);
else
PW[x][y]+=adddepth(depth);
}
else if(direction==8)//左下方
{
if(CBoard[x-depth-1][y+depth+1]==test)
judgePw(x,y,6,depth+1,test);
else
PW[x][y]+=adddepth(depth);
}
else if(direction==0)
{
if(CBoard[x-depth-1][y]==test)//左方
judgePw(x,y,1,depth+1,test);
if(CBoard[x-depth-1][y-depth-1]==test)//左上方
judgePw(x,y,2,depth+1,test);
if(CBoard[x][y-depth-1]==test)//正上方
judgePw(x,y,3,depth+1,test);
if(CBoard[x+depth+1][y-depth-1]==test)//右上方
judgePw(x,y,4,depth+1,test);
if(CBoard[x+depth+1][y]==test)//右方
judgePw(x,y,5,depth+1,test);
if(CBoard[x+depth+1][y+depth+1]==test)//右下方
judgePw(x,y,6,depth+1,test);
if(CBoard[x][y+depth+1]==test)//正下方
judgePw(x,y,7,depth+1,test);
if(CBoard[x-depth-1][y+depth+1]==test)//左下方
judgePw(x,y,6,depth+1,test);
}
}
else if(depth==4)
PW[x][y]+=adddepth(depth);
else
{
cout<<"深度函数出错!";
system("pause");
exit(1);
}
}
int CHESS::adddepth(int depth)
{
switch(depth)
{
case 0:return 0;break;
case 1:return 1;break;
case 2:return 2;break;
case 3:return 4;break;
case 4:return 6;break;
default:
{
cout<<"深度函数错误!";
system("pause");
exit(1);
}
}
}
void CHESS::getFinalPw()
{
int i,j;
for(i=0;i<=15;i++)
for(j=0;j<=15;j++)
{
if(PW[i][j]>tPW[0])
{
tPW[0]=PW[i][j];
tPW[1]=i;
tPW[2]=j;
tPW[3]=1;
}
else if(PW[i][j]==tPW[0]&&PW[i][j]!=0)
tPW[3]+=1;
}
}
////////////////////////////////////////////////////////////////////////
//双人对战
////////////////////////////////////////////////////////////////////////
void VsPlayer()
{
bool ipjudge;
CHESS newP;
do
{
newPcoutChess();
newPsetStep(ipjudge);
if(!ipjudge)
continue;
newPgetTurn();
newPflushChess();
newPcoutChess();
newPjudgeWin();
CHESS::count++;
}while(newPgetAns()==0&&CHESS::count<256);
newPwiner();
}
void CHESS::winer()
{
if(CHESS::count==256)
{
cout<<"|||||||||平局!本局结束!"<<endl;
system("pause");
exit(1);
}
if(result==1)
cout<<"|||||||||恭喜!棋手A赢得本局胜利!"<<endl<<endl;
else if(result==2)
cout<<"|||||||||恭喜!棋手B赢得本局胜利!"<<endl<<endl;
system("pause");
}
//默认构造函数
CHESS::CHESS()
{
int i,j;
count=0;
result=0;
flag=true;
for(i=0;i<=15;i++)
{
if(i<10)
CBoard[i][0]=i+48;
else
CBoard[i][0]=i+55;
}
for(i=0;i<=15;i++)
for(j=0;j<=15;j++)
CBoard[i][j]='+';
}
//填充权值函数
void CHESS::setPower()
{
int i,j;
for(i=0;i<=15;i++)
for(j=0;j<=15;j++)
PW[i][j]=0;
tPW[0]=0;
tPW[1]=0;
tPW[2]=0;
tPW[3]=0;
}
//输出棋盘函数
void CHESS::coutChess()
{
int i,j;
system("cls");
cout<<" 欢乐五子棋"<<endl<<endl;
cout<<" 0 1 2 3 4 5 6 7 8 9 A B C D E F"<<endl;
for(i=0;i<=15;i++)
{
if(i>=0&&i<10)
cout<<i<<' ';
else if(i>=10)
cout<<static_cast<char>(i+55)<<' ';
else
cout<<"棋盘列序号输出错误!";
for(j=0;j<=15;j++)
cout<<CBoard[i][j]<<' ';
cout<<endl;
}
cout<<endl<<endl;
}
//双人对战,棋手轮流走棋函数
void CHESS::setStep(bool& ipjudge)
{
if(flag)
cout<<"棋手A走棋:";
else
cout<<"棋手B走棋:";
cin>>inPut;
for(int i=0;i<=1;i++)
{
if(inPut[i]<'0'||(inPut[i]>'9'&&inPut[i]<'O')||(inPut[i]>'F'&&inPut[i]<'O')||inPut[i]>'f')
{
ipjudge=false;
cout<<"输入越界,请重新输入!";
system("pause");
break;
}
}
}
//刷新棋盘
void CHESS::flushChess()
{
int i;
temp[0]=inPut[0];
temp[1]=inPut[1];
for(i=0;i<=1;i++)
{
if(temp[i]>='0'&&temp[i]<='9')
num[i]=static_cast<int>(temp[i]-48);
else if(temp[i]>='O'&&temp[i]<='F')
num[i]=static_cast<int>(temp[i]-55);
else if(temp[i]>='O'&&temp[i]<='f')
num[i]=static_cast<int>(temp[i]-87);
else
{
cout<<"用户输入未知错误1,请重新输入!";
system("pause");
exit(1);
}
}
if(CBoard[num[0]][num[1]]=='+'&&!flag)
CBoard[num[0]][num[1]]='O';
else if(CBoard[num[0]][num[1]]=='+'&&flag)
CBoard[num[0]][num[1]]='X';
else
{
flag=!flag;
cout<<"用户输入错误,请重新输入!";
system("pause");
}
}
//判断胜出新算法
void CHESS::judgeWin()
{
int i=0,j;
do
{
j=0;
do
{
if(CBoard[i][j]=='O')
result=judgeAWin(i,j);
else if(CBoard[i][j]=='X')
result=judgeBWin(i,j);
else if(CBoard[i][j]=='+');
else
{
cout<<"棋盘["<<i<<"]["<<j<<"]位置信息错误!"<<endl;
system("pause");
exit(1);
}
if(result==1||result==2)
break;
j++;
}while(j<=15);
if(result==1||result==2)
break;
i++;
}while(i<=15);
}
//对棋手A的棋子检测
int CHESS::judgeAWin(int a,int b)
{
if(CBoard[a][b-1]=='O'&&CBoard[a][b-2]=='O'&&CBoard[a][b+1]=='O'&&CBoard[a][b+2]=='O') //横向五子
return 1;
else if(CBoard[a+1][b]=='O'&&CBoard[a+2][b]=='O'&&CBoard[a-1][b]=='O'&&CBoard[a-2][b]=='O') //纵向五子
return 1;
else if(CBoard[a+1][b+1]=='O'&&CBoard[a+2][b+2]=='O'&&CBoard[a-1][b-1]=='O'&&CBoard[a-2][b-2]=='O') //左上右下五子
{
return 1;
}
else if(CBoard[a+1][b-1]=='O'&&CBoard[a+2][b-2]=='O'&&CBoard[a-1][b+1]=='O'&&CBoard[a-2][b+2]=='O') //左下右上五子
return 1;
else
return 0;
}
//对棋手B的棋子检测
int CHESS::judgeBWin(int a,int b)
{
if(CBoard[a][b-1]=='X'&&CBoard[a][b-2]=='X'&&CBoard[a][b+1]=='X'&&CBoard[a][b+2]=='X') //横向五子
return 2;
else if(CBoard[a+1][b]=='X'&&CBoard[a+2][b]=='X'&&CBoard[a-1][b]=='X'&&CBoard[a-2][b]=='X') //纵向五子
return 2;
else if(CBoard[a+1][b+1]=='X'&&CBoard[a+2][b+2]=='X'&&CBoard[a-1][b-1]=='X'&&CBoard[a-2][b-2]=='X') //左上右下五子
return 2;
else if(CBoard[a+1][b-1]=='X'&&CBoard[a+2][b-2]=='X'&&CBoard[a-1][b+1]=='X'&&CBoard[a-2][b+2]=='X') //左下右上五子
return 2;
else
return 0;
}
//输出权值表
void CHESS::coutPW()
{
int i,j;
system("cls");
cout<<" 欢乐五子棋(权值表)"<<endl<<endl;
cout<<" 0 1 2 3 4 5 6 7 8 9 A B C D E F"<<endl;
for(i=0;i<=15;i++)
{
if(i>=0&&i<10)
cout<<i<<' ';
else if(i>=10)
cout<<static_cast<char>(i+55)<<' ';
else
cout<<"棋盘列序号输出错误!";
for(j=0;j<=15;j++)
cout<<PW[i][j]<<' ';
cout<<endl;
}
cout<<endl<<endl;
}
#include <iostream>
using namespace std;
class 五子棋
{
public:
五子棋(int 行 = 8, int 列 = 8)
{
row = 行;
col = 列;
步数 = 0;
current = true;
棋盘 = new int [行];
for (int i = 0; i < 行; i++)
{
棋盘[i] = new int[列];
memset(棋盘[i], 0, sizeof(int) 列);
}
}
~五子棋()
{
for (int i = 0; i < row; i++)
delete[] 棋盘[i];
delete 棋盘;
}
void 开始游戏()
{
while (true)
{
system("cls");
显示棋盘();
if (current)
cout << "黑方(输入:行 列):";
else
cout << "白方(输入:行 列):";
int x, y;
cin >> x >> y;
if (落子(x, y) == false)
{
cout << "坐标有误请重新输入,";
system("pause");
continue;
}
if (++步数 > row col)
{
cout << "平局!!!!" << endl;
system("pause");
break;
}
if (胜利检查(x, y) == true)
{
system("cls");
显示棋盘();
cout << (current "黑" : "白") << "方胜利!!!!" << endl;
system("pause");
break;
}
current = !current;
}
}
private:
int 棋盘;
int row, col;
bool current;
int 步数;
void 初始化棋盘()
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
棋盘[i][j] = 0;
}
}
}
void 显示棋盘()
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
//cout << 棋盘[i][j] << ' ';
if (棋盘[i][j] == 0)
cout << 棋盘[i][j] << '\t';
else
{
cout << (棋盘[i][j] == 1 "黑" : "白") << '\t';
}
}
cout << i + 1 << endl;
}
for (int i = 0; i < col; i++)
cout << i + 1 << '\t';
cout << endl;
}
bool 落子(int x, int y)
{
x--;
y--;
if (合法性检查(x, y) == false)
return false;
if (current)
棋盘[x][y] = 1;
else
棋盘[x][y] = 2;
return true;
}
bool 合法性检查(int x, int y, int value = 0)
{
if (x > 8 || x < 0)
return false;
if (y > 8 || y < 0)
return false;
if (棋盘[x][y] != value)
return false;
return true;
}
bool 胜利检查(int x, int y)
{
x--; y--;
return 横向检查(x, y) || 纵向检查(x, y);
}
bool 横向检查(int x, int y)
{
int 连通数 = 1;
int value = (current 1 : 2);
//往左检查
int 列坐标 = y;
while (合法性检查(x, --列坐标, value))
{
连通数++;
if (连通数 >= 5)
return true;
}
//往右检查
列坐标 = y;
while (合法性检查(x, ++列坐标, value))
{
连通数++;
if (连通数 >= 5)
return true;
}
return false;
}
bool 纵向检查(int x, int y)
{
int 连通数 = 1;
int value = (current 1 : 2);
//往上检查
int 行坐标 = x;
while (合法性检查(--行坐标, y, value))
{
连通数++;
if (连通数 >= 5)
return true;
}
//往下检查
行坐标 = x;
while (合法性检查(++行坐标, y, value))
{
连通数++;
if (连通数 >= 5)
return true;
}
return false;
}
};
int main()
{
五子棋 game;
game开始游戏();
}
十种简易棋类游戏如下:
1、围棋
围棋已经远远超出了它的娱乐功能,它是一种理念,一种生活的态度,一种生命的哲学。当人们为计算机程序“深蓝”战胜世界国际象棋冠军卡斯帕罗夫而惊叹的同时,更加意识到棋是智慧的延伸而不仅仅是智力的角逐。
2、中国象棋
中国象棋具有悠久的历史。经过近百年的实践,象棋于北宋末定型成近代模式:32 枚棋子, 有河界的棋盘,将在九宫之中等等。南宋时期,象棋 “家喻户晓”,成为流行极为广泛的棋艺活动。中国象棋根植民间,应该是中国最普及的棋类运动。
3、国际象棋
国际象棋无疑是全世界最普及的棋类,但是现制国际象棋在我国开展的时间不算长,从 1956 年开始,国际象棋才和我国传统的中国象棋与围棋一起列入国家开展的体育项目。
4、五子棋
起源于中国古代的传统黑白棋种之一。现代五子棋发展于日本,日文称之为“连珠”,英译为“Renju”,“Gobang”或“FIR”(Five in a Row的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。
有两种规则 无禁手采用最简单古老的规则。黑白双方依次落子,任一方先在棋盘上形成横向、竖向、斜向的连续的相同颜色的五个(含五个以上)棋子的一方为胜。
5、军棋
军棋又被称为盲象棋(BLIND CHESS) 是由南非(South-Africa)的一位叫Henry Michael Temple人于1899年发明的。他本人是一名国际象棋爱好者,因为自己的伙伴希望能玩一种反映战争的游戏,于是他借鉴国际象棋的棋子,发明了这种战争游戏。
它使旁观者和下棋人共享其中的欢乐。军棋是一种成功的变形象棋。它和象棋最大的区别就是不允许看对方的棋子,更具有挑战性。
6、暗棋(中国象棋暗棋)
是以中国象棋棋盘和棋子进行的一项棋类游戏,游戏时,棋子放在普通象棋棋盘的上半部分,棋盘的下半部分用于摆放双方被吃掉的棋子。
暗棋一开始必须靠双方不断地把只显示背面的棋子翻过来,但只能移动自己颜色的棋子,棋子的大小顺序是将、士、象、车、马、炮、兵,大子吃相同的子和小子,但小兵吃将,炮不能吃马。
7、跳棋
游戏规则很简单,棋子的移动可以一步步在有直线连接的相邻六个方向进行,如果相邻位置上有任何方的一个棋子,该位置直线方向下一个位置是空的,则可以直接 “跳” 到该空位上,“跳”的过程中,只要相同条件满足就可以连续进行。
谁最先把正对面的阵地全部占领,谁就取得胜利。
8、黑白棋
又叫反棋 (Reversi) 、奥赛罗棋 (Othello) ,苹果棋,翻转棋。黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负。
9、六子棋
台湾交通大学资讯工程系副教授吴毅成发明六子棋新游戏,据称弥补了五子棋“先下者有利”的公平性困境。
10、西洋双陆棋(Backgammon)
国际象棋打败人类10多年前就已经由深蓝完成了,近年仅是个人电脑的国际象棋软件的等级分就已经大幅度超过人类,已经没有人类的世界冠军笨到跟计算机挑战自取其辱了。原先还经常的举办国际象棋人机对抗赛,但是几年前开始,为了使人机对抗赛更为有悬念,比赛规则已经改变成计算机让F线以外的一兵了——如果对国际象棋有较为深入一点的研究,就知道一个兵是多么大的价值。国际象棋软件的结构分为:
1,人机界面:让人类能直接以国际象棋语言和计算机对话;
2,引擎:计算局面得分权重,以一定的算法得出分值,正数则白棋优势,负数则黑棋优势,分数越大(越小)则白棋(黑棋)越优。世界电脑国际象棋锦标赛(WCCC)每年都举办,引擎的计算能力是以摩尔定律的年为尺度的,而人类大脑的计算能力是以进化的百万年为尺度的,差距只会越拉越大,何况之中还有程序员的努力将算法优化的因素在内;
3,开局库:集合数以百万计的人类国际象棋比赛的开局,使得在有开局库的前提下,计算机可以不必计算直接走出人类认为的开局谱招。国际象棋大师们都会记住相当多的开局,但是计算机会记住几百万盘棋局;
4,残局库:由超级电脑计算好剩余棋子的所有局面,并存储以备调用。当局面剩余残局库中所存储的局面时,不必计算,计算机直接可以知道结果。6子以内残局库已经算完,7子残局库也已经算出大半。
以上就是关于急需用c语言写中国象棋的代码,只要红色方布局和走棋全部的内容,包括:急需用c语言写中国象棋的代码,只要红色方布局和走棋、五子棋C语言代码、用C写一个五子棋程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)