C语言-------扫雷游戏

     

 各位CSDN的朋友们大家好,今天爱编程的小赵的,想要分享给各位的c语言知识是编写一个扫雷游戏。相信不少初学c语言的小伙伴一听说可以自己编写一个游戏都心头一震,心中止不住的开心,那么我们就快快开始吧。一个游戏的编写离不开以下几个方面

1.菜单

2.游戏界面的设计

3.游戏程序和具体功能

那么我们就从第一个层面入手,即游戏菜单的设计。

1.菜单设计

         在菜单的设计上我们可以追求简约,利用一个简单的printf函数,来为自己在屏幕上输出一个简单却又很舒服的菜单

printf("*******************************************\n");
printf("*******         1.play          ***********\n");
printf("*******         0.exit          ***********\n");
printf("*******************************************\n");

有了这样一个简单的框架之后我们接下来要考虑的就是如何实现这样一项功能,即使用者输入1开始游戏,输入0游戏结束,我们同时还要考虑到如果输入其他数字我们的程序该如何做出反应。这样一个程序。我们可以利用的就是我们的switch 的选择结构,加上循环结构,同时我们将我们的菜单放入函数中,让我们的整个程序的代码显得更加简单清晰。

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void meun()
{
	printf("*******************************************\n");
	printf("*******         1.play          ***********\n");
	printf("*******         0.exit          ***********\n");
	printf("*******************************************\n");
}
int main()
{
	int input;
	meun();
	printf("请输入你的选择\n");
	do
	{
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("输入错误请重新输入\n");
		}
	}while(input);
}

这样我们一个游戏的简单的菜单就算是设计好了。

2.游戏界面的设计

        接下来我们要考虑的就是我们的游戏界面设计啦!我们注意到扫雷游戏的界面其实就是一个类似于长方形的界面。


         而且我们是可以通过手点格子来展开的,那我们应该用当下学习的什么来代替这样的东西呢,还要能在里面布置上雷。于是我们吧便会联想到二维数组,只要在二维的数组中设置好长款,然后往里面初始化‘0’,最后用我们的随机数,随机放1在里面, 不就可以完美的布置 我们的雷了吗?

        但是我们这样设计我们的代码的时候要考虑到代码的过长,而且每次运行都要敲一遍,就显得很冗杂,不如直接创建一个函数,让我们的代码更加明亮好看。

#define COL   9
#define ROW   9
#define COLS   COL+2
#define ROWS   ROW+2
void InitBoard(char arr[ROWS][COLS], int row, int col, char set)//对数组进行初始化
{
	int i = 1;
	for (i = 1; i <= row;i++)
	{
		int j = 1;
		for (j = 1; j <= col; j++)
		{
			arr[i][j] = set;//将数组的每个位置放入自己想要的东西
		}
	}
}
void PrintBoard(char arr[ROWS][COLS], int row, int col)//打印我们的数组
{
	printf("******************扫雷***************************\n");
	int i = 0;
	int a = 0;
	for (a = 0; a <= row; a++)//横坐标
	{
		printf(" %d ", a);
	}
	printf("\n");
	for (i = 1; i < =row; i++)
	{
		int j = 0;
		printf(" %d ", i);//纵坐标
		for (j = 0; j < col; j++)
		{
			printf(" %c ", arr[i][j]);//打印
		}
		printf("\n");
	}
	printf("*****************扫雷****************************");

}

这时我们可以试着去运行看看我们的代码是否正确,防止后续代码错误难以回头修改错误地方

int main()
{
	char mine[ROWS][COLS];//创立数组
	char show[ROWS][COLS];
	InitBoard(mine, ROWS, COLS, '0');//布雷用的
	InitBoard(show, ROWS, COLS, '*');//页面
	PrintBoard(show, ROW, COL);
}

我们通过运营检验,发现我们的代码是没有问题的,那么我们接着进入下一步

3.游戏程序和具体功能

        在进入这一步之前我们还要考虑一个问题,就是我们要不要把我们的所有代码都敲在一起?

在回答这个问题之前,先幻想一个场景,就是假如有一天你敲出一个很牛的游戏代码,你想让别人看到你所有的代码,让别人知道你怎么运行,可能也就意为着你的游戏很容易被别人盗版。那么我们该如何提高我们的代码的保密性呢?这时候我们可以创建一个头文件(要输入一个头文件,即我画线那一行)

这个文件里我们放入自己定义的函数,然后再创建一个源文件,对这些函数进行设计。

这个可以用来给自己看,自己收着。

最后我们将自己的主函数放在我们的另一源文件中,这样我们的可以将这个文件和头文件给要买自己代码的公司看,让自己的代码的函数定义放在里面,不被别人看到。这样我们的代码的保密性就大大提高了。而且我们以后在公司敲代码,也有利于大家的分工合作,快速完成任务。

但是下面一个问题就是代码敲在别的文件里,我们怎么用呢,其实只要加上#include"你想要用的文件的名字"那么你就可以使用了,比如我在使用时就是加入#include"game.h"这一行。

好了我们继续编写我们的代码。

我们下面是对我们的游戏主体进行编写,那么就一定需要了解我们游戏的运行是怎么样的?

我们通过阅读上面这段文字发现扫雷的功能无非就是两个,一是我们点到雷,游戏结束

二是如果点到的不是雷,上面会显示数字,数字上面即是以这个格子为中心的九宫格有几个雷

那么我们先一步步来,第一步是布置雷,我们利用上一次猜数字游戏中的时间种子来设置我们的未知数来布置我们的雷区

void Setmine(char arr[ROWS][COLS], int row, int col)
{
	srand((unsigned int)time(NULL));
	int count = 10//设置雷的个数
	while(count)
	{
	int x = rand() % row + 1;
	int y = rand() % row + 1;
	if (arr[x][y] = '0')
	{
		arr[x][y] = '1';//对坐标布置雷
		count--;
	}
     }
}

接下来就是我们需要去统计雷的个数,在那之前我们还需要知道一个代数的运算的一个法则即‘9’-‘0’=9,9*‘0’=‘9’;掌握这个技巧我们就可以来统计雷的个数了。在这里小赵再送您一招,我们可以将我们这个函数前面加上static这样我们这个函数就可以在只这个页面使用,就可以更大程度地隐藏我们的代码了。

static GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y - 1] + mine[x + 1][y + 1] +
		mine[x - 1][y] + mine[x + 1][y - 1] +
		mine[x - 1][y + 1] + mine[x + 1][y] +
		mine[x][y - 1] + mine[x][y + 1] - 8 * '0';
}//求出输入坐标周围雷的个数

统计完每一个输入的坐标周围的雷,我们下一步就是要将这个数字输入到我们揭开的这个坐标上,同时我们还要确立我们输入的坐标的范围,以及究竟怎样才算胜利,我们可以将胜利的标准设置为找完所有雷,那么我只需要设置一个变量,当打开一个没有雷的位置时加一,最终只要等于总数减去雷数即可获胜

void Finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	
	int win = 0;
	while (win <= col * row - EASY_COUNT)//胜利的标准,即打开的位置等于总数减雷数
	{
		printf("请输入:\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y <= col && y >= 1)
		{
			if (mine[x][y] == '1')//如果碰到雷
			{
				printf("你被炸了\n");
				break;
			}

			if (mine[x][y] == '0')//不是雷
			{
				int n = GetMineCount(mine, x, y);
				show[x][y] = n + '0';
				PrintBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("非法输入请重新输入\n");
			break;
		}
		if (win == col * row - EASY_COUNT)
		{
			printf("你赢了\n");
			PrintBoard(mine, row, col);
		}
	}
}

最后我们只需要将我们设置好的程序进行排队设置在game()函数中依次运行,再将部分代码进行优化就可以得到我们的扫雷游戏了。

game.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#pragma once
#define COL   9
#define ROW   9
#define COLS   COL+2
#define ROWS   ROW+2
#define EASY_COUNT 10
void InitBoard(char arr[ROWS][COLS], int row ,int col,char set); 
void PrintBoard(char arr[ROWS][COLS], int row, int col);
void Setmine(char arr[ROWS][COLS], int row, int col);
void Finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"

void InitBoard(char arr[ROWS][COLS], int row, int col, char set)//对数组进行初始化
{
	int i = 0;
	for (i = 0; i < row;i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			arr[i][j] = set;//将数组的每个位置放入自己想要的东西
		}
	}
}
void PrintBoard(char arr[ROWS][COLS], int row, int col)//打印我们的数组
{
	printf("*****************扫雷****************\n");
	
	int i = 0;
	int a = 0;
	for (a = 0; a <= row; a++)//横坐标
	{
		printf(" %d ", a);
	}
	printf("\n");
	for (i = 1; i <=row; i++)
	{
		int j = 1;
		printf(" %d ", i);//纵坐标
		for (j = 1; j <= col; j++)
		{
			printf(" %c ", arr[i][j]);//打印
		}
		printf("\n");
	}
	printf("*****************扫雷****************\n");

}
void Setmine(char arr[ROWS][COLS], int row, int col)
{
	srand((unsigned int)time(NULL));
	int count = EASY_COUNT;
	while(count)
	{
	int x = rand() % row + 1;
	int y = rand() % row + 1;
	if (arr[x][y] = '0')
	{
		arr[x][y] = '1';
		count--;
	}
     }
}
static GetMineCount(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y - 1] + mine[x + 1][y + 1] +
		mine[x - 1][y] + mine[x + 1][y - 1] +
		mine[x - 1][y + 1] + mine[x + 1][y] +
		mine[x][y - 1] + mine[x][y + 1] - 8 * '0';
}
void Finemine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	
	int win = 0;
	while (win <= col * row - EASY_COUNT)
	{
		printf("请输入:\n");
		scanf("%d%d", &x, &y);
		if (x >= 1 && x <= row && y <= col && y >= 1)
		{
			if (mine[x][y] == '1')
			{
				printf("你被炸了\n");
				break;
			}

			if (mine[x][y] == '0')
			{
				int n = GetMineCount(mine, x, y);
				show[x][y] = n + '0';
				PrintBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("非法输入请重新输入\n");
			break;
		}
		if (win == col * row - EASY_COUNT)
		{
			printf("你赢了\n");
			PrintBoard(mine, row, col);
		}
	}
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void meun()
{
	printf("*******************************************\n");
	printf("*******         1.play          ***********\n");
	printf("*******         0.exit          ***********\n");
	printf("*******************************************\n");
}

void game()
//int main()
{
	char mine[ROWS][COLS] ;
	char show[ROWS][COLS];
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	printf("%c", show[1][1]);
	DisplayBoard(show, ROW, COL);
	Setmine(mine, ROWS, COLS);
	/*DisplayBoard(mine, ROW, COL);*/
	Finemine(mine, show, ROW, COL);
}
int main()
{
	int input;
	meun();
	printf("请输入你的选择\n");
	do
	{
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束\n");
			break;
		default:
			printf("输入错误请重新输入\n");
		}
	}while(input);
}

上面就是小赵今天的扫雷代码的分享,如果你感觉上述的代码对你有帮助,可以给小赵点个赞吗?

创作不易,谢谢各位的点赞,咱们下期见!

  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱编程的小赵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值