| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 452 人关注过本帖
标题:自己写的玩的一个小程序,运行的时候出问题了,这是为什么啊?
只看楼主 加入收藏
lyjdyq
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-12-28
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:2 
自己写的玩的一个小程序,运行的时候出问题了,这是为什么啊?
将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()
{
}
搜索更多相关主题的帖子: twopeople computer default include 
2014-01-18 22:13
so_love
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:7
帖 子:812
专家分:4151
注 册:2013-11-25
收藏
得分:10 
应该注意一下你scanf读写的时候 会有一个"\n"    第一次执行switch的时候 应该不会有问题,第二次的时候就会出错了。   最好应该在scanf 后面加一个getchar()

一花一世界、一叶一追寻、片片花叶落、情系何人身。
2014-01-19 16:34
lyjdyq
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2013-12-28
收藏
得分:0 
回复 2楼 so_love
搞定了,谢了啊
2014-01-19 22:05
快速回复:自己写的玩的一个小程序,运行的时候出问题了,这是为什么啊?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020529 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved