扫雷游戏
main.c(main函数所在文件)
#include <stdio.h>
#include "game.h"
void menu()
{
printf("******************************\n");
printf("********* 1.play *********\n");
printf("********* 0.exit *********\n");
printf("******************************\n");
}
void game()
{
char Set_Board[ROWS][COLS];
char Show_Board[ROWS][COLS];
IntiBoard(Set_Board, ROWS, COLS, '0');
IntiBoard(Show_Board, ROWS, COLS, '*');
SetMine(Set_Board, ROW, COL, EASY_COUNT);
Display_Board(Show_Board, ROW, COL);
Sweep(Set_Board, Show_Board, ROW, COL,EASY_COUNT);
}
int main()
{
int n = 1;
while (n)
{
srand((unsigned int)time(NULL));
menu();
printf("请输入数字:\n");
scanf_s("%d", &n);
switch (n)
{
case 1:
system("cls");
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入无效,请重新输入\n");
}
}
return 0;
}
game.h(在main.c中所使用的game.c中函数声明及全局变量的定义)
#pragma once
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
void IntiBoard(char Board[ROWS][COLS], int r, int c,char set);
void Display_Board(char Board[ROWS][COLS], int r, int c);
void SetMine(char Set_Board[ROWS][COLS],int r,int c,int count);
void Sweep(char Set_Board[ROWS][COLS],char Show_Board[ROWS][COLS],int r,int c,int m);
int Translate(char Set_Board[ROWS][COLS], char Show_Board[ROWS][COLS], int x, int y);
void Auto_Sweep(char Set_Board[ROWS][COLS], char Show_Board[ROWS][COLS], int x, int y);
game.c(游戏主干)
#include <stdio.h>
#include "game.h"
void IntiBoard(char Board[ROWS][COLS], int r, int c, char set)
{
int i = 0;
for (i = 0; i <= r; i++)
{
int j = 0;
for (j = 0; j <= c; j++)
{
Board[i][j] = set;
}
}
}
void Display_Board(char Board[ROWS][COLS], int r, int c)
{
int i = 0;
int j = 0;
printf("------扫雷游戏------\n");
for (i = 0; i <= r; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= r; i++)
{
printf("%d ", i);
for (j = 1; j <= c; j++)
{
printf("%c ", Board[i][j]);
}
printf("\n");
}
}
void SetMine(char Set_Board[ROWS][COLS], int r, int c, int count)
{
int i = 0;
for (i = 0; i < count; i++)
{
int flag = 1;
while (flag)
{
int x = rand() % 9 + 1;
int y = rand() % 9 + 1;
if (Set_Board[x][y] == '0')
{
Set_Board[x][y] = '1';
flag = 0;
}
else
{
flag = 1;
}
}
}
}
void Sweep(char Set_Board[ROWS][COLS], char Show_Board[ROWS][COLS], int r, int c,int m)
{
int mine_amount = r*c - m;
while (mine_amount)
{
int x = 0;
int y = 0;
int flag = 1;
while (flag)
{
printf("请输入要排查的坐标:");
scanf_s("%d %d", &x, &y);
if (x > 9 || y > 9)
{
printf("您的输入不符合规则,请重新输入!");
Sleep(2000);
system("cls");
Display_Board(Show_Board, ROW, COL);
flag = 1;
}
else if (x <= 9 && y <= 9)
{
flag = 0;
}
}
if (Show_Board[x][y] != '*')
{
printf("该坐标您已排查过,请重新排查!\n");
Sleep(2000);
}
Auto_Sweep(Set_Board,Show_Board, x, y);
printf("\n");
system("cls");
if (Set_Board[x][y] == '0')
{
int count = Translate(Set_Board, Show_Board,x,y);
Show_Board[x][y] = count + '0';
mine_amount--;
Display_Board(Show_Board, ROW, COL);
}
else
{
printf("游戏结束,你被炸死了\n");
Display_Board(Set_Board, ROW, COL);
break;
}
}
if (mine_amount == 0)
{
printf("恭喜你,成功排完全部的雷!\n");
Display_Board(Set_Board, ROW, COL);
}
}
Translate.c(game.c中所使用的算法)
#include <stdio.h>
#include "game.h"
int Translate(char Set_Board[ROWS][COLS], char Show_Board[ROWS][COLS], int x, int y)
{
int r = Set_Board[x - 1][y - 1] + Set_Board[x - 1][y] + Set_Board[x - 1][y + 1] + Set_Board[x][y - 1] + Set_Board[x][y + 1] + Set_Board[x + 1][y - 1] + Set_Board[x + 1][y] + Set_Board[x + 1][y + 1] - 8 * '0';
return r;
}