Bootstrap

学C必做项目——扫雷游戏

引言

在学习编程语言的过程中,实际动手编写项目是巩固理论知识和提高编程技能的有效方式。扫雷游戏作为一款经典的益智游戏,不仅能够帮助我们熟悉编程的基本概念,还能锻炼我们的逻辑思维能力。本文将引导你完成一个简单的扫雷游戏的C语言实现,旨在通过实践加深对C语言的理解和掌握。

游戏规则简介

扫雷游戏的目标是在不触发任何地雷的情况下,找出并标记所有隐藏的地雷。游戏界面由一个方格组成,每个方格要么是空的,要么包含一个数字,该数字表示周围8个格子中有多少个地雷。如果点击一个地雷,则游戏失败;如果成功揭示所有非雷格子,则游戏胜利。

项目结构

项目主要分为以下几个部分:

  1. 棋盘初始化:创建一个棋盘,并将其所有格子初始化为未知状态。
  2. 布雷:随机放置一定数量的地雷。
  3. 显示棋盘:将棋盘的状态呈现给玩家。
  4. 排雷:玩家选择格子,程序根据选择更新棋盘状态。
  5. 游戏循环:持续接受玩家输入直到游戏胜利或失败。
  6. 胜利与失败条件:判断游戏状态,告知玩家结果。

同样的,先看结果:

 头文件:

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

//棋盘大小
#define HANG 11
#define LIE 11

#define lei_shu 20//修改数字可以改变雷数

void caidan();

void kaishi();

//初始化棋盘
void chushihua(char qizi[HANG][LIE], int hang, int lie, char lei);

//打印棋盘
void printf_qipan(char qizi[HANG][LIE], int hang , int lie );

//布置雷
//void bu_lei(char an_qi[HANG][LIE], int hang, int lie);
void bu_lei(char qi_zi[HANG][LIE], int hang, int lie);


//排雷
void pai_lei(char an_qi[HANG][LIE], char ming_qi[HANG][LIE], int hang, int lie);

//雷数提示
int ti_shi(char an_qi[HANG][LIE], int x, int y);

main函数部分:

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void caidan()
{
	printf("欢迎来到扫雷游戏!\n");
	printf("*************************************\n");
	printf("*********    1.开始游戏     *********\n");
	printf("*********    2.退出游戏     *********\n");
	printf("*************************************\n");
}

void game()
{
	//游戏规则展示
	printf("\t*游戏规则*:\n\n");
	printf("\t1.'1'代表地雷,'0'代表没有地雷(安全),数字代表周围8个格子存在的地雷数。\n\n");
	printf("\t2.玩家需要在不触雷的情况下找到所有没有地雷的格子方可胜出!\n\n");
	printf("  好了,游戏开始!\n\n");
	

	//定义棋盘
	char ming_qi[HANG][LIE] = { 0 };
	char an_qi[HANG][LIE] = { 0 };

	//初始化棋盘
	chushihua(an_qi, HANG, LIE,'0');
	chushihua(ming_qi, HANG, LIE, '*');

	//打印棋盘
	//printf_qipan(an_qi, HANG - 2, LIE - 2);
	printf_qipan(ming_qi, HANG - 2, LIE - 2);

	//布置地雷
	bu_lei(an_qi, HANG - 2, LIE - 2);

	//取消注释可以偷看地雷位置
	//printf_qipan(an_qi, HANG - 2, LIE - 2);

	//排雷
	pai_lei(an_qi, ming_qi, HANG - 2, LIE - 2);

	
}
void kaishi()
{
	srand((unsigned int)time(NULL));
	int yaoshi = 1;
	do
	{
		caidan();
		printf("请输入数字进行选择:\n");
		scanf("%d", &yaoshi);
		switch (yaoshi)
		{
		case 1:
			game();
			break;
		case 2:
			printf("欢迎下次再来!\n\n\n");
			break;
		default:
			printf("输入错误,请重新输入!\n");
			break;
		}
	} while (yaoshi);
}
int main()
{
	kaishi();
	
	return 0;
}

主体函数部分:

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void chushihua(char qizi[HANG][LIE], int hang, int lie,char lei)
{
	for ( int i = 0; i < hang; i++)
	{
		for (int j = 0; j < lie; j++)
		{
			qizi[i][j] = lei;
		}
	}
}

void printf_qipan(char qizi[HANG][LIE], int hang, int lie)
{
	printf("----------扫雷游戏----------\n");
	for (int i = 0; i < lie+1; i++)
	{
		printf("%d ", i);
	}

	printf("\n");
	for (int i = 1; i < hang+1; i++)
	{
		printf("%d ", i);
		for (int j = 1; j < lie+1; j++)
		{
			printf("%c ", qizi[i][j]);
		}
		printf("\n");
	}
	printf("\n");
}

void bu_lei(char qi_zi[HANG][LIE], int hang, int lie)
{
	int count = lei_shu;
	while (count) 
	{
		int x = rand() % hang + 1;
		int y = rand() % lie + 1;
		if (qi_zi[x][y] == '0')
		{
			qi_zi[x][y] = '1';
			count--;
		}
	}
}

int ti_shi(char an_qi[HANG][LIE], int x, int y)
{
	return (an_qi[x - 1][y] + an_qi[x - 1][y - 1] +
		an_qi[x - 1][y + 1] + an_qi[x][y - 1] + an_qi[x][y + 1]
		+ an_qi[x + 1][y - 1] + an_qi[x + 1][y]
		+ an_qi[x + 1][y + 1] - 8 * '0');
}


void pai_lei(char an_qi[HANG][LIE], char ming_qi[HANG][LIE], int hang, int lie)
{
	printf("请输入要排查雷的坐标(格式:行 列)\n");
	int x = 0, y = 0;
	int win = 0;
	while (win<((HANG-2)*(LIE-2)-lei_shu))
	{
		scanf("%d %d", &x, &y);
		if (x >= 1 && x < hang + 1 && y >= 1 && y < lie + 1)
		{
			if (an_qi[x][y] == '1')
			{
				printf("很遗憾,你发现了雷!并且你被炸死了!\n");
				printf_qipan(an_qi, HANG - 2, LIE - 2);
				break;
			}
			else
			{
				int n = ti_shi(an_qi, x, y);
				ming_qi[x][y] = n +'0';
				printf_qipan(ming_qi, HANG - 2, LIE - 2);
				win++;
			}
		}
		else
		{
			printf("输入的坐标超出范围!请重新输入!\n");
		}
	}
	if (win == ((HANG - 2) * (LIE - 2) - lei_shu))
	{
		printf("恭喜你,排雷成功!\n\n\n");
	}
}

结论与扩展

这是一个检验自己C语言基础的小项目,建议可以先参照,理解思路,然后自行敲一遍进行游戏的实现。简单的扫雷游戏项目覆盖了C语言的一些基础概念,如数组、函数、循环和条件语句。通过实践,你可以进一步理解这些概念的实际应用。

此外,你还可以尝试以下扩展:

  • 图形界面:使用图形库(如SDL或OpenGL)为游戏添加图形界面。
  • 高级算法:研究并实现更高效的算法来自动识别可能的地雷位置。
  • 多平台支持:使游戏能够在不同的操作系统上运行。
  • 网络对战:实现网络功能,允许玩家在线对战。

最后,记住编程是一个不断学习和实践的过程。遇到问题时,不要气馁,查阅资料、调试代码,向社区求助都是很好的解决途径。祝你在编程的道路上越走越远!

;