| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1607 人关注过本帖
标题:扫雷代码出问题了,求修改
只看楼主 加入收藏
S酱紫
Rank: 2
等 级:论坛游民
威 望:3
帖 子:25
专家分:20
注 册:2019-1-2
结帖率:100%
收藏
 问题点数:0 回复次数:2 
扫雷代码出问题了,求修改
程序代码:
#include"stdio.h"
#include"stdlib.h"
#include"time.h"

int i,j,mi;
int x,y;
int mineNumber;
char showchar;
int flagn;
int flagrealnum=10;
int flagnum=10;
//定义数据
int mineXY(void);
int mine(int);
int numberMould(void);
int deSame(int);
int showMould(void);
int showFirst(void);
int OneOrZero(void);
int open(void);
int clean(void);
int flag(void);
int check(void);
int scanfMould(void);
int openone(void);
int openzero(void);
//定义函数
int mineX[11];
int mineY[11];
int number[12][12];
int nonmine[11];
char show[12][12];
int onezero[12][12];
int flagXY[12][12];
//定义数组

int mine(int mi)
{
    mi=rand()%(100);
    return mi;
}
//随机数生成

int deSame(mineNumber)
{
    nonmine[i]=mine(mi);
    for(j=i-1;j>=1;j--)
    {
        if(nonmine[i]==nonmine[j])
        {
            i--;
            mineNumber=0;
            break;
        }
        if(j==1)
        {
            mineNumber=nonmine[i];
        }
    }
    return mineNumber;
}
//排除重复雷

int mineXY(void)
{

    for (i=1;i<=10;i++)
    {
        mineX[i]=deSame(mineNumber);
        mineY[i]=mineX[i]/10+1;
        mineX[i]=mineX[i]%10+1;
    }
}
    //以上生成雷坐标

int numberMould(void)
{
    for(y=1;y<=10;y++)
    {
       for(x=1;x<=10;x++)
       {
          number[x][y]=0;
       }
    }

   for(i=1;i<=10;i++)
   {
       x=mineX[i];
       y=mineY[i];
       for(int a=-1;a<=1;a++)
       {
         for(int b=-1;b<=1;b++)
         {
            number[x+a][y+b]+=1;
         }
       }
    }
                
   for(i=1;i<=10;i++)
   {
       x=mineX[i];
       y=mineY[i];
       number[x][y]=9;
   }            
    
}
//数字模板数字设置

int showFirst(void)
{
    for(y=1;y<=10;y++)
    {
        for(x=1;x<=10;x++)
        {
            show[x][y]='-';
            printf("%c ",show[x][y]);
        }
        printf("\n");
    }
}
//显示层初始化

int OneOrZero(void)
{
    for(y=1;y<=10;y++)
    {
        for(x=1;x<=10;x++)
        {
            onezero[x][y]=1;
            flagXY[x][y]=0;
        }
    }
    for(i=1;i<=10;i++)
    {
        x=mineX[i];
        y=mineY[i];
        onezero[x][y]=0;
    }
}
//翻开层初始化

int showMould(void)
{
    printf("提示:\nx,y初始值为1,x为从上到下依次增加,y为从左到右依次增加\n坐标间用空格隔开\n");
    printf("提示:\n在一个数字周围排除所有雷时,再次翻开这个数字为把这个数字周围未翻开的界面翻开\n\n");
    printf("提示:还有%d个雷\n",flagnum);
    scanfMould();
    if(x<1||x>10||y<1||y>10||(flagn!=0&&flagn!=1))
    {
        clean();
    }
    if(flagn==0)
    {
        open();
    }
    if(flagn==1)
    {
        flag();
    }
}
//显示层设置

int scanfMould(void)
{
    printf("请输入指定坐标x,y\n");
    scanf("%d%d",&x,&y);
    printf("翻开此坐标输入0,标记此坐标输入1\n");
    scanf("%d",&flagn);
}
//输入层函数

int open(void)
{
    if(number[x][y]==9)
    {
        printf("失败了!");
        exit(0);
    }
    if(onezero[x][y]==1)
    {
        openone();
        clean();
    }
    if(onezero[x][y]==0)
    {
        openzero();
        clean();
    }
}
//全局检查0

int openone(void)
{
    show[x][y]=number[x][y]+'0';
    onezero[x][y]=0;
    if(number[x][y]==0)
    {
        for(int a=-1;a<=1;a++)
        {
            for(int b=-1;b<=1;b++)
            {
                show[x+a][y+b]=number[x+a][y+b]+'0';
                onezero[x+a][y+b]=0;
            }
        }
        check();
    }
}
//翻开未翻开

int openzero(void)
{
    int n=0;
    for(int a=-1;a<=1;a++)
    {
        for(int b=-1;b<=1;b++)
        {
            if(flagXY[x+a][y+b]==1)
            {
                n+=1;
            }
        }
    }
    if(number[x][y]==n)
    {
        for(int a=-1;a<=1;a++)
        {
            for(int b=-1;b<=1;b++)
            {
                show[x+a][y+b]=number[x+a][y+b]+'0';
                if(flagXY[x+a][y+b]==1)
                {
                    show[x+a][y+b]='*';
                }
            }
        }
    }
    check();
}
//翻开已翻开

int check(void)
{
    for(x=1;x<=10;x++)
    {
        for(y=1;y<=10;y++)
        {
            if(number[x][y]==0&&onezero[x][y]==0)
            {
                for(int a=-1;a<=1;a++)
                {
                    for(int b=-1;b<=1;b++)
                    {
                        if(onezero[x+a][y+b]==1)
                        {
                            openone();
                        }
                    }
                }
            }
        }
    }
    clean();
}
//检查0

int clean(void)
{
    printf("\033[2J");
    printf("\033[0;0H");
    for(x=1;x<=10;x++)
    {
        for(y=1;y<=10;y++)
        {
            printf("%c ",show[x][y]);
        }
        printf("\n");
    }
        if(flagrealnum==0)
    {
        printf("胜利了!");
        exit(0);
    }
    showMould();
}
//清空显示

int flag(void)
{
    if(onezero[x][y]==0)
    {
        show[x][y]='*';
        flagXY[x][y]=1;
        flagnum-=1;
        if(number[x][y]==9)
        {
            flagrealnum-=1;
        }
    }
    if(onezero[x][y]==1)
    {
        show[x][y]='-';
        flagXY[x][y]=0;
        flagnum+=1;
        if(number[x][y]==9)
        {
            flagrealnum+=1;
        }
    }
    clean();
}
//雷区提示设置

int main(void)
{
    srand((unsigned)time(NULL));
    mineXY();
    numberMould();
    OneOrZero();
    showFirst();    
    showMould();
    return 0;
}



找了很久也没找到代码在哪……

[此贴子已经被作者于2019-3-13 20:42编辑过]

搜索更多相关主题的帖子: int number void for printf 
2019-03-13 05:53
S酱紫
Rank: 2
等 级:论坛游民
威 望:3
帖 子:25
专家分:20
注 册:2019-1-2
收藏
得分:0 
主要问题补充一下,是输入
1 2
0
的时候直接显示
"失败了!"


[此贴子已经被作者于2019-3-13 06:05编辑过]

2019-03-13 06:00
S酱紫
Rank: 2
等 级:论坛游民
威 望:3
帖 子:25
专家分:20
注 册:2019-1-2
收藏
得分:0 
等待……好像找到问题了,

有个地方的onezero应该是onezero[x][y];

 我再试试
2019-03-13 06:01
快速回复:扫雷代码出问题了,求修改
数据加载中...
 
   



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

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