[C语言]扫雷小游戏实现 注释 代码

思路

一、初始化用户棋盘和雷区棋盘
二、雷区棋盘随机布雷
三、打印初始化棋盘
四、用户输入坐标
五、判断输赢
六、打印雷区棋盘
在这里插入图片描述

game.h的创建和代码

这部分做的是头文件的声明以及后面所要用到的大部分函数的定义

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9   //用户棋盘大小
#define COL 9
#define ROWS ROW+2//雷区棋盘大小
#define COLS COL+2
#define Mine_Count 10//雷数
void InitBoard(char mine_board[ROWS][COLS], char user_board[ROWS][COLS], int row, int col);//初始化雷区棋盘和用户棋盘
void SetMine(char mine_board[ROWS][COLS], int row, int col);//放置雷
void ShowBoard(char user_board[ROWS][COLS], int row, int col);//打印用户棋盘
char Get_Mine(char mine_board[ROWS][COLS], int x, int y);//获取用户选择坐标周围的雷数
void SweepMine(char mine_board[ROWS][COLS], char user_board[ROWS][COLS], int row, int col);//扫雷

game.c的创建和代码

这部分做的是game.c文件中定义的函数实现

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(char mine_board[ROWS][COLS], char user_board[ROWS][COLS], int row, int col)//初始化雷区棋盘和用户棋盘
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			mine_board[i][j] = '0';//初始化雷区棋盘
		}
	}
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			user_board[i][j] = '?';//初始化用户棋盘
		}
	}
}
void SetMine(char mine_board[ROWS][COLS], int row, int col)//放置雷
{
	int mine_count = Mine_Count;

	while (mine_count!=0)
	{
		int x = rand() % ROW + 1;
		int y = rand() % COL + 1;
		if (mine_board[x][y] == '0')
		{
			mine_board[x][y] = '1';
			mine_count--;
		}
	}
}
void ShowBoard(char user_board[ROWS][COLS], int row, int col)//打印用户棋盘
{
	printf("============================================\n");
	for (int i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\n");
	for (int i = 1; i <= row; i++)
	{
		printf("%d ", i);
		for (int j = 1; j <= col; j++)
		{
			{
				printf("%c ", user_board[i][j]);
			}
		}
		printf("\n");
	}
	printf("============================================\n");
}
char Get_Mine(char mine_board[ROWS][COLS], int x, int y)//获取用户选择坐标周围的雷数
{
	return mine_board[x - 1][y - 1] + mine_board[x - 1][y] + mine_board[x - 1][y + 1]
		+ mine_board[x][y - 1] + mine_board[x][y + 1]+ mine_board[x + 1][y - 1] 
		+ mine_board[x + 1][y] + mine_board[x + 1][y + 1]-8*'0';
}

void SweepMine(char mine_board[ROWS][COLS], char user_board[ROWS][COLS], int row, int col)//扫雷
{
	int count = 0;
	while (count < ROW*COL - Mine_Count)
	{
		printf("请输入你的选择 x,y:");
		int x = 0;
		int y = 0;
		scanf("%d,%d", &x, &y);
		if (user_board[x][y] == '?')//判断是否曾经输入过这个坐标
		{
			if (mine_board[x][y] == '1')//等于字符1就踩雷
			{
				printf("很遗憾,踩到雷了...\n");
				break;
			}
			else//否则返回该坐标周围的雷数并打印新的棋盘
			{
				user_board[x][y] = Get_Mine(mine_board, x, y) + '0';
				ShowBoard(user_board, ROW, COL);
				count++;
			}
		}
		else
		{
			printf("刚才已经扫过此地...");
		}
	}
	if (count == ROW*COL - Mine_Count)//判断走的步数和棋盘安全位置是否相等
	{
		printf("恭喜你,扫雷成功!!");
		ShowBoard(mine_board, ROW, COL);
	}
}

test.c的创建和代码

这部分做的是菜单、游戏的运行函数和主函数的编写

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
	printf("**********************\n");
	printf("*********扫雷*********\n");
	printf("****0.exit**1.play****\n");
	printf("**********************\n");
}
void game()
{
	char mine_board[ROWS][COLS] = { 0 };
	char user_board[ROWS][COLS] = { 0 };
	InitBoard(mine_board, user_board, ROWS, COLS);
	SetMine(mine_board, ROWS, COLS);
	ShowBoard(user_board, ROW, COL);
	//ShowBoard(mine_board, ROW, COL);这个函数在最开始会打印一边雷区 供调试使用
	SweepMine(mine_board, user_board, ROWS, COLS);
}
int main()
{
	srand((unsigned int)time(NULL));
	int input;
	do
	{
		menu();
		printf("请输入你的选择:");
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				printf("开始游戏\n");
				game();
				break;
			case 0:
				printf("退出游戏\n");
				break;
			default:
				printf("选择不合法");
		}
	} while (input);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值