从bilibili看到一个非常好的C语言视频并学习如何使用C语言实现扫雷,但缺少了一个小小的功能,在此加上了,完成一个完整的C语言程序。初学可能有不精简的地方可指出。
//头文件-game.h
#define ROW 5
#define COL 5
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 3
#define White 4
//函数初始化,可以放到.h头文件中👇
//声明
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
void DisplayBoard(char board[ROWS][COLS],int row,int col);
void setMine(char board[ROWS][COLS],int row,int col);
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
void SetWhite(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
//game.c
//void InitBoard(char board[ROWS][COLS],char show[ROWS][COLS],int rows,int cols,char set);
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set){
int i = 0;
int j = 0;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
//1、打印列号
printf("%c ",'0');
printf("%c ",'|');
for (i = 1; i <= col; i++) {
printf("%d ",i);
}
printf("\n");
for (i = 0; i <= 2*(col+1); i++) {
printf("%c",'-');
}
printf("\n");
for (i = 1; i <= row; i++) {
printf("%d ",i);
printf("%c ",'|');
for (j = 1; j <= col; j++) {
printf("%c ",board[i][j]);
}
printf("\n");
}
}
void setMine(char board[ROWS][COLS],int row,int col)
{
int count = EASY_COUNT;
while (count){
int x = rand() % row + 1;
int y = rand() % col + 1;
if(board[x][y] == '0'){
board[x][y] = '1';
count--;
}
}
}
int get_mine_count(char mine[ROWS][COLS],int x,int y)
{
return mine[x-1][y] +
mine[x-1][y-1] +
mine[x][y-1] +
mine[x+1][y-1] +
mine[x+1][y] +
mine[x+1][y+1] +
mine[x][y+1] +
mine[x-1][y+1] - 8*'0';
}
void SetWhite(char mine[ROWS][COLS],char show[ROWS][COLS],int x,int y)
{
int a = rand() % White;
int b = rand() % White;
int c = rand() % White;
int d = rand() % White;
int i = 0;
for (i = 1; i < a; i++) {
if(mine[x][y+i] == '0' && show[x][y+i] == '*'){
show[x][y+i] = ' ';
}
}
for (i = 1; i < b; i++) {
if(mine[x][y-i] == '0' && show[x][y-i] == '*'){
show[x][y-i] = ' ';
}
}
for (i = 1; i < c; i++) {
if(mine[x+i][y] == '0' && show[x+i][y] == '*'){
show[x+i][y] = ' ';
}
}
for (i = 1; i < d; i++) {
if(mine[x-i][y] == '0' && show[x-i][y] == '*'){
show[x-i][y] = ' ';
}
}
for (i = 1; i < b-1; i++) {
if(mine[x-i][y-i] == '0' && show[x-i][y-i] == '*'){
show[x-i][y-i] = ' ';
}
}
for (i = 1; i < a-1; i++) {
if(mine[x+i][y+i] == '0' && show[x+i][y+i] == '*'){
show[x+i][y+i] = ' ';
}
}
for (i = 1; i < d-1; i++) {
if(mine[x-i][+i] == '0' && show[x-i][y+i] == '*'){
show[x-i][y+i] = ' ';
}
}
for (i = 1; i < c-1; i++) {
if(mine[x][y] == '0' && show[x+i][y-i] == '*'){
show[x+i][y-i] = ' ';
}
}
}
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
int x = 0;
int y = 0;
int q = 0;
int w = 0;
int win = 0;
int count = 0;
while (1)
{
printf("请输入排查雷的坐标:>");
scanf("%d%d",&x,&y);
if (x >= 1 && x <= row && y >= 1 && y <= col) {
if(mine[x][y] == '1'){
//踩雷
printf("你被炸死了\n");
DisplayBoard(mine,row,col);
break;
} else if(mine[x][y] == '0'){
//没踩雷
//计算周围几个雷
int count = get_mine_count(mine,x,y);
show[x][y] = count + '0';
SetWhite(mine,show,x,y);
DisplayBoard(show,row,col);
for (q = 1; q < row; q++) {
for (w = 1; w < row; w++) {
if(show[q][w] == '*')
{
count++;
}
}
}
if(count == EASY_COUNT){
printf("恭喜你成功\n");
break;
}
}else{
printf("请重新输入:");
}
}else{
printf("输入非法,重新输入!\n");
}
}
}
//测试文件test.c
#include <stdio.h>
//#include "game.h"
void menu(){
printf("**************************\n");
printf("******1.play 0.exit*******\n");
printf("**************************\n");
}
void game(){
//雷的存储
//1、布置好雷的信息
char mine[ROWS][COLS] = {0};//11*11
//2、排查出的雷的信息
char show[ROWS][COLS] = {0};//11*11
//3、初始化
InitBoard(mine,ROWS,COLS,'0');
InitBoard(show,ROWS,COLS,'*');
//4、打印棋盘
//DisplayBoard(mine,ROW,COL);
printf("\n");
DisplayBoard(show,ROW,COL);
printf("\n");
//5.布置雷
setMine(mine,ROW,COL);
//DisplayBoard(mine,ROW,COL);
//printf("\n");
//6.扫雷
FindMine(mine,show,ROW,COL);
}
void test()
{
int input = 0;
srand((unsigned int) time(NULL));
do {
menu();
printf("请选择:>");
scanf("%d",&input);
switch (input) {
case 1:
game();
printf("扫雷\n");
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
}while(input);
}
int main()
{
test();
return 0;
}