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);
}
效果截图
第一个就被炸死了。。。
最后扫雷成功!
总结
想要写一个小游戏需要有程序的思维。
在正式写代码之前,要先想好游戏的具体流程是什么,画出流程简图,然后根据简图想出有哪些功能要实现,实现这些功能都需要设计哪些函数。然后根据流程一个功能一个功能的实现,写一个功能或者函数,可以先进行初步调试,看当前写的功能能不能跑起来。没问题之后再去写下一个函数。
另外文件的整理也需要规范,将函数声明、函数体、调试部分分别放到不同的文件里,即方便查看,又方便出问题后修改。
思考和提高
虽然代码已经基本实现了游戏,但是在实际玩的时候依然发现了很多让人不舒服的地方,我觉得还可以提升,具体总结如下:
- 能不能让玩家标记地雷?
- 如何让周围没有地雷的方格自动展开?
- 能不能防止玩家第一次就踩雷?
- 能不能做一个倒计时?
过段时间再想办法提高一下游戏体验!
以上是关于C语言实现扫雷小游戏(初级版)的主要内容,如果未能解决你的问题,请参考以下文章
扫雷游戏(C语言实现)初级版和优化版(增加了自动展开标记地雷功能,同时排除了第一次排到地雷的情况)