引言
在学习编程语言的过程中,实际动手编写项目是巩固理论知识和提高编程技能的有效方式。扫雷游戏作为一款经典的益智游戏,不仅能够帮助我们熟悉编程的基本概念,还能锻炼我们的逻辑思维能力。本文将引导你完成一个简单的扫雷游戏的C语言实现,旨在通过实践加深对C语言的理解和掌握。
游戏规则简介
扫雷游戏的目标是在不触发任何地雷的情况下,找出并标记所有隐藏的地雷。游戏界面由一个方格组成,每个方格要么是空的,要么包含一个数字,该数字表示周围8个格子中有多少个地雷。如果点击一个地雷,则游戏失败;如果成功揭示所有非雷格子,则游戏胜利。
项目结构
项目主要分为以下几个部分:
- 棋盘初始化:创建一个棋盘,并将其所有格子初始化为未知状态。
- 布雷:随机放置一定数量的地雷。
- 显示棋盘:将棋盘的状态呈现给玩家。
- 排雷:玩家选择格子,程序根据选择更新棋盘状态。
- 游戏循环:持续接受玩家输入直到游戏胜利或失败。
- 胜利与失败条件:判断游戏状态,告知玩家结果。
同样的,先看结果:
头文件:
#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)为游戏添加图形界面。
- 高级算法:研究并实现更高效的算法来自动识别可能的地雷位置。
- 多平台支持:使游戏能够在不同的操作系统上运行。
- 网络对战:实现网络功能,允许玩家在线对战。