C语言_扫雷
程序员文章站
2024-03-18 13:31:40
...
做一个扫雷的游戏,首先分析一下扫雷需要实现的功能:
1.选择一个位置,如果该位置是雷则结束游戏,并显示所有雷的位置。如果不是雷则显示该位置周围雷的数量。
2.如果周围没有雷,则该位置显示空,并且周围如果也为空则一并展开。
3.第一次选择时必定不是雷
4.当盘上剩余的位置只有雷了,则游戏也结束,并且玩家胜利。
然后可以用两个二维数组,一个数组保存雷的排布,一个数组显示游戏界面,假设是10*10的界面的话,数组大小应该为12*12,周围一圈全为0,以便雷布在边界时,周围的数字更好的计算。
头文件部分:
#ifndef _GAME_H_
#define _GAME_H_
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 11
#define COL 11
#define ROWS ROW+1
#define COLS COL+1
#define EASY 10
int game(); //游戏实现
void fill_mine(char arr[ROWS][COLS]); //随机布雷
void show_mine(char show[ROWS][COLS]); //展示该数组
void clean_show(char show[ROWS][COLS]); //初始化该数组
void IS_mine(char arr[ROWS][COLS], char show[ROWS][COLS], int x, int y); //判断该位置周围雷的个数,没有雷则展开
void copy(char arr[ROWS][COLS], char show[ROWS][COLS]); //将雷的位置显示在显示数组里
#endif //game.h
主菜单部分:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game.h"
void meau()
{
printf("****************************************\n");
printf("********1.开始扫雷 0.退出扫雷********\n");
printf("****************************************\n");
printf("请选择:");
}
int main()
{
int a=1;
while (a)
{
meau();
scanf("%d", &a);
if (a != 1 && a !=0)
{
printf("输入错误,请重新输入\n");
}
else if (1 == a)
{
game();
}
}
printf("谢谢使用!\n");
return 0;
}
游戏功能实现部分:
int game()
{
char arr[ROWS][COLS];
char show[ROWS][COLS];
int x, y;
int cout = 0;
clean_show(arr);
fill_mine(arr);
clean_show(show);
show_mine(show);
for (;;)
{
cout++;
printf("请输入坐标:x,y>");
scanf("%d%d", &x, &y);
if (x<1 || x>10 || y<1 || y>10)
{
printf("输入不合法!\n");
}
else if ('*' == arr[x][y])
{
if (1 == cout)
{
clean_show(arr);
fill_mine(arr);
IS_mine(arr, show, x, y);
show_mine(show);
}
else
{
printf("你被炸死了!\n");
copy(arr, show);
show_mine(show);
break;
}
}
else
{
IS_mine(arr,show, x, y);
show_mine(show);
if (win(show))
{
printf("你赢了\n");
show_mine(arr);
break;
}
}
}
return 0;
}
各函数定义:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void fill_mine(char arr[ROWS][COLS]) //随机布雷
{
int i, j;
int ret = 0;
srand((unsigned int)time(NULL));
do
{
i = rand() % 10;
j = rand() % 10;
if (arr[i+1][j+1] != '*') //最外一圈不布雷
{
arr[i+1][j+1] = '*';
ret++;
}
} while (ret <= EASY);
}
void show_mine(char show[ROWS][COLS])
{
int i, j;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
if (0 == i)
{
printf("%2d ", j);
}
else if (0 == j)
{
printf("%2d ", i);
}
else
{
printf("%2c ", show[i][j]);
}
}
printf("\n");
}
}
void clean_show(char show[ROWS][COLS])
{
int i, j;
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
{
show[i][j] = '0';
}
}
}
void copy(char arr[ROWS][COLS], char show[ROWS][COLS])
{
int i, j;
for (i = 1; i < ROW; i++)
{
for (j = 1; j < COL; j++)
{
if ('*' == arr[i][j])
{
show[i][j] = arr[i][j];
}
}
}
}
void IS_mine(char arr[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
int cout;
cout = 0;
if ((x >= 1 && x <= 10 && y >= 1 && y <= 10) && '0' == show[x][y])
{
cout = ('*' == arr[x - 1][y + 1]) + ('*' == arr[x][y + 1]) + ('*' == arr[x + 1][y + 1])
+ ('*' == arr[x - 1][y]) + ('*' == arr[x + 1][y])
+ ('*' == arr[x - 1][y - 1]) + ('*' == arr[x][y - 1]) + ('*' == arr[x + 1][y - 1]);
if (cout != 0)
{
show[x][y] = cout + '0';
}
else
{
show[x][y] = ' ';
if (y > 0 && show[x][y - 1] == '0')
{
IS_mine(arr, show, x, y - 1);
}
if (x > 0 && show[x - 1][y] == '0')
{
IS_mine(arr, show, x - 1, y);
}
if (y < COL && show[x][y + 1] == '0')
{
IS_mine(arr, show, x, y + 1);
}
if (x < ROW && show[x + 1][y] == '0')
{
IS_mine(arr, show, x + 1, y);
}
}
}
}
int win(char show[ROWS][COLS])
{
int i, j;
int cout = 0;
for (i = 1; i < ROW; i++)
{
for (j = 1; j < COL; j++)
{
if ('0' == show[i][j])
{
cout++;
}
}
}
if (10 == cout)
{
return 1;
}
else return 0;
}
运行结果: