C语言实现扫雷小游戏(初级版)

Posted ImwaterP

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言实现扫雷小游戏(初级版)相关的知识,希望对你有一定的参考价值。

尝试写的第二个小游戏:扫雷
游戏规则是在一个9*9的棋盘上,随机分布了10个地雷,输入坐标号可以得到该坐标附近位置地雷数。直到把所有不含有地雷的方格全部选出,即可获胜。
本次同样是三个文件夹
game.h:包含所有函数的声明和常量
game.c:所有游戏本身的函数本体
test.c:包含游戏调试的所有代码

game.h

#pragma once

#define ROW 9 //这里是棋盘的规格
#define COL 9

#define ROWS 11 //为了防止数组越界,将棋盘“放大一圈”。
#define COLS 11

//调试胜利的方法:把10改为80,并开局打印mine数组
#define EASY_COUNT 10 //地雷个数

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

void InitBoard(char board [ROWS][COLS], int row, int col, char s);

void DisplayBoard(char board [ROWS][COLS], int row, int col);

void SetMine(char board [ROWS][COLS], int row, int col);

void FindMind(char mine [ROWS][COLS], char show [ROWS][COLS], int row, int col);

int GetMineCount(char mine [ROWS][COLS], int x, int y);

game.c

#define _CRT_SECURE_NO_WARNINGS

#include"game.h"

void InitBoard(char board [ROWS][COLS], int row, int col, char s)
{
	//初始化棋盘
	int i = 0;
	for (i = 0; i < row; i++)
	{
		int j = 0;
		for (j = 0; j < col; j++)
		{
			board [i][j] = s;
		}
	}
}

void DisplayBoard(char board [ROWS][COLS], int row, int col)
{
	//打印当前棋盘
	int i = 0;
	printf("---------------------\\n");
	for (i = 0; i <= row; i++)
	{
		printf("%d ", i);
	}
	printf("\\n");
	for (i = 1; i <= row; i++)
	{
		printf("%d ", i);
		int j = 0;
		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)
{
	//设置地雷(在棋盘内随机放置指定个数的地雷)
	int x = 0, y = 0;
	int i = 0;
	int count = 0;
	while (1)
	{
		x = rand() % row + 1;
		y = rand() % row + 1;
		if (board [x][y] == '1')
			continue;
		else
		{
			board [x][y] = '1';
			count++;
		}
		if (count == EASY_COUNT)//指定地雷的个数
			break;
	}
		
}

int GetMineCount(char mine [ROWS][COLS], int x, int y)
{
	//数指定坐标内周围九个格子的地雷个数
	int i = 0;
	int count = 0;
	for (i = x - 1; i <= x + 1; i++)
	{
		int j = 0;
		for (j = y - 1; j <= y + 1; j++)
		{
			if (mine [i][j] == '1')
			{
				count++;
			}
		}
	}
	return count;
}

void FindMind(char mine [ROWS][COLS], char show [ROWS][COLS], int row, int col)
{
	//排查地雷函数,让玩家输入坐标,排查地雷
	int x = 0, y = 0;
	int win = 0;
	while (1)
	{
		printf("请输入坐标->");
		scanf("%d%d", &x, &y);
		int count = 0;
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			//判断是不是雷
			//是雷,则游戏失败,退出循环
			//不是雷,计算周围雷的个数,输出数字
			if (mine [x][y] == '1')
			{
				printf("很遗憾,你被炸死了!\\n");
				DisplayBoard(mine, ROW, COL);
				break;
			}
			else
			{
				count = GetMineCount(mine, x, y);
				show [x][y] = count + '0';//将数字count转变为字符
				DisplayBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("非法输入!请重新输入!\\n");
		}
		if (win == (ROW * COL - EASY_COUNT)) //胜利判断条件
		{
			printf("恭喜你扫雷成功!\\n");
			break;
		}
	}
}


test.c

#define _CRT_SECURE_NO_WARNINGS

#include"game.h"

void Menu()
{
	//打印游戏菜单
	printf("*********************************\\n");
	printf("*************1、play*************\\n");
	printf("*************0、exit*************\\n");
	printf("*********************************\\n");
}

void game()
{
	//游戏的调试函数(也是整体流程)
	char mine [ROWS][COLS];
	char show [ROWS][COLS];
	//初始化
	InitBoard(mine, ROWS, COLS, '0');
	InitBoard(show, ROWS, COLS, '*');
	//布置雷
	SetMine(mine, ROW, COL);
	//DisplayBoard(mine, ROW, COL);
	DisplayBoard(show, ROW, COL);

	//排查雷
	FindMind(mine, show, ROW, COL);
}

int main()
{

	//思考
	//1、如何让周围没有地雷的方格自动展开?
	//2、能不能让玩家标记地雷?
	//3、能不能防止玩家第一次就踩雷?

	int input = 0;
	srand((unsigned int) time(NULL));
	do
	{
		printf("扫雷小游戏\\n");
		Menu();
		printf("请输入数字->\\n");
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				printf("游戏开始!\\n");
				game();
				break;
			case 0:
				printf("游戏结束!\\n");
				break;
			default:
				printf("输入错误!请重新输入!\\n");
		}

	} while (input);

}


效果截图


第一个就被炸死了。。。

最后扫雷成功!

总结

想要写一个小游戏需要有程序的思维。
在正式写代码之前,要先想好游戏的具体流程是什么,画出流程简图,然后根据简图想出有哪些功能要实现,实现这些功能都需要设计哪些函数。然后根据流程一个功能一个功能的实现,写一个功能或者函数,可以先进行初步调试,看当前写的功能能不能跑起来。没问题之后再去写下一个函数。
另外文件的整理也需要规范,将函数声明、函数体、调试部分分别放到不同的文件里,即方便查看,又方便出问题后修改。

思考和提高

虽然代码已经基本实现了游戏,但是在实际玩的时候依然发现了很多让人不舒服的地方,我觉得还可以提升,具体总结如下:

  1. 能不能让玩家标记地雷?
  2. 如何让周围没有地雷的方格自动展开?
  3. 能不能防止玩家第一次就踩雷?
  4. 能不能做一个倒计时?

过段时间再想办法提高一下游戏体验!

以上是关于C语言实现扫雷小游戏(初级版)的主要内容,如果未能解决你的问题,请参考以下文章

扫雷游戏(C语言实现)初级版和优化版(增加了自动展开标记地雷功能,同时排除了第一次排到地雷的情况)

扫雷游戏(C语言实现)初级版和优化版(增加了自动展开标记地雷功能,同时排除了第一次排到地雷的情况)

扫雷(初级)游戏程序编写(C语言版)

C语言小游戏,编程入门必看,初级扫雷

C语言实现入门级小游戏——扫雷

C语言扫雷简化版(b站鹏哥)