目录
1.游戏介绍
扫雷是1992年发布的一款小游戏,它的玩法很简单。在基础模式下,它由一个9*9的正方形格子组成,当你对任意格子进行操作时如果是雷的话,就会输掉游戏。如果不是雷,它就会显示它一周一共有几个雷。
那么我们如何用c语言将它具体实现呢,接着往下。
2.具体实现
一.分工协作
为了更高效的完成我们扫雷这个项目,我们选择创建多个.c文件和一个.h文件。
test.c我们用来写我们扫雷游戏的主要逻辑。game.c用来写扫雷游戏需要用到的各种函数,而game.h用来存放我们写的各种函数 ,我们开始可以在game.h里放上各种函数库,这样我们只要在你正在写的.c文件中声game.h就可以用到它里面的各种函数库了
二.游戏的主要逻辑
int main() {
int input = 0;
printf("请输入1或0选择游戏\n");
do {
menu();
scanf("%d", &input);
switch (input) {
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误请重新选择\n");
break;
}
}
while (input);
printf("游戏结束\n");
return 0;
}
int mian中使我们游戏的主体逻辑。先给用户简单的菜单提示 1:开始游戏 或者 0:离开游戏。
case 1:中就是我们的游戏主体了。
三.游戏主体
1.初始化棋盘
初始化怎么做
我们要完成一个9*9棋盘大小的棋盘,就需要2维数组来存放它的信息。而且需要俩个二维数组,一个用来给用户看,一个用来存放雷的信息。
那么这个二位数组该多大呢?其实这个二位数组并不只能是9行9列,这样就会存在越界问题。
所以我们可以扩大数组具体请看图
我们创建一个12*12的数组但是只给用户展示里面9*9的内容那么这个问题就很好的解决了。
在开始写初始化棋盘的函数之前我们可以在game.c里面写上一个# define ROW,和#define COL 一个用来表示行,一个用来表示列,这样我们后面想要改变棋盘的大小就很方便了。
初始化棋盘函数
void ChuShiHua(char arr[ROWS][COLS], int rows, int cols,char set) {
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < ROWS; j++) {
arr[i][j] = set;
}
}
}
创建一个数组存放扫雷棋盘的信息
2.布置雷
同样的为了之后的方便,我们在game.h里定义雷和它的个数:#define Lei 10
布置雷函数:
void BuZhiLei(char arr[ROWS][COLS], int row, int cok, int lei) {
int a = Lei;
srand((unsigned)time(NULL)); //设置随机数
while (a) {
int x = rand() % row + 1; //限制x y范围,避免溢出棋盘
int y = rand() % row + 1;
if (arr[x][y] == '0') { //'1'有雷,'0'无雷
arr[x][y] = '1';
a--;
}
}
}
3.打印棋盘
void DaYing(char arr[ROWS][COLS], int row,int col) {
printf("-------扫雷游戏--------\n");
for (int i = 0; i <= COL; i++) {
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <=ROW; i++) {
printf("%d ", i);
for (int j = 1; j <=ROW; j++) {
printf("%c ",arr[i][j]);
}
printf("\n");
}
}
这里为了好看的在设计打印棋盘的函数时,加了些许修饰让页面更好看写 。
4.统计周边的雷
int TongJiLei(char arr[ROWS][COLS],int x,int y) {
int cont = 0;
for (int i = x-1; i <= x + 1; i++) { //统计扫过雷的区域周边一共有几个雷
for (int j = y - 1; j <= y + 1; j++) {
cont+=arr[i][j] - '0';
}
}
return cont;
}
5.开始扫雷
void SaoLei(char arr1[ROWS][COLS], char arr2[ROWS][COLS],int row, int col,int lei) {
system("cls");
int x = 0;
int y = 0;
int win = 0; //拿win来计算扫了多少不是雷的格子数
while (win < row * col - lei) //row* col - lei:不是雷的格子数
{
DaYing(arr2, row, col);
printf("请输入你想要扫的坐标 (行,列)\n");
scanf("%d",&x);
scanf("%d",&y);
if (arr2[x][y] != '*') //排查过的坐标的情况
{
system("cls");
printf("该坐标已经排查过请重新输入\n");
}
if (arr2[x][y] == '*')
{
if ((x >= 1 && x <= 9) && (y >= 1 && y <= 9))
{
if (arr1[x][y] == '1') //被炸死的情况
{
printf("你被炸死了\n");
break;
}
else
{
system("cls"); //排查成功的情况
char a = TongJiLei(arr1, x, y) + '0';
arr2[x][y] = a;
win++;
}
}
}
if((x >9 || x < 0) || (y > 9 || y < 0)) //坐标错位的情况
{
system("cls");
printf("坐标输入有误请重新输入\n");
}
}
if (win == row * col - lei) { //当win < 不是雷的地方时,游戏结束
printf("恭喜你赢了\n");
}
}
代码全览:
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h> //这样只要.c文件包含这个头文件这些就不需要写了
#include<windows.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define Lei 1
void ChuShiHua(char arr[ROWS][COLS], int rows, int cols, char set);
void DaYing(char arr[ROWS][COLS], int a, int b);
void BuZhiLei(char arr[ROWS][COLS], int row, int cok, int lei);
int TongJiLei(char arr[ROWS][COLS], int x, int y);
void SaoLei(char arr1[ROWS][COLS], char arr2[ROWS][COLS], int row, int col, int lei);
-----------------------------------------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
#include "game.h"
void menu() {
printf("-------------------------\n");
printf("---------1. paly --------\n");
printf("---------0. exit---------\n");
printf("-------------------------\n");
}
void game() {
char mine[ROWS][COLS] = { '0' };
char show[ROWS][COLS] = { '*' };
//先要初始化数组
ChuShiHua(mine, ROWS, COLS, '0');
ChuShiHua(show, ROWS, COLS, '*');
//布置雷
BuZhiLei(mine,ROW,COL,Lei);
//打印棋盘
DaYing(show,ROW,COL);
/*DaYing(mine, ROW, COL);*/ //用户只需要看见9*9的棋盘就好
//开始扫雷
SaoLei(mine, show, ROW, COL, Lei);
}
int main() {
int input = 0;
printf("请输入1或0选择游戏\n");
do {
menu();
scanf("%d", &input);
switch (input) {
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误请重新选择\n");
break;
}
}
while (input);
printf("游戏结束\n");
return 0;
}
-----------------------------------------------------------------------------------------
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void ChuShiHua(char arr[ROWS][COLS], int rows, int cols,char set) {
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < ROWS; j++) {
arr[i][j] = set;
}
}
}
void DaYing(char arr[ROWS][COLS], int row,int col) {
printf("-------扫雷游戏--------\n");
for (int i = 0; i <= COL; i++) {
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <=ROW; i++) {
printf("%d ", i);
for (int j = 1; j <=ROW; j++) {
printf("%c ",arr[i][j]);
}
printf("\n");
}
}
void BuZhiLei(char arr[ROWS][COLS], int row, int cok, int lei) {
int a = Lei;
srand((unsigned)time(NULL)); //设置随机数
while (a) {
int x = rand() % row + 1; //限制x y范围,避免溢出棋盘
int y = rand() % row + 1;
if (arr[x][y] == '0') { //'1'有雷,'0'无雷
arr[x][y] = '1';
a--;
}
}
}
int TongJiLei(char arr[ROWS][COLS],int x,int y) {
int cont = 0;
for (int i = x-1; i <= x + 1; i++) { //统计扫过雷的区域周边一共有几个雷
for (int j = y - 1; j <= y + 1; j++) {
cont+=arr[i][j] - '0';
}
}
return cont;
}
void SaoLei(char arr1[ROWS][COLS], char arr2[ROWS][COLS],int row, int col,int lei) {
system("cls");
int x = 0;
int y = 0;
int win = 0; //拿win来计算扫了多少不是雷的格子数
while (win < row * col - lei) //row* col - lei:不是雷的格子数
{
DaYing(arr2, row, col);
printf("请输入你想要扫的坐标 (行,列)\n");
scanf("%d",&x);
scanf("%d",&y);
if (arr2[x][y] != '*') //排查过的坐标的情况
{
system("cls");
printf("该坐标已经排查过请重新输入\n");
}
if (arr2[x][y] == '*')
{
if ((x >= 1 && x <= 9) && (y >= 1 && y <= 9))
{
if (arr1[x][y] == '1') //被炸死的情况
{
printf("你被炸死了\n");
break;
}
else
{
system("cls"); //排查成功的情况
char a = TongJiLei(arr1, x, y) + '0';
arr2[x][y] = a;
win++;
}
}
}
if((x >9 || x < 0) || (y > 9 || y < 0)) //坐标错位的情况
{
system("cls");
printf("坐标输入有误请重新输入\n");
}
}
if (win == row * col - lei) { //当win < 不是雷的地方时,游戏结束
printf("恭喜你赢了\n");
}
}