mine_clearance.c
#include"game.h"
void menu()
{
printf("********************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("********************\n");
}
void game()
{
int x = 0;
int y = 0;
int count = MINE_NUM;
char mineboard[ROWS][COLS] = { 0 };//放雷的雷盘
char findboard[ROWS][COLS] = { 0 };//排雷的雷盘
char textboard[ROWS][COLS] = { 0 };//测试是否展开的雷盘
InitBoard(textboard, ROWS, COLS, '0');
InitBoard(mineboard, ROWS, COLS, '0');
InitBoard(findboard, ROWS, COLS, '*');
SetMine(mineboard, ROWS, COLS, count);
FindMine(mineboard, findboard,textboard, x, y);
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新选择!\n");
break;
}
} while (input);
system("pause");
return 0;
}
game.c
#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols, char ch)
{
memset(&board[0][0], ch, rows*cols * sizeof(board[0][0]));
}
void ShowBoard(char findboard[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf(" ");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
}
printf("\n\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", findboard[i][j]);
}
printf("\n");
}
}
void SetMine(char mineboard[ROWS][COLS], int rows, int cols, int count)
{
int i = 0;
int j = 0;
while (count != 0)
{
i = rand() % 9 + 1;
j = rand() % 9 + 1;
if (mineboard[i][j] == '0')
{
mineboard[i][j] = '1';
count--;
}
}
}
void Compute(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], int x, int y)
{
findboard[x][y] = mineboard[x - 1][y]
+ mineboard[x - 1][y - 1]
+ mineboard[x][y - 1]
+ mineboard[x + 1][y - 1]
+ mineboard[x + 1][y]
+ mineboard[x + 1][y + 1]
+ mineboard[x][y + 1]
+ mineboard[x - 1][y + 1]
- 7 * '0';
}
void Open(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], char textboard[ROWS][COLS], int x, int y)
{
textboard[x][y] = '1';
if (x > 0 && x < ROWS - 1 && y>0 && y < COLS - 1)
{
Compute(findboard, mineboard, x, y);
if (findboard[x][y] == '0')
{
Compute(findboard, mineboard, x - 1, y);
Compute(findboard, mineboard, x - 1, y - 1);
Compute(findboard, mineboard, x, y - 1);
Compute(findboard, mineboard, x + 1, y - 1);
Compute(findboard, mineboard, x + 1, y);
Compute(findboard, mineboard, x + 1, y + 1);
Compute(findboard, mineboard, x, y + 1);
Compute(findboard, mineboard, x - 1, y + 1);
if (findboard[x - 1][y] == '0')
{
if (textboard[x - 1][y] == '0')
{
Open(findboard, mineboard, textboard, x - 1, y);
}
}
if (findboard[x][y - 1] == '0')
{
if (textboard[x][y - 1] == '0')
{
Open(findboard, mineboard, textboard, x, y - 1);
}
}
if (findboard[x + 1][y] == '0')
{
if (textboard[x + 1][y] == '0')
{
Open(findboard, mineboard, textboard, x + 1, y);
}
}
if (findboard[x][y + 1] == '0')
{
if (textboard[x][y + 1] == '0')
{
Open(findboard, mineboard, textboard, x, y + 1);
}
}
}
}
}
void FindMine(char mineboard[ROWS][COLS], char findboard[ROWS][COLS], char textboard[ROWS][COLS], int x, int y)
{
ShowBoard(mineboard, ROW, COL);
int ret = ROW * COL - MINE_NUM;
int count = 0;
while (1)
{
int time0 = 0;
int time1 = 0;
int time2 = 0;
ShowBoard(findboard, ROW, COL);
time1 =(unsigned int) time(NULL);
printf("请输入你要排雷的坐标:>");
scanf("%d%d", &x, &y);
if (x > 0 && x < ROWS - 1 && y>0 && y < COLS - 1)
{
count++;
if (mineboard[x][y] == '1')
{
if (count == 1)
{
SetMine(mineboard, ROWS, COLS, count);
mineboard[x][y] = '0';
Open(findboard, mineboard,textboard, x, y);
}
else
{
time2 = (unsigned int)time(NULL);
time0 = time2 - time1;
printf("很遗憾,你被炸死了! 所用时间:%ds\n", time0);
ShowBoard(mineboard, ROW, COL);
break;
}
}
else
{
ret--;
Open(findboard, mineboard, textboard, x, y);
}
}
else
{
printf("输入坐标有误,请重新输入!\n");
}
if (ret == 0)
{
time2 = (unsigned int)time(NULL);
time0 = time2 - time1;
printf("恭喜你,游戏通关! 所用时间:%ds\n",time0);
ShowBoard(mineboard, ROW, COL);
break;
}
}
}
game.h
#ifndef __GAME_H__
#define __GAME_H__
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#include <stdio.h>
#define __GAME_H__
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.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 ch);
//展示雷盘
void ShowBoard(char findboard[ROWS][COLS], int row, int col);
//埋雷
void SetMine(char mineboard[ROWS][COLS], int rows, int cols, int count);
//计算雷数
void Compute(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], int x, int y);
//展开雷阵
void Open(char findboard[ROWS][COLS], char mineboard[ROWS][COLS], char textboard[ROWS][COLS], int x, int y);
//排雷
void FindMine(char mineboard[ROWS][COLS], char findboard[ROWS][COLS],char textboard[ROWS][COLS], int x, int y);
#endif //__GAME_H__