问题描述
- 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 rowint lineint iint mode);
void turnwhite(char a[][10]int rowint lineint iint mode);
int canblack(char a[][10]int rowint lineint i[]);
int canwhite(char a[][10]int rowint lineint i[]);
int allblack(char a[][10]int rowint lineint iint mode);
int allwhite(char a[][10]int rowint lineint iint 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 Jn"");
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=0w=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("" nn黑方胜利nn"");
if(w>b) printf("" nn白方胜利nn"");
if(w==b) printf("" nn平局nn"");
}
int play(char a[][10]){
//行判断//列判断//斜判断 12
}
void black(char a[][10]){
int rowlinei[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(arowlinei)){
printf(""这里不行,因为规则要求必须反转至少一个n从新输入:"");
scanf(""%*c%d %c""&row&s);
row=row-1;
line=s-65;
}
if(canblack(arowlinei)==0){
a[row][line]='B';
}table(a);
}
void white(char a[][10]){
int rowlinei[2]={0};
char s;
printf(""n白方执棋n输入行,列:(注意顺序 先行!!! 后列!!! (列要大写!!!=v=))"");
scanf(""%d %c""&row&s);
row=row-1;
line=s-65;
while(canwhite(arowlinei)){
printf(""这里不行,因为规则要求必须反转至少一个n从新输入:"");
scanf(""%*c%d %c""&row&s);
row=row-1;
line=s-65;
}
if(canwhite(arowlinei)==0){
a[row][line]='W';
}table(a);
}
int canblack(char a[][10]int rowint lineint i[]){
int sum=row+line;
int can1=1can2=1can3=1can4=1;
for(i[1]=0;i[1] if(a[row][i[1]]=='B'&&((i[1]-line)>1||(i[1]-line)<-1)&&allwhite(arowlinei[1]i[0]))
{
turnblack(arowlinei[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(arowlinei[1]i[0]))
{
turnblack(arowlinei[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(arowlinei[1]i[0]))
{
turnblack(arowlinei[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(arowlinei[1]i[0]))
{
turnblack(arowlinei[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(arowlinei[1]i[0]))
{
turnblack(arowlinei[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(arowlinei[1]i[0]))
{
turnblack(arowlinei[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 rowint lineint i[]){
int sum=row+line;
int can1=1can2=1can3=1can4=1;
for(i[1]=0;i[1] if(a[row][i[1]]=='W'&&((i[1]-line)>1||(i[1]-line)<-1)&&allblack(arowlinei[1]i[0]))
{
turnwhite(arowlinei[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(arowlinei[1]i[0]))
{
turnwhite(arowlinei[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(arowlinei[1]i[0]))
{
turnwhite(arowlinei[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(arowlinei[1]i[0]))
{
turnwhite(arowlinei[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(arowlinei[1]i[0]))
{
turnwhite(arowlinei[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(arowlinei [1]i[0]))
{
turnwhite(arowlinei[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 rowint lineint iint mode){
int ret1=1ret2=1ret3=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 rowint lineint iint mode){
int ret1=1ret2=1ret3=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 rowint lineint iint 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 rowint lineint iint 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;
}
}
}
解决方案
啊我重发一遍...
#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 rowint lineint iint mode);
void turnwhite(char a[][10]int rowint lineint iint mode);
int canblack(char a[][10]int rowint lineint i[]);
int canwhite(char a[][10]int rowint lineint i[]);
int allblack(char a[][10]int rowint lineint iint mode);
int allwhite(char a[][10]int rowint lineint iint 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 Jn"");
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=0w=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("" nn黑方胜利nn"");
if(w>b) printf("" nn白方胜利nn"");
if(w==b) printf("" nn平局nn"");
}
int play(char a[][10]){
//行判断
//列判断//斜判断 12
}
void black(char a[][10]){
int rowlinei[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(arowlinei)){
printf(""这里不行,因为规则要求必须反转至少一个n从新输入:"");
scanf(""%*c%d %c""&row&s);
row=row-1;
line=s-65;
}
if(canblack(arowlinei)==0){
a[row][line]='B';
}
table(a);
}
void white(char a[][10]){
int rowlinei[2]={0};
char s;
printf(""n白方执棋n输入行,列:(注意顺序 先行!!! 后列!!! (列要大写!!!=v=))"");
scanf(""%d %c""&row&s);
row=row-1;
line=s-65;
while(canwhite(arowlinei)){
printf(""这里不行,因为规则要求必须反转至少一个n从新输入:"");
scanf(""%*c%d %c""&row&s);
row=row-1;
line=s-65;
}
if(canwhite(arowlinei)==0){
a[row][line]='W';
}
table(a);
}
int canblack(char a[][10]int rowint lineint i[]){
int sum=row+line;
int can1=1can2=1can3=1can4=1;
for(i[1]=0;i[1] if(a[row][i[1]]=='B'&&((i[1]-line)>1||(i[1]-line)<-1)&&allwhite(arowlinei[1]i[0]))
{
turnblack(arowlinei[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(arowlinei[1]i[0]))
{
turnblack(arowlinei[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(arowlinei[1]i[0]))
{
turnblack(arowlinei[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(arowlinei[1]i[0]))
{
turnblack(arowlinei[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(arowlinei[1]i[0]))
{
turnblack(arowlinei[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(arowlinei[1]i[0]))
{
turnblack(arowlinei[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 rowint lineint i[]){
int sum=row+line;
int can1=1can2=1can3=1can4=1;
for(i[1]=0;i[1] if(a[row][i[1]]=='W'&&((i[1]-line)>1||(i[1]-line)<-1)&&allblack(arowlinei[1]i[0]))
{
turnwhite(arowlinei[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(arowlinei[1]i[0]))
{
turnwhite(arowlinei[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(arowlinei[1]i[0]))
{
turnwhite(arowlinei[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(arowlinei[1]i[0]))
{
turnwhite(arowlinei[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(arowlinei[1]i[0]))
{
turnwhite(arowlinei[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(arowlinei [1]i[0]))
{
turnwhite(arowlinei[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 rowint lineint iint mode){
int ret1=1ret2=1ret3=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 rowint lineint iint mode){
int ret1=1ret2=1ret3=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 rowint lineint iint 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 rowint lineint iint 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;
}
}
}