目录
前言
一.思维的建立
二.创建游戏菜单
三.初始化棋盘
四.打印棋盘
五.布置雷的个数和位置
六.排查雷
七.整体代码
game.h
text.c
game.c
扫雷是一个十分经典的游戏,一张棋盘中有很多个不确定是雷还是安全区域的格子,当点击之后若没有雷则会在该区域显示周围八个格子雷的数目,若有雷则游戏结束。今天我就跟大家分享一下如何用c语言实现初阶版扫雷。是一个利用书写坐标所实现的扫雷游戏。
本扫雷游戏涉及:
game.c 用于游戏的实现
text.c 用于游戏的检测
game.h 用于游戏的函数引用,库函数的引用(将库函数的引用都放于头文件之中,这样可以使得代码不至于过于臃肿)
1. 这里我们需要注意,扫雷游戏是一个需" 两成 "的游戏,一层是需要用于埋雷,一层用于玩家观看。所以,我们是需要两个二维函数。
2. 扫雷游戏是一个,需要提醒周围(四周8块地)是否有雷,于是就会出现一个问题,最外面的四周是是比较难的,所以,我们使用多一层外圈专门用来便于计算。
void mune()
{
printf("*****************************\n");
printf("********** 1.play *********\n");
printf("*****************************\n");
printf("********** 0.exit *********\n");
printf("*****************************\n");
}
void text()
{
mune();
int input = 0;
printf("请输入一个数字->");
srand((unsigned int)time(NULL));
do
{
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入->");
break;
}
} while (input);
}
int main()
{
text();
return 0;
}
通过将初始化内容传输入函数,这样可以使得函数的初始化只需用一个函数实现即可,更加高效。
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
//初始化数组
init_board(mine, ROWS, COLS, '0');
init_board(show, ROWS, COLS, '*');
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char ret);
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char ret)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
arr[i][j] = ret;
}
}
}
注意:此处最好打印行列表示,以防行列过多不易数清。
//打印雷区
void printf_board(char arr[ROWS][COLS], int rows, int cols)
void printf_board(char arr[ROWS][COLS], int row, int col)
{
int j = 0;
int i = 0;
printf(" ");
for (j = 1; j <= col; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", arr[i][j]);
}
printf("\n");
}
printf("\n-------扫雷游戏-------\n");
}
//雷的数目
#define COUNT_MUNE 10
//布置雷
void set_mune(char mine[ROWS][COLS], int row, int col, int count_mine);
//布置雷
void set_mune(char mine[ROWS][COLS], int row, int col,int count_mine)
{
int x = 0;
int y = 0;
int i = 0;
//用于检测雷是否够数
//int count = 0;
for (i = 0; i < count_mine; i++)
{
a:
x = rand() % row + 1;
y = rand() % col + 1;
if ('0' == mine[x][y])
{
mine[x][y] = '1';
//count++;
}
else
{
goto a;
}
}
//printf("%d", count);
}
此处需要注意的是,玩家看见的是未经增加最外圈的二维数组,所以,我们需要传输的是,ROW,COL。
//排查雷
void check(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
//排查雷
check(mine, show, ROW, COL);
//是否排雷完成
int mune_end(char mine[ROWS][COLS], int row, int col)
{
int i = 0;
for (i = 1; i <= row - 2; i++)
{
int j = 0;
for (j = 1; j < col - 2; j++)
{
if ('0' == mine[i][j])
{
return 1;
}
}
}
return 0;
}
//附近雷的数目
int get_count_mine(char mine[ROWS][COLS],int x , int y)
{
return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y + 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]) - 8 * '0';
}
//排查雷
void check(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
printf_board(show, ROW, COL);
while (1)
{
printf("请输入坐标->");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if ('1' == mine[x][y])
{
printf("雷炸了,游戏结束!\n");
}
else
{
int count = get_count_mine(mine, x, y);
show[x][y] = '0' + count;
printf_board(show, ROW, COL);
}
}
int end = mune_end(mine, row, col);
if (0 == end)
{
printf("游戏结束,排雷完成\n");
break;
}
}
}
#pragma once
#include
#include
#include
#define ROW 9//行
#define COL 9//列
//便于排雷时报数
#define ROWS ROW + 2
#define COLS COL + 2
//雷的数目
#define COUNT_MUNE 10
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char ret);
//打印雷区
void printf_board(char arr[ROWS][COLS], int rows, int cols);
//布置雷
void set_mune(char mine[ROWS][COLS], int row, int col, int count_mine);
//排查雷
void check(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void game()
{
//用于埋雷
char mine[ROWS][COLS] = { 0 };
//用于排查雷
char show[ROWS][COLS] = { 0 };
//初始化数组
init_board(mine, ROWS, COLS, '0');
init_board(show, ROWS, COLS, '*');
打印检测
//printf_board(mine, ROW, COL);
//printf("\n");
//printf_board(show, ROW, COL);
//布置雷
set_mune(mine, ROW, COL, COUNT_MUNE);
打印检测
//printf_board(mine, ROW, COL);
//排查雷
check(mine, show, ROW, COL);
}
void mune()
{
printf("*****************************\n");
printf("********** 1.play *********\n");
printf("*****************************\n");
printf("********** 0.exit *********\n");
printf("*****************************\n");
}
void text()
{
mune();
int input = 0;
printf("请输入一个数字->");
srand((unsigned int)time(NULL));
do
{
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入->");
break;
}
} while (input);
}
int main()
{
text();
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化
void init_board(char arr[ROWS][COLS], int rows, int cols, char ret)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
arr[i][j] = ret;
}
}
}
//打印
void printf_board(char arr[ROWS][COLS], int row, int col)
{
int j = 0;
int i = 0;
printf(" ");
for (j = 1; j <= col; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", arr[i][j]);
}
printf("\n");
}
printf("\n-------扫雷游戏-------\n");
}
//布置雷
void set_mune(char mine[ROWS][COLS], int row, int col,int count_mine)
{
int x = 0;
int y = 0;
int i = 0;
//用于检测雷是否够数
//int count = 0;
for (i = 0; i < count_mine; i++)
{
a:
x = rand() % row + 1;
y = rand() % col + 1;
if ('0' == mine[x][y])
{
mine[x][y] = '1';
//count++;
}
else
{
goto a;
}
}
//printf("%d", count);
}
//是否排雷完成
int mune_end(char mine[ROWS][COLS], int row, int col)
{
int i = 0;
for (i = 1; i <= row - 2; i++)
{
int j = 0;
for (j = 1; j < col - 2; j++)
{
if ('0' == mine[i][j])
{
return 1;
}
}
}
return 0;
}
//附近雷的数目
int get_count_mine(char mine[ROWS][COLS],int x , int y)
{
return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y + 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1]) - 8 * '0';
}
//排查雷
void check(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
printf_board(show, ROW, COL);
while (1)
{
printf("请输入坐标->");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if ('1' == mine[x][y])
{
printf("雷炸了,游戏结束!\n");
}
else
{
int count = get_count_mine(mine, x, y);
show[x][y] = '0' + count;
printf_board(show, ROW, COL);
}
}
int end = mune_end(mine, row, col);
if (0 == end)
{
printf("游戏结束,排雷完成\n");
break;
}
}
}