扫雷是一款趣味的小游戏。系统随机放置一定数目的雷在某些位置,玩家通过选定坐标来排雷,今天,我们用C语言来实现这样一个趣味小游戏。
首先,我们需要一个棋盘来存放雷的信息,这里我们暂且给它起名为mine,这个棋盘上的元素只有两种状态:(字符 ‘0 ’: 表示没有雷,字符'1':表示这个位置是雷),其次我们应该打印一个和用户交互的棋盘,我们给它起名为show,这个show完成的任务应该是当用户排查到不是雷的信息的时候,及时反馈周围8个坐标雷的个数之和。所以,我们这个扫雷小游戏的大致框架如下:
1.设计show和mine
2.布置雷的信息
3.设计排查雷的规则
了解了大致的框架以后,我们就可以上手写代码了
game.h头文件
#pragma once
#include
#include
#include
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
//设置游戏模式
#define EASY 80
//初始化雷盘
void Initboard(char board[ROWS][COLS], int rows, int cols,char set);
//打印雷的信息
void Displayboard(char board[ROWS][COLS], int row, int col);
//布置雷的信息
void Setmine(char mine[ROWS][COLS], int row, int col);
//扫雷
void Findmine(char mine[ROWS][COLS],char show[ROWS][COLS],int row, int col);
注意,为什么我们要定义两个行和列呢,是因为数组存在越界的问题,图解如下
基于这个原因,我们才定义了ROWS和COLS,但实际使用的时候,只打印ROW和COL的信息。
game.c代码如下
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化棋盘
void Initboard(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 = 1 && x <= row && y >= 1 && y <= col)
{
if ('1' == mine[x][y])
{
printf("很遗憾,你被炸死了\n");
Displayboard(mine, ROW, COL);
break;
}
else
{
int count = get_mine_count(mine, x, y);
show[x][y] = count + '0';
Displayboard(show, row, col);
++win;
}
}
else
{
printf("输入坐标非法,请重新输入\n");
}
}
//可能被炸死了,也有可能游戏成功结束
if (win == ROW * COL - EASY)
{
printf("恭喜你,排雷成功\n");
Displayboard(mine, ROW, COL);
}
}
这里我解释一下数雷函数的static修饰符的作用,这个函数的作用仅仅是为了Findmine函数的使用,更简单的说,它仅供为了Findmine()的使用,它不需要被其他文件所使用,static修饰函数的时候会改变函数的外部链接属性,使得被修饰的函数仅能在本文件中使用。
在打印棋盘的时候,我们特地设置了一个字符形参set,目的是为了提高函数的复用性。简单来说,就是我要初始化mine和show,我可以选择为mine写一个初始化函数,也可以为show写一个初始化函数,但这样代码不够简洁,初始化的时候我要调用两次功能相同的函数,而增加这个set形参的时候,我们就可以在你想要初始化棋盘的时候传入你需要的字符初始化对应的棋盘。这样提高了
函数的复用性。
对于获胜情况的判断,也许是比较难想的,获胜条件的图解如下:
1 | 1 | 1 |
0 | 0 | 0 |
1 | 1 | 1 |
这里以3*3为例解说,如果我们获胜,我们应该点完了所有不是雷的位置,所以我们定义一个标杆变量(win)统计我们的点击的个数,而当最后win==ROW*COL-EASY(雷的个数)这时候比赛胜利。
test.c部分
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化雷的信息
Initboard(mine, ROWS, COLS, '0');
//初始化运行界面
Initboard(show, ROWS, COLS, '*');
//打印运行界面
Displayboard(show, ROW, COL);
//放置雷的信息
Setmine(mine, ROW, COL);
//Displayboard(mine, ROW, COL);
//排雷
Findmine(mine, show, ROW, COL);
//Displayboard(show, ROW, COL);
}
//菜单
void menu()
{
printf("***********************\n");
printf("***** 1.play *******\n");
printf("***** 0.exit *********\n");
printf("**********************\n");
}
//测试游戏运行
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入:>");
scanf("%d", &input);
printf("\n");
switch (input)
{ case 1:
game();
break;
case 0:printf("退出游戏\n");
break;
default:printf("选择错误,请重新选择\n");
break;
}
} while (input);
}
int main()
{ //简洁明了的主函数
test();
return 0;
}
完整代码如下:
#pragma once
#include
#include
#include
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
//设置游戏模式
#define EASY 80
//初始化雷盘
void Initboard(char board[ROWS][COLS], int rows, int cols,char set);
//打印雷的信息
void Displayboard(char board[ROWS][COLS], int row, int col);
//布置雷的信息
void Setmine(char mine[ROWS][COLS], int row, int col);
//扫雷
void Findmine(char mine[ROWS][COLS],char show[ROWS][COLS],int row, int col);
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化棋盘
void Initboard(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 = 1 && x <= row && y >= 1 && y <= col)
{
if ('1' == mine[x][y])
{
printf("很遗憾,你被炸死了\n");
Displayboard(mine, ROW, COL);
break;
}
else
{
int count = get_mine_count(mine, x, y);
show[x][y] = count + '0';
Displayboard(show, row, col);
++win;
}
}
else
{
printf("输入坐标非法,请重新输入\n");
}
}
//可能被炸死了,也有可能游戏成功结束
if (win == ROW * COL - EASY)
{
printf("恭喜你,排雷成功\n");
Displayboard(mine, ROW, COL);
}
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化雷的信息
Initboard(mine, ROWS, COLS, '0');
//初始化运行界面
Initboard(show, ROWS, COLS, '*');
//打印运行界面
Displayboard(show, ROW, COL);
//放置雷的信息
Setmine(mine, ROW, COL);
//Displayboard(mine, ROW, COL);
//排雷
Findmine(mine, show, ROW, COL);
//Displayboard(show, ROW, COL);
}
//菜单
void menu()
{
printf("***********************\n");
printf("***** 1.play *******\n");
printf("***** 0.exit *********\n");
printf("**********************\n");
}
//测试游戏运行
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入:>");
scanf("%d", &input);
printf("\n");
switch (input)
{ case 1:
game();
break;
case 0:printf("退出游戏\n");
break;
default:printf("选择错误,请重新选择\n");
break;
}
} while (input);
}
int main()
{ //简洁明了的主函数
test();
return 0;
}
以上就是扫雷小游戏用C语言实现,如有不足之处,还望大神指正。