相信大家都玩过扫雷吧?电脑游戏规则:在一块9*9的网格中,左键翻开这一格,右键标记地雷,双击左键(或者左右键一起点)可以看到这个数字的可点击范围,你点出了一个数字,是1,就说明它周围的8的格子里有1个雷,是2就有两个雷,是3就有三个雷···以此类推。如果你把数字周围的雷全扫出后还有空格,不必再一格一格翻开,直接双击左键就可以了。但如果你标记错了雷,那就会"boom!"一切重新开始。
-
初始化棋盘
-
显示棋盘
-
布置雷区
-
统计当前坐标周围雷数
-
排雷
-
第一次排雷绝对安全
-
判断输赢
这是我game.h里面的代码:
#pragma once #include#include #include #ifndef __GAME_H__//#ifndef A_H意思是"if not define a.h" 如果不存在a.h #define __GAME_H__//引入a.h #include #include #include //实际的行列(打印出来的棋盘) #define ROW 9 #define COL 9 //设计时的行列(比实际的多两行以防越界,多出来的两行、列不打印) #define ROWS ROW+2 #define COLS COL+2 //设置的雷数目为10 #define minenum 10 void game(); void Init_board(char board[ROWS][COLS], int rows, int cols, char set);//初始化两个棋盘 void Display_board(char board[ROWS][COLS], int row, int col);//显示棋盘 void Set_mine(char real_board[ROWS][COLS], int row, int col);//布置雷区 int Count_mine(char real_board[ROWS][COLS], int x, int y);//统计当前坐标周围的雷数 void Find_mine(char play_board[ROWS][COLS], char real_board[ROWS][COLS], int row, int col);//排雷 void Fsafe(char board[ROWS][COLS], int x, int y);//第一次排雷绝对安全 void Unfold(char play_board[ROWS][COLS], char real_board[ROWS][COLS], int row, int col, int x, int y);//没雷展开 int Iswin(char board[ROWS][COLS], int row, int col);//判断输赢 #endif//否则不需要引入c //头件的中的#ifndef,这是一个很关键的东西。比如你有两个C文件,这两个C文件都include了同一个头文件。而编译时,这两个C文件要一同编译成一个可运行文件,于是问题来了,大量的声明冲突。
这是我game.c里面的代码:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void Init_board(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 Display_board(char board[ROWS][COLS], int row, int col)//显示棋盘(传不同的参可以展示不同的键盘)
{
int i = 0;
int j = 0;
for (i = 0; i <= col; i++)
{
printf("%d ", i);//设置列标以便用户使用
}
printf("n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);//设置行标
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("n");
}
}
void Set_mine(char real_board[ROWS][COLS], int row, int col)//布置雷区
{
int x = 0;
int y = 0;
int count = minenum;
while (count)
{
x = rand() % row + 1;
y = rand() % col + 1;
if (real_board[x][y] == '0')
{
real_board[x][y] = '1';
count--;
}
}
}
int Count_mine(char real_board[ROWS][COLS], int x, int y)//统计mine数组中x,y坐标周围有几个雷
{
return real_board[x - 1][y - 1] +
real_board[x - 1][y] +
real_board[x - 1][y + 1] +
real_board[x][y - 1] +
real_board[x][y + 1] +
real_board[x + 1][y - 1] + real_board[x + 1][y] + real_board[x + 1][y + 1]
- 8 * '0';
}
void Fsafe(char real_board[ROWS][COLS], int x, int y)//第一次排雷很安全
{
int i = 0;
int j = 0;
if (real_board[x][y] == '1')
{
i = rand() % 9 + 1;
j = rand() % 9 + 1;
if (real_board[i][j] == '0')
{
real_board[i][j] = '1';
real_board[x][y] = '0';
}
}
}
int Iswin(char board[ROWS][COLS], int row, int col)//判断是否排完雷赢了
{
int i = 0;
int j = 0;
int count = 0;
for (i = 1; i <= row; i++)
{
for (j = 1; j <= col; j++)
{
if (board[i][j] == '*')//计算剩余雷的个数
{
count++;
}
}
}
return count;
}
void Unfold(char play_board[ROWS][COLS], char real_board[ROWS][COLS], int row, int col, int x, int y)//没雷展开
{
int i = 0;
int j = 0;
if (Count_mine(real_board, x, y) == 0)
{
play_board[x][y] = '0';
for (i = -1; i <= 1; i++)
{
for (j = -1; j <= 1; j++)
{
if (x + i >= 1 && x + i <= row && y + j >= 1 && y + j <= col && (i != 0 || j != 0))
{
if (play_board[x + i][y + j] != '0')
{
Unfold(play_board, real_board, row, col, x + i, y + j);
}
}
}
}
}
else
{
play_board[x][y] = Count_mine(real_board, x, y) + '0';
}
}
void Find_mine(char play_board[ROWS][COLS], char real_board[ROWS][COLS], int row, int col)//排雷
{
int x = 0;
int y = 0;
int ret = 0;
int count = 0;//排查次数
while (Iswin(play_board, row, col) != minenum)
{
printf("请输入你要排查的坐标:n");
scanf("%d%d", &x, &y);
if (x<1 || x>row || y<1 || y>col)
{
printf("输入坐标超出范围,请重新输入:n");
}
else
{
if (real_board[x][y] == '1')
{
if (count == 0)
{
Fsafe(real_board, x, y);
Unfold(play_board, real_board, row, col, x, y);
Display_board(play_board, row, col);
count++;
}
else
{
printf("你被炸死了,游戏结束n");
Display_board(real_board, row, col);
count++;
printf("一共排查了%d次n", count);
break;
}
}
else
{
Unfold(play_board, real_board, row, col, x, y);
Display_board(play_board, row, col);
count++;
}
}
}
if (Iswin(play_board, row, col) == minenum)
{
printf("恭喜你,扫雷成功!!!n");
printf("一共排查了%d次n", count);
Display_board(real_board, row, col);
}
}
void game()
{
char play_board[ROWS][COLS] = { 0 };
char real_board[ROWS][COLS] = { 0 };
Init_board(play_board, ROWS, COLS, '*');
Init_board(real_board, ROWS, COLS, '0');
Display_board(play_board, ROW, COL);
Set_mine(real_board, ROW, COL);
Find_mine(play_board, real_board, ROW, COL);
}
这是我test.c文件里的代码:
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
printf("************************************************n");
printf("********* 扫雷游戏***************************n");
printf("************ 1. 开始 **************************n");
printf("*********** 0. 退出 **************************n");
printf("************************************************n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));//默认情况下生成一个随机数,这个随机数来自系统时钟
do
{
menu();
printf("请输入你的选择:n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏已退出n");
break;
default:
printf("输入错误,请重新输入n");
break;
}
} while (input);
}
代码就写完了,最后到了最激动人心的时刻我们来实现这个游戏:



