自己写的玩的一个小程序,运行的时候出问题了,这是为什么啊?
将twopeople()函数改成主函数单独执行时不会出错,但是改成函数,用switch结构就出错#include<stdio.h>
void main()
{
void computer();
void twopeople();
int i=0;
while(i!=3)
{
printf("*1为人机对战\n2*为双人对战\n3*退出游戏\n");
printf("请选择:");
scanf("%d",&i);
switch(i)
{
case 1:computer();break;
case 2:twopeople();break;
case 3:break;
default :printf("输入错误\n");break;
}
}
}
void twopeople()
{
void printf_bg(char a[2],char b[2],int yx_h[100],int yx_b[100],int bz,int pd);//输出棋盘及棋子
void paixu(int x[100],int y);//将棋子坐标排序
void jilu();
int ifwin(int x[100],int bz);//判断是否有玩家已获胜 ,若有则返回1,没有则返回0
int yx_h[100]={0},yx_b[100]={0};
int x_1,y_1,bz=0,pd=0,i;
int hs=0,bs=0,yx;
char a[2],b[2];
char ab[2];
printf("输入两个中文字符作为两个玩家的名字(格式:甲乙):");
scanf("%c%c%c%c",&a[0],&a[1],&b[0],&b[1]);
printf("\n");
ab[0]=a[0];ab[1]=a[1];
printf_bg(a,b,yx_h,yx_b,bz,pd);//输出空白棋盘
while(hs!=1&&bs!=1)//判断是否有玩家已获胜,有则退出下子循环
{
printf("(%c%c)输入落子坐标(格式X,Y):",ab[0],ab[1]);
back: scanf("%d,%d",&x_1,&y_1);
printf("\n");
if(x_1>20||y_1>20)//判断是否超出棋盘范围
{
printf("输入错误,请重新输入(格式X,Y):");
goto back;
}
yx=y_1*100+x_1;
for(i=0;i<bz+1;i++)//判断此坐标是否已有棋子
{
if(yx==yx_h[i]||yx==yx_b[i])
{
printf("此处已下子,请重新输入:");
goto back;
}
}
if(pd==0)//两玩家轮流落子
{
yx_h[bz]=yx;
pd++;
}
else
{
yx_b[bz]=yx;
bz++;
pd=0;
}
if(pd==1)//若果pd为1,说明此时玩家一已下子,而bz并未加一,因此此时棋子数量应为bz+1
paixu(yx_h,bz+1);
else
paixu(yx_h,bz);
paixu(yx_b,bz);
printf_bg(a,b,yx_h,yx_b,bz,pd);//输出落子后的棋盘
if(pd==0)
hs=ifwin(yx_h,bz);
else
hs=ifwin(yx_h,bz+1);
bs=ifwin(yx_b,bz);
if(pd==0)
{
ab[0]=a[0];
ab[1]=a[1];
}
else
{
ab[0]=b[0];
ab[1]=b[1];
}
}
if(hs==1)
{
printf("%c%c 胜利\n",a[0],a[1]);
jilu();
}
else
{
printf("%c%c 胜利\n",b[0],b[1]);
jilu();
}
}
void paixu(int x[100],int y)
{
int i,j,k;
for(i=0;i<(y-1);i++)
for(j=0;j<(y-1);j++)
{
if(x[j]>x[j+1])
{
k=x[j];
x[j]=x[j+1];
x[j+1]=k;
}
}
}
void printf_bg(char a[2],char b[2],int yx_h[100],int yx_b[100],int bz,int pd)
{
int x_h[100]={0},y_h[100]={0},x_b[100]={0},y_b[100]={0};
int i,j,k=1,bz_p,i1=0,i2=0;
char as[2]={"十"};//用十组成棋盘经络线
if(pd==1)
bz_p=bz+1;
else
bz_p=bz;
for(i=0;i<bz_p;i++)
{
x_h[i]=yx_h[i]%100+1;
y_h[i]=yx_h[i]/100;
}
for(i=0;i<bz;i++)
{
x_b[i]=yx_b[i]%100+1;
y_b[i]=yx_b[i]/100;
}
printf("Y\n");
for(i=1;i<=20;i++)
{
for(j=1;j<=21;j++)//y坐标显示
{
if(j==1)
printf("%2d",k++);
else
printf("%c%c",as[0],as[1]);
if(i==y_h[i1]&&j==x_h[i1])//判断玩家一在此坐标是否有棋子
{
printf("\b\b%c%c",a[0],a[1]);
i1++;
}
if(i==y_b[i2]&&j==x_b[i2])//判断玩家二在此坐标是否有棋子
{
printf("\b\b%c%c",b[0],b[1]);
i2++;
}
}
printf("\n");
}
printf(" 一二三四五六七八九十一二三四五六七八九十X\n");//x坐标显示
}
int ifwin(int x[100],int bz)
{
int i,j,k,fh=0,i1,i2,i3;
int yx[21][21]={0};
for(i=0;i<bz;i++)//使用一个2维数组,将有棋子的位置写1
{
j=x[i]/100;
k=x[i]%100;
yx[j][k]=1;
}
for(i=0;i<bz;i++)
{
j=x[i]/100;
k=x[i]%100;
for(i1=j-4;i1<=j;i1++)//判断竖直方向是否有5个棋子连在一起
{
if(i1>0&&(i1+4)<21)
{
if(yx[i1][k]==1&&yx[i1+1][k]==1&&yx[i1+2][k]==1&&yx[i1+3][k]==1&&yx[i1+4][k]==1)
fh=1;
}
}
for(i1=k-4;i1<=k;i1++)//判断水平方向是否有5个棋子连在一起
{
if(i1>0&&(i1+4)<21)
{
if(yx[j][i1]==1&&yx[j][i1+1]==1&&yx[j][i1+2]==1&&yx[j][i1+3]==1&&yx[j][i1+4]==1)
fh=1;
}
}
for(i1=0;i1<5;i1++)//135°方向
{
i2=j-i1;i3=k-i1;
if(i2>0&&(i2+4)<21&&i3>0&&(i3+4)<21)
{
if(yx[i2][i3]==1&&yx[i2+1][i3+1]==1&&yx[i2+2][i3+2]==1&&yx[i2+3][i3+3]==1&&yx[i2+4][i3+4]==1)
fh=1;
}
}
for(i1=0;i1<5;i1++)//45°方向
{
i2=j-i1;i3=k+i1;
if(i2>0&&(i2+4)<21&&i3<21&&(i3-4)>0)
{
if(yx[i2][i3]==1&&yx[i2+1][i3-1]==1&&yx[i2+2][i3-2]==1&&yx[i2+3][i3-3]==1&&yx[i2+4][i3-4]==1)
fh=1;
}
}
}
return(fh);
}
void jilu()
{
}