两个游戏 (2)

扫雷,递归要怎么用?有几个思路,都没想好怎么实现,先发上来。


头文件

#ifndef __GAME_H__
#define __GAME_H__


#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>




#define ROWS 11
#define LOCS 11
#define ROW ROWS-2
#define LOC LOCS-2
#define MINENUMBER 20


void outboard(char mine[ROWS][LOCS], int row, int loc);
void outboard(char mine[ROWS][LOCS], int row, int loc);


int openmine(char mine[ROWS][LOCS], int row, int loc, int m, int n);




#endif//__GAME_H__



函数库

 

#define _CRT_SECURE_NO_DEPRECATE
#include "game.h"








void outboard(char mine[ROWS][LOCS], int row, int loc)
{
int i = 0;
int j = 0;
printf("  ------------------------------------\n");
for (i = 1; i < ROWS - 1; i++)
{
printf(" ح");
for (j = 1; j < LOCS - 1; j++)
{
printf(" %cح", mine[i][j]);
}
printf(" %d",i);
printf("\n");
printf("  ------------------------------------\n");
}
printf(" ");
for (j = 1; j < LOCS - 1; j++)
{
printf("   %d", j);
}
printf("\n\n");
}


int openmine(char mine[ROWS][LOCS], int row, int loc,int m, int n)
{
int z = 0;

if (mine[m - 1][n - 1] == '@')
{
z++; 
}
if (mine[m - 1][n - 0] == '@')
{
z++; 
}
if (mine[m - 1][n + 1] == '@')
{
z++;
}
if (mine[m - 0][n - 1] == '@')
{
z++;
}
if (mine[m - 0][n + 1] == '@')
{
z++;
}
if (mine[m + 1][n - 1] == '@')
{
z++;
}
if (mine[m + 1][n - 0] == '@')
{
z++;
}
if (mine[m + 1][n + 1] == '@')
{
z++;
}
return z;
}


主体部分


#define _CRT_SECURE_NO_DEPRECATE
#include "game.h"




int main()
{


//游戏头
begin:;
printf("***************************************************************\n");
printf("************      欢迎来到扫雷游戏 请选择      ****************\n");
printf("************            1.开始游戏             ****************\n");
printf("************            2.离开游戏             ****************\n");
printf("***************************************************************\n");
int a = 0;
scanf("%d", &a);
switch (a)
{
case 1:break;
case 2:goto end;
default:printf("输入错误,清重新输入\n"); goto begin;
}


//创建两个数组 show用于展示给玩家 mine记录雷区
char mine[ROWS][LOCS];
char show[ROWS][LOCS];
memset(show,'?', ROWS*LOCS*sizeof(show[0][0]));
memset(mine, ' ', ROWS*LOCS*sizeof(mine[0][0]));
printf("%c", mine[0][0]);




srand(time(NULL));
int i = 0;
int j = 0;
int count = MINENUMBER;//总雷数
while (count)
{
i = rand() % 9 + 1;
j = rand() % 9 + 1;
//printf("%d   %d   %d\n", i, j, count);
if (mine[i][j] == ' ')                     
{
//printf("%d   %d   %d\n", i, j, count);
mine[i][j] = '@';
count=count-1;
}
}


printf("%c", mine[0][0]);


//打印雷区
outboard(show, ROWS, LOCS);




//调试用的
//outboard(mine, ROWS, LOCS);




//输入要点开的坐标
int m = 0;
int n = 0;
scanf("%d%d", &m, &n);
count = 1;
printf("%c", mine[0][0]);




//不能一开始就被炸死
if (mine[m][n] == '@');
{
while (count)
{
i = rand() % 9 + 1;
j = rand() % 9 + 1;
if (mine[i][j] == ' ')                     
{
mine[i][j] = '@';
count = count - 1;
}
}
mine[m][n] = ' ';
}




//打印新雷区
//outboard(mine, ROWS, LOCS);





//雷区展开 开始进入重点!!!


int z=openmine(mine, ROWS, LOCS,m, n);
show[m][n] = 48 + z;
if (z == 0)
{
show[m][n] = ' ';
}
outboard(show, ROWS, LOCS);




//调试用的


//outboard(mine, ROWS, LOCS);
//printf("%c", show[m][n]);




//第二次点及以后


int k = 1;//用于判断获胜


while (1)
{
scanf("%d%d", &m, &n);//输入坐标


if (show[m][n] != '?')  //判断是否重复输入
{
printf("输入非法,重新输入\n");
continue;
}


//踩雷判断


if (mine[m][n] == '@')  
{

outboard(show, ROWS, LOCS);
outboard(mine, ROWS, LOCS);
printf("你踩到雷了\n");
goto end;
}




//*************************************************************************    以下为8/1修改内容:    **************
z = openmine(mine, ROWS, LOCS, m, n);//z表示周围雷的个数
show[m][n] = 48 + z;                 //show显示雷的个数
if (z == 0)                          //z=0时,显示空
{
show[m][n] = ' ';


}
outboard(show, ROWS, LOCS);          //show打印出来


//雷区打印出来,调试用的
        //outboard(mine, ROWS, LOCS);   










//胜利判断
k++;
if (k == ROW*LOC - MINENUMBER)
{
printf("恭喜你扫雷成功");
goto begin;
}
}


//游戏结束
end:;
printf("再见\n");
system("pause");
return 0;
}



函数的调用还是不熟练。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值