游戏主框架
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("***********************\n");
printf("******* 1.play ******\n");
printf("******* 0.exit ******\n");
printf("***********************\n");
}
void game()
{
//创建两个数组用于存放炸弹布局和展示
char mine[ROWS][COLS];
char show[ROWS][COLS];
//对两个数组进行初始化
InitBoard(mine, ROWS, COLS, '0');//数组初始化所有元素为'0'
InitBoard(show, ROWS, COLS, '*');//数组初始化所有元素为'*'
//布置雷
SetMine(mine, ROW, COL);
//排雷
FindMine(mine,show,ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//为随机数生成提供以系统时间为基准的种子
do
{
menu();
printf("是否进行游戏,输入1开始游戏,输入0退出游戏: ");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("请输入1和0\n");
}
} while (input);
return 0;
}
具体函数实现
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i = 0;
for (i = 0; i <= col; i++)
printf("%d ", i);//打印列号
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);//打印行号
int j = 0;
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void SetMine(char board[ROWS][COLS], int row, int col)
{
int mine_num = MINE_NUM;
while (mine_num)
{
int x = rand() % row + 1;//生成随机横坐标
int y = rand() % col + 1;//生成随机纵坐标
if (board[x][y] == '0')//检验是否已设置雷,若已设置则不会重复设置
{
board[x][y] = '1';
mine_num--;
}
}
}
int GetMines_Num(char board[ROWS][COLS],int x,int y)
{
return board[x - 1][y - 1] + board[x - 1][y]
+ board[x - 1][y + 1]+ board[x][y - 1]
+ board[x][y] + board[x][y + 1]
+ board[x + 1][y - 1] + board[x + 1][y]
+ board[x + 1][y + 1] - 8 * '0';
//由于棋盘只有1和0,采用周围一圈所有的数分别与字符'0'相减,
//也就是对应的ASCII码相减,再累加,得出周围一圈含雷个数
}
void FindMine(char board[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
DisplayBoard(show, ROW, COL);
while (win<row*col-MINE_NUM)//括号内为不含雷的格子数
{
printf("请输入坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
{
if (board[x][y] == '1')
{
printf("游戏失败\n");
DisplayBoard(board, ROW, COL);
break;
}
else
{
show[x][y] = GetMines_Num(board, x, y);
system("cls");//选择位置后清屏,提升游戏体验
printf("请输入坐标:");
DisplayBoard(show, ROW, COL);
win++;//每选择一个不是雷的格子,代表排除了一个不是雷的位置
}
}
else
printf("坐标非法\n");
if (win == row * col - MINE_NUM)//当所有的不是雷的格子都被找出来,游戏结束
printf("------获胜-----\n");
}
}
头文件
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINE_NUM 10
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 board[ROWS][COLS], char show[ROWS][COLS],int row, int col);
该游戏仅作为个人巩固C语言知识的小项目,与实际扫雷游戏还有差距,后续会考虑增加自动扩展无雷区域的功能。