初学C语言,实战扫雷小游戏

一、游戏规则

二、基本思路

三、代码实现及分析

四、整体代码及结果演示


一、游戏规则

在初级9*9的的表格内排雷,等级可以任意改动,输入坐标进行排雷,输入坐标处是雷,则游戏失败,输入坐标为非雷,则会显示该坐标8个方向坐标的雷数,知道排除所有雷胜利。

---------------------------------------------------------------------------------------------------------------------------------

二、基本思路

1.游戏选择 :进行游戏/退出游戏 - 进行游戏选择 1,退出选择 0

2.设置俩个区域,分别是雷区和显示区,雷区用于存放雷的信息,显示区用于存放排查出雷的信息

3.初始化雷区和显示区

4.布置雷区

5.进行排查雷

6.打印棋盘

---------------------------------------------------------------------------------------------------------------------------------

三、代码实现及分析

代码1:游戏选择

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

}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请输入0/1:>\n");
		scanf("%d",&input);
		switch (input)
		{
		case 1: game(); break;
		case 0: printf("退出游戏\n"); break;
		default:printf("输入错误,请您重新输入\n"); break;

		}
	
	} 	while (input);

}

此处用于实现游戏选择,首先进行菜单函数menu()提示,输入0/1,输入0则退出游戏,输入1则进行game()函数,输入其他则input为非0,再次进入循环,知道输入0/1为止

---------------------------------------------------------------------------------------------------------------------------------

代码2.初始化雷区和显示区

char mine[ROWS][COLS] = {0};//存放排雷的信息
char show[ROWS][COLS] = {0};//存放排查出的雷的信息
//初始化一下棋盘
InitBoard(mine,ROWS,COLS,'0');//'0'  11*11
InitBoard(show, ROWS, COLS,'*');//'*'

雷区和显示区相当于一个棋盘,首先我们设置的是初级难度为9*9的棋盘,但是如果大小都设置为9*9,那么显示区为边上的位置(如下图)的8个方向上就会数组越界,所以我们要设置乘11*11的棋盘,但是我们运用的还是中间的1 - 9位置的棋盘。

//棋盘大小设置
#define ROW 9 //行
#define COL 9 //列
#define ROWS ROW+2 //11 * 11
#define COLS COL+2

---------------------------------------------------------------------------------------------------------------------------------

初始化棋盘代码实现:

//初始化棋盘
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 < cols;j++)
		{
			board[i][j] = set;
		}
	}
}

雷区统一初始化为'0',显示区统一初始化为'*'

--------------------------------------------------------------------------------------------------------------------------------

代码3.布置雷区

//布置雷
SetMine(mine,ROW,COL);
//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
	//在9*9表格里随机布置10个雷
	int count = EASY_COUNT;
	
	while (count)
	{
		int x = rand() % row + 1;//1 - 9
		int y = rand() % col + 1; //每次只生成一个
		//判断这个坐标是否有雷
		if (board[x][y] != '1')//如果没有雷布置雷
		{
			board[x][y] = '1';
			//布置完一个雷,雷数--
			count--;
		}
	}
}

我们实现的是人机对战,所以电脑下棋实现的实在9*9的棋盘中随机下棋。

#define EASY_COUNT 10//定义雷的个数

代码4.排查雷

void FindMine(char Mine[ROWS][COLS], char Show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < (row*col - EASY_COUNT))
//如果找到的不是雷的个数 <  71,那么就继续排雷,每找到一次不是雷的就win++,说明排雷成功一次,71次找的都不是雷,那说明排雷成功
 	{
		//排查雷之前需要输入你要排查的坐标
		printf("请输入您要排查的坐标:>\n");
		scanf("%d%d", &x, &y);
		//输入合法的情况下
		if (x >= 1 && x <= row &&  y >= 1 && y <= col)
		{
			//2种情况
			//1.该坐标为雷,输,然后打印出雷区
			//2.该坐标无雷,显示出该坐标8个方向的雷数
			if (Mine[x][y] == '1')
			{
				printf("很遗憾,您被炸死了\n");
				DisplayBoard(Mine, ROW, COL);
				break;
			}
			else
			{
				int count = GetMineCount(Mine,x,y);//然后在显示区显示这个坐标8个方向雷的个数
				Show[x][y] = count + '0';
//显示区放置的都是字符类型,而count 是int ,'3' - '0' = 数字3,所以数字3+'0' = '3';
				DisplayBoard(Show, ROW, COL);//打印出显示区
				win++;//进入这里说明排雷成功一次
			}
		}
		//输入非法的情况下,重新输入,所以while()
		else
		{
			printf("输入非法,请重新输入\n");
		}
	}
	if (win == (row * col - EASY_COUNT))//71次找的都不是雷,那说明排雷成功
	{
		printf("恭喜你排雷成功!\n");
		DisplayBoard(Mine, ROW, COL);//打印出显示区

	}
}

首先,输入行和列都为1-9的合法坐标,不合法则提示"输入非法,请重新输入"等字样,,合法则进入,有俩种情况,一种是该坐标为雷,输掉比赛,打印雷区的现状,另一种则是该坐标不是雷,那么通过GetMineCount(Mine,x,y)函数统计该坐标8个方向的雷数,然后在显示区打印该坐标8个方向的雷数,然后进行下一次排雷,每排完一次雷,win++,因为该棋盘是9*9的棋盘,一共10个雷

,所以当win<(9*9)- 10=71,要一直排雷,当win ==71的时候,说明排完了71次雷,恭喜你排雷成功。

--------------------------------------------------------------------------------------------------------------------------------

排查雷代码中调用的GetMineCount(Mine,x,y)函数如下

//在雷区回去x,y坐标8个方向雷的个数
int GetMineCount(char Mine[ROWS][COLS], int x,int y)
{
	int sum = 0;
	int count = 0;
	int i = 0;
	int j = 0;
	for (i = x-1;i <= x+1;i++)
	{
		for (j = y - 1;j <= y+1;j++)
		{
			if (Mine[i][j] != '0')//是'1'时,count++;
			{
			    count =  Mine[i][j] - '0';
				sum += count;
			}
		}
	}
	return sum;
	//return (Mine[x - 1][y] +
	//	Mine[x - 1][y - 1] +
	//	Mine[x][y - 1] +
	//	Mine[x + 1][y - 1] +
	//	Mine[x + 1][y] +
	//	Mine[x + 1][y + 1] +
	//	Mine[x][y + 1] +
	//	Mine[x - 1][y + 1] - 8 * '0');
}

---------------------------------------------------------------------------------------------------------------------------------

代码5.打印棋盘

//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;//打印9*9
	int j = 0;
	printf("---------------------------\n");

	for (i = 0;i <= row;i++)
	{
		printf("%d ",i);
	}
	printf("\n");
	for (i = 1;i <= row;i++ )
	{
		printf("%d ",i);
		for (j = 1;j <= col;j++)
		{
			printf("%c ",board[i][j]);
		}
		printf("\n");
	}
	printf("---------------------------\n");
}

---------------------------------------------------------------------------------------------------------------------------------

四、整体代码及结果演示

//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 EASY_COUNT 10

//初始化棋盘
void InitBoard(char board[ROWS][COLS],int rows ,int cols);

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

//布置雷
void SetMine(char board[ROWS][COLS], int row, int col);

//排查雷
void FindMine(char Mine[ROWS][COLS], char Show[ROWS][COLS], int row, int col);

---------------------------------------------------------------------------------------------------------------------------------

//test.c 测试
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"


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

}

void game()
{ 
	char mine[ROWS][COLS] = {0};//存放排雷的信息
	char show[ROWS][COLS] = {0};//存放排查出的雷的信息
	//初始化一下棋盘
	InitBoard(mine,ROWS,COLS,'0');//'0'  11*11
	InitBoard(show, ROWS, COLS,'*');//'*'
	
									
	打印棋盘
	//DisplayBoard(mine,ROW,COL);//打印9*9,其他的是防止数组越界
	//DisplayBoard(show, ROW, COL);

	//布置雷
	SetMine(mine,ROW,COL);
	DisplayBoard(show, ROW, COL);

	//排查雷,需要雷区中的雷数在显示区中显示雷的个数
	FindMine(mine,show,ROW,COL);
}
int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请输入0/1:>\n");
		scanf("%d",&input);
		switch (input)
		{
		case 1: game(); break;
		case 0: printf("退出游戏\n"); break;
		default:printf("输入错误,请您重新输入\n"); break;

		}
	
	} 	while (input);

}

---------------------------------------------------------------------------------------------------------------------------------

//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 < cols;j++)
		{
			board[i][j] = set;
		}
	}
}

//打印棋盘
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
	int i = 0;//打印9*9
	int j = 0;
	printf("---------------------------\n");

	for (i = 0;i <= row;i++)
	{
		printf("%d ",i);
	}
	printf("\n");
	for (i = 1;i <= row;i++ )
	{
		printf("%d ",i);
		for (j = 1;j <= col;j++)
		{
			printf("%c ",board[i][j]);
		}
		printf("\n");
	}
	printf("---------------------------\n");
}

//布置雷
void SetMine(char board[ROWS][COLS], int row, int col)
{
	//在9*9表格里随机布置10个雷
	int count = EASY_COUNT;
	
	while (count)
	{
		int x = rand() % row + 1;//1 - 9
		int y = rand() % col + 1; //每次只生成一个
		//判断这个坐标是否有雷
		if (board[x][y] != '1')//如果没有雷布置雷
		{
			board[x][y] = '1';
			//布置完一个雷,雷数--
			count--;
		}
	}
}

//在雷区回去x,y坐标8个方向雷的个数
int GetMineCount(char Mine[ROWS][COLS], int x,int y)
{
	int sum = 0;
	int count = 0;
	int i = 0;
	int j = 0;
	for (i = x-1;i <= x+1;i++)
	{
		for (j = y - 1;j <= y+1;j++)
		{
			if (Mine[i][j] != '0')//是'1'时,count++;
			{
			    count =  Mine[i][j] - '0';
				sum += count;
			}
		}
	}
	return sum;
	//return (Mine[x - 1][y] +
	//	Mine[x - 1][y - 1] +
	//	Mine[x][y - 1] +
	//	Mine[x + 1][y - 1] +
	//	Mine[x + 1][y] +
	//	Mine[x + 1][y + 1] +
	//	Mine[x][y + 1] +
	//	Mine[x - 1][y + 1] - 8 * '0');
}

//排雷   //问题:Mine[ROW][COL]实参大小和形参大小不一样会导致问题
void FindMine(char Mine[ROWS][COLS], char Show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < (row*col - EASY_COUNT))//如果找到的不是雷的个数 <  71,那么就继续排雷,每找到一次不是雷的就win++,说明排雷成功一次,71次找的都不是雷,那说明排雷成功
 	{
		//排查雷之前需要输入你要排查的坐标
		printf("请输入您要排查的坐标:>\n");
		scanf("%d%d", &x, &y);
		//输入合法的情况下
		if (x >= 1 && x <= row &&  y >= 1 && y <= col)
		{
			//2种情况
			//1.该坐标为雷,输,然后打印出雷区
			//2.该坐标无雷,显示出该坐标8个方向的雷数
			if (Mine[x][y] == '1')
			{
				printf("很遗憾,您被炸死了\n");
				DisplayBoard(Mine, ROW, COL);
				break;
			}
			else
			{
				int count = GetMineCount(Mine,x,y);//然后在显示区显示这个坐标8个方向雷的个数
				Show[x][y] = count + '0';
//显示区放置的都是字符类型,而count 是int ,'3' - '0' = 数字3,所以数字3+'0' = '3';
				DisplayBoard(Show, ROW, COL);//打印出显示区
				win++;//进入这里说明排雷成功一次
			}
		}
		//输入非法的情况下,重新输入,所以while()
		else
		{
			printf("输入非法,请重新输入\n");
		}
	}
	if (win == (row * col - EASY_COUNT))//71次找的都不是雷,那说明排雷成功
	{
		printf("恭喜你排雷成功!\n");
		DisplayBoard(Mine, ROW, COL);//打印出显示区

	}
}

---------------------------------------------------------------------------------------------------------------------------------

结果演示:

---------------------------------------------------------------------------------------------------------------------------------

初学C语言,以上代码分析为本人拙见,望大家多多指正,有什么问题可以@博主哈😊

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值