我写的扫雷游戏 不知道哪里错了

sonack 2012-02-11 06:06:38
#include "stdio.h"
#include "stdlib.h"
#define SPA 0 //代表空白
#define BOMB 1 //代表雷
#define SAFE 2 //代表已翻开的空白
#define N 16
void change(int m,int *i,int *j);
int number(int x,int y);
int num=N*N;//可翻的格的数目
int dilei[N+2][N+2]={SPA}; //边界各2
int eye[N][N]={SPA};
void suiji()
{
int i,j;
for(i=1;i<N+1;i++)
for(j=1;j<N+1;j++)
dilei[i][j]=(rand()%2)*(rand()%2)*(rand()%2); //随机分配1或2 到dilei中 且1的概率较小
}
void clear(int x,int y) //清除函数
{
int dir,a,b;//dir代表方向
if(dilei[x+1][y+1]==BOMB||x==N||y==N)//传入的是eye的下标 这里dilei数组都多1
return ;
if(dilei[x+1][y+1]==SPA){
eye[x][y]=SAFE; //如果没有地雷 eye标为SAFE
for(dir=1;dir<=8;dir++){ //判断改点周围8个点
a=x,b=y;
change(dir,&a,&b);//改变方向
clear(a,b); //递归 直至遇到地雷或者达到边界 返回
if(dir%2==0) 复原方向
change(dir-1,&a,&b);
else change(dir+1,&a,&b);
eye[a][b]=number(a,b);通过number函数将周围8点的雷数目存入eye中
}
}
}
void change(int m,int *i,int *j) //改变坐标 从而判断周围8点的方向
{
switch(m)
{
case 1:(*i)++,(*j)++; break;
case 2:(*i)--,(*j)--; break;
case 3:(*i)++,(*j)--;break;
case 4:(*i)--,(*j)++;break;
case 5:(*i)++;break;
case 6:(*i)--;break;
case 7:(*j)++;break;
case 8:(*j)--;break;
}
}
int number(int x,int y)//判断周围雷的数目
{
int m,number=0,a=x,b=y;
for(m=1;m<=8;m++)
{ x=a,y=b; //每次都复原
change(m,&x,&y);
if(dilei[x][y]==BOMB)
number++;
}
return number;
}
void draw()
{
int i,j;
for(i=0;i<16;i++){
for(j=0;j<16;j++)
{
if(eye[i][j]==SPA||eye[i][j]==SAFE||eye[i][j]==BOMB)
{ switch(eye[i][j]) {
case SPA: printf("□");continue;
case SAFE: printf("■"),num--;continue;
case BOMB: printf(" %c",'X');continue;
} }
printf("%2d",eye[i][j]),num--; //不是以上三种就把他的值输出 代表周围的地雷书
}
printf("%d\n",i);
}
}
int main(void)
{
int i,j,x,y,count=0;
suiji();
for(i=1;i<N+1;i++)
for(j=1;j<N+1;j++)
if(dilei[i][j]==BOMB)
count++;
printf("地雷数:%d\n",count); //计算全局地雷书
draw();
while(num==count)//num代表剩余的可翻的数目
{
scanf("%d%d",&x,&y);
clear(x,y);
draw();
}
}
求解啊
到底怎么错了
输入什么数都立即 press any key to continue
我还是个自学的高一生 低级错误大家笑笑就算了。。
...全文
362 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
sonack 2012-02-12
  • 打赏
  • 举报
回复
不知道是不是逻辑错误
有没有什么好方法可以把0连续的翻开?
sonack 2012-02-12
  • 打赏
  • 举报
回复
不知道是不是逻辑错误。我都晕了
有什么好方法可以把0连续的全部翻开
duyufeng1995 2012-02-12
  • 打赏
  • 举报
回复
是不是哟逻辑错误啊
yrnaaa 2012-02-12
  • 打赏
  • 举报
回复
单步调试一下呢?实在不行加点输出,看看在哪返回了。
盐在哪咸醋在哪酸总有个道理啊
Sparkfire 2012-02-12
  • 打赏
  • 举报
回复
只有16×16的格子怎么会stack overflow = =
翻格子的标准算法就是floodfill了吧,检查下floodfill算法有没写错。
面包大师 2012-02-11
  • 打赏
  • 举报
回复
就是和编译器有关。。。
sonack 2012-02-11
  • 打赏
  • 举报
回复
额 貌似真的和编译器 有关系
换了下WINTC 虽然符号显示的乱七八糟
但是能输入3组数据后弹出了个对话框
说什么CPU收到了不合法的指令
sonack 2012-02-11
  • 打赏
  • 举报
回复
谁可以在自己机子上编译运行一下 看看是不是编译器的问题
东莞某某某 2012-02-11
  • 打赏
  • 举报
回复
刚学编程时,尽量多使用编译器的调试,事半功倍
sonack 2012-02-11
  • 打赏
  • 举报
回复
能不能优化下算法呢
面包大师 2012-02-11
  • 打赏
  • 举报
回复
函数调用层次太深
sonack 2012-02-11
  • 打赏
  • 举报
回复
额 我的是缩水过的。不能点这个。
面包大师 2012-02-11
  • 打赏
  • 举报
回复
英文的,调出“Project/Settings/Link”选项卡,选择Output,其中的Stack allocations的reserve值便是栈空间所用大小(见下图),VC6中默认为1MB,根据实际情况将其加大然后重新编译即可,具体说明可参见MSDN中的/stack选项。这个方案对于一些问题来说简单可行,但不能满足我这里的需求。


面包大师 2012-02-11
  • 打赏
  • 举报
回复
中文版的,你可以在:工程->设置->连接->输出那里的保留地方输入0x10000000,然后重新编译连接一下
sonack 2012-02-11
  • 打赏
  • 举报
回复
e怎么会出现无限递归呢
不是有这句
if(dilei[x+1][y+1]==BOMB||x==N||y==N)//传入的是eye的下标 这里dilei数组都多1
return ;
吗。
面包大师 2012-02-11
  • 打赏
  • 举报
回复
因为你的函数出现无限递归调用即函数调用层次太深,造成Stack Overflow,栈满了。。。
hjrui09 2012-02-11
  • 打赏
  • 举报
回复
扫雷啊!~~~~~~~~
sonack 2012-02-11
  • 打赏
  • 举报
回复
VC6.
面包大师 2012-02-11
  • 打赏
  • 举报
回复
你是什么编译器?
sonack 2012-02-11
  • 打赏
  • 举报
回复
不行 还有一样直接退出
加载更多回复(6)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧