2 wangxianrez wangxianrez 于 2014.12.09 21:32 提问

C语言编写黑白棋小游戏= =BUG咋回事

#include
void black(char a[][10]);
void white(char a[][10]);
void victory(char a[][10]);
//int play(char a[][10]);
void table(char a[][10]);
void turnblack(char a[][10],int row,int line,int i,int mode);
void turnwhite(char a[][10],int row,int line,int i,int mode);
int canblack(char a[][10],int row,int line,int i[]);
int canwhite(char a[][10],int row,int line,int i[]);
int allblack(char a[][10],int row,int line,int i,int mode);
int allwhite(char a[][10],int row,int line,int i,int mode);
void mirror(char a[][10]);
int main()
{
int i;
char a[10][10];
for (i=0;i for(int k=0;k a[i][k]='o';
}
}
a[4][5]=a[5][4]='B';
a[4][4]=a[5][5]='W';
table(a);
for(i=0;i // if(!play(a)) break;
if(i%2==0) black(a);
else white(a);
}
victory(a);
}
//----------------------------------------------------------------------------------------------------------
void table(char a[][10]){
printf("X A B C D E F G H I J\n");
for(int i=0;i printf("%-d",i+1);
for(int k=0;k printf("%3c",a[i][k]);
}
puts("\n");
}
printf("10 %c",a[9][0]);
for(int k=1;k printf("%3c",a[9][k]);
}
void victory(char a[][10]){
int b=0,w=0;
for(int i=0;i for(int k=0;k if(a[i][k]=='B') b++;
if(a[i][k]=='W') w++;
}
}
if(b>w) printf(" \n\n黑方胜利\n\n");
if(w>b) printf(" \n\n白方胜利\n\n");
if(w==b) printf(" \n\n平局\n\n");
}
int play(char a[][10]){
//行判断

//列判断

//斜判断 1,2

}
void black(char a[][10]){
int row,line,i[2]={0};//斜判断 1中i[1]表示着开始的row i[0]表示mode;
char s;
printf("\n黑方执棋\n输入行,列:(注意顺序 先行!!! 后列!!! (列要大写!!!=v=))");
scanf("%d %c",&row,&s);
row=row-1;
line=s-65;
while(canblack(a,row,line,i)){
printf("这里不行,因为规则要求必须反转至少一个\n从新输入:");
scanf("%*c%d %c",&row,&s);
row=row-1;
line=s-65;
}
if(canblack(a,row,line,i)==0){
a[row][line]='B';
}

table(a);

}
void white(char a[][10]){
int row,line,i[2]={0};
char s;
printf("\n白方执棋\n输入行,列:(注意顺序 先行!!! 后列!!! (列要大写!!!=v=))");
scanf("%d %c",&row,&s);
row=row-1;
line=s-65;
while(canwhite(a,row,line,i)){
printf("这里不行,因为规则要求必须反转至少一个\n从新输入:");
scanf("%*c%d %c",&row,&s);
row=row-1;
line=s-65;
}
if(canwhite(a,row,line,i)==0){
a[row][line]='W';
}

table(a);

}
int canblack(char a[][10],int row,int line,int i[]){
int sum=row+line;
int can1=1,can2=1,can3=1,can4=1;
for(i[1]=0;i[1] if(a[row][i[1]]=='B'&&((i[1]-line)>1||(i[1]-line)<-1)&&allwhite(a,row,line,i[1],i[0]))
{
turnblack(a,row,line,i[1],i[0]);
can1=0;
}
}

i[0]=1;
for(i[1]=0;i[1] if(a[i[1]][line]=='B'&&((i[1]-row)>1||(i[1]-row)<-1)&&allwhite(a,row,line,i[1],i[0]))
{
turnblack(a,row,line,i[1],i[0]);
can2=0;
}
}

i[0]=2;
if(sum>9)
{
for(i[1]=9;i[1]>=sum-9;i[1]--){
if(a[i[1]][sum-i[1]]=='B'&&((i[1]-row)>1||(i[1]-row)<-1)&&allwhite(a,row,line,i[1],i[0]))
{
turnblack(a,row,line,i[1],i[0]);
can3=0;
}
}
}
if(sum<=9){
for(i[1]=0;i[1]<=sum;i[1]++){ //斜判断 1 ; sum<=9时 i[1]表示着开始的row它的line可以由sum-row得出 ;
if(a[i[1]][sum-i[1]]=='B'&&((i[1]-row)>1||(i[1]-row)<-1)&&allwhite(a,row,line,i[1],i[0]))
{
turnblack(a,row,line,i[1],i[0]);
can3=0;
}
}
}
i[0]=2;//mode在mirror之后和斜判断1相同;都是2;
mirror(a);//之后与斜判断1类似注意将sum的值改变 ;
row=9-row;//镜面之后的row';
sum=line+row;//镜面之后的sum';
if(sum>9)
{
for(i[1]=9;i[1]>=sum-9;i[1]--){
if(a[i[1]][sum-i[1]]=='B'&&((i[1]-row)>1||(i[1]-row)<-1)&&allwhite(a,row,line,i[1],i[0]))
{
turnblack(a,row,line,i[1],i[0]);
can4=0;
}
}
}
if(sum<=9){
for(i[1]=0;i[1]<=sum;i[1]++){ //斜判断 1 ; sum<=9时 i[1]表示着开始的row它的line可以由sum-row得出 ;
if(a[i[1]][sum-i[1]]=='B'&&((i[1]-row)>1||(i[1]-row)<-1)&&allwhite(a,row,line,i[1],i[0]))
{
turnblack(a,row,line,i[1],i[0]);
can4=0;
}
}
}//和斜判断1相同了;
mirror(a);//进行两次镜面反转;将a又转回来 ;
if(can1==0||can2==0||can3==0||can4==0) return 0;
else return 1;//如果有一个可以进行的话就终止black里的while循环 ;*/
}
int canwhite(char a[][10],int row,int line,int i[]){
int sum=row+line;
int can1=1,can2=1,can3=1,can4=1;
for(i[1]=0;i[1] if(a[row][i[1]]=='W'&&((i[1]-line)>1||(i[1]-line)<-1)&&allblack(a,row,line,i[1],i[0]))
{
turnwhite(a,row,line,i[1],i[0]);
can1=0;
}
}

i[0]=1;
for(i[1]=0;i[1] if(a[i[1]][line]=='W'&&((i[1]-row)>1||(i[1]-row)<-1)&&allblack(a,row,line,i[1],i[0]))
{
turnwhite(a,row,line,i[1],i[0]);
can2=0;
}
}

i[0]=2;
if(sum>9)
{
for(i[1]=9;i[1]>=sum-9;i[1]--){
if(a[i[1]][sum-i[1]]=='W'&&((i[1]-row)>1||(i[1]-row)<-1)&&allblack(a,row,line,i[1],i[0]))
{
turnwhite(a,row,line,i[1],i[0]);
can3=0;
}
}
}
if(sum<=9){
for(i[1]=0;i[1]<=sum;i[1]++){ //斜判断 1 ; sum<=9时 i[1]表示着开始的row它的line可以由sum-row得出 ;
if(a[i[1]][sum-i[1]]=='W'&&((i[1]-row)>1||(i[1]-row)<-1)&&allblack(a,row,line,i[1],i[0]))
{
turnwhite(a,row,line,i[1],i[0]);
can3=0;
}
}
}
i[0]=2;//mode在mirror之后和斜判断1相同;
mirror(a);
row=9-row;//镜面之后的row';
sum=line+row;//镜面之后的sum';
if(sum>9)
{
for(i[1]=9;i[1]>=sum-9;i[1]--){//sum-9表示的是到line头的row;
if(a[i[1]][sum-i[1]]=='W'&&((i[1]-row)>1||(i[1]-row)<-1)&&allblack(a,row,line,i[1],i[0]))
{
turnwhite(a,row,line,i[1],i[0]);
can4=0;
}
}
}
if(sum<=9){
for(i[1]=0;i[1]<=sum;i[1]++){ //斜判断 1 ; sum<=9时 i[1]表示着开始的row它的line可以由sum-row得出 ;
if(a[i[1]][sum-i[1]]=='W'&&((i[1]-row)>1||(i[1]-row)<-1)&&allblack(a,row,line,i [1],i[0]))
{
turnwhite(a,row,line,i[1],i[0]);
can4=0;
}
}
}
mirror(a);//将a转回来;
if(can1==0||can2==0||can3==0||can4==0) return 0;
else return 1;//如果有一个可以进行的话就终止white里的while循环 ;
}
int allwhite(char a[][10],int row,int line,int i,int mode){
int ret1=1,ret2=1,ret3=1;
int trs;
if(mode==0){
if(line<i){
trs=i;
i=line;
line=trs;

}
for(int k=i+1;k<line;k++){
if(a[row][k]!='W')//行上在i+1到line-1判断是不是全是白色的;
{
ret1=0;break;
}
}
}
if(mode==1){
if(row<i){
trs=i;
i=line;
line=trs;

}
for(int k=i+1;k<row;k++){
if(a[k][line]!='W') //列上在i+1到row-1判断是不是全是白色的;
{
ret2=0;break;
}
}
}
if(mode==2){
if(row<i){
trs=i;
i=line;
line=trs;

}
for(int k=i+1;k<line;k++){//i表示的是开始的row?
if(a[k][row+line-k]!='W'){
ret3=0;break;
}

    } 
}
if(ret1==0||ret2==0||ret3==0)   return 0;//在canblack里面,mode决定了ret的序号;allwhite只进行了一个if;有一个为0就说明不是allwhite; 
else return 1;

}
int allblack(char a[][10],int row,int line,int i,int mode){
int ret1=1,ret2=1,ret3=1;
int trs;
if(mode==0){
if(line<i){
trs=i;
i=line;
line=trs;

}
for(int k=i+1;k<line;k++){
if(a[row][k]!='B')//行上在i+1到line-1判断是不是全是白色的;
{
ret1=0;break;
}
}
}
if(mode==1){
if(row<i){
trs=i;
i=line;
line=trs;

}
for(int k=i+1;k<row;k++){
if(a[k][line]!='B') //列上在i+1到row-1判断是不是全是白色的;
{
ret2=0;break;
}
}
}
if(mode==2){
if(row<i){
trs=i;
i=line;
line=trs;

}
for(int k=i+1;k<line;k++){//i表示的是开始的row
if(a[k][row+line-k]!='B'){
ret3=0;break;
}

    } 
}
if(ret1==0||ret2==0||ret3==0)   return 0;//在canblack里面,mode决定了ret的序号;allwhite只进行了一个if;有一个为0就说明不是allwhite; 
else return 1;

}
void turnblack(char a[][10],int row,int line,int i,int mode){///////这里注意i和line,row的大小 i int trs;//交换
if(i>row){
trs=i;
i=row;
row=trs;
}
if(i>line){
trs=i;
i=line;
line=trs;
}//因为只能有一个row||line进入函数; 只用一个trs;这里无所谓;
if(mode==0)//行中的翻转 从i+1到line-1;
{
for(int k=i+1;k a[row][k]='B';
}
}
if(mode==1)//列中的翻转 从i+1到row+1;
{
for(int k=i+1;k a[k][line]='B';
}
}
if(mode==2)//斜着的翻转1
{
for(int k=i+1;k a[k][row+line-k]='B';
}
}
}
void turnwhite(char a[][10],int row,int line,int i,int mode){//这里注意i和line,row的大小 i int trs;//交换
if(i>row){
trs=i;
i=row;
row=trs;
}
if(i>line){
trs=i;
i=line;
line=trs;
}//因为只能有一个row||line进入函数; 只用一个trs;这里无所谓;
if(mode==0)//行中的翻转 从i+1到line-1;
{
for(int k=i+1;k<line;k++){
a[row][k]='W';
}
}
if(mode==1)//列中的翻转 从i+1到row+1;
{
for(int k=i+1;k<row;k++){
a[k][line]='W';
}
}
if(mode==2)//斜着的翻转1
{
for(int k=i+1;k<row;k++){
a[k][row+line-k]='W';
}
}
}
void mirror(char a[][10]){
int trs;
for(int k=0;k<10;k++){//镜面反转的行;
for(int i=0;i<10;i++){//镜面反转的列 i与9-i进行交换;
trs=a[k][i];
a[k][i]=a[k][9-i];
a[k][9-i]=trs;
}
}
}

1个回答

wangxianrez
wangxianrez   2014.12.09 21:35

啊我重发一遍...
#include
void black(char a[][10]);
void white(char a[][10]);
void victory(char a[][10]);
//int play(char a[][10]);
void table(char a[][10]);
void turnblack(char a[][10],int row,int line,int i,int mode);
void turnwhite(char a[][10],int row,int line,int i,int mode);
int canblack(char a[][10],int row,int line,int i[]);
int canwhite(char a[][10],int row,int line,int i[]);
int allblack(char a[][10],int row,int line,int i,int mode);
int allwhite(char a[][10],int row,int line,int i,int mode);
void mirror(char a[][10]);
int main()
{
int i;
char a[10][10];
for (i=0;i for(int k=0;k a[i][k]='o';
}
}
a[4][5]=a[5][4]='B';
a[4][4]=a[5][5]='W';
table(a);
for(i=0;i // if(!play(a)) break;
if(i%2==0) black(a);
else white(a);
}
victory(a);
}
//----------------------------------------------------------------------------------------------------------
void table(char a[][10]){
printf("X A B C D E F G H I J\n");
for(int i=0;i printf("%-d",i+1);
for(int k=0;k printf("%3c",a[i][k]);
}
puts("\n");
}
printf("10 %c",a[9][0]);
for(int k=1;k printf("%3c",a[9][k]);
}
void victory(char a[][10]){
int b=0,w=0;
for(int i=0;i for(int k=0;k if(a[i][k]=='B') b++;
if(a[i][k]=='W') w++;
}
}
if(b>w) printf(" \n\n黑方胜利\n\n");
if(w>b) printf(" \n\n白方胜利\n\n");
if(w==b) printf(" \n\n平局\n\n");
}
int play(char a[][10]){
//行判断

//列判断

//斜判断 1,2

}
void black(char a[][10]){
int row,line,i[2]={0};//斜判断 1中i[1]表示着开始的row i[0]表示mode;
char s;
printf("\n黑方执棋\n输入行,列:(注意顺序 先行!!! 后列!!! (列要大写!!!=v=))");
scanf("%d %c",&row,&s);
row=row-1;
line=s-65;
while(canblack(a,row,line,i)){
printf("这里不行,因为规则要求必须反转至少一个\n从新输入:");
scanf("%*c%d %c",&row,&s);
row=row-1;
line=s-65;
}
if(canblack(a,row,line,i)==0){
a[row][line]='B';
}

table(a);

}
void white(char a[][10]){
int row,line,i[2]={0};
char s;
printf("\n白方执棋\n输入行,列:(注意顺序 先行!!! 后列!!! (列要大写!!!=v=))");
scanf("%d %c",&row,&s);
row=row-1;
line=s-65;
while(canwhite(a,row,line,i)){
printf("这里不行,因为规则要求必须反转至少一个\n从新输入:");
scanf("%*c%d %c",&row,&s);
row=row-1;
line=s-65;
}
if(canwhite(a,row,line,i)==0){
a[row][line]='W';
}

table(a);

}
int canblack(char a[][10],int row,int line,int i[]){
int sum=row+line;
int can1=1,can2=1,can3=1,can4=1;
for(i[1]=0;i[1] if(a[row][i[1]]=='B'&&((i[1]-line)>1||(i[1]-line)<-1)&&allwhite(a,row,line,i[1],i[0]))
{
turnblack(a,row,line,i[1],i[0]);
can1=0;
}
}

i[0]=1;
for(i[1]=0;i[1] if(a[i[1]][line]=='B'&&((i[1]-row)>1||(i[1]-row)<-1)&&allwhite(a,row,line,i[1],i[0]))
{
turnblack(a,row,line,i[1],i[0]);
can2=0;
}
}

i[0]=2;
if(sum>9)
{
for(i[1]=9;i[1]>=sum-9;i[1]--){
if(a[i[1]][sum-i[1]]=='B'&&((i[1]-row)>1||(i[1]-row)<-1)&&allwhite(a,row,line,i[1],i[0]))
{
turnblack(a,row,line,i[1],i[0]);
can3=0;
}
}
}
if(sum<=9){
for(i[1]=0;i[1]<=sum;i[1]++){ //斜判断 1 ; sum<=9时 i[1]表示着开始的row它的line可以由sum-row得出 ;
if(a[i[1]][sum-i[1]]=='B'&&((i[1]-row)>1||(i[1]-row)<-1)&&allwhite(a,row,line,i[1],i[0]))
{
turnblack(a,row,line,i[1],i[0]);
can3=0;
}
}
}
i[0]=2;//mode在mirror之后和斜判断1相同;都是2;
mirror(a);//之后与斜判断1类似注意将sum的值改变 ;
row=9-row;//镜面之后的row';
sum=line+row;//镜面之后的sum';
if(sum>9)
{
for(i[1]=9;i[1]>=sum-9;i[1]--){
if(a[i[1]][sum-i[1]]=='B'&&((i[1]-row)>1||(i[1]-row)<-1)&&allwhite(a,row,line,i[1],i[0]))
{
turnblack(a,row,line,i[1],i[0]);
can4=0;
}
}
}
if(sum<=9){
for(i[1]=0;i[1]<=sum;i[1]++){ //斜判断 1 ; sum<=9时 i[1]表示着开始的row它的line可以由sum-row得出 ;
if(a[i[1]][sum-i[1]]=='B'&&((i[1]-row)>1||(i[1]-row)<-1)&&allwhite(a,row,line,i[1],i[0]))
{
turnblack(a,row,line,i[1],i[0]);
can4=0;
}
}
}//和斜判断1相同了;
mirror(a);//进行两次镜面反转;将a又转回来 ;
if(can1==0||can2==0||can3==0||can4==0) return 0;
else return 1;//如果有一个可以进行的话就终止black里的while循环 ;*/
}
int canwhite(char a[][10],int row,int line,int i[]){
int sum=row+line;
int can1=1,can2=1,can3=1,can4=1;
for(i[1]=0;i[1] if(a[row][i[1]]=='W'&&((i[1]-line)>1||(i[1]-line)<-1)&&allblack(a,row,line,i[1],i[0]))
{
turnwhite(a,row,line,i[1],i[0]);
can1=0;
}
}

i[0]=1;
for(i[1]=0;i[1] if(a[i[1]][line]=='W'&&((i[1]-row)>1||(i[1]-row)<-1)&&allblack(a,row,line,i[1],i[0]))
{
turnwhite(a,row,line,i[1],i[0]);
can2=0;
}
}

i[0]=2;
if(sum>9)
{
for(i[1]=9;i[1]>=sum-9;i[1]--){
if(a[i[1]][sum-i[1]]=='W'&&((i[1]-row)>1||(i[1]-row)<-1)&&allblack(a,row,line,i[1],i[0]))
{
turnwhite(a,row,line,i[1],i[0]);
can3=0;
}
}
}
if(sum<=9){
for(i[1]=0;i[1]<=sum;i[1]++){ //斜判断 1 ; sum<=9时 i[1]表示着开始的row它的line可以由sum-row得出 ;
if(a[i[1]][sum-i[1]]=='W'&&((i[1]-row)>1||(i[1]-row)<-1)&&allblack(a,row,line,i[1],i[0]))
{
turnwhite(a,row,line,i[1],i[0]);
can3=0;
}
}
}
i[0]=2;//mode在mirror之后和斜判断1相同;
mirror(a);
row=9-row;//镜面之后的row';
sum=line+row;//镜面之后的sum';
if(sum>9)
{
for(i[1]=9;i[1]>=sum-9;i[1]--){//sum-9表示的是到line头的row;
if(a[i[1]][sum-i[1]]=='W'&&((i[1]-row)>1||(i[1]-row)<-1)&&allblack(a,row,line,i[1],i[0]))
{
turnwhite(a,row,line,i[1],i[0]);
can4=0;
}
}
}
if(sum<=9){
for(i[1]=0;i[1]<=sum;i[1]++){ //斜判断 1 ; sum<=9时 i[1]表示着开始的row它的line可以由sum-row得出 ;
if(a[i[1]][sum-i[1]]=='W'&&((i[1]-row)>1||(i[1]-row)<-1)&&allblack(a,row,line,i [1],i[0]))
{
turnwhite(a,row,line,i[1],i[0]);
can4=0;
}
}
}
mirror(a);//将a转回来;
if(can1==0||can2==0||can3==0||can4==0) return 0;
else return 1;//如果有一个可以进行的话就终止white里的while循环 ;
}
int allwhite(char a[][10],int row,int line,int i,int mode){
int ret1=1,ret2=1,ret3=1;
int trs;
if(mode==0){
if(line<i){
trs=i;
i=line;
line=trs;

}
for(int k=i+1;k<line;k++){
if(a[row][k]!='W')//行上在i+1到line-1判断是不是全是白色的;
{
ret1=0;break;
}
}
}
if(mode==1){
if(row<i){
trs=i;
i=line;
line=trs;

}
for(int k=i+1;k<row;k++){
if(a[k][line]!='W') //列上在i+1到row-1判断是不是全是白色的;
{
ret2=0;break;
}
}
}
if(mode==2){
if(row<i){
trs=i;
i=line;
line=trs;

}
for(int k=i+1;k<line;k++){//i表示的是开始的row?
if(a[k][row+line-k]!='W'){
ret3=0;break;
}

    } 
}
if(ret1==0||ret2==0||ret3==0)   return 0;//在canblack里面,mode决定了ret的序号;allwhite只进行了一个if;有一个为0就说明不是allwhite; 
else return 1;

}
int allblack(char a[][10],int row,int line,int i,int mode){
int ret1=1,ret2=1,ret3=1;
int trs;
if(mode==0){
if(line<i){
trs=i;
i=line;
line=trs;

}
for(int k=i+1;k<line;k++){
if(a[row][k]!='B')//行上在i+1到line-1判断是不是全是白色的;
{
ret1=0;break;
}
}
}
if(mode==1){
if(row<i){
trs=i;
i=line;
line=trs;

}
for(int k=i+1;k<row;k++){
if(a[k][line]!='B') //列上在i+1到row-1判断是不是全是白色的;
{
ret2=0;break;
}
}
}
if(mode==2){
if(row<i){
trs=i;
i=line;
line=trs;

}
for(int k=i+1;k<line;k++){//i表示的是开始的row
if(a[k][row+line-k]!='B'){
ret3=0;break;
}

    } 
}
if(ret1==0||ret2==0||ret3==0)   return 0;//在canblack里面,mode决定了ret的序号;allwhite只进行了一个if;有一个为0就说明不是allwhite; 
else return 1;

}
void turnblack(char a[][10],int row,int line,int i,int mode){///////这里注意i和line,row的大小 i int trs;//交换
if(i>row){
trs=i;
i=row;
row=trs;
}
if(i>line){
trs=i;
i=line;
line=trs;
}//因为只能有一个row||line进入函数; 只用一个trs;这里无所谓;
if(mode==0)//行中的翻转 从i+1到line-1;
{
for(int k=i+1;k a[row][k]='B';
}
}
if(mode==1)//列中的翻转 从i+1到row+1;
{
for(int k=i+1;k a[k][line]='B';
}
}
if(mode==2)//斜着的翻转1
{
for(int k=i+1;k a[k][row+line-k]='B';
}
}
}
void turnwhite(char a[][10],int row,int line,int i,int mode){//这里注意i和line,row的大小 i int trs;//交换
if(i>row){
trs=i;
i=row;
row=trs;
}
if(i>line){
trs=i;
i=line;
line=trs;
}//因为只能有一个row||line进入函数; 只用一个trs;这里无所谓;
if(mode==0)//行中的翻转 从i+1到line-1;
{
for(int k=i+1;k<line;k++){
a[row][k]='W';
}
}
if(mode==1)//列中的翻转 从i+1到row+1;
{
for(int k=i+1;k<row;k++){
a[k][line]='W';
}
}
if(mode==2)//斜着的翻转1
{
for(int k=i+1;k<row;k++){
a[k][row+line-k]='W';
}
}
}
void mirror(char a[][10]){
int trs;
for(int k=0;k<10;k++){//镜面反转的行;
for(int i=0;i<10;i++){//镜面反转的列 i与9-i进行交换;
trs=a[k][i];
a[k][i]=a[k][9-i];
a[k][9-i]=trs;
}
}
}

wangxianrez
wangxianrez 回复zxh707wk: 可以的=-=
大约 3 年之前 回复
zxh707wk
zxh707wk 这代码能编译通过?
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!