今天给大家介绍一下如何用C语言实现一个简易的扫雷游戏
首先,要实现10 * 10的扫雷游戏,我们要先定义两个12 * 12的二维数组,一个用来显示给玩家操作,一个用来存放随机产生的雷的位置,
为什么是12 * 12呢
0 | 0 | 0
1 | x | 0
1 | 0 | 0
我们以3 * 3来举例,0 表示没有雷,1 表示有雷,x 为玩家输入的扫雷的位置,它的值为0,那么它现在要返回周围有几个雷,必须将周围8个空格全部扫描一遍,但是如果x的位置在边框呢
x | 0 | 0
1 | 0 | 0
1 | 0 | 1
很显然,这种情况只能扫描周围的三个空格,为了解决这个问题,我们可以设置一个5 * 5的数组
0 | 0 | 0 | 0 | 0
0 | x | 0 | 0 | 0
0 | 1 | 0 | 0 | 0
0 | 1 | 0 | 1 | 0
0 | 0 | 0 | 0 | 0
这样的话,不管x在什么位置,都会扫描8个空格
头文件
#ifndef _MINE_H_
#define _MINE_H_
#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <stdlib.h>
#pragma warning(disable:4996)
#define ROW 12
#define COL 12
#define NUM 20//产生雷的个数
void Game();
void Initboard(char board[ROW][COL], int row, int col, char elem);
void Setmine(char mine[ROW][COL], int row, int col, int num);
void Showboard(char board[ROW][COL], int row, int col);
char Getnum(char mine[ROW][COL], int x, int y);
#endif
主函数
#include "mine.h"
void menu()
{
printf("###############################\n");
printf("#### 欢迎来到扫雷游戏室 #####\n");
printf("###############################\n");
printf("#### 1.玩游戏 #####\n");
printf("#### 2.退出游戏 #####\n");
printf("###############################\n");
}
int main()
{
int select = 0;
do{
menu();
printf("请选择:>");
scanf("%d", &select);
switch (select){
case 1:
Game();
printf("游戏结束!\n");
break;
case 2:
printf("退出成功!\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while(2 != select);
system("pause");
return 0;
}
调用函数
#include "mine.h"
void Initboard(char board[ROW][COL], int row, int col, char elem)//初始化数组
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++){
for (j = 0; j < col; j++){
board[i][j] = elem;
}
}
}
void Setmine(char mine[ROW][COL], int row, int col, int num)//随机产生雷的位置
{
while (num > 0){
int i = rand() % (row - 2) + 1;//横坐标
int j = rand() % (col - 2) + 1;//纵坐标
if (mine[i][j] == '0'){//防止雷的位置重复
num--;
mine[i][j] = '1';
}
}
}
void Showboard(char board[ROW][COL], int row, int col)//打印数组
{
int i = 0;
int j = 0;
printf(" ");//为了界面好看一点
for (j = 1; j < col - 1; j++){//打印列标
printf("| %-2d", j);
}
printf("\n");
for (i = 1; i < row - 1; i++){
printf("-------------------------------------------\n");
printf("%2d|", i);//打印行标
for (j = 1; j < col - 1; j++){
printf("%2c |", board[i][j]);
}
printf("\n");
}
}
char Getnum(char mine[ROW][COL], int x, int y)
{
return mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + \//上一行的雷的个数
mine[x][y - 1] + mine[x][y + 1] + \//左右两边的雷
mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 7 * '0';//下一行的雷的个数
}
void Game()
{
char board[ROW][COL];//用来显示扫雷界面
char mine[ROW][COL];//存放产生的雷的位置
int count = (ROW - 2) * (COL - 2) - NUM;//玩家可以扫的位置的 个数
srand((unsigned int)time(NULL));//随机数种子
Initboard(board, ROW, COL, '*');//全部初始化为‘*’
Initboard(mine, ROW, COL, '0');//‘0’代表该位置没有雷,‘1’代表有雷
Setmine(mine, ROW, COL, NUM);//随机生成雷
do{
system("cls");//清屏
int x = 0;//横坐标
int y = 0;//纵坐标
Showboard(board, ROW, COL);//打印界面
printf("请输入扫雷位置<x,y>:");
scanf("%d,%d", &x, &y);
if (x < 1 || x >10 || y < 1 || y > 10){
printf("超出界面范围,请重新输入!\n");
continue;
}
if (board[x][y] != '*'){
printf("该位置已经扫过,请重新输入!\n");
continue;
}
if (mine[x][y] == '0'){
count--;
char num = Getnum(mine, x, y);
board[x][y] = num;
}
else{
printf("很遗憾!你扫到了雷,游戏失败!\n");
Showboard(mine, ROW, COL);
break;
}
} while (count > 0);
if (0 == count){
Showboard(mine, ROW, COL);
printf("恭喜你,你赢了!\n");
}
}