开发工具-熊猫devc++
由于做象棋需要用到很多图形库函数的东西,所以使用EGE的图形库方便很多(熊猫devc++自带ege的图形库(#include
棋子走动规则已经完善
效果展示图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210308205923511.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUyMzQ3NTQw,si
ze_16,color_FFFFFF,t_70)
#include
#include
#include
#include
#include
PIMAGE rche,rma,rpao,rbing,rshi,rshuai,rxiang;
PIMAGE bche,bma,bpao,bbing,bshi,bshuai,bxiang;
int lenth=70;//单位长度
int k[5];
int b=1;//判断先后
int rwin,bwin; //判断输赢
int pan[10][9]={
{
-3,-4,-5,-6,-7,-6,-5,-4,-3},
{
0,0,0,0,0,0,0,0,0},
{
0,-2,0,0,0,0,0,-2,0},
{
-1,0,-1,0,-1,0,-1,0,-1},
{
0,0,0,0,0,0,0,0,0},
{
0,0,0,0,0,0,0,0,0},
{
1,0,1,0,1,0,1,0,1},
{
0,2,0,0,0,0,0,2,0},
{
0,0,0,0,0,0,0,0,0},
{
3,4,5,6,7,6,5,4,3}
};//定义棋盘里面每一个格子的类容;
//红色方 兵=1, 炮=2, 车=3, 马=4, 相=5, 士=6, 帅=7;
//黑色方 兵=-1,炮=-2,车=-3,马=-4,相=-5,士=-6,帅=-7;
void showline(); //画棋盘的线条
void showqizi();
void shubiao();
void zhanshi();
void ruler();
int main()
{
initgraph(13*lenth, 11*lenth ,0);
setbkcolor(YELLOW);
//cleardevice();
showline();
showqizi();
for(;;){
//zhanshi();
shubiao();
cleardevice();
showline();
ruler();
showqizi();
if(rwin==0){
//closegraph();
setbkcolor(YELLOW);
initgraph(10*lenth, 10*lenth);
setbkcolor(YELLOW);
xyprintf(5*lenth,5*lenth,"黑方胜利");
getch();
break;
}
if(bwin==0){
//closegraph();
setbkcolor(YELLOW);
initgraph(10*lenth, 10*lenth);
setbkcolor(YELLOW);
xyprintf(5*lenth,5*lenth,"红方胜利");
getch();
break;
}
}
}
void showline(){
int i=1,j=1;
for(;i<=9;i++){
setcolor(BLACK); //设置纵线条颜色
line(i*lenth,lenth,i*lenth,10*lenth);
}
for(;j<=10;j++){
setcolor(BLACK); //设置列线条颜色
line(lenth,j*lenth,9*lenth,j*lenth);
}
for(int w=2;w<9;w++){
setcolor(YELLOW);
line(w*lenth,5*lenth,w*lenth,6*lenth);
}
setcolor(BLACK);
line(4*lenth,1*lenth,6*lenth,3*lenth);
line(4*lenth,8*lenth,6*lenth,10*lenth);
line(6*lenth,1*lenth,4*lenth,3*lenth);
line(6*lenth,8*lenth,4*lenth,10*lenth);
line(0.9*lenth,0.9*lenth,9.1*lenth,0.9*lenth);
line(0.9*lenth,10.1*lenth,9.1*lenth,10.1*lenth);
line(0.9*lenth,0.9*lenth,0.9*lenth,10.1*lenth);
line(9.1*lenth,0.9*lenth,9.1*lenth,10.1*lenth);
}
void showqizi(){
int i=0,j=0;
rche=newimage(),rma=newimage(),rpao=newimage(),rbing=newimage(),rshi=newimage(),rshuai=newimage(),rxiang=newimage();
bche=newimage(),bma=newimage(),bpao=newimage(),bbing=newimage(),bshi=newimage(),bshuai=newimage(),bxiang=newimage();
getimage(rche,"3.png");
getimage(rma,"4.png");
getimage(rxiang,"5.png");
getimage(rshi,"6.png");
getimage(rshuai,"7.png");
getimage(rpao,"2.png");
getimage(rbing,"1.png");
getimage(bche,"-3.png");
getimage(bma,"-4.png");
getimage(bxiang,"-5.png");
getimage(bshi,"-6.png");
getimage(bshuai,"-7.png");
getimage(bpao,"-2.png");
getimage(bbing,"-1.png");
rwin=0;
bwin=0;
for(;i<=8;i++){
for(;j<=9;j++){
if(pan[j][i]==1){
putimage((0.5+i)*lenth,(0.5+j)*lenth,rbing);}
if(pan[j][i]==2){
putimage((0.5+i)*lenth,(0.5+j)*lenth,rpao);}
if(pan[j][i]==3){
putimage((0.5+i)*lenth,(0.5+j)*lenth,rche);}
if(pan[j][i]==4){
putimage((0.5+i)*lenth,(0.5+j)*lenth,rma);}
if(pan[j][i]==5){
putimage((0.5+i)*lenth,(0.5+j)*lenth,rxiang);}
if(pan[j][i]==6){
putimage((0.5+i)*lenth,(0.5+j)*lenth,rshi);}
if(pan[j][i]==7){
putimage((0.5+i)*lenth,(0.5+j)*lenth,rshuai);rwin=1;}
if(pan[j][i]==-1){
putimage((0.5+i)*lenth,(0.5+j)*lenth,bbing);}
if(pan[j][i]==-2){
putimage((0.5+i)*lenth,(0.5+j)*lenth,bpao);}
if(pan[j][i]==-3){
putimage((0.5+i)*lenth,(0.5+j)*lenth,bche);}
if(pan[j][i]==-4){
putimage((0.5+i)*lenth,(0.5+j)*lenth,bma);}
if(pan[j][i]==-5){
putimage((0.5+i)*lenth,(0.5+j)*lenth,bxiang);}
if(pan[j][i]==-6){
putimage((0.5+i)*lenth,(0.5+j)*lenth,bshi);}
if(pan[j][i]==-7){
putimage((0.5+i)*lenth,(0.5+j)*lenth,bshuai);bwin=1;}
}
j=0;
}
}
void shubiao(){
int flag=0,a=0;
int x2,y2,x1,y1;
int n11,n22,m11,m22;
double n1,n2,m1,m2;
for(;flag!=1;){
int x,y;
mouse_msg mso;
mousepos(&x,&y);
mso=getmouse();
if(mso.is_left() && mso.is_down()){
a+=2;
flag=1;
}
if(flag==1){
x1=x;y1=y;
n1=x1*1.0/lenth;
m1=y1*1.0/lenth;
n11=x1/lenth;
m11=y1/lenth;
n1=n1-n11;
m1=m1-m11;
if(n1>=0.5){
n11=n11+1;}
if(m1>=0.5){
m11=m11+1;}
k[a-1]=n11-1;
k[a]=m11-1;
flag=0;
//xyprintf(12*lenth,a*lenth,"%d %d",k[a-1],k[a]);
//xyprintf(12*lenth,a*lenth,"%d %d",n11,m11);
}
if(a==4){
flag=1;
}
}
}
void zhanshi(){
int i=0,j=0;
for(;i<=9;i++){
for(;j<=8;j++){
xyprintf(j*lenth+0.8*lenth,i*lenth+0.8*lenth," %d",pan[i][j]);
}
j=0;
}
}
void ruler(){
int change1,a;
//判断先后手
if(pan[k[2]][k[1]]==0)return;
if(pan[k[2]][k[1]]>0&&b==0){
xyprintf(11*lenth,5.5*lenth,"请黑棋下");
return;
}
if(pan[k[2]][k[1]]<0&&b==1){
xyprintf(11*lenth,5.5*lenth,"请红棋下");
return;
}
//判断车的走位
if(pan[k[2]][k[1]]==3){
if(pan[k[4]][k[3]]>0){
return;
}
if(k[4]!=k[2]&&k[1]!=k[3]){
return;
}
if(k[4]==k[2]){
if(k[3]>k[1]){
for(int i=k[1]+1;i<k[3];i++){
if(pan[k[4]][i]!=0){
return;
}
}
}
if(k[3]<k[1]){
for(int i=k[3]+1;i<k[1];i++){
if(pan[k[4]][i]!=0){
return;
}
}
}
}
if(k[3]==k[1]){
if(k[4]>k[2]){
for(int i=k[2]+1;i<k[4];i++){
if(pan[i][k[3]]!=0){
return;
}
}
}
if(k[4]<k[2]){
for(int i=k[4]+1;i<k[2];i++){
if(pan[i][k[3]]!=0){
return;
}
}
}
}
}
if(pan[k[2]][k[1]]==-3){
if(pan[k[4]][k[3]]<0){
return;
}
if(k[4]!=k[2]&&k[1]!=k[3]){
return;
}
if(k[4]==k[2]){
if(k[3]>k[1]){
for(int i=k[1]+1;i<k[3];i++){
if(pan[k[4]][i]!=0){
return;
}
}
}
if(k[3]<k[1]){
for(int i=k[3]+1;i<k[1];i++){
if(pan[k[4]][i]!=0){
return;
}
}
}
}
if(k[3]==k[1]){
if(k[4]>k[2]){
for(int i=k[2]+1;i<k[4];i++){
if(pan[k[i]][k[3]]!=0){
return;
}
}
}
if(k[3]>k[1]){
for(int i=k[1]+1;i<k[3];i++){
if(pan[k[i]][k[3]]!=0){
return;
}
}
}
}
}
//判断兵的走位
if(pan[k[2]][k[1]]==1){
if(pan[k[4]][k[3]]>0){
return;
}
if(k[2]>=5){
if(k[2]-1!=k[4]||k[1]!=k[3]){
return;
}
}
if(k[1]-k[3]>1||k[2]-k[4]>1||k[4]>k[2])return;
}
if(pan[k[2]][k[1]]==-1){
if(pan[k[4]][k[3]]<0){
return;
}
if(k[2]<=4){
if(k[2]+1!=k[4]||k[1]!=k[3]){
return;
}
}
if(k[3]-k[1]>1||k[4]-k[2]>1||k[2]>k[4])return;
}
int rrpao=0,bbpao=0;
//判断炮的走位
if(pan[k[2]][k[1]]==2){
if(pan[k[4]][k[3]]>0){
//不能吃有方棋子
return;
}
if(k[4]!=k[2]&&k[1]!=k[3]){
//只能直走
return;
}
if(k[4]==k[2]){
//如果在同一排
if(k[3]>k[1]){
for(int i=k[1]+1;i<k[3];i++){
if(pan[k[4]][i]!=0){
rrpao++;
}
}
}
if(k[3]<k[1]){
for(int i=k[3]+1;i<k[1];i++){
if(pan[k[4]][i]!=0){
rrpao++;
}
}
}
if(rrpao==0){
if(pan[k[4]][k[3]]<0)return;
}
if(rrpao==1&&pan[k[4]][k[3]]<0){
goto yes;
}
if(rrpao!=0){
return;
}
}
if(k[3]==k[1]){
//如果在同一列
if(k[4]>k[2]){
for(int i=k[2]+1;i<k[4];i++){
if(pan[i][k[3]]!=0){
rrpao++;
}
}
}
if(k[4]<k[2]){
for(int i=k[4]+1;i<k[2];i++){
if(pan[i][k[3]]!=0){
rrpao++;
}
}
}
if(rrpao==0){
if(pan[k[4]][k[3]]<0)return;
}
if(rrpao==1&&pan[k[4]][k[3]]<0){
goto yes;
}
if(rrpao!=0){
return;
}
}
}
if(pan[k[2]][k[1]]==-2){
if(pan[k[4]][k[3]]<0){
//不能吃有方棋子
return;
}
if(k[4]!=k[2]&&k[1]!=k[3]){
//只能直走
return;
}
if(k[4]==k[2]){
//如果在同一排
if(k[3]>k[1]){
for(int i=k[1]+1;i<k[3];i++){
if(pan[k[4]][i]!=0){
rrpao++;
}
}
}
if(k[3]<k[1]){
for(int i=k[3]+1;i<k[1];i++){
if(pan[k[4]][i]!=0){
rrpao++;
}
}
}
if(rrpao==0){
if(pan[k[4]][k[3]]>0)return;
}
if(rrpao==1&&pan[k[4]][k[3]]>0){
goto yes;
}
if(rrpao!=0){
return;
}
}
if(k[3]==k[1]){
//如果在同一列
if(k[4]>k[2]){
for(int i=k[2]+1;i<k[4];i++){
if(pan[i][k[3]]!=0){
rrpao++;
}
}
}
if(k[4]<k[2]){
for(int i=k[4]+1;i<k[2];i++){
if(pan[i][k[3]]!=0){
rrpao++;
}
}
}
if(rrpao==0){
if(pan[k[4]][k[3]]>0)return;
}
if(rrpao==1&&pan[k[4]][k[3]]>0){
goto yes;
}
if(rrpao!=0){
return;
}
}
}
//判断士的走位
if(pan[k[2]][k[1]]==6){
if(k[2]==8&&k[1]==4){
if(k[3]==3&&(k[4]==7||k[4]==9));
else if(k[3]==5&&(k[4]==7||k[4==9]));
else return;
}
if(k[2]==9||k[2]==7){
if(k[3]==4&&k[4]==8);
else return;
}
}
if(pan[k[2]][k[1]]==-6){
if(k[2]==1&&k[1]==4){
if(k[3]==3&&(k[4]==0||k[4]==2));
else if(k[3]==5&&(k[4]==0||k[4==2]));
else return;
}
if(k[2]==0||k[2]==2){
if(k[3]==4&&k[4]==1);
else return;
}
}
//判断马的走位
if(pan[k[2]][k[1]]==4||pan[k[2]][k[1]]==-4){
if(k[2]>k[4]&&k[2]-k[4]==2){
if(k[2]-k[4]==2&&(k[1]-k[3]==1||k[1]-k[3]==-1)){
if(pan[k[2]-1][k[1]]!=0)return;
}
else return;
}
else if(k[4]>k[2]&&k[2]-k[4]==-2){
if(k[2]-k[4]==-2&&(k[1]-k[3]==1||k[1]-k[3]==-1)){
if(pan[k[2]+1][k[1]]!=0)return;
}
else return;
}
else if(k[1]>k[3]&&k[1]-k[3]==2){
if(k[2]-k[4]==1||k[2]-k[4]==-1){
if(pan[k[2]][k[1]-1]!=0)return;
}
else return;
}
else if(k[1]<k[3]&&k[1]-k[3]==-2){
if(k[2]-k[4]==1||k[2]-k[4]==-1){
if(pan[k[2]][k[1]+1]!=0)return;
}
else return;
}
else return;
}
//判断相的走位
if(pan[k[2]][k[1]]==5||pan[k[2]][k[1]]==-5){
if((k[2]-k[4]==2||k[2]-k[4]==-2)&&(k[1]-k[3]==2||k[1]-k[3]==-2)){
if(pan[(k[2]+k[4])/2][(k[1]+k[3])/2]!=0)return;
if(k[2]>=5){
if(k[4]<5)return;
}
if(k[2]<=4){
if(k[4]>4)return;
}
}
else return;
}
//判断将的走位
if(pan[k[2]][k[1]]==7||pan[k[2]][k[1]]==-7){
if(k[4]>=3&&k[4]<=6)return;
if(k[3]>=6||k[3]<=2)return;
if(k[3]!=k[1]&&k[4]!=k[2])return;
if(abs(k[3]-k[1])>1||abs(k[4]-k[2])>1)return;
}
//判断红黑吃的情况
yes:if((pan[k[2]][k[1]]>0&&pan[k[4]][k[3]]>0)||(pan[k[2]][k[1]]<0&&pan[k[4]][k[3]]<0))return;
if(pan[k[2]][k[1]]>0&&pan[k[4]][k[3]]<0){
pan[k[4]][k[3]]=0;
}
if(pan[k[2]][k[1]]<0&&pan[k[4]][k[3]]>0){
pan[k[4]][k[3]]=0;
}
change1=pan[k[4]][k[3]];
pan[k[4]][k[3]]=pan[k[2]][k[1]];
pan[k[2]][k[1]]=change1;
if(pan[k[4]][k[3]]>0)b=0;
if(pan[k[4]][k[3]]<0)b=1;
}