#include <stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
#include<assert.h>
#define ROW 10//行
#define COL 10//列
#define ROWS ROW+2//地雷棋盘行
#define COLS COL+2//地雷棋盘列
//地雷棋盘比棋盘多初和末各两行两列
void menu();//菜单
void New(char* Chq, int row, int col);//初始化棋盘
void MineBuild(char Chq[ROWS][COLS], int row, int col, int num);//设置地雷
void GameShow(char Chq[ROW][COL], int row, int col);//打印棋盘
void MineShow(char Chq[ROWS][COLS], int row, int col);//打印地雷棋盘
int Player(char Chq[ROW][COL], char MineChq[ROWS][COLS], int row, int col, int num);//玩家游戏
game.h文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu() {//菜单
printf("\n*************************************\n*** 1.开始游戏 2.结束游戏 ***\n*************************************\n");
printf("请输入:>");
}
void New(char* Chq, int row, int col){
assert(Chq != NULL);
int i = 0,j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
*(Chq + i * col + j) = ' ';
}
}
}//初始化为空格
void GameShow(char Chq[ROW][COL], int row, int col) {
int m = 0; int n = 0;
for (m = 0; m < row; m++) {
for (n = 0; n < col; n++) {
printf(" %c ", Chq[m][n]);//打印数据
if (n < col - 1) {
printf("|");//打印分隔列
}
}
printf("\n");
{
for (n = 0; n < col; n++)//打印分隔行
if (m < row - 1) {
if (n < col - 1)
printf("---|");//除最后一行打印
else
printf("---");//最后一列打印
}
}
printf("\n");
}
}
void MineShow(char MineChq[ROWS][COLS], int row, int col) {
int m = 0; int n = 0;
for (m = 1; m < row - 1; m++) {
for (n = 1; n < col - 1; n++) {
printf(" %c ", MineChq[m][n]);//打印数据
if (n < col - 2) {
printf("|");//打印分隔列
}
}
printf("\n");
{
for (n = 1; n < col - 1; n++)//打印分隔行
if (m < row - 2) {
if (n < col - 2)
printf("---|");//除最后一行打印
else
printf("---");//最后一列打印
}
}
printf("\n");
}
}
void MineBuild(char MineChq[ROWS][COLS], int row, int col, int num) {
int x = 0;
int y = 0;
int z = 0;
for (z = 0; z < num;) {//创造雷
x = rand() % (row - 2);
y = rand() % (col - 2);
if (MineChq[x + 1][y + 1] == ' ') {
MineChq[x + 1][y + 1] = '*';
z++;
}
}
for (int i = 1; i < row - 1; i++) {//创造雷周围的数字
for (int j = 1; j < col - 1; j++) {
if (MineChq[i][j] != '*') {
int a = 0;
if (MineChq[i - 1][j - 1] == '*')
a++;
if (MineChq[i - 1][j] == '*')
a++;
if (MineChq[i - 1][j + 1] == '*')
a++;
if (MineChq[i][j - 1] == '*')
a++;
if (MineChq[i][j + 1] == '*')
a++;
if (MineChq[i + 1][j - 1] == '*')
a++;
if (MineChq[i + 1][j] == '*')
a++;
if (MineChq[i + 1][j + 1] == '*')
a++;
MineChq[i][j] = a + '0';
}
}
}
}
int Player(char Chq[ROW][COL], char MineChq[ROWS][COLS], int row, int col, int num) {//玩家操作
int x = 0, y = 0, win = 0;
int test = EOF;
while (1) {
while (test = getchar(), test != '\n' && test != EOF);
printf("请输入要走的坐标(例如1,1):>");
x = 0; y = 0;
scanf_s("%d,%d", &x, &y);
if (x > 0 && x <= row && y > 0 && y <= col) {
if (win == row * col - num) {//判断胜利条件
printf("恭喜你,游戏胜利\n");
return 0;
}
if (MineChq[x][y] == '*') {//判断失败条件
system("cls");
printf("雷炸了!游戏结束!\n");
MineShow(MineChq, ROW + 2, COL + 2);
return 0;
}
else if (Chq[x - 1][y - 1] != ' ')//判断位置是否重复
{
printf("该位置已走,请重新输入\n");
}
else {//将输入坐标处数字复制到棋盘上
Chq[x - 1][y - 1] = MineChq[x][y];
system("cls");
GameShow(Chq, ROW, COL);
win++;//走一步一增加,计算是否胜利
}
}
else
{
printf("超出范围或输入错误,请重新输入\n");
continue;
}
}
}
game.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game()
{
system("cls");
int a = 0; int ret;
char Chq[ROW][COL] = { 0 };
char MineChq[ROWS][COLS] = { 0 };
New(Chq, ROW, COL); //初始化展示棋盘
New(MineChq, ROWS, COLS);//初始化地雷棋盘
GameShow(Chq, ROW, COL);//展示棋盘
while (1)
{
printf("创造雷的数量:>");
scanf_s("%d", &a);
if (a >= ROW * COL)
printf("雷数量超过上限,请重新输入\n");
else
{
system("cls");
MineBuild(MineChq, ROWS, COLS, a);
GameShow(Chq, ROW, COL);
printf("创造成功,开始游戏\n");
break;
}
};//在棋盘中创建雷
while (1)
{
ret = Player(Chq, MineChq, ROW, COL, a);
if (ret == 0)
break;
}
}
int main() {
int IsGame = 0, a = 1;
int test = EOF;
srand((unsigned int)time(NULL));
while (a) {
menu();
scanf_s("%d", &IsGame);
switch (IsGame) {//是否进行游戏
case 1:
game();
break;
case 2:
printf("游戏结束!");
a = 0;
break;
default:
printf("输入错误,请重新输入");
break;
}
while (test = getchar(), test != '\n' && test != EOF);
}
system("pause");
return 0;
}
test.c文件