资讯专栏INFORMATION COLUMN

实现初阶扫雷

WilsonLiu95 / 2923人阅读

摘要:通过二维数组的学习以及之前学的一些知识,实现初阶扫雷小游戏。整体思路菜单一把不够,再来一把利用二维数组创建两个的棋盘,那为什么不是呢,下面代码有解释。中进行函数调用和部分函数实现。

通过二维数组的学习以及之前学的一些知识,实现初阶扫雷(9×9)小游戏。

                                                                                                           
 

 整体思路

menu菜单(一把不够,再来一把)
利用二维数组创建两个(11×11)的棋盘,那为什么不是(9×9)呢,下面代码有解释。
initboard初始化棋盘( char/int )
4 diaplayboard打印棋盘
5 ​​​​​​​setmine布置雷
6 findmine统计周围雷的个数
game.c中放函数实现,game.h中放函数声明。test.c中进行函数调用和部分函数实现。
定义宏ROW,COL,ROWS,COLS,方便计算。

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


1菜单的实现

#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void menu(){	printf("*****************************/n");	printf("******    1. play   *********/n");	printf("******    0. exit   *********/n");	printf("*****************************/n");}void test(){	int input = 0;	srand((unsigned int)time(NULL));//布置雷的时候使用(随机)	do	{		menu();		printf("请选择》/n");		scanf("%d", &input);		switch (input)		{		case 1:			game();			break;		case 0:			printf("退出游戏/n");			break;		default:			printf("输入错误/n");			break;		}//switch用不惯的也可以用多条件if语句	} while (input);}

2.1 第一个棋盘
用来存放布置雷的信息,雷为"1",不是雷为"0",为啥要放字符‘1‘和’0’呢?咱们先往下看

2.2 第二个棋盘
玩家每走一步,用来显示周围雷个数的信息。没排过的雷的坐标放"*",排过的显示周围雷的个数。

2.3 棋盘选用( char )
1和0本来是整形,我们可以考虑用int类型来创建,但由于之后棋盘要用函数打印,综合考虑我们就统一用char。1和0换成"0"和"1"。

 

 

接上上面的棋盘创建
当出现上图的情况时,我们在计算周围雷数的时候会产生越界访问。(11×11)就可以避免这个问题。

3初始化棋盘 

选char类型初始化棋盘一个函数可以打印两个棋盘

//test.cinitboard(mine, ROWS, COLS, "0");initboard(show, ROWS, COLS, "*");
//game.c中的函数实现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;		}	}}

 4打印棋盘

//test.cdisplayboard(mine, ROW, COL);//这里我们打印棋盘是(9*9)displayboard(show, ROW, COL);//game.cvoid displayboard(char board[ROWS][COLS], int row, int col){	int i = 0;	int j = 0;	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");	}}

 5布置雷(随机)

//game.h#include#includesrand((unsigned int)time(NULL));//test.c//game.cvoid setmine(char mine[ROWS][COLS], int row, int col){	int count = 10;	while (count)	{		int x = rand() % row + 1;		int y = rand() % col + 1;		if (mine[x][y] == "0")		{			mine[x][y] = "1";			count--;		}	}}

 布置好雷后我们可以再调用displayboard函数打印棋盘进行查看。

6 找雷(‘0’和‘1’在计算周围雷数的时候只需要让周围的数转化成整型数字再相加就行了)

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 0 && x <= row&&y > 0 && y <= col)		{			if (mine[x][y] != "1")			{				int m =getmine(mine,x,y);//用来计算周围雷的数量				show[x][y] = m+"0";//整型数字转换成字符数字				displayboard(show, ROW, COL);				win++;			}			else			{				printf("您被发往一趟去西天取经的航班,祝你旅途愉快/n");				displayboard(mine, ROW, COL);				break;			}		}		else		{			printf("输入坐标非法,请重新输入/n");		}	}	if (win == row*col - 10)	{		printf("你有当工兵的好天赋/n");		displayboard(mine, ROW, COL);	}}

 getmine

int getmine(char mine[ROWS][COLS], int x, int y){	return mine[x - 1][y - 1]+ mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * "0";//这里返回的是int类型,将字符数字转化为整型数字(减去字符0):eg:"1"-"0"=1(感兴趣的同学可以去查查ascall码表)}

 完整代码展示

game.h

#pragma once#include#define ROW 9#define COL 9#define ROWS ROW+2#define COLS COL+2//初始化棋盘void initboard(char board[ROWS][COLS], int rows, int cols, char set);//打印棋盘void displayboard(char board[ROWS][COLS], int row, int col);void setmine(char mind[ROWS][COLS], int row, int col);void findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);#include#include

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 setmine(char mine[ROWS][COLS], int row, int col){	int count = 10;	while (count)	{		int x = rand() % row + 1;		int y = rand() % col + 1;		if (mine[x][y] == "0")		{			mine[x][y] = "1";			count--;		}	}}int getmine(char mine[ROWS][COLS], int x, int y){	return mine[x - 1][y - 1]+ mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * "0";//这里返回的是int类型,将字符数字转化为整型数字(减去字符0):eg:"1"-"0"=1(感兴趣的同学可以去查查ascall码表)}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 0 && x <= row&&y > 0 && y <= col)		{			if (mine[x][y] != "1")			{				int m =getmine(mine,x,y);				show[x][y] = m+"0";				displayboard(show, ROW, COL);				win++;			}			else			{				printf("您被发往一趟去西天取经的航班,祝你旅途愉快/n");				displayboard(mine, ROW, COL);				break;			}		}		else		{			printf("输入坐标非法,请重新输入/n");		}	}	if (win == row*col - 10)	{		printf("你有当工兵的好天赋/n");		displayboard(mine, ROW, COL);	}}void displayboard(char board[ROWS][COLS], int row, int col){	int i = 0;	int j = 0;	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");	}}

 

test.c

#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void menu(){	printf("*****************************/n");	printf("******    1. play   *********/n");	printf("******    0. exit   *********/n");	printf("*****************************/n");}void game(){	char mine[ROWS][COLS] = { 0 };	char show[ROWS][COLS] = { 0 };	//初始化棋盘	initboard(mine, ROWS, COLS, "0");	initboard(show, ROWS, COLS, "*");	setmine(mine, ROW, COL);	displayboard(mine, ROW, COL);	displayboard(show, ROW, COL);		findmine(mine, show, ROW, COL);		}void test(){	int input = 0;	srand((unsigned int)time(NULL));	do	{		menu();		printf("请选择》/n");		scanf("%d", &input);		switch (input)		{		case 1:			game();			break;		case 0:			printf("退出游戏/n");			break;		default:			printf("输入错误/n");			break;		}	} while (input);}int main(){	test();	return 0;}

今天的内容到这里就结束了,要是觉得对你有所帮助的话,不妨点赞关注一下,这也是我的第一篇博客,你的支持将是我最大的动力,最后谢谢大家的观看,咱们下期见。

                                                        

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/124779.html

相关文章

  • C语言初阶学习——扫雷小游戏(递归)

    摘要:目录前言前言前期的准备前期的准备游戏代码的具体实现游戏代码的具体实现完整版的扫雷小游戏代码完整版的扫雷小游戏代码总结总结前言扫雷是一款大众类的益智小游戏,于年发行。 目录 前言 前期的准备 游戏代码的具体实现 1、text.c 2、game.h 3、game.c 完整版的扫雷小游戏代码: 1...

    zhonghanwen 评论0 收藏0
  • 详细讲解 —— 数组(C语言初阶

    摘要:也可以理解成二维数组有三个元素,每个元素是一个一维数组我们可以把二维数组想象成一个几行几列的数组但是本质上的二维数组是一列的。数组名,计算整个数组的大小,内部单独放一个数组名,数组名表示整个数组。数组名,数组名表示整个数组。 目录 1. 一维数组 1.1 数组的创建和初始化 数组的创建: 数...

    Backache 评论0 收藏0
  • 扫雷小程序的js实现

    摘要:初学,写了一个扫雷程序练练手扫雷规则及功能扫雷想必大家都不陌生,就是上点击排雷的小游戏,它的主要规则有左键点击显示当前格子是否为雷,如果为雷的话,啦,如果不是雷的话,这个格子会显示周围八个格子内的雷数量。 初学javascript,写了一个扫雷程序练练手! 扫雷规则及功能 扫雷想必大家都不陌生,就是windows上点击排雷的小游戏,它的主要规则有 1.左键点击显示当前格子是否为雷,如果...

    crelaber 评论0 收藏0
  • [ C语言 ] 扫雷 ------> 用C语言实现game2

    摘要:函数游戏菜单请选择扫雷游戏退出游戏选择错误解析函数内部利用时间戳,形成随机数,主要目的是实现游戏中地雷的随机埋放。 前言 本篇文章使用C语言实现简单小游戏---扫雷。(文章最后有完整代码链接) 想必大多数人都玩过或者了解过扫雷的游戏规则,但是在这里,我们在一起重温一下扫雷的游戏规则,也更好...

    I_Am 评论0 收藏0
  • C语言实现入门级小游戏——扫雷

    摘要:上一期咱们用语言实现了三子棋的小游戏语言实现三子棋今天我们再来写个扫雷的游戏,说起扫雷,相信大家都不陌生,可能许多朋友还是玩扫雷的高手。      上一期咱们用C语言实现了三子棋的小游戏  C语言实现三子棋       今天我们再来写个扫雷的游戏,说起扫雷,相信大家都不陌生,可能许多朋友还是...

    nevermind 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<