C语言实现扫雷小游戏
扫雷

思路
1.用二维数组存储数据,考虑到显示的内容与实际存储的内容有差别,故定义两个完全相同的二维数组,一个用取名mine_board用来存储实际的雷的位置,另一个show_board用来向玩家显示。 2.为了避免边框位置周边雷的个数不方便统计,所以定义一个比实际使用的数组大2的数组,只使用其中没有边框的部分:  埋雷时只在中间埋,向用户展示时也只显示中间部分,这样便于统计雷的个数,不用考虑边角的特殊情况。 3.电脑埋雷时使用随机数,在随机生成的坐标中埋雷,用字符1表示有雷,用字符0表示没有雷。
代码实现
程序多文件形式,一个头文件clear_mine.h和两个源文件main.c,clear_mine.c,其中main.c和 clear_mine.c之间只有Game一个函数的交互,耦合低,两个文件彼此高度独立。 程序注释中对每个函数的作用有详细解释, 源码如下:
1.头文件clear_mine.h(包含头文件、宏定义、函数声明等)
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#define ROW 12
#define COL 12
#define NUM 20
#define SHOW '*'
extern void Game();
2.源文件main.c(程序入口)
#include"clear_mine.h"
void Manu()
{
printf("------------------------\n");
printf("+----1.Play 0.Quit----+\n");
printf("------------------------\n");
}
int main()
{
int select = 0;
int quit = 0;
while (!quit)
{
Manu();
printf("Please select:");
scanf("%d",&select);
switch (select){
case 1:
Game();
break;
case 0:
quit = 1;
printf("Bye bye!");
break;
default:
printf("Enter error!\n");
break;
}
}
system("pause");
return 0;
}
3.源文件clear_mine.c(游戏的具体实现)
#include"clear_mine.h"
static void SetMines(char mine[][COL], int row,int col)
{
int num = NUM;
while (num){
int x = rand() % (row - 2) + 1;
int y = rand() % (col - 2) + 1;
if (mine[x][y] != '1'){
mine[x][y] = '1';
num--;
}
}
}
static void ShowLine(int col){
for (int i = 1; i <= col - 1; i++){
printf("----");
}
printf("\n");
}
static void ShowBoard(char show[][COL], int row,int col)
{
printf(" ");
for (int i = 1; i <= (col - 2); i++){
printf("%-4d", i);
}
printf("\n");
ShowLine(col);
for (int i = 1; i <= row-2; i++){
printf("%2d|", i);
for (int j = 1; j <= col-2; j++){
printf(" %c |", show[i][j]);
}
printf("\n");
ShowLine(col);
}
}
static char Count(char board[][COL],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 + 1][y + 1] + board[x + 1][y] + \
board[x + 1][y - 1] + board[x][y - 1] - 8 * '0' + '0';
}
void Game()
{
srand((unsigned long)time(NULL));
char show_board[ROW][COL];
char mine_board[ROW][COL];
memset(show_board, SHOW,sizeof(show_board));
memset(mine_board, '0', sizeof(mine_board));
SetMines(mine_board, ROW, COL);
int count = 0;
count = (ROW - 2)*(COL - 2) - NUM;
while (count)
{
ShowBoard(show_board, ROW, COL);
int x = 0;
int y = 0;
printf("Please enter your position:\n");
scanf("%d %d", &x, &y);
if (x<1 || x>ROW || y<1 || y>COL){
printf("Enter error!\n");
continue;
}
if (show_board[x][y] != SHOW){
printf("The coordinates have been cleaned!\n");
continue;
}
if (mine_board[x][y] == '1'){
ShowBoard(mine_board, ROW, COL);
printf("Game over...\n");
break;
}
show_board[x][y] = Count(mine_board,x,y);
count--;
system("cls");
}
if (count == 0){
printf("You win!\n");
}
}
运行截图

|