扫雷游戏
本帖最后由 Juniorboy 于 2020-5-18 16:07 编辑#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <graphics.h>
#include <windows.h>
int a;//生成游戏区和辅助区(12*12)
int main(void)
{
srand((unsigned int)time(NULL));//随机数种子;
//给游戏区和辅助区赋值(游戏区为10*10);
for (int i = 0; i < 11; i++)
{
for (int j = 0; j < 10; j++)
{
a = 0;
}
}
for (int i = 1; i <= 10; i++)
{
for (int j = 0; j <= 10; j++)
{
printf("%2d", a);
}
printf("\n");
}
//随机埋雷(雷为-1);
for (int i = 0; i <10;)
{
//+1为了让随机数取值为1,if判断是为了防止重复赋值。
if (a == 0)
{
a = -1;
i++;
}
}
//给不是雷的坐标赋值(0-8);
for (int i = 1; i <= 10; i++)
{
for (int j = 1; j <= 10; j++)
if (a != 0)//找到整个数组中不是雷的元素;
{
for (i -= 1;i <= i + 1; i++)
{
for (j -= 1; j <= j + 1; j++)
{
int b = 0;//用来累计周围雷的个数;
if (a == -1)
{
b++;
a = b;
}
}
}
}
}
return 0;
想写一个扫雷游戏,然后执行到53行哪里就报错了,然后调试显示j的值是6000多,求解,谢谢啦~
错误信息:0x00415259 处(位于 2.exe 中)引发的异常: 0xC0000005: 读取位置 0x00420000 时发生访问冲突。 你的程序最后的四层for循环,里面的两层循环结束条件有问题!死循环了!
i<=i+1 和 j<=j+1 永远成立,所以最里面的循环就进入了死循环 sunrise085 发表于 2020-5-18 16:12
你的程序最后的四层for循环,里面的两层循环结束条件有问题!死循环了!
i
哦哦,对,我看看怎么改过来,谢谢~ sunrise085 发表于 2020-5-18 16:12
你的程序最后的四层for循环,里面的两层循环结束条件有问题!死循环了!
i
int b = 0;
for (int i = 1; i <= 10; i++)
{
for (int j = 1; j <= 10; j++)
if (a == 0 )//找到整个数组中不是雷的元素;
{
for (int m= i - 1; m <= i + 1; m++)
{
for ( int n = j - 1; n <= j + 1; n++)
{
//用来累计周围雷的个数;
if (a == -1)
{
a = ++b;
}
}
}
}
}
我这样就是错的
然后这样就是对的
for (int i = 1; i <= 10; i++)
{
for (int j = 1; j <= 10; j++)
if (a == 0 )//找到整个数组中不是雷的元素;
{
for (int m= i - 1; m <= i + 1; m++)
{
for ( int n = j - 1; n <= j + 1; n++)
{
//用来累计周围雷的个数;
if (a == -1)
{
a++;
}
}
}
}
}
但是我感觉两者的思路一样啊 Juniorboy 发表于 2020-5-18 16:40
我这样就是错的
然后这样就是对的
第一种写法之所以错误是因为每次循环的时候,b没有复位为0。应该在第5行前,给b赋值为0
int b = 0;
for (int i = 1; i <= 10; i++)
{
for (int j = 1; j <= 10; j++)
{
b=0;
if (a == 0 )//找到整个数组中不是雷的元素;
{
for (int m= i - 1; m <= i + 1; m++)
{
for ( int n = j - 1; n <= j + 1; n++)
{
//用来累计周围雷的个数;
if (a == -1)
{
a = ++b;
}
}
}
}
}
} sunrise085 发表于 2020-5-18 17:02
第一种写法之所以错误是因为每次循环的时候,b没有复位为0。应该在第5行前,给b赋值为0
明白了,谢谢~
页:
[1]