扫雷,递归要怎么用?有几个思路,都没想好怎么实现,先发上来。
头文件
#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;
}
函数的调用还是不熟练。