C语言函数调用的运用

为了函数的具体运用。来个扫雷游戏具体学习

     这就是调用的具体学习。虽然补充的晚了点。但也是抽时间慢慢的学习与补充。写完这个扫雷游戏。不仅对函数的调用有了很好的掌握,而且对编程的兴趣有提高了一层(毕竟要有一个编程思维的提升)。这个代码也是在挫折与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");
}

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值