ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

基于C语言的简单小游戏-(扫雷)

2021-07-28 22:31:42  阅读:143  来源: 互联网

标签:ROWS int COLS C语言 char 小游戏 扫雷 printf


前言

阅读水平条件
C语言的基本语法:

  • 条件语句if,switch;
  • 循环语句for ,while, do while,
  • 函数
  • 数组

文章目录

一 扫雷游戏的需求

我们实现一个 9 * 9 的宫格扫雷,有81 个格子,在 81个格子随机放入 10个雷;当输入格子对应坐标时候,开始扫雷,扫到雷游戏结束,没扫到雷,则继续游戏,直到扫完为止;

二 扫雷游戏的需求分析

  1. 9*9的九宫格:可以用一个二维数组表示;
  2. 随机放入10个雷:使用随机种子函数,用 字符 1 表示 雷,字符 0表示无雷,循环实现;
  3. 开始扫雷:计算坐标的周围雷的个数,并且显示出另一个二维数组中;

三 扫雷的代码实现

前提准备文件:(笔者用vs2013创建的文件)
game.c 文件:用于实现扫雷游戏的功能函数;
game.h 文件:用于声明函数,和声明一些头文件;
text.c 文件:用于主函数测试游戏文件;
在这里插入图片描述
game.h 头文件代码

# pragma once
# define _CRT_SECURE_NO_WARNINGS 1

# include<stdio.h>
# include<stdlib.h> //随机数种子 srand()的头文件
# include<time.h> //时间函数time 的头文件
# 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, char set);
//显示宫格
void ShowBoard(char board[ROWS][COLS], int row, int col);
//设置宫格
void SetBoard(char board[ROWS][COLS], int row, int col);
//排雷功能
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c 文件代码就是 扫雷游戏功能函数的集合;

1 扫雷的菜单和交互逻辑的实现


首先:我们需要一个简易的菜单函数:显示游戏界面的菜单;
其次:我们需要选择游戏开始的按键和游戏结束的按键;
接着:选择游戏时候可以用 do while 循环,switch 语句实现;
最后:设置选择 1开始游戏,选择 0 退出游戏;


主函数基本代码逻辑

int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:》");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("选择有误,重写选择:\n\n");
			break;
		}
	} while (input);

	system("pause");
	return 0;
}

2 扫雷游戏的功能

  1. 需要 2 个二维数组,一个用于存放雷的信息数组,一个用于玩家界面看到的数组;
  2. 数组的大小设置为 11 * 11的大小,因为,在排雷的过程中,可能会发生排雷在数组的边界,假如9 * 9的话,会造成越界,但是,实际使用的是9*9的数组,如下图:
    在这里插入图片描述
  3. 对2个 11*11的数组进行初始化,初始化时候给存放雷的数组,全为 0;玩家显示的宫格数组全是 * ;
  4. 开始设置 雷的位置,用 1 表示雷,无雷 用 0 表示;
  5. 显示玩家宫格排雷的信息;
  6. 开始排雷;

如下代码:

void game()
{
	char mine[ROWS][COLS] = { 0 };//存放雷的信息
	char show[ROWS][COLS] = { 0 };//显示排除出雷的信息
	//初始化棋盘
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	//设置雷的位置

	SetBoard(mine, ROW, COL);
	ShowBoard(mine, ROW, COL);

	//显示棋盘
	ShowBoard(show, ROW, COL);
	
	//开始排查雷
	FindMine(mine, show,ROW, COL);

}

1)扫雷的初始化功能

初始化,本质就是给二维数组设置值:
注意传入的参数:
ROWS 在头文件定义的 11
COLS 在头文件定义的 11
set 为数组存放的字符

void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			board[i][j] = set;
			//printf("%d ", board[i][j]);
		}
	}
}

2)扫雷的显示功能

主要控制赋值的地方是在下标【1,9】的地方即可;
其他的都是修饰

void ShowBoard(char board[ROWS][COLS], int row, int col)
{
	for (int i = 0; i <=row+1; i++) //显示棋盘的行号
	{
		if (i == 0) //第一个下标显示扫字
		{
			printf("扫 ");
			continue;
		}

		if (i == row+1) //第10个下标时候显示雷字
		{
			printf("雷");
			continue;
		}

		printf("%d ", i); //下标1-9显示 数字
	}
	printf("\n");

	for (int i = 0; i <= row+1; i++) //分割棋盘的作用
	{
		printf("__");
	}
	printf("\n");

	for (int i = 1; i <= row+1; i++) //显示棋盘的内容,下标为为 1-9 二维数组的范围
	{
		if (i != row + 1) //显示竖列的棋盘数字和分割竖列的棋盘
		{
			printf("%d ", i);
			printf("|");
		}
		if (i == row + 1) //在棋盘最后一行的下一行打印--符号分割
		{
			for (int j = 0; j <= col + 1; j++)
			{
				printf("--");
			}
			printf(" \n");
			continue;    //跳过外层循环,不然其再打印棋盘大小了
		}
		
		//显示棋盘的内容
		for (int j = 1; j <= col+1; j++)
		{
			if (j == col + 1) //显示棋盘最后1列的下一列的分割符号
			{
				printf("|");
				continue;
			}
			printf("%c ", board[i][j]);	
		}
		printf("\n");
	}
}

显示效果:
在这里插入图片描述

3)扫雷的设置雷信息

void SetBoard(char board[ROWS][COLS], int row, int col)
{
	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--;
		}
	}
}

效果显示:
在这里插入图片描述

4)扫雷的排雷功能

int GetMineCount(char mine[ROWS][COLS], int x, int y) //统雷的个数
{
	int count = 0;
	for (int i = x - 1; i <= x + 1;i++)
	{
		for (int j = y - 1; j <= y + 1; j++)
		{
			if (mine[i][j] == '1') count++;	
		}
	}
	return count;
}
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)
	{
		printf("请输入你要排雷的坐标位置:");
		scanf("%d %d", &x, &y);

		if (x >= 1 && x <= row && y >= 1 && y <= col )//保证坐标合法,且在合适的坐标排雷
		{
			if (mine[x][y] == '1') //排中雷
			{
				printf("很遗憾,你排中地雷了。\n!!!游戏结束!!!\n");
				SetBoard(mine, ROW, COL);
				break;
			}
			else //排的不是雷
			{
				int count = GetMineCount(mine, x, y); //统计雷的个数
				show[x][y] = count + '0'; //count是数字,要加个字符’0‘,转化为字符count
				ShowBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("你输入的非法坐标,请重新输入:");
		}
	}
	if (win == row*col - EASY_COUNT)
		printf("恭喜你,排雷成功,游戏结束啦\n");
}

最终效果:
在这里插入图片描述

标签:ROWS,int,COLS,C语言,char,小游戏,扫雷,printf
来源: https://blog.csdn.net/m0_46606290/article/details/119190610

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有