为了函数的具体运用。来个扫雷游戏具体学习
这就是调用的具体学习。虽然补充的晚了点。但也是抽时间慢慢的学习与补充。写完这个扫雷游戏。不仅对函数的调用有了很好的掌握,而且对编程的兴趣有提高了一层(毕竟要有一个编程思维的提升)。这个代码也是在挫折与BUG中成长起来,可能会有不足的地方。比如菜单的地方太过草率。还有中间的某些算法太过冗长。但是代码的可读性还是比较好的。后面还有一个少稍微加了点内容的扫雷。(有错误或是感兴趣却没看到的请评论哦。欢迎交流)
-
扫雷游戏
该代码涉及到数组这个概念,提前了解请点击,传送门在此
提前看一下棋盘:
//C语言
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define ROW 9//地图行数
#define COL 9//地图列数
#define MINE_COUNT 10 //地雷个数
char mine_map[ROW + 2][COL + 2];//雷阵地图(+2表示边框,统计雷数)
char show_map[ROW + 2][COL + 2];//展示地图(+2表示边框,统计雷数)
int man_select() { //比较草率的一个菜单
int choice = 0;
printf("##########扫雷游戏##########\n");
printf(" #########1. 开始游戏######\n");
printf(" #########2. 退出游戏######\n");
printf("###########################\n");
while (1) {
printf("请输入您的选择:");
scanf("%d", &choice);
if (choice < 0 || choice>2) {
printf("您输入的有问题,请重新输入!");//进行输入的判定
continue;
}
break;
}
return choice;
}
//打印函数
void print_map(char map[ROW+2][COL+2]) {//一般数组做参数都是 arr[]这种形式,这里方便阅读而已
printf(" "); //如void str(char arr[])
for (int col = 1; col <= COL;col++) {
printf("%d ",col);
}
printf("\n");
for (int col = 1; col <= COL;col++) {
printf("---");
}
printf("\n"); //前面的代码都是为了美观,可以不要
for (int row = 1; row <= ROW;row++) {
printf(" %d|",row);
for (int col = 1; col <=COL;col++) {
printf("%c ",map[row][col]);
}
printf("\n");
}
}
//提示周围数量
void prompt_mine_count(char map[ROW+2][COL+2],char mmap[ROW+2][COL+2],int row,int col) {
//有必要说一下,字符转整型,就是 '9' - '0' == 9,assic码表对照
int mine_count = (mine_map[row - 1][col - 1] - '0') + (mine_map[row - 1][col] - '0') + (mine_map[row - 1][col + 1] - '0')//第一行这里都是 '1' - '0' == 1
+
(mine_map[row][col - 1] - '0') + (mine_map[row][col + 1] - '0') +//第二行
(mine_map[row + 1][col - 1] - '0') + (mine_map[row + 1][col] - '0')+ (mine_map[row + 1][col + 1] - '0') ;//第三行
show_map[row][col] = '0' + mine_count;//整型返回字符一样的道理
}
//数组初始化,布置雷阵
void init_arr(char mine_map[ROW+2][COL+2], char show_map[ROW+2][COL+2]) {
memset(mine_map, '0', (ROW+2)*(COL+2));//数组初始化的一个函数
//第一个参数是数组,第二个参数是要初始化成的数据,第三个参数是要初始化的长度
memset(show_map, '*', (ROW+2)*(COL+2));
int mine_count = MINE_COUNT;
//srand(time(0));//时间种子,随时间进行随机
while (mine_count>0) {
int row = rand() % 9 + 1;//%9肯定是一个小于 9 的数
int col = rand() % 9 + 1;
if (mine_map[row][col]=='0') {
mine_map[row][col] = '1';
--mine_count;
}
}
}
void to_game() {
//不是地雷的方块数
int not_mine_count = 0;
//初始化数组
init_arr(mine_map,show_map);
//打印展示地图
print_map(show_map);
//开始游戏
while (1) {
int row = 0;
int col = 0;
//提示用户输入
printf("条件简陋,请输入要翻开的坐标(行 列):");
scanf("%d %d",&row,&col);
//进行合法判定
if (row<1||row>ROW||col<1||col>ROW) {
printf("您输入的坐标超出范围,请重新输入!");
continue;
}
//判断是否踩雷
//踩雷,游戏结束
if (mine_map[row][col]=='1') {
printf("您踩雷了,游戏结束!\n");
print_map(mine_map);
break;
}
//没踩雷,是否胜利,未胜利提示周围雷数
//胜利!退出循环!
++not_mine_count;
if (not_mine_count==ROW*COL-MINE_COUNT) {
printf("猴赛雷!扫雷成功!\n");
print_map(mine_map);
break;
}
//没有胜利,提示周围雷数
prompt_mine_count(show_map,mine_map,row,col);
print_map(show_map);
}
}
void start_game() {
while (1) {
int choice = man_select();
if (choice == 0) {
break;
}
to_game();
}
}
void main() {
start_game();
system("pause");
}
-
改进版扫雷
//C语言
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define ROW 9//地图行数
#define COL 9//地图列数
#define ROWPLUS 20
#define COLPLUS 20
#define MINE_COUNT 10 //地雷个数
#define MINE_COUNT_PLUS 20
char mine_map[ROW + 2][COL + 2];//雷阵地图(+2表示边框,统计雷数)
char show_map[ROW + 2][COL + 2];//展示地图(+2表示边框,统计雷数)
char mine_map_plus[ROWPLUS + 2][COLPLUS + 2];
char show_map_plus[ROWPLUS + 2][COLPLUS + 2];
int level_game(){
int choice = 0;
printf("##### 请选择难度 ######\n");
printf("##### 1.9 * 9 棋盘 ######\n");
printf("##### 2.20 * 20 棋盘 ####\n");
printf("#########################\n");
while (1) {
printf("请输入您的选择:");
scanf("%d",&choice);
if (choice<1||choice>2) {
printf("您输入的有问题,请重新输入!");
continue;
}
break;
}
return choice;
}
int man_select() {
int choice = 0;
printf("##########扫雷游戏##########\n");
printf(" #########1. 开始游戏######\n");
printf(" #########2. 退出游戏######\n");
printf("###########################\n");
while (1) {
printf("请输入您的选择:");
scanf("%d", &choice);
if (choice < 0 || choice>2) {
printf("您输入的有问题,请重新输入!");
continue;
}
break;
}
return choice;
}
//打印函数
void print_map(char map[ROW + 2][COL + 2]) {
printf(" ");
for (int col = 1; col <= COL; col++) {
printf("%d ", col);
}
printf("\n");
for (int col = 1; col <= COL; col++) {
printf("---");
}
printf("\n");
for (int row = 1; row <= ROW; row++) {
printf(" %d|", row);
for (int col = 1; col <= COL; col++) {
printf("%c ", map[row][col]);
}
printf("\n");
}
}
//打印plus的棋盘
void print_map_plus(char map[ROWPLUS + 2][COLPLUS + 2]) {
printf(" ");
for (int col = 1; col <= COLPLUS; col++) {
printf(" %02d", col);
}
printf("\n");
for (int col = 0; col <= COLPLUS; col++) {
printf("---");
}
printf("\n");
for (int row = 1; row <= ROWPLUS; row++) {
printf(" %02d|", row);
for (int col = 1; col <= COLPLUS; col++) {
printf(" %c ", map[row][col]);
}
printf("\n");
}
}
//提示周围数量
void prompt_mine_count(char map[ROW + 2][COL + 2], char mmap[ROW + 2][COL + 2], int row, int col) {
int mine_count = (mine_map[row - 1][col - 1] - '0') + (mine_map[row - 1][col] - '0') + (mine_map[row - 1][col + 1] - '0')//第一行
+
(mine_map[row][col - 1] - '0') + (mine_map[row][col + 1] - '0') +//第二行
(mine_map[row + 1][col - 1] - '0') + (mine_map[row + 1][col] - '0') + (mine_map[row + 1][col + 1] - '0');//第三行
show_map[row][col] = '0' + mine_count;
}
//plus提示数量
void prompt_mine_count_plus(char map[ROWPLUS + 2][COLPLUS + 2], char mmap[ROWPLUS + 2][COLPLUS + 2], int row, int col) {
int mine_count = (mine_map_plus[row - 1][col - 1] - '0') + (mine_map_plus[row - 1][col] - '0') + (mine_map_plus[row - 1][col + 1] - '0')//第一行
+
(mine_map_plus[row][col - 1] - '0') + (mine_map_plus[row][col + 1] - '0') +//第二行
(mine_map_plus[row + 1][col - 1] - '0') + (mine_map_plus[row + 1][col] - '0') + (mine_map_plus[row + 1][col + 1] - '0');//第三行
show_map_plus[row][col] = '0' + mine_count;
}
//数组初始化,不知雷阵
void init_arr(char mine_map[ROW + 2][COL + 2], char show_map[ROW + 2][COL + 2]) {
memset(mine_map, '0', (ROW + 2)*(COL + 2));
memset(show_map, '*', (ROW + 2)*(COL + 2));
int mine_count = MINE_COUNT;
srand(time(0));
while (mine_count > 0) {
int row = rand() % 9 + 1;
int col = rand() % 9 + 1;
if (mine_map[row][col] == '0') {
mine_map[row][col] = '1';
--mine_count;
}
}
}
//PLUS数组初始化
void init_arr_plus(char mine_map_plus[ROWPLUS+ 2][COLPLUS + 2], char show_map_plus[ROWPLUS + 2][COLPLUS + 2]) {
memset(mine_map_plus, '0', (ROWPLUS + 2)*(COLPLUS + 2));
memset(show_map_plus, '*', (ROWPLUS + 2)*(COLPLUS + 2));
int mine_count = MINE_COUNT_PLUS;
srand(time(0));
while (mine_count > 0) {
int row = rand() % 9 + 1;
int col = rand() % 9 + 1;
if (mine_map_plus[row][col] == '0') {
mine_map_plus[row][col] = '1';
--mine_count;
}
}
}
void to_game() {
//不是地雷二点方块数
int not_mine_count = 0;
//初始化数组
init_arr(mine_map, show_map);
//打印展示地图
print_map(show_map);
//开始游戏
while (1) {
int row = 0;
int col = 0;
//提示用户输入
printf("条件简陋,请输入要翻开的坐标(行 列):");
scanf("%d %d", &row, &col);
//进行合法判定
if (row<1 || row>ROW || col<1 || col>ROW) {
printf("您输入的坐标超出范围,请重新输入!");
continue;
}
//判断是否踩雷
//踩雷,游戏结束
if (mine_map[row][col] == '1') {
printf("您踩雷了,游戏结束!\n");
print_map(mine_map);
break;
}
//没踩雷,是否胜利,为胜利提示周围雷数
//胜利!退出循环!
++not_mine_count;
if (not_mine_count == ROW * COL - MINE_COUNT) {
printf("猴赛雷!扫雷成功!\n");
print_map(mine_map);
break;
}
//没有胜利,提示周围雷数
prompt_mine_count(show_map, mine_map, row, col);
print_map(show_map);
}
}
void to_game_plus() {
//不是地雷二点方块数
int not_mine_count = 0;
//初始化数组
init_arr_plus(mine_map_plus, show_map_plus);
//打印展示地图
print_map_plus(show_map_plus);
//开始游戏
while (1) {
int row = 0;
int col = 0;
//提示用户输入
printf("条件简陋,请输入要翻开的坐标(行 列):");
scanf("%d %d", &row, &col);
//进行合法判定
if (row<1 || row>ROWPLUS || col<1 || col>ROWPLUS) {
printf("您输入的坐标超出范围,请重新输入!");
continue;
}
//判断是否踩雷
//踩雷,游戏结束
if (mine_map_plus[row][col] == '1') {
printf("您踩雷了,游戏结束!\n");
print_map_plus(mine_map_plus);
break;
}
//没踩雷,是否胜利,为胜利提示周围雷数
//胜利!退出循环!
++not_mine_count;
if (not_mine_count == ROWPLUS * COLPLUS - MINE_COUNT_PLUS) {
printf("猴赛雷!扫雷成功!\n");
print_map_plus(mine_map_plus);
break;
}
//没有胜利,提示周围雷数
prompt_mine_count_plus(show_map_plus, mine_map_plus, row, col);
print_map_plus(show_map_plus);
}
}
void start_game() {
while (1) {
int choice = man_select();
if (choice == 0) {
break;
}
int choice2 = level_game();
if (choice2==1) {
to_game();
}
else {
to_game_plus();
}
}
}
void main() {
start_game();
system("pause");
}