C语言学习 Day13(扫雷的实现)

今天主要是C语言的学习三子棋的实现。

类似于三子棋,扫雷也分装成三个模块,game.h ,game.c,test.c。

首先在test.c里创建主函数,并使用test函数。

int main()
{
	test();
	return 0;
}

然后在test函数中实现是否玩游戏的选择,并利用循环确保每次进行完游戏和非法输入的情况能再次选择。

void test()
{
	srand(time((unsigned int)NULL));//为后续生成随机雷做准备
	while (1)
	{
		menu();
		printf("请输入一个值:");
		int n = 0;
		scanf("%d", &n);
		system("cls");
		if (n == 1)
		{
			game();
		}
		else if (n == 0)
		{
			printf("退出游戏\n");
			break;
		}
		else
		{
			printf("非法输入,请重试。\n");
		}
	}

}

当然,我们得有一个菜单提示选择

void menu()
{
	printf("*********************************\n");
	printf("********     1.play      ********\n");
	printf("********     0.exit      ********\n");
	printf("*********************************\n");
}

然后就是game函数

void game()
{
	char mine[ROWS][COLS] = { 0 };
	char show[ROWS][COLS] = { 0 };
	//初始化
	init(mine, ROWS, COLS, '0');
	init(show, ROWS, COLS, '*');
	//设置随机雷
	set_mine(mine, ROWS, COLS);
	print(mine, ROW, COL);
	//打印玩家界面
	printf("剩余雷的个数为:%d\n", MINE);
	print(show, ROW, COL);
	//玩家操作
	//排查雷
	player(mine, show, ROW, COL);
}

首先是初始化

void init(char board[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	int j = 0;
	for (i = 0; i <= rows - 1; i++)
	{
		for (j = 0; j <= cols - 1; j++)
		{
			board[i][j] = set;
		}
	}
}

然后打印

void print(char board[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	int a = 0;
	int b = 0;
	printf("----------------扫雷----------------\n");
	for (b = 0; b <= col; b++)
	{
		printf("%d ", b);
	}
	printf("\n");
	for (i = 1 ,a = 1; i <= row && a <= row; i++, a++)
	{
		printf("%d ", a);
		for (j = 1; j <= col; j++)
		{
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("----------------扫雷----------------\n");
}

下一步是生成雷

void set_mine(char board[ROWS][COLS], int rows, int cols)
{
	int n = 0;
	for (n = 0; n < MINE;)
	{
		int i = rand() % (rows - 2) + 1;
		int j = rand() % (rows - 2) + 1;
		if (board[i][j] != '1')
		{
			board[i][j] = '1';
			n++;
		}
	}
}

再来是玩家操作

void player(char board_mine[ROWS][COLS], char board_show[ROWS][COLS], int row, int col)
{
	int i = 0;
	int j = 0;
	int n = 0;
	int a = 0;
	for(a=0;a<ROW*COL-MINE;a++)
	{
		printf("请输入一个坐标:");
		scanf("%d %d", &i, &j);
		//坐标是否已经被使用
		if (board_show[i][j] != '*')
		{
			printf("坐标已被使用,请重新输入。\n");
			a--;
			continue;
		}
		//坐标是否在范围内1=<i<=row,1<=j<=col
		if (i >= 1 && i <= row && j >= 1 && j <= col)
		{
			if (board_mine[i][j] == '1')
			{
				printf("很遗憾,您被雷炸死了。\n");
				goto end;
			}
			n = count(board_mine, i, j);
			board_show[i][j] = '0' + n; 
			print(board_show, row, col);
		}
	}
	printf("恭喜你,游戏胜利!\n");
end:
	{

	}
}

最后是计算周围雷的个数

int count(char board[ROWS][COLS], int x, int y)
{
	return(board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1]
		+ board[x][y - 1] + board[x][y + 1] + board[x + 1][y - 1]
		+ board[x + 1][y] + board[x + 1][y + 1] - 8 * '0');
}

以下是头文件

#include <stdio.h>
#include <Windows.h>
#include <stdlib.h>
#include <time.h>

#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINE 10

//初始化
void init(char board[ROWS][COLS], int rows, int cols, char set);

//打印棋盘
void print(char board[ROWS][COLS], int row, int col);

//随机生成雷
void set_mine(char board[ROWS][COLS], int rows, int cols);

//玩家操作
void player(char board_mine[ROWS][COLS] ,char board_show[ROWS][COLS], int row, int col);

以上就是今天的学习分享了,感谢您的阅读,如有发现错误也欢迎指出!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

听说有人ID没取完就

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值