!这是本人做的黑白棋,已经可以正常运行了,但是在“落子”是还有错误,比如:白棋在黑棋右边不能落子,黑棋斜向不能落子等等,希望各位大虾帮帮小弟,看看到底哪里错了阿,谢谢了先~~~
以下是源程序:
#include"graphics.h" /*图形系统头文件*/ #define LEFT 0x4b00 /*光标左键值*/ #define RIGHT 0x4d00 /*光标右键值*/ #define DOWN 0x5000 /*光标下键值*/ #define UP 0x4800 /*光标上键值*/ #define Esc 0x011b /*Esc键值*/ #define ENTER 0x01c0d /*回车键值*/ int a[8][8]={0},key,score1,score2; /*具体分数以及按键与存放棋子的变量*/ char playone[3],playtwo[3]; /*两个人的得分转换成字符串输出*/ void playtoplay(void); /*双人对战函数*/ void DrawBattle(void); /*画棋盘函数*/ void SetPlayColor(int x); /*设置棋子第一次的颜色*/ void MoveColor(int x,int y); /*恢复原来的棋盘状态*/ int BattleChange(int x,int y,int z); /*判断棋盘的变化*/ void DoScore(void); /*处理分数*/ void PrintScore(int n); /*输出成绩*/ void PrintWin(void); /*输出胜者信息*/
void main(void) /*主函数*/ { int gd=DETECT,gr; initgraph(&gd,&gr,"c:\\tc"); DrawBattle(); playtoplay(); getch(); closegraph(); }
void DrawBattle() /*画棋盘*/ { int i,j; score1=score2=0; setbkcolor(BLUE); for(i=100;i<=420;i+=40) { line(100,i,420,i); /*水平线*/ line(i,100,i,420); /*垂直线*/ } setcolor(0); setfillstyle(SOLID_FILL,15); fillellipse(500,200,15,15); setfillstyle(SOLID_FILL,8); fillellipse(500,300,15,15); a[3][3]=a[4][4]=1; /*初始白棋*/ a[3][4]=a[4][3]=2; /*初识黑棋*/ setfillstyle(SOLID_FILL,WHITE); fillellipse(120+3*40,120+3*40,15,15); fillellipse(120+4*40,120+4*40,15,15); setfillstyle(SOLID_FILL,8); fillellipse(120+3*40,120+4*40,15,15); fillellipse(120+4*40,120+3*40,15,15); score1=score2=2; DoScore(); }
void playtoplay() /*双人对战*/ { int x,y,t=1,i,j,cc=0; while(1) /*交换玩家*/ { x=120,y=80; /*棋子初始坐标*/ while(1) /*玩家走棋过程*/ { PrintScore(1); PrintScore(2); SetPlayColor(t); fillellipse(x,y,15,15); key=bioskey(0); if(key==Esc) /*退出游戏*/ break; else if(key==ENTER) /*回车下子*/ { if(y!=80&&a[(x-120)/40][(y-120)/40]!=1&&a[(x-120/40)][(y-120)/40]!=2) /*位置无棋子*/ { if(t%2==1) /*玩家1*/ a[(x-120)/40][(y-120)/40]=1; else /*玩家2*/ a[(x-120)/40][(y-120)/40]=2; if(!BattleChange(x,y,t)) { a[(x-120)/40][(y-120)/40]=0; /*恢复空格状态*/ cc++; /*统计尝试次数*/ if(cc>=64-score1-score2) /*尝试超过空格则停步*/ { MoveColor(x,y); fillellipse(x,y,15,15); break; } else continue; } DoScore(); break; /*因为棋盘变化交换玩家*/ } else continue; } else /*方向键判断*/ if(key==LEFT&&x>120) /*左键*/ { MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); x-=40; fillellipse(x,y,15,15); } else if(key==RIGHT&&x<400&&y>80) /*右键*/ { MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); x+=40; fillellipse(x,y,15,15); } else if(key==UP&&y>120) /*上键*/ { MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); y-=40; fillellipse(x,y,15,15); } else if(key==DOWN&&y<400) /*下键*/ { MoveColor(x,y); fillellipse(x,y,15,15); SetPlayColor(t); y+=40; fillellipse(x,y,15,15); } } if(key==Esc) break; if((score1+score2)==64||score1==0||score2==0) /*棋子已满或一方棋子为零*/ { PrintWin(); break; } t=t%2+1; /*一方下子后改变棋子颜色交换玩家*/ cc=0; /*计数清零*/ } /*endwhile*/ }
void SetPlayColor(int t) /*设置棋子颜色*/ { if(t%2==1) setfillstyle(SOLID_FILL,15); else setfillstyle(SOLID_FILL,8); }
void MoveColor(int x,int y) /*下子后恢复原来状态*/ { if(y<100) setfillstyle(SOLID_FILL,BLUE); else switch(a[(x-120)/40][(y-120)/40]) { case 1: /*恢复白子*/ setfillstyle(SOLID_FILL,15); break; case 2: /*恢复黑子*/ setfillstyle(SOLID_FILL,8); break; default: /*恢复棋盘*/ setfillstyle(SOLID_FILL,BLUE); } }
int BattleChange(int x,int y,int t) /*棋盘变化*/ { int i,j,k,kk,ii,jj,yes; yes=0; i=(x-120)/40; /*数组元素行下标*/ j=(y-120)/40; /*数组元素列下标*/ SetPlayColor(t); /*8个方向变化判断*/ if(j<6) /*右边*/ { for(k=j+1;k<8;k++) if(a[i][k]==a[i][j]||a[i][k]==0) /*遇自己棋子或空格结束*/ break; if(a[i][k]!=0&&k<8) { for(kk=j+1;kk<k&&k<8;kk++) /*判断*/ { a[i][kk]=a[i][j]; /*改变棋子颜色*/ fillellipse(120+i*40,120+kk*40,15,15); } if(kk!=j+1) yes=1; } } if(j>1) /*左边*/ { for(k=j-1;k>=0;k--) if(a[i][k]==a[i][j]||!a[i][k]) break; if(a[i][k]!=0&&k>=0) { for(kk=j-1;kk>k&&k>=0;kk--) { a[i][kk]=a[i][j]; fillellipse(120+i*40,120+kk*40,15,15); } if(kk!=j-1) yes=1; } } if(i<6) /*下边*/ { for(k=i+1;k<8;k++) if(a[k][j]==a[i][j]||!a[k][j]) break; if(a[k][j]!=0&&k<8) { for(kk=i+1;kk<k&&k<8;kk++) { a[kk][j]=a[i][j]; fillellipse(120+kk*40,120+j*40,15,15); } if(kk!=i+1) yes=1; } } if(i>1) /*上边*/ { for(k=i-1;k>=0;k++) if(a[k][j]==a[i][j]||!a[k][j]) break; if(a[k][j]!=0&&k>=0) { for(kk=i-1;kk>k&&k>=0;kk--) { a[kk][j]=a[i][j]; fillellipse(120+kk*40,120+j*40,15,15); } if(kk!=i-1) yes=1; } } if(i>1&&j<6) /*右上*/ { for(k=i-1,kk=j+1;k>=0&&kk<8;k--,kk++) if(a[k][kk]==a[i][j]||!a[k][kk]) break; if(a[k][kk]&&k>=0&&kk<8) { for(ii=i-1,jj=j+1;ii<k&&k>=0;ii--,jj++) { a[ii][jj]=a[i][j]; fillellipse(120+ii*40,120+jj*40,15,15); } if(ii!=i-1) yes=1; } } if(i<6&&j>1) /*左下*/ { for(k=i+1,kk=j-1;k<8&&kk>=0;k++,kk--) if(a[k][kk]==a[i][j]||!a[k][kk]) break; if(a[k][kk]!=0&&k<8&&kk>=0) { for(ii=i+1,jj=j-1;ii<k&&k<8;ii++,jj--) { a[ii][jj]=a[i][j]; fillellipse(120+ii*40,1020+jj*40,15,15); } if(ii!=i+1) yes=1; } } if(i>1&&j>1) /*左上*/ { for(k=i-1,kk=j-1;k>=0&&kk>=0;k--,kk--) if(a[k][kk]==a[i][j]||!a[k][kk]) break; if(a[k][kk]!=0&&k>=0&&kk>=0) { for(ii=i-1,jj=j-1;ii>k&&kk>=0;ii--,jj--) { a[ii][jj]=a[i][j]; fillellipse(120+ii*40,120+jj*40,15,15); } if(ii!=i-1) yes=1; } } if(i<6&&j<6) /*右下*/ { for(k=i+1,kk=j+1;k<8&&kk<8;k++,kk++) if(a[k][kk]==a[i][j]||!a[k][kk]) break; if(a[k][kk]!=0&&kk<8&&k<8) { for(ii=i+1,jj=j+1;ii<k&&k<8;ii++,jj++) { a[ii][jj]=a[i][j]; fillellipse(120+ii*40,120+jj*40,15,15); } if(ii!=i+1) yes=1; } } return yes; /*返回是否改变过棋子颜色的标记*/ }
void DoScore() /*处理分数*/ { int i,j; score1=score2=0; /*重新计分*/ for(i=0;i<8;i++) for(j=0;j<8;j++) if(a[i][j]==1) /*分别统计两个人的分数*/ score1++; else if(a[i][j]==2) score2++; }
void PrintScore(int playnum) /*输出成绩*/ { if(playnum==1) /*清除以前成绩*/ { setfillstyle(SOLID_FILL,BLUE); bar(550,100,640,400); } setcolor(RED); settextstyle(0,0,4); /*文本输出样式*/ if(playnum==1) /*判断棋手、输出位置*/ { sprintf(playone,"%d",score1); outtextxy(550,200,playone); } else { sprintf(playtwo,"%d",score2); outtextxy(550,300,playtwo); } setcolor(0); }
void PrintWin() /*输出胜者信息*/ { settextstyle(0,0,4); setcolor(12); if(score2>score1) /*判断最后结果*/ outtextxy(100,50,"black win!"); else if(score2<score1) outtextxy(100,50,"white win!"); else outtextxy(60,50,"you all win!"); }