2018年4月24日
今天分享一个简单的扫雷游戏的程序。首先看程序:
头文件 game.h :
#ifndef _GAME_H_
#define _GAME_H_
#define _CRT_SECURE_NO_DEPRECATE //忽略scanf() 可能不安全的问题
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#define MAX_ROW 16 //最大棋盘行数
#define MAX_COL 30 //最大棋盘列数
void menu(void);//游戏菜单
void difficultMenu(void);//难度选择菜单
void game(int difficult);//扫雷游戏
#endif
源文件 game.c :
#include "game.h"
//游戏菜单
void menu(void)
{
system("cls");//每次显示菜单时清屏
printf("**********************************************\n");
printf("****** 欢迎来到扫雷游戏 ******\n");
printf("****** ******\n");
printf("****** 1.开始游戏 ******\n");
printf("****** 2.难度设置 ******\n");
printf("****** 0.退出 ******\n");
printf("****** ******\n");
printf("****** 适度游戏益脑 沉迷游戏伤身 ******\n");
printf("**********************************************\n");
}
//难度选择菜单
void difficultMenu(void)
{
system("cls");//每次显示菜单时清屏
printf("**********************************************\n");
printf("****** 欢迎来到扫雷游戏 ******\n");
printf("****** 难度设置 ******\n");
printf("****** ******\n");
printf("****** 1.简单(雷区:9*9 雷数:10) ******\n");
printf("****** 2.中等(雷区:16*16 雷数:40) ******\n");
printf("****** 3.困难(雷区:16*30 雷数:99) ******\n");
printf("****** ******\n");
printf("****** 适度游戏益脑 沉迷游戏伤身 ******\n");
printf("**********************************************\n");
}
//埋雷
void plantMines(char mine_board[][MAX_COL + 2], int row, int col, int num_mine)
{
int i, x, y;
//初始化雷区 '0'
memset(mine_board, '0', (MAX_ROW + 2)*(MAX_COL + 2));
//埋雷 '1'
for (i = 0; i < num_mine; i++){
while (1){
x = rand() % row + 1;
y = rand() % col + 1;
if ('0' == mine_board[x][y]){
mine_board[x][y] = '1';
break;
}
}
}
}
//初始化玩家面板 ' '
void initPlayerBoard(char player_board[][MAX_COL + 2])
{
memset(player_board, ' ', (MAX_ROW + 2)*(MAX_COL + 2));
}
//展示游戏难度和游戏进程信息
void showMessage(int difficult, int num_mine, int count)
{
system("cls");//清屏
switch (difficult)
{
case 1:
printf("游戏难度:简单 ");
break;
case 2:
printf("游戏难度:中等 ");
break;
case 3:
printf("游戏难度:困难 ");
break;
default:
break;
}
printf("未排除的雷区:%d 雷数:%d\n", count, num_mine);
}
//显示玩家面板内容
void showPlayerBoard(char player_board[][MAX_COL + 2], int row, int col)
{
int i, j;
//打印玩家面板列数序列号
printf(" ");
for (i = 1; i < col + 1; i++){
printf("%3d", i);
}
//打印玩家面板行数序列号,以及每行的面板信息并用"-------"隔开
for (i = 1; i < row + 1; i++){
printf("\n ");
for (j = 0; j < 3 * col + 1; j++){
printf("-");
}
printf("\n%2d|", i);
for (j = 1; j < col + 1; j++){
printf("%2c|", player_board[i][j]);
}
}
//打印最后一行"------------"
printf("\n ");
for (j = 0; j < 3 * col + 1; j++){
printf("-");
}
printf("\n");
}
//返回坐标<x,y>周围雷的个数
char numOfMineAroundIt(char mine_board[][MAX_COL + 2], int x, int y)
{
int i, j, num;
num = 0;//初始化
for (i = x - 1; i < x + 2; i++){
for (j = y - 1; j < y + 2; j++){
num += mine_board[i][j] - '0';
}
}
return num + '0';
}
//展开坐标<x,y>为'0'时周围的信息 递归
void showAroundZero(char player_board[][MAX_COL + 2], \
char mine_board[][MAX_COL + 2], int row, int col, int x, int y,int *pcount)
{
int i, j;
for (i = x - 1; i < x + 2; i++){
for (j = y - 1; j < y + 2; j++){
if (i>0 && i<row + 1 && j>0 && j<col + 1 && ' ' == player_board[i][j]){
player_board[i][j] = numOfMineAroundIt(mine_board, i, j);
--*pcount;//玩家面板每显示一个格子信息,--count
if ('0'==player_board[i][j])
showAroundZero(player_board, mine_board, row, col, i, j, pcount);\
//如果player_board[i][j]=='0',继续展开<i,j>周围的信息
}
}
}
}
//游戏结束 把雷的位置加入到玩家面板中并展示
void gameOver(char player_board[][MAX_COL + 2], \
char mine_board[][MAX_COL + 2], int row, int col)
{
int i, j;
for (i = 1; i < row + 1; i++){
for ( j = 1; j < col+1; j++)
{
if ('1' == mine_board[i][j])
player_board[i][j] = '*';
}
}
showPlayerBoard(player_board, row, col);
}
//扫雷游戏
void game(int difficult)
{
//创建足够大的雷区
char mine_board[MAX_ROW + 2][MAX_COL + 2];
char player_board[MAX_ROW + 2][MAX_COL + 2];
int row, col, num_mine, count;
//设置雷区大小以及雷数
switch (difficult)
{
case 1:
row = 9;
col = 9;
num_mine = 10;
break;
case 2:
row = 16;
col = 16;
num_mine = 40;
break;
case 3:
row = 16;
col = 30;
num_mine = 99;
break;
default:
break;
}
count = row*col;
//埋雷
plantMines(mine_board, row, col, num_mine);
//初始化雷区
initPlayerBoard(player_board);
//扫雷
while (count > num_mine)
{
int x, y;
//显示游戏信息与玩家面板内容
showMessage(difficult, num_mine, count);
showPlayerBoard(player_board, row, col);
printf("请输入<x,y>:");
while (1){
scanf("%d%d", &x, &y);
if (x<1 || x>row || y<1 || y>col)
printf("坐标输入错误!请重新输入<x,y>:");
else if (player_board[x][y] != ' ')
printf("坐标已被清理!请重新输入<x,y>:");
else
break;
}
if ('1' == mine_board[x][y])
break;
else{
player_board[x][y] = numOfMineAroundIt(mine_board, x, y);
--count;//玩家面板每显示一个格子信息,--count
if ('0' == player_board[x][y])
showAroundZero(player_board, mine_board, row, col, x, y, &count);\
//如果player_board[x][y]=='0',展开<x,y>周围的信息
}
}
//展示游戏结束时游戏以及玩家面板信息
showMessage(difficult, num_mine, count);
gameOver(player_board, mine_board, row, col);
//判断扫雷成功还是失败
if (count > num_mine)
printf("很可惜!扫雷失败!\n");
else
printf("恭喜你!扫雷成功!\n");
}
源文件 test.c :
#include "game.h"
//扫雷游戏
int main(void)
{
int input1, input2, input3, difficult, flag;
//初始化菜单输入标志
flag = 1;
//初始化难度:简单
difficult = 1;
srand((unsigned)time(NULL));//随机数种子
do{
input2 = 1;
//显示菜单
menu();
if (flag)
printf("请按菜单提示输入选择:");
else
printf("输入错误!请按菜单提示重新输入选择:");
scanf("%d", &input1);
flag = 1;//重置菜单输入标志
switch (input1)
{
case 0:
printf("祝您生活愉快!再见!\n");
break;
case 1:
do{
switch (input2)
{
case 0:
flag = 1;
break;
case 1:
game(difficult);
printf("再来一局请输入1,返回菜单请输入0:");
break;
default:
printf("输入错误!请按提示重新输入:");
break;
}
scanf("%d", &input2);
} while (input2);
break;
case 2:
difficultMenu();
printf("请按菜单提示输入选择:");
while (1){
int dif_flag = 1;//循环结束标志
scanf("%d", &input3);
/*switch (input3)
{
case 1:
difficult = 1;
break;
case 2:
difficult = 2;
break;
case 3:
difficult = 3;
break;
default:
flag = 0;
printf("输入错误!请按菜单提示输入选择:");
break;
}*/
if (input3 > 0 && input3 < 4)
difficult = input3;
else{
dif_flag = 0;//难度选择菜单输入错误标志
printf("输入错误!请按菜单提示输入选择:");
}
//输入正确跳出循环
if (dif_flag)
break;
}
break;
default:
flag = 0;//主菜单输入错误标志
break;
}
} while (input1);
system("pause");
return 0;
}
运行结果:
菜单界面:
难度设置界面:(初始化难度为简单)
简单难度下游戏开始界面:
输入坐标<1,1>后:
扫雷成功界面:
困难模式下游戏界面:
喜欢的朋友可以拷贝玩一下这个简单的游戏,欢迎并感谢大家在下面留言交流看法。
作者小丿萝卜,来自美丽的大重庆。
我的C故事系列主要写我在C中发现的有趣的代码或者算法。
如果大家觉得我的分享对大家学习了解C有一点点帮助,欢迎关注我的博客。
我的联系方式:微信:zhongdaidongzdd QQ:1161665939。欢迎一起交流编程知识。