c语言实现的国际象棋,先放源码,有空再更
所有图形资源均来源于网络,侵删
#include <graphics.h>
#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>
#include <time.h>
#define HEIGHT 800
#define WIDTH 1100
#define SIZE 100
#define true 1
#define false 0
int count=0,lx1=0,ly1=0,lx2=0,ly2=0,ending=0,game=0,seA=0,seB=0,second,passpawnA[8][1024],passpawnB[8][1024],passAg[8][1024],passBg[8][1024],record[8][8][1024],
KA[1024],KB[1024],RAL[1024],RAR[1024],RBL[1024],RBR[1024];
int hour=0,min=0,sec=0;
time_t timep=0,timen=0;
//game用来显示已下的局数
//record[][][i]为第i步后的棋盘
//se表示送王次数
//passpawn表示下完第列数布后过路兵分布
//passg用以记录兵下第几步后成为过路兵
//KA,KB显示王是否有过移动;RAL,RAR记录A方两个车是否移动,RBL,RBR记录B方两个车是否移动
enum terms{
A,B
}term=B;
enum chessman
{
BoardL,BoardL_poss,
PawnAL,PawnAL_poss,PawnBL,PawnBL_poss,
KnightAL,KnightAL_poss,KnightBL,KnightBL_poss,
RookAL,RookAL_poss,RookBL,RookBL_poss,
BishopAL,BishopAL_poss,BishopBL,BishopBL_poss,
QueenAL,QueenAL_poss,QueenBL,QueenBL_poss,
KingAL,KingAL_poss,KingBL,KingBL_poss
};
//像素坐标(i,j)对应chessboard[j][i]
int chessboard[8][8]=
{
RookAL,KnightAL,BishopAL,QueenAL,KingAL,BishopAL,KnightAL,RookAL,
PawnAL,PawnAL,PawnAL,PawnAL,PawnAL,PawnAL,PawnAL,PawnAL,
BoardL,BoardL,BoardL,BoardL,BoardL,BoardL,BoardL,BoardL,
BoardL,BoardL,BoardL,BoardL,BoardL,BoardL,BoardL,BoardL,
BoardL,BoardL,BoardL,BoardL,BoardL,BoardL,BoardL,BoardL,
BoardL,BoardL,BoardL,BoardL,BoardL,BoardL,BoardL,BoardL,
PawnBL,PawnBL,PawnBL,PawnBL,PawnBL,PawnBL,PawnBL,PawnBL,
RookBL,KnightBL,BishopBL,QueenBL,KingBL,BishopBL,KnightBL,RookBL
};
int flag[8][8]={0};
IMAGE PawnAB,PawnAW,PawnBB,PawnBW,PawnAB_poss,PawnAW_poss,PawnBB_poss,PawnBW_poss,
KnightAB,KnightAW,KnightBB,KnightBW,KnightAB_poss,KnightAW_poss,KnightBB_poss,KnightBW_poss,
RookAB,RookAW,RookBB,RookBW,RookAB_poss,RookAW_poss,RookBB_poss,RookBW_poss,
BishopAB,BishopAW,BishopBB,BishopBW,BishopAB_poss,BishopAW_poss,BishopBB_poss,BishopBW_poss,
QueenAB,QueenAW,QueenBB,QueenBW,QueenAB_poss,QueenAW_poss,QueenBB_poss,QueenBW_poss,
KingAB,KingAW,KingBB,KingBW,KingAB_poss,KingAW_poss,KingBB_poss,KingBW_poss,
Black,Black_poss,White,White_poss,
White_flag,Larrow,Rarrow,Shake_hands;
void draw();
void load_im();
void total_time();//记录总时间
void term_time();//记录当前对局时间
void turn();//轮换下棋者
void sending(enum terms m);//判断有无送王,并执行相应指令
void send_king(enum terms m);//判断有送王行为后,显示相应界面
void re_record(int l);//把record第l层到1023层赋值为-2
void re_passpawn(int l);//把passpawnA,passpawnB第l层到1023层赋值为0
void re_passg(int l);//把passpawnA,passpawnB第l层到1023层赋值为-4
//将六个数组的第l层到1023层赋值为0
void re_KA(int l);
void re_KB(int l);
void re_RAL(int l);
void re_RAR(int l);
void re_RBL(int l);
void re_RBR(int l);
void copy_c(int l);//将王车易位六个数组的第l-1行赋值给l行
void pawnup(enum terms m);//检测并执行兵升变
void play_chess(ExMessage m);
void end_game();//结束游戏
void restart();//初始化所有参数
int x_img(int x);//显示SIZE*SIZE区域里左上角像素的相对坐标
int y_img(int y);//显示SIZE*SIZE区域里左上角像素的相对坐标
int IsA(int x,int y);
int IsB(int x,int y);
int Isposs(int x,int y);
void show_csquare(int x1,int y1);//显示可走格子
void re_chessboard();//清除chessboard上的所有poss
void back_chessboard();//将record[][][game]赋值给chessboard
void re_flag();//重置flag数组
void drop(int x1,int y1,int x2,int y2);
void show_King(int x1,int y1);//显示King可走的范围
void show_enemy(enum terms m);//显示term方棋子的攻击范围
void copy(int i);//把chessboard复制到record的第i列
void regret();//悔棋
void forward();//取消悔棋
void winner();判读是否将死
int main()
{
start:
second=45;
re_record(0);
re_passpawn(0);
re_passg(0);
re_KA(0);
re_KB(0);
re_RAL(0);
re_RAR(0);
re_RBL(0);
re_RBR(0);
copy(0);
time(&timep);
//图形界面初始化
load_im();
initgraph(WIDTH, HEIGHT,SHOWCONSOLE);
SetWindowText(GetHWnd(),L"国际象棋小游戏");
setbkcolor(RGB(35,35,35));
cleardevice();
draw();
ExMessage m;
while(1)
{
time(&timen);
if(timep!=timen)
{
if(term==A)
printf("\r当前回合为——黑 ");
if(term==B)
printf("\r当前回合为——白 ");
timep=timen;
total_time();
term_time();
}
if(ending)
{
end_game();
if(!ending)
goto start;
ending=0;
}
while (peekmessage(&m, EM_MOUSE))
{
if(m.message==WM_LBUTTONUP)
{
if((x_img(m.x)<8)&&(y_img(m.y)<8))
{
play_chess(m);
draw();
}
else
{
if((x_img(m.x)==(WIDTH/SIZE)-1)&&(y_img(m.y)==3))
ending=1;
if((x_img(m.x)==(WIDTH/SIZE)-1)&&(y_img(m.y)==4))
ending=2;
if((x_img(m.x)==8)&&(y_img(m.y)==4))
ending=3;
if((x_img(m.x)==8)&&(y_img(m.y)==3))
regret();
}
}
}
}
return 0;
}
void total_time()
{
if(sec<60)
sec++;
else
{
sec=0;
if(min<60)
min++;
else
{
min=0;
hour++;
}
}
printf("当前对局总时间为——%02d:%02d:%02d ",hour,min,sec);
return;
}
void term_time()
{
if(second>0)
{
second--;
printf("当前回合剩余时间——%02d 秒",second);
}
else
{
switch(term)
{
case A:
ending=1;
break;
case B:
ending=2;
break;
}
}
return;
}
void draw()
{
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
if((i+j)%2==0)
{
switch(chessboard[j][i]){
case RookAL:putimage(i*SIZE,j*SIZE,&RookAW); break;
case BishopAL:putimage(i*SIZE,j*SIZE,&BishopAW); break;
case KingAL:putimage(i*SIZE,j*SIZE,&KingAW); break;
case KnightAL:putimage(i*SIZE,j*SIZE,&KnightAW); break;
case QueenAL:putimage(i*SIZE,j*SIZE,&QueenAW); break;
case PawnAL:putimage(i*SIZE,j*SIZE,&PawnAW); break;
case RookBL:putimage(i*SIZE,j*SIZE,&RookBW); break;
case BishopBL:putimage(i*SIZE,j*SIZE,&BishopBW); break;
case KingBL:putimage(i*SIZE,j*SIZE,&KingBW); break;
case KnightBL:putimage(i*SIZE,j*SIZE,&KnightBW); break;
case QueenBL:putimage(i*SIZE,j*SIZE,&QueenBW); break;
case PawnBL:putimage(i*SIZE,j*SIZE,&PawnBW); break;
case BoardL:putimage(i*SIZE,j*SIZE,&White);break;
case RookAL_poss:putimage(i*SIZE,j*SIZE,&RookAW_poss); break;
case BishopAL_poss:putimage(i*SIZE,j*SIZE,&BishopAW_poss); break;
case KingAL_poss:putimage(i*SIZE,j*SIZE,&KingAW_poss); break;
case KnightAL_poss:putimage(i*SIZE,j*SIZE,&KnightAW_poss); break;
case QueenAL_poss:putimage(i*SIZE,j*SIZE,&QueenAW_poss); break;
case PawnAL_poss:putimage(i*SIZE,j*SIZE,&PawnAW_poss); break;
case RookBL_poss:putimage(i*SIZE,j*SIZE,&RookBW_poss); break;
case BishopBL_poss:putimage(i*SIZE,j*SIZE,&BishopBW_poss); break;
case KingBL_poss:putimage(i*SIZE,j*SIZE,&KingBW_poss); break;
case KnightBL_poss:putimage(i*SIZE,j*SIZE,&KnightBW_poss); break;
case QueenBL_poss:putimage(i*SIZE,j*SIZE,&QueenBW_poss); break;
case PawnBL_poss:putimage(i*SIZE,j*SIZE,&PawnBW_poss); break;
case BoardL_poss:putimage(i*SIZE,j*SIZE,&White_poss);break;
}
}
if((i+j)%2==1)
{
switch(chessboard[j][i]){
case RookAL:putimage(i*SIZE,j*SIZE,&RookAB); break;
case BishopAL:putimage(i*SIZE,j*SIZE,&BishopAB); break;
case KingAL:putimage(i*SIZE,j*SIZE,&KingAB); break;
case KnightAL:putimage(i*SIZE,j*SIZE,&KnightAB); break;
case QueenAL:putimage(i*SIZE,j*SIZE,&QueenAB); break;
case PawnAL:putimage(i*SIZE,j*SIZE,&PawnAB); break;
case RookBL:putimage(i*SIZE,j*SIZE,&RookBB); break;
case BishopBL:putimage(i*SIZE,j*SIZE,&BishopBB); break;
case KingBL:putimage(i*SIZE,j*SIZE,&KingBB); break;
case KnightBL:putimage(i*SIZE,j*SIZE,&KnightBB); break;
case QueenBL:putimage(i*SIZE,j*SIZE,&QueenBB); break;
case PawnBL:putimage(i*SIZE,j*SIZE,&PawnBB); break;
case BoardL:putimage(i*SIZE,j*SIZE,&Black);break;
case RookAL_poss:putimage(i*SIZE,j*SIZE,&RookAB_poss); break;
case BishopAL_poss:putimage(i*SIZE,j*SIZE,&BishopAB_poss); break;
case KingAL_poss:putimage(i*SIZE,j*SIZE,&KingAB_poss); break;
case KnightAL_poss:putimage(i*SIZE,j*SIZE,&KnightAB_poss); break;
case QueenAL_poss:putimage(i*SIZE,j*SIZE,&QueenAB_poss); break;
case PawnAL_poss:putimage(i*SIZE,j*SIZE,&PawnAB_poss); break;
case RookBL_poss:putimage(i*SIZE,j*SIZE,&RookBB_poss); break;
case BishopBL_poss:putimage(i*SIZE,j*SIZE,&BishopBB_poss); break;
case KingBL_poss:putimage(i*SIZE,j*SIZE,&KingBB_poss); break;
case KnightBL_poss:putimage(i*SIZE,j*SIZE,&KnightBB_poss); break;
case QueenBL_poss:putimage(i*SIZE,j*SIZE,&QueenBB_poss); break;
case PawnBL_poss:putimage(i*SIZE,j*SIZE,&PawnBB_poss); break;
case BoardL_poss:putimage(i*SIZE,j*SIZE,&Black_poss);break;
}
}
}
}
putimage(WIDTH-SIZE,3*SIZE,&White_flag);
putimage(WIDTH-SIZE,4*SIZE,&White_flag);
putimage(8*SIZE,3*SIZE,&Larrow);
putimage(9*SIZE,3*SIZE,&Rarrow);
putimage(8*SIZE,4*SIZE,&Shake_hands);
}
void load_im()
{
loadimage(&PawnAB,L"PawnAB.png",SIZE,SIZE,false);
loadimage(&PawnAB_poss,L"PawnAB_poss.png",SIZE,SIZE,false);
loadimage(&PawnAW,L"PawnAW.png",SIZE,SIZE,false);
loadimage(&PawnAW_poss,L"PawnAW_poss.png",SIZE,SIZE,false);
loadimage(&PawnBB,L"PawnBB.png",SIZE,SIZE,false);
loadimage(&PawnBB_poss,L"PawnBB_poss.png",SIZE,SIZE,false);
loadimage(&PawnBW,L"PawnBW.png",SIZE,SIZE,false);
loadimage(&PawnBW_poss,L"PawnBW_poss.png",SIZE,SIZE,false);
loadimage(&KnightAW,L"KnightAW.png",SIZE,SIZE,false);
loadimage(&KnightAW_poss,L"KnightAW_poss.png",SIZE,SIZE,false);
loadimage(&KnightAB,L"KnightAB.png",SIZE,SIZE,false);
loadimage(&KnightAB_poss,L"KnightAB_poss.png",SIZE,SIZE,false);
loadimage(&KnightBW,L"KnightBW.png",SIZE,SIZE,false);
loadimage(&KnightBW_poss,L"KnightBW_poss.png",SIZE,SIZE,false);
loadimage(&KnightBB,L"KnightBB.png",SIZE,SIZE,false);
loadimage(&KnightBB_poss,L"KnightBB_poss.png",SIZE,SIZE,false);
loadimage(&RookAB,L"RookAB.png",SIZE,SIZE,false);
loadimage(&RookAB_poss,L"RookAB_poss.png",SIZE,SIZE,false);
loadimage(&RookAW,L"RookAW.png",SIZE,SIZE,false);
loadimage(&RookAW_poss,L"RookAW_poss.png",SIZE,SIZE,false);
loadimage(&RookBB,L"RookBB.png",SIZE,SIZE,false);
loadimage(&RookBB_poss,L"RookBB_poss.png",SIZE,SIZE,false);
loadimage(&RookBW,L"RookBW.png",SIZE,SIZE,false);
loadimage(&RookBW_poss,L"RookBW_poss.png",SIZE,SIZE,false);
loadimage(&BishopAB,L"BishopAB.png",SIZE,SIZE,false);
loadimage(&BishopAB_poss,L"BishopAB_poss.png",SIZE,SIZE,false);
loadimage(&BishopAW,L"BishopAW.png",SIZE,SIZE,false);
loadimage(&BishopAW_poss,L"BishopAW_poss.png",SIZE,SIZE,false);
loadimage(&BishopBB,L"BishopBB.png",SIZE,SIZE,false);
loadimage(&BishopBB_poss,L"BishopBB_poss.png",SIZE,SIZE,false);
loadimage(&BishopBW,L"BishopBW.png",SIZE,SIZE,false);
loadimage(&BishopBW_poss,L"BishopBW_poss.png",SIZE,SIZE,false);
loadimage(&QueenAB,L"QueenAB.png",SIZE,SIZE,false);
loadimage(&QueenAB_poss,L"QueenAB_poss.png",SIZE,SIZE,false);
loadimage(&QueenAW,L"QueenAW.png",SIZE,SIZE,false);
loadimage(&QueenAW_poss,L"QueenAW_poss.png",SIZE,SIZE,false);
loadimage(&QueenBB,L"QueenBB.png",SIZE,SIZE,false);
loadimage(&QueenBB_poss,L"QueenBB_poss.png",SIZE,SIZE,false);
loadimage(&QueenBW,L"QueenBW.png",SIZE,SIZE,false);
loadimage(&QueenBW_poss,L"QueenBW_poss.png",SIZE,SIZE,false);
loadimage(&KingAB,L"KingAB.png",SIZE,SIZE,false);
loadimage(&KingAB_poss,L"KingAB_poss.png",SIZE,SIZE,false);
loadimage(&KingAW,L"KingAW.png",SIZE,SIZE,false);
loadimage(&KingAW_poss,L"KingAW_poss.png",SIZE,SIZE,false);
loadimage(&KingBB,L"KingBB.png",SIZE,SIZE,false);
loadimage(&KingBB_poss,L"KingBB_poss.png",SIZE,SIZE,false);
loadimage(&KingBW,L"KingBW.png",SIZE,SIZE,false);
loadimage(&KingBW_poss,L"KingBW_poss.png",SIZE,SIZE,false);
loadimage(&Black,L"Black.png",SIZE,SIZE,false);
loadimage(&Black_poss,L"Black_poss.png",SIZE,SIZE,false);
loadimage(&White,L"White.png",SIZE,SIZE,false);
loadimage(&White_poss,L"White_poss.png",SIZE,SIZE,false);
loadimage(&White_flag,L"White_flag.png",SIZE,SIZE,false);
loadimage(&Larrow,L"Larrow.png",SIZE,SIZE,false);
loadimage(&Rarrow,L"Rarrow.png",SIZE,SIZE,false);
loadimage(&Shake_hands,L"Shake_hands.png",SIZE,SIZE,false);
return;
}
//轮换下棋者
void turn()
{
if(game%2==0) term=B;
if(game%2==1) term=A;
return;
}
//把record第l层到1023层赋值为-2
void re_record(int l)
{
int i,j,k;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
for(k=l;k<1024;k++)
record[i][j][k]=-2;
}
}
}
//把passpawnA,passpawnB第l层到1023层赋值为0
void re_passpawn(int l)
{
int i,j;
for(i=0;i<8;i++)
{
for(j=l;j<1024;j++)
{
passpawnA[i][j]=0;
passpawnB[i][j]=0;
}
}
}
//把passpawnA,passpawnB第l层到1023层赋值为-4
void re_passg(int l)
{
int i,j;
for(i=0;i<8;i++)
{
for(j=l;j<1024;j++)
{
passAg[i][j]=-4;
passBg[i][j]=-4;
}
}
}
//将六个数组的第l层到1023层赋值为0
void re_KA(int l)
{
int i;
for(i=l;i<1024;i++)
KA[i]=0;
}
void re_KB(int l)
{
int i;
for(i=l;i<1024;i++)
KB[i]=0;
}
void re_RAL(int l)
{
int i;
for(i=l;i<1024;i++)
RAL[i]=0;
}
void re_RBL(int l)
{
int i;
for(i=l;i<1024;i++)
RBL[i]=0;
}
void re_RAR(int l)
{
int i;
for(i=l;i<1024;i++)
RAR[i]=0;
}
void re_RBR(int l)
{
int i;
for(i=l;i<1024;i++)
RAR[i]=0;
}
//将王车易位六个数组的第l-1行赋值给l行
void copy_c(int l)
{
KA[l]=KA[l-1];
KB[l]=KB[l-1];
RAL[l]=RAL[l-1];
RAR[l]=RAR[l-1];
RBL[l]=RBL[l-1];
RBR[l]=RBR[l-1];
}
//检测并执行兵升变
void pawnup(enum terms n)
{
int i;
switch(n)
{
case A:
for(i=0;i<8;i++)
{
if(chessboard[7][i]==PawnAL)
{
cleardevice();
settextstyle(50,0,_T("黑体"));
settextcolor(WHITE);
outtextxy(400,300,_T("黑方兵升变为"));
outtextxy(450,500,_T("马"));
outtextxy(600,500,_T("象"));
outtextxy(300,500,_T("车"));
outtextxy(750,500,_T("后"));
break;
}
if(i==7)
return;
}
while(1)
{
ExMessage m=getmessage(EM_MOUSE);
if(m.message==WM_LBUTTONDOWN)
{
if((300<=m.x)&&(m.x<=350)&&(500<=m.y)&&(m.y<=550))
{
chessboard[7][i]=RookAL;
copy(game);
break;
}
if((450<=m.x)&&(m.x<=500)&&(500<=m.y)&&(m.y<=550))
{
chessboard[7][i]=KnightAL;
copy(game);
break;
}
if((600<=m.x)&&(m.x<=650)&&(500<=m.y)&&(m.y<=550))
{
chessboard[7][i]=BishopAL;
copy(game);
break;
}
if((750<=m.x)&&(m.x<=800)&&(500<=m.y)&&(m.y<=550))
{
chessboard[7][i]=QueenAL;
copy(game);
break;
}
}
}
break;
case B:
for(i=0;i<8;i++)
{
if(chessboard[0][i]==PawnBL)
{
cleardevice();
settextstyle(50,0,_T("黑体"));
settextcolor(WHITE);
outtextxy(400,300,_T("白方兵升变为"));
outtextxy(450,500,_T("马"));
outtextxy(600,500,_T("象"));
outtextxy(300,500,_T("车"));
outtextxy(750,500,_T("后"));
break;
}
if(i==7)
return;
}
while(1)
{
ExMessage m=getmessage(EM_MOUSE);
if(m.message==WM_LBUTTONDOWN)
{
if((300<=m.x)&&(m.x<=350)&&(500<=m.y)&&(m.y<=550))
{
chessboard[0][i]=RookBL;
copy(game);
break;
}
if((450<=m.x)&&(m.x<=500)&&(500<=m.y)&&(m.y<=550))
{
chessboard[0][i]=KnightBL;
copy(game);
break;
}
if((600<=m.x)&&(m.x<=650)&&(500<=m.y)&&(m.y<=550))
{
chessboard[0][i]=BishopBL;
copy(game);
break;
}
if((750<=m.x)&&(m.x<=800)&&(500<=m.y)&&(m.y<=550))
{
chessboard[0][i]=QueenBL;
copy(game);
break;
}
}
}
break;
}
return;
}
//判断有无送王,并执行相应指令
void sending(enum terms m)
{
int i,j;
switch(m)
{
case A:
show_enemy(B);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(chessboard[j][i]==KingAL&&flag[j][i]==1)
{
seA++;
send_king(A);
}
}
}
break;
case B:
show_enemy(A);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(chessboard[j][i]==KingBL&&flag[j][i]==1)
{
seB++;
send_king(B);
}
}
}
break;
}
}
//判断有送王行为后,显示相应界面
void send_king(enum terms m)
{
switch(m)
{
case A:
if(seA)
{
cleardevice();
settextstyle(50,0,_T("黑体"));
settextcolor(WHITE);
outtextxy(450,250,_T("黑方送王"));
outtextxy(500,600,_T("确定"));
if(seA==1)
outtextxy(450,300,_T("总次数一"));
if(seA==2)
outtextxy(450,300,_T("总次数二"));
if(seA==3)
outtextxy(450,300,_T("总次数三"));
while(1)
{
ExMessage n=getmessage(EM_MOUSE);
if(n.message==WM_LBUTTONDOWN)
{
if(500<=n.x&&n.x<=600&&600<=n.y&&n.y<=650)
{
if(seA==3)
{
ending=1;
return;
}
else
{
regret();
return;
}
}
}
}
}
break;
case B:
if(seB)
{
cleardevice();
settextstyle(50,0,_T("黑体"));
settextcolor(WHITE);
outtextxy(450,250,_T("白方送王"));
outtextxy(500,600,_T("确定"));
if(seB==1)
outtextxy(450,300,_T("总次数一"));
if(seB==2)
outtextxy(450,300,_T("总次数二"));
if(seB==3)
outtextxy(450,300,_T("总次数三"));
while(1)
{
ExMessage n=getmessage(EM_MOUSE);
if(n.message==WM_LBUTTONDOWN)
{
if(500<=n.x&&n.x<=600&&600<=n.y&&n.y<=650)
{
if(!seB)
return;
if(seB==3)
{
ending=2;
return;
}
else
{
regret();
return;
}
break;
}
}
}
}
break;
}
}
void play_chess(ExMessage m)
{
switch(term)
{
case A:
if(!count)
{
if(IsA(x_img(m.x),y_img(m.y)))
{
lx1=x_img(m.x);
ly1=y_img(m.y);
show_csquare(lx1,ly1);
count=1;
}
}
else
{
lx2=x_img(m.x);
ly2=y_img(m.y);
if(Isposs(lx2,ly2))
{
re_passpawn(game+1);
re_passg(game+1);
re_KA(game+1);
re_KB(game+1);
re_RAL(game+1);
re_RAR(game+1);
re_RBL(game+1);
re_RBR(game+1);
drop(lx1,ly1,lx2,ly2);
count=0;
copy(++game);
re_record(game+1);
turn();
sending(A);
pawnup(A);
winner();
second=45;
}
else if(IsA(lx2,ly2))
{
show_csquare(lx2,ly2);
lx1=lx2;
ly1=ly2;
}
}
break;
case B:
if(!count)
{
if(IsB(x_img(m.x),y_img(m.y)))
{
lx1=x_img(m.x);
ly1=y_img(m.y);
show_csquare(lx1,ly1);
count=1;
}
}
else
{
lx2=x_img(m.x);
ly2=y_img(m.y);
if(Isposs(lx2,ly2))
{
re_passpawn(game+1);
re_passg(game+1);
re_KA(game+1);
re_KB(game+1);
re_RAL(game+1);
re_RAR(game+1);
re_RBL(game+1);
re_RBR(game+1);
drop(lx1,ly1,lx2,ly2);
count=0;
copy(++game);
re_record(game+1);
turn();
sending(B);
pawnup(B);
winner();
second=45;
}
else if(IsB(lx2,ly2))
{
show_csquare(lx2,ly2);
lx1=lx2;
ly1=ly2;
}
}
break;
}
return;
}
//结束游戏
void end_game()
{
cleardevice();
settextstyle(50,0,_T("黑体"));
settextcolor(WHITE);
switch(ending)
{
case 1:
outtextxy(850,0,_T("游戏结束"));
outtextxy(850,50,_T("白方获胜"));
break;
case 2:
outtextxy(850,0,_T("游戏结束"));
outtextxy(850,50,_T("黑方获胜"));
break;
case 3:
outtextxy(400,300,_T("是否接受和棋"));
outtextxy(450,500,_T("是"));
outtextxy(600,500,_T("否"));
while(1)
{
ExMessage m=getmessage(EM_MOUSE);
if(m.message==WM_LBUTTONDOWN)
{
if((600<=m.x)&&(m.x<=650)&&(500<=m.y)&&(m.y<=550))
{
draw();
return ;
}
if((450<=m.x)&&(m.x<=500)&&(500<=m.y)&&(m.y<=550))
{
outtextxy(850,0,_T("游戏结束"));
outtextxy(850,50,_T("双方平手"));
break;
}
}
}
}
setbkcolor(RGB(35,35,35));
setfillcolor(RGB(35,35,35));
draw();
solidrectangle(900,400,800,500);
solidrectangle(1100,300,1000,500);
outtextxy(850,(HEIGHT/2)+350,_T("重新开始"));
while(1)
{
ExMessage m=getmessage(EM_MOUSE);
if(m.message==WM_LBUTTONDOWN)
{
if((850<=m.x)&&(m.x<=1050)&&(750<=m.y)&&(m.y<=800))
{
restart();
return;
}
if((x_img(m.x)==8)&&(y_img(m.y)==3))
{
regret();
setfillcolor(RGB(35,35,35));
solidrectangle(900,400,800,500);
solidrectangle(1100,300,1000,500);
}
if((x_img(m.x)==9)&&(y_img(m.y)==3))
{
forward();
setfillcolor(RGB(35,35,35));
solidrectangle(900,400,800,500);
solidrectangle(1100,300,1000,500);
}
}
}
}
//重新开始
void restart()
{
int i,j;
count=0;
lx1=0;ly1=0;
lx2=0;ly2=0;
ending=0;
game=0;
term=B;
seA=0;
seB=0;
re_flag();
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
chessboard[i][j]=record[i][j][0];
}
}
}
//显示SIZE*SIZE区域里左上角像素的相对坐标
int x_img(int x)
{
return (int)(x/(float)SIZE);
}
int y_img(int y)
{
return (int)(y/(float)SIZE);
}
int IsA(int x,int y)
{
switch(chessboard[y][x])
{
case RookAL:
case BishopAL:
case KingAL:
case KnightAL:
case QueenAL:
case PawnAL:return 1;
default:return 0;
}
}
int IsB(int x,int y)
{
switch(chessboard[y][x])
{
case RookBL:
case BishopBL:
case KingBL:
case KnightBL:
case QueenBL:
case PawnBL:return 1;
}
return 0;
}
int Isposs(int x,int y)
{
return chessboard[y][x]%2==1;
}
//把chessboard复制到record的第i列层
void copy(int i)
{
int j,k;
for(j=0;j<8;j++)
{
for(k=0;k<8;k++)
record[k][j][i]=chessboard[k][j];
}
return;
}
//将record[][][game]赋值给chessboard
void back_chessboard()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
chessboard[j][i]=record[j][i][game];
}
}
return ;
}
//显示可走格子
void show_csquare(int x,int y)
{
int i,j;
re_chessboard();
switch(chessboard[y][x])
{
case PawnAL:
if(y==1)
{
if(chessboard[y+1][x]==BoardL)
{
chessboard[y+1][x]++;
if(chessboard[y+2][x]==BoardL)
chessboard[y+2][x]++;
}
if(y<7&&x>0&&IsB(x-1,y+1))
chessboard[y+1][x-1]++;
if(y<7&&x<7&&IsB(x+1,y+1))
chessboard[y+1][x+1]++;
}
else if(y==4)
{
if((x>0)&&(passpawnB[x-1][game]==1))
chessboard[y+1][x-1]++;
else if(y<7&&x>0&&IsB(x-1,y+1))
chessboard[y+1][x-1]++;
if((x<7)&&(passpawnB[x+1][game]==1))
chessboard[y+1][x+1]++;
else if(y<7&&x<7&&IsB(x+1,y+1))
chessboard[y+1][x+1]++;
if(y<7&&chessboard[y+1][x]==BoardL)
chessboard[y+1][x]++;
}
else
{
if(y<7&&chessboard[y+1][x]==BoardL)
chessboard[y+1][x]++;
if(y<7&&x>0&&IsB(x-1,y+1))
chessboard[y+1][x-1]++;
if(y<7&&x<7&&IsB(x+1,y+1))
chessboard[y+1][x+1]++;
}
break;
case KnightAL:
for(i=0;i<=7;i++)
{
for(j=0;j<=7;j++)
{
if(abs(i-x)==1&&abs(j-y)==2&&!IsA(i,j))
chessboard[j][i]++;
if(abs(i-x)==2&&abs(j-y)==1&&!IsA(i,j))
chessboard[j][i]++;
}
}
break;
case BishopAL:
for(i=1;x+i<8&&y+i<8;i++)
{
if(chessboard[y+i][x+i]==BoardL)
chessboard[y+i][x+i]++;
else if(IsB(x+i,y+i))
{
chessboard[y+i][x+i]++;
break;
}
else
break;
}
for(i=1;x+i<8&&y-i>-1;i++)
{
if(chessboard[y-i][x+i]==BoardL)
chessboard[y-i][x+i]++;
else if(IsB(x+i,y-i))
{
chessboard[y-i][x+i]++;
break;
}
else
break;
}
for(i=1;x-i>-1&&y+i<8;i++)
{
if(chessboard[y+i][x-i]==BoardL)
chessboard[y+i][x-i]++;
else if(IsB(x-i,y+i))
{
chessboard[y+i][x-i]++;
break;
}
else
break;
}
for(i=1;x-i>-1&&y-i>-1;i++)
{
if(chessboard[y-i][x-i]==BoardL)
chessboard[y-i][x-i]++;
else if(IsB(x-i,y-i))
{
chessboard[y-i][x-i]++;
break;
}
else
break;
}
break;
case RookAL:
for(i=1;x+i<8;i++)
{
if(chessboard[y][x+i]==BoardL)
chessboard[y][x+i]++;
else if(IsB(x+i,y))
{
chessboard[y][x+i]++;
break;
}
else
break;
}
for(i=1;x-i>-1;i++)
{
if(chessboard[y][x-i]==BoardL)
chessboard[y][x-i]++;
else if(IsB(x-i,y))
{
chessboard[y][x-i]++;
break;
}
else
break;
}
for(i=1;y+i<8;i++)
{
if(chessboard[y+i][x]==BoardL)
chessboard[y+i][x]++;
else if(IsB(x,y+i))
{
chessboard[y+i][x]++;
break;
}
else
break;
}
for(i=1;y-i>-1;i++)
{
if(chessboard[y-i][x]==BoardL)
chessboard[y-i][x]++;
else if(IsB(x,y-i))
{
chessboard[y-i][x]++;
break;
}
else
break;
}
break;
case QueenAL:
for(i=1;x+i<8&&y+i<8;i++)
{
if(chessboard[y+i][x+i]==BoardL)
chessboard[y+i][x+i]++;
else if(IsB(x+i,y+i))
{
chessboard[y+i][x+i]++;
break;
}
else
break;
}
for(i=1;x+i<8&&y-i>-1;i++)
{
if(chessboard[y-i][x+i]==BoardL)
chessboard[y-i][x+i]++;
else if(IsB(x+i,y-i))
{
chessboard[y-i][x+i]++;
break;
}
else
break;
}
for(i=1;x-i>-1&&y+i<8;i++)
{
if(chessboard[y+i][x-i]==BoardL)
chessboard[y+i][x-i]++;
else if(IsB(x-i,y+i))
{
chessboard[y+i][x-i]++;
break;
}
else
break;
}
for(i=1;x-i>-1&&y-i>-1;i++)
{
if(chessboard[y-i][x-i]==BoardL)
chessboard[y-i][x-i]++;
else if(IsB(x-i,y-i))
{
chessboard[y-i][x-i]++;
break;
}
else
break;
}
for(i=1;x+i<8;i++)
{
if(chessboard[y][x+i]==BoardL)
chessboard[y][x+i]++;
else if(IsB(x+i,y))
{
chessboard[y][x+i]++;
break;
}
else
break;
}
for(i=1;x-i>-1;i++)
{
if(chessboard[y][x-i]==BoardL)
chessboard[y][x-i]++;
else if(IsB(x-i,y))
{
chessboard[y][x-i]++;
break;
}
else
break;
}
for(i=1;y+i<8;i++)
{
if(chessboard[y+i][x]==BoardL)
chessboard[y+i][x]++;
else if(IsB(x,y+i))
{
chessboard[y+i][x]++;
break;
}
else
break;
}
for(i=1;y-i>-1;i++)
{
if(chessboard[y-i][x]==BoardL)
chessboard[y-i][x]++;
else if(IsB(x,y-i))
{
chessboard[y-i][x]++;
break;
}
else
break;
}
break;
case KingAL:
if((KA[game]==0)&&(RAL[game]==0))
{
if((chessboard[0][1]==BoardL)&&(chessboard[0][2]==BoardL)&&(chessboard[0][3]==BoardL))
{
show_enemy(B);
if((flag[0][1]==0)&&(flag[0][2]==0)&&(flag[0][3]==0)&&(flag[0][4]==0))
chessboard[0][2]++;
re_flag();
}
}
if((KA[game]==0)&&(RAR[game]==0))
{
if((chessboard[0][5]==BoardL)&&(chessboard[0][6]==BoardL))
{
show_enemy(B);
if((flag[0][4]==0)&&(flag[0][5]==0)&&(flag[0][6]==0))
chessboard[0][6]++;
re_flag();
}
}
show_King(x,y);
break;
case PawnBL:
if(y==6)
{
if(chessboard[y-1][x]==BoardL)
{
chessboard[y-1][x]++;
if(chessboard[y-2][x]==BoardL)
chessboard[y-2][x]++;
}
if(y>0&&x>0&&IsA(x-1,y-1))
chessboard[y-1][x-1]++;
if(y>0&&x<7&&IsA(x+1,y-1))
chessboard[y-1][x+1]++;
}
else if(y==3)
{
if((x>0)&&(passpawnA[x-1][game]==1))
chessboard[y-1][x-1]++;
else if(x>0&&IsA(x-1,y-1))
chessboard[y-1][x-1]++;
if((x<7)&&(passpawnA[x+1][game]==1))
chessboard[y-1][x+1]++;
else if(y>0&&x<7&&IsA(x+1,y-1))
chessboard[y-1][x+1]++;
if(y>0&&chessboard[y-1][x]==BoardL)
chessboard[y-1][x]++;
}
else
{
if(y>0&&chessboard[y-1][x]==BoardL)
chessboard[y-1][x]++;
if(y>0&&x>0&&IsA(x-1,y-1))
chessboard[y-1][x-1]++;
if(y>0&&x<7&&IsA(x+1,y-1))
chessboard[y-1][x+1]++;
}
break;
case KnightBL:
for(i=0;i<=7;i++)
{
for(j=0;j<=7;j++)
{
if(abs(i-x)==1&&abs(j-y)==2&&!IsB(i,j))
chessboard[j][i]++;
if(abs(i-x)==2&&abs(j-y)==1&&!IsB(i,j))
chessboard[j][i]++;
}
}
break;
case RookBL:
for(i=1;x+i<8;i++)
{
if(chessboard[y][x+i]==BoardL)
chessboard[y][x+i]++;
else if(IsA(x+i,y))
{
chessboard[y][x+i]++;
break;
}
else
break;
}
for(i=1;x-i>-1;i++)
{
if(chessboard[y][x-i]==BoardL)
chessboard[y][x-i]++;
else if(IsA(x-i,y))
{
chessboard[y][x-i]++;
break;
}
else
break;
}
for(i=1;y+i<8;i++)
{
if(chessboard[y+i][x]==BoardL)
chessboard[y+i][x]++;
else if(IsA(x,y+i))
{
chessboard[y+i][x]++;
break;
}
else
break;
}
for(i=1;y-i>-1;i++)
{
if(chessboard[y-i][x]==BoardL)
chessboard[y-i][x]++;
else if(IsA(x,y-i))
{
chessboard[y-i][x]++;
break;
}
else
break;
}
break;
case BishopBL:
for(i=1;x+i<8&&y+i<8;i++)
{
if(chessboard[y+i][x+i]==BoardL)
chessboard[y+i][x+i]++;
else if(IsA(x+i,y+i))
{
chessboard[y+i][x+i]++;
break;
}
else
break;
}
for(i=1;x+i<8&&y-i>-1;i++)
{
if(chessboard[y-i][x+i]==BoardL)
chessboard[y-i][x+i]++;
else if(IsA(x+i,y-i))
{
chessboard[y-i][x+i]++;
break;
}
else
break;
}
for(i=1;x-i>-1&&y+i<8;i++)
{
if(chessboard[y+i][x-i]==BoardL)
chessboard[y+i][x-i]++;
else if(IsA(x-i,y+i))
{
chessboard[y+i][x-i]++;
break;
}
else
break;
}
for(i=1;x-i>-1&&y-i>-1;i++)
{
if(chessboard[y-i][x-i]==BoardL)
chessboard[y-i][x-i]++;
else if(IsA(x-i,y-i))
{
chessboard[y-i][x-i]++;
break;
}
else
break;
}
break;
case QueenBL:
for(i=1;x+i<8;i++)
{
if(chessboard[y][x+i]==BoardL)
chessboard[y][x+i]++;
else if(IsA(x+i,y))
{
chessboard[y][x+i]++;
break;
}
else
break;
}
for(i=1;x-i>-1;i++)
{
if(chessboard[y][x-i]==BoardL)
chessboard[y][x-i]++;
else if(IsA(x-i,y))
{
chessboard[y][x-i]++;
break;
}
else
break;
}
for(i=1;y+i<8;i++)
{
if(chessboard[y+i][x]==BoardL)
chessboard[y+i][x]++;
else if(IsA(x,y+i))
{
chessboard[y+i][x]++;
break;
}
else
break;
}
for(i=1;y-i>-1;i++)
{
if(chessboard[y-i][x]==BoardL)
chessboard[y-i][x]++;
else if(IsA(x,y-i))
{
chessboard[y-i][x]++;
break;
}
else
break;
}
for(i=1;x+i<8&&y+i<8;i++)
{
if(chessboard[y+i][x+i]==BoardL)
chessboard[y+i][x+i]++;
else if(IsA(x+i,y+i))
{
chessboard[y+i][x+i]++;
break;
}
else
break;
}
for(i=1;x+i<8&&y-i>-1;i++)
{
if(chessboard[y-i][x+i]==BoardL)
chessboard[y-i][x+i]++;
else if(IsA(x+i,y-i))
{
chessboard[y-i][x+i]++;
break;
}
else
break;
}
for(i=1;x-i>-1&&y+i<8;i++)
{
if(chessboard[y+i][x-i]==BoardL)
chessboard[y+i][x-i]++;
else if(IsA(x-i,y+i))
{
chessboard[y+i][x-i]++;
break;
}
else
break;
}
for(i=1;x-i>-1&&y-i>-1;i++)
{
if(chessboard[y-i][x-i]==BoardL)
chessboard[y-i][x-i]++;
else if(IsA(x-i,y-i))
{
chessboard[y-i][x-i]++;
break;
}
else
break;
}
break;
case KingBL:
if((KB[game]==0)&&(RBL[game]==0))
{
if((chessboard[7][1]==BoardL)&&(chessboard[7][2]==BoardL)&&(chessboard[7][3]==BoardL))
{
show_enemy(A);
if((flag[7][1]==0)&&(flag[7][2]==0)&&(flag[7][3]==0)&&(flag[7][4]==0))
chessboard[7][2]++;
re_flag();
}
}
if((KB[game]==0)&&(RBR[game]==0))
{
if((chessboard[7][5]==BoardL)&&(chessboard[7][6]==BoardL))
{
show_enemy(A);
if((flag[7][4]==0)&&(flag[7][5]==0)&&(flag[7][6]==0))
chessboard[7][6]++;
re_flag();
}
}
show_King(x,y);
break;
return;
}
}
//在flag上显示term方棋子的攻击范围
void show_enemy(enum terms m)
{
int x,y,i,j;
if(m==A)
{
for(x=0;x<8;x++)
{
for(y=0;y<8;y++)
{
switch(chessboard[y][x])
{
case PawnAL:
if(y<7&&x>0)
flag[y+1][x-1]=1;
if(y<7&&x<7)
flag[y+1][x+1]=1;
break;
case KnightAL:
for(i=0;i<=7;i++)
{
for(j=0;j<=7;j++)
{
if(abs(i-x)==1&&abs(j-y)==2)
flag[j][i]=1;
if(abs(i-x)==2&&abs(j-y)==1)
flag[j][i]=1;
}
}
break;
case BishopAL:
for(i=1;x+i<8&&y+i<8;i++)
{
if(chessboard[y+i][x+i]==BoardL)
flag[y+i][x+i]=1;
else
{
flag[y+i][x+i]=1;
break;
}
}
for(i=1;x+i<8&&y-i>-1;i++)
{
if(chessboard[y-i][x+i]==BoardL)
flag[y-i][x+i]=1;
else
{
flag[y-i][x+i]=1;
break;
}
}
for(i=1;x-i>-1&&y+i<8;i++)
{
if(chessboard[y+i][x-i]==BoardL)
flag[y+i][x-i]=1;
else
{
flag[y+i][x-i]=1;
break;
}
}
for(i=1;x-i>-1&&y-i>-1;i++)
{
if(chessboard[y-i][x-i]==BoardL)
flag[y-i][x-i]=1;
else
{
flag[y-i][x-i]=1;
break;
}
}
break;
case RookAL:
for(i=1;x+i<8;i++)
{
if(chessboard[y][x+i]==BoardL)
flag[y][x+i]=1;
else
{
flag[y][x+i]=1;
break;
}
}
for(i=1;x-i>-1;i++)
{
if(chessboard[y][x-i]==BoardL)
{
flag[y][x-i]=1;
}
else
{
flag[y][x-i]=1;
break;
}
}
for(i=1;y+i<8;i++)
{
if(chessboard[y+i][x]==BoardL)
flag[y+i][x]=1;
else
{
flag[y+i][x]=1;
break;
}
}
for(i=1;y-i>-1;i++)
{
if(chessboard[y-i][x]==BoardL)
flag[y-i][x]=1;
else
{
flag[y-i][x]=1;
break;
}
}
break;
case QueenAL:
for(i=1;x+i<8&&y+i<8;i++)
{
if(chessboard[y+i][x+i]==BoardL)
flag[y+i][x+i]=1;
else
{
flag[y+i][x+i]=1;
break;
}
}
for(i=1;x+i<8&&y-i>-1;i++)
{
if(chessboard[y-i][x+i]==BoardL)
flag[y-i][x+i]=1;
else
{
flag[y-i][x+i]=1;
break;
}
}
for(i=1;x-i>-1&&y+i<8;i++)
{
if(chessboard[y+i][x-i]==BoardL)
flag[y+i][x-i]=1;
else
{
flag[y+i][x-i]=1;
break;
}
}
for(i=1;x-i>-1&&y-i>-1;i++)
{
if(chessboard[y-i][x-i]==BoardL)
flag[y-i][x-i]=1;
else
{
flag[y-i][x-i]=1;
break;
}
}
for(i=1;x+i<8;i++)
{
if(chessboard[y][x+i]==BoardL)
flag[y][x+i]=1;
else
{
flag[y][x+i]=1;
break;
}
}
for(i=1;x-i>-1;i++)
{
if(chessboard[y][x-i]==BoardL)
{
flag[y][x-i]=1;
}
else
{
flag[y][x-i]=1;
break;
}
}
for(i=1;y+i<8;i++)
{
if(chessboard[y+i][x]==BoardL)
flag[y+i][x]=1;
else
{
flag[y+i][x]=1;
break;
}
}
for(i=1;y-i>-1;i++)
{
if(chessboard[y-i][x]==BoardL)
flag[y-i][x]=1;
else
{
flag[y-i][x]=1;
break;
}
}
break;
case KingAL:
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if((abs(x-i)<2)&&(abs(y-j)<2))
{
if(chessboard[j][i]!=KingAL)
flag[j][i]=1;
}
}
}
break;
}
}
}
}
else
{
for(x=0;x<8;x++)
{
for(y=0;y<8;y++)
{
switch(chessboard[y][x])
{
case PawnBL:
if(y>0&&x>0)
flag[y-1][x-1]=1;
if(y>0&&x<7)
flag[y-1][x+1]=1;
else
{
if(y>0&&x>0)
flag[y-1][x-1]=1;
if(y>0&&x<7)
flag[y-1][x+1]=1;
}
break;
case KnightBL:
for(i=0;i<=7;i++)
{
for(j=0;j<=7;j++)
{
if(abs(i-x)==1&&abs(j-y)==2)
flag[j][i]=1;
if(abs(i-x)==2&&abs(j-y)==1)
flag[j][i]=1;
}
}
break;
case BishopBL:
for(i=1;x+i<8&&y+i<8;i++)
{
if(chessboard[y+i][x+i]==BoardL)
flag[y+i][x+i]=1;
else
{
flag[y+i][x+i]=1;
break;
}
}
for(i=1;x+i<8&&y-i>-1;i++)
{
if(chessboard[y-i][x+i]==BoardL)
flag[y-i][x+i]=1;
else
{
flag[y-i][x+i]=1;
break;
}
}
for(i=1;x-i>-1&&y+i<8;i++)
{
if(chessboard[y+i][x-i]==BoardL)
flag[y+i][x-i]=1;
else
{
flag[y+i][x-i]=1;
break;
}
}
for(i=1;x-i>-1&&y-i>-1;i++)
{
if(chessboard[y-i][x-i]==BoardL)
flag[y-i][x-i]=1;
else
{
flag[y-i][x-i]=1;
break;
}
}
break;
case RookBL:
for(i=1;x+i<8;i++)
{
if(chessboard[y][x+i]==BoardL)
flag[y][x+i]=1;
else
{
flag[y][x+i]=1;
break;
}
}
for(i=1;x-i>-1;i++)
{
if(chessboard[y][x-i]==BoardL)
flag[y][x-i]=1;
else
{
flag[y][x-i]=1;
break;
}
}
for(i=1;y+i<8;i++)
{
if(chessboard[y+i][x]==BoardL)
flag[y+i][x]=1;
else
{
flag[y+i][x]=1;
break;
}
}
for(i=1;y-i>-1;i++)
{
if(chessboard[y-i][x]==BoardL)
flag[y-i][x]=1;
else
{
flag[y-i][x]=1;
break;
}
}
break;
case QueenBL:
for(i=1;x+i<8&&y+i<8;i++)
{
if(chessboard[y+i][x+i]==BoardL)
flag[y+i][x+i]=1;
else
{
flag[y+i][x+i]=1;
break;
}
}
for(i=1;x+i<8&&y-i>-1;i++)
{
if(chessboard[y-i][x+i]==BoardL)
flag[y-i][x+i]=1;
else
{
flag[y-i][x+i]=1;
break;
}
}
for(i=1;x-i>-1&&y+i<8;i++)
{
if(chessboard[y+i][x-i]==BoardL)
flag[y+i][x-i]=1;
else
{
flag[y+i][x-i]=1;
break;
}
}
for(i=1;x-i>-1&&y-i>-1;i++)
{
if(chessboard[y-i][x-i]==BoardL)
flag[y-i][x-i]=1;
else
{
flag[y-i][x-i]=1;
break;
}
}
for(i=1;x+i<8;i++)
{
if(chessboard[y][x+i]==BoardL)
flag[y][x+i]=1;
else
{
flag[y][x+i]=1;
break;
}
}
for(i=1;x-i>-1;i++)
{
if(chessboard[y][x-i]==BoardL)
flag[y][x-i]=1;
else
{
flag[y][x-i]=1;
break;
}
}
for(i=1;y+i<8;i++)
{
if(chessboard[y+i][x]==BoardL)
flag[y+i][x]=1;
else
{
flag[y+i][x]=1;
break;
}
}
for(i=1;y-i>-1;i++)
{
if(chessboard[y-i][x]==BoardL)
flag[y-i][x]=1;
else
{
flag[y-i][x]=1;
break;
}
}
break;
case KingBL:
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if((abs(x-i)<2)&&(abs(y-j)<2))
{
if(chessboard[j][i]!=KingBL)
flag[j][i]=1;
}
}
}
break;
}
}
}
}
}
//显示King可走的范围
void show_King(int x1,int y1)
{
int i,j;
switch(term)
{
case A:
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if((abs(x1-i)<2)&&(abs(y1-j)<2))
{
if(!IsA(i,j))
chessboard[j][i]++;
}
}
}
re_flag();
break;
case B:
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if((abs(x1-i)<2)&&(abs(y1-j)<2))
{
if(!IsB(i,j))
chessboard[j][i]++;
}
}
}
re_flag();
break;
}
}
//将像素坐标(x1,y1)的棋子下到(x2,y2)
void drop(int x1,int y1,int x2,int y2)
{
int i;
copy_c(game+1);
if((x1==4)&&(y1==0)&&(x2==2)&&(y2==0))
{
if(chessboard[0][2]%2==1)
{
chessboard[0][0]=BoardL;
chessboard[0][3]=RookAL;
}
}
if((x1==4)&&(y1==0)&&(x2==6)&&(y2==0))
{
if(chessboard[0][6]%2==1)
{
chessboard[0][7]=BoardL;
chessboard[0][5]=RookAL;
}
}
if((x1==4)&&(y1==7)&&(x2==2)&&(y2==7))
{
if(chessboard[7][2]%2==1)
{
chessboard[7][0]=BoardL;
chessboard[7][3]=RookBL;
}
}
if((x1==4)&&(y1==7)&&(x2==6)&&(y2==7))
{
if(chessboard[7][6]%2==1)
{
chessboard[7][7]=BoardL;
chessboard[7][5]=RookBL;
}
}
re_chessboard();
if((x1==4)&&(y1==0)) KA[game+1]=1;
if((x1==0)&&(y1==0)) RAL[game+1]=1;
if((x1==7)&&(y1==0)) RAR[game+1]=1;
if((x1==4)&&(y1==7)) KB[game+1]=1;
if((x1==0)&&(y1==7)) RBL[game+1]=1;
if((x1==7)&&(y1==7)) RBR[game+1]=1;
for(i=0;i<8;i++)
{
passAg[i][game+1]=passAg[i][game];
passBg[i][game+1]=passBg[i][game];
}
if((chessboard[y1][x1]==PawnAL)&&(y2==y1+2))
{
passpawnA[x1][game+1]=1;
passAg[x1][game+1]=game+1;
}
if((chessboard[y1][x1]==PawnBL)&&(y2==y1-2))
{
passpawnB[x1][game+1]=1;
passBg[x1][game+1]=game+1;
}
for(i=0;i<8;i++)
{
if(game==passAg[i][game+1]+1)
passpawnA[i][game+1]=0;
}
for(i=0;i<8;i++)
{
if(game==passBg[i][game+1]+1)
passpawnB[i][game+1]=0;
}
if((y1==4)&&(x1>0)&&(chessboard[y1][x1]==PawnAL)&&(passpawnB[x1-1][game]==1)&&(x2==x1-1))
{
chessboard[y1][x1-1]=BoardL;
passpawnB[x1-1][game+1]=0;
}
if((y1==4)&&(x1<7)&&(chessboard[y1][x1]==PawnAL)&&(passpawnB[x1+1][game]==1)&&(x2==x1+1))
{
chessboard[y1][x1+1]=BoardL;
passpawnB[x1+1][game+1]=0;
}
if((y1==3)&&(x1>0)&&(chessboard[y1][x1]==PawnBL)&&(passpawnA[x1-1][game]==1)&&(x2==x1-1))
{
chessboard[y1][x1-1]=BoardL;
passpawnA[x1-1][game+1]=0;
}
if((y1==3)&&(x1<7)&&(chessboard[y1][x1]==PawnBL)&&(passpawnA[x1+1][game]==1)&&(x2==x1+1))
{
chessboard[y1][x1+1]=BoardL;
passpawnA[x1+1][game+1]=0;
}
chessboard[y2][x2]=chessboard[y1][x1];
chessboard[y1][x1]=BoardL;
return;
}
//清除chessboard上的所有poss
void re_chessboard()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if((chessboard[i][j]%2)==1)
chessboard[i][j]--;
}
}
return;
}
void re_flag()
{
int i,j;
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
flag[i][j]=0;
}
}
return;
}
//悔棋
void regret()
{
int j,k;
if(game>0)
{
game--;
turn();
for(j=0;j<8;j++)
{
for(k=0;k<8;k++)
chessboard[k][j]=record[k][j][game];
}
draw();
}
return;
}
//取消悔棋
void forward()
{
int j,k;
if(record[0][0][game+1]>-1)
{
game++;
turn();
for(j=0;j<8;j++)
{
for(k=0;k<8;k++)
chessboard[k][j]=record[k][j][game];
}
draw();
}
return;
}
//判读是否将死
void winner()
{
int i,j,k,l,m,n,o,p,live=0;//live用来判断王是否被将死,1为否,0为是;poss用来显示当前棋子能走几格
switch(term)
{
live=0;
case A:
show_enemy(B);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(flag[j][i]==0&&chessboard[j][i]==KingAL)
live=1;
if(flag[j][i]==1&&chessboard[j][i]==KingAL)//像素坐标(i,j)为王
{
re_flag();
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(IsA(i,j))
{
show_csquare(i,j);
for(k=0;k<8;k++)
{
for(l=0;l<8;l++)
{
show_csquare(i,j);
if(Isposs(k,l))
{
re_chessboard();
chessboard[l][k]=chessboard[j][i];
chessboard[j][i]=BoardL;
show_enemy(B);
for(o=0;o<8;o++)
{
for(p=0;p<8;p++)
{
if(chessboard[p][o]==KingAL&&flag[p][o]==0)
{
live=1;
goto end;
}
}
}
re_flag();
back_chessboard();
}
}
}
}
}
}
}
}
}
break;
case B:
show_enemy(A);
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(flag[j][i]==0&&chessboard[j][i]==KingBL)
live=1;
if(flag[j][i]==1&&chessboard[j][i]==KingBL)//像素坐标(i,j)为王
{
re_flag();
for(i=0;i<8;i++)
{
for(j=0;j<8;j++)
{
if(IsB(i,j))
{
show_csquare(i,j);
for(k=0;k<8;k++)
{
for(l=0;l<8;l++)
{
show_csquare(i,j);
if(Isposs(k,l))
{
re_chessboard();
chessboard[l][k]=chessboard[j][i];
chessboard[j][i]=BoardL;
show_enemy(A);
for(o=0;o<8;o++)
{
for(p=0;p<8;p++)
{
if(chessboard[p][o]==KingBL&&flag[p][o]==0)
{
live=1;
goto end;
}
}
}
re_flag();
back_chessboard();
}
}
}
}
}
}
}
}
}
break;
}
re_flag();
end:
if(!live)
{
if(term==A)
{
show_enemy(B);
ending=1;
}
else
{
show_enemy(A);
ending=2;
}
}
re_flag();
back_chessboard();
return;
}