扫雷程序代码c语言插旗,NOOB也开源——20*20的扫雷游戏(并分享全部思路)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

下面最大块的代码来了:计算不是地雷的格子周围的地雷数量,并显示出来。

我的算法是:遍历每个元素,如果元素的.b为*,则周围的.b值不为‘*’的全部格子.b都加一。

必须要注意一点:最外层的格子有越界危险。必须要分开考虑。

什么是最外层的格子?大部分格子需要考虑的方向有8个,而最外层的矩形中并不能考虑8个方向。

假设i为行号,j为列号

i==0 || i==19 || j==0 ||j==19时,需要具体设定周围的格子的值的改变方式(好拗口…)

我的方法是,定义每个方向的操作,并设定一个标记数组flag[8],表示8个方向的操作。标记数组全部被初始化为1,如果检测到元素属于最外层格子,则将不能延伸的方向的flag设定为0.

当然,最后结束操作时,需要把flag的全部值初始化为1.

下面是源代码

void

compute(mine a[][20])

{

int flag[8]; //标记数组,表示8个不同的方向

for(int i=0;i<8;i++)

flag[i]=1;

for(int i=0;i<20;i++)

{

for(int j=0;j<20;j++)

{

if(a[i][j].b=='*')

{

if(i==0 && j==0) //当遍历到第一个格子时,只向下方、游方、右下方操作。

{

flag[0]=0;flag[2]=0;flag[4]=0;flag[5]=0;flag[6]=0;

}

if(i==0 && j!=0 && j!=19)//当遍历到第一行数据且不为首末端点时

{

flag[0]=0;flag[4]=0;flag[5]=0;

}

if(i==0 && j==19)

{

flag[0]=0;flag[3]=0;flag[4]=0;flag[5]=0;flag[7]=0;

}

if(i!=0 && i!=19 && j==0)

{

flag[2]=0;flag[4]=0;flag[6]=0;

}

if(i==19 && j==0)

{

flag[2]=0;flag[6]=0;flag[4]=0;flag[1]=0;flag[7]=0;

}

if(i==19 && j!=19 && j!=0)

{

flag[6]=0;flag[1]=0;flag[7]=0;

}

if(i==19 && j==19)

{

flag[5]=0;flag[6]=0;flag[3]=0;flag[1]=0;flag[7]=0;

}

if(j==19 && i!=0 && i!=19)

{

flag[5]=0;flag[3]=0;flag[7]=0;

}

if(a[i-1][j].b!='*' && flag[0]==1) //此处为8个方向的操作。如果flag允许,则执行这个方向的操作

a[i-1][j].b+=1;

if(a[i+1][j].b!='*' && flag[1]==1)

a[i+1][j].b+=1;

if(a[i][j-1].b!='*' && flag[2]==1)

a[i][j-1].b+=1;

if(a[i][j+1].b!='*' && flag[3]==1)

a[i][j+1].b+=1;

if(a[i-1][j-1].b!='*' && flag[4]==1)

a[i-1][j-1].b+=1;

if(a[i-1][j+1].b!='*' && flag[5]==1)

a[i-1][j+1].b+=1;

if(a[i+1][j-1].b!='*' && flag[6]==1)

a[i+1][j-1].b+=1;

if(a[i+1][j+1].b!='*' && flag[7]==1)

a[i+1][j+1].b+=1;

}

for(int i=0;i<8;i++) //再次初始化为1

flag[i]=1;

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值