在学习C语言的二维数组之后,我们就有能力做一个简单的扫雷游戏了
还是老规矩,分析思路
目录
1.目录
最开始要给玩家选择是进入游戏还是退出游戏,所以给一个目录,这里我做出来的是这样的
2.持续游戏
制作一个持续进行游戏,这里我用dowhile来实现,具体代码如下
int input;
do
{
menu();
scanf("%d",&input);
switch (input)
{
case 1:
{
game();
break;
}
case 0:
{
printf("退出游戏\n");
break;
}
default:
{
printf("输入错误,请重新输入\n");
break;
}
}
} while (input);
这样就可以让用户自己选择是继续游戏还是退出游戏
3.制作棋盘
制作棋盘,对于棋盘我选择用二维是数组来解决,这里我们需要设置两个棋盘,一个是埋雷的棋盘,一个是用户排雷的棋盘,然后为了美观给棋盘排雷的棋盘初始化为'*',为了方便,给埋雷的棋盘初始化成'0'具体初始化代码如下
void Init(char arr[ROWS][COLS], int rows, int cols, char set)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
arr[i][j] = set;
}
}
}
这里的set是为了初始化两个棋盘的时候更加方便,所以我就封装成了一个初始化函数
4.埋雷
埋雷我们需要给对应的埋雷棋盘的对应位置把'0'更改成成'1',这样设计是为了方便我们进行是否有类判断的时候更加方便,在进行埋雷之前要对对应的棋盘进行初始化,这里我还是用随机数的函数来设置雷,如果不知道设置随机数函数的,可以看我之前的文章猜数字C语言实战项目【猜数字】埋雷具体代码如下
void set_mine(char arr[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
for (int i = 1; i <= EASY_COUNT; i++)
{
while(1)
{
x = rand() % 9 + 1;//1-9
y = rand() % 9 + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
break;
}
}
}
}
5.排雷
埋雷之后需要玩家进行排雷,这里我把判胜负的代码直接放到这里面了,如果想的话,也可以重新封装成一个函数来调用,这里排雷需要让玩家输入,然后判断胜负,循环知道雷排完,或者踩到雷为止,玩家每次输入一次之后,我们需要对排雷的棋盘进行打印,让玩家知道自己的操作是否踩到雷和附近是否有雷,这里我们用加减法来判断玩家排雷处有多少雷,这里就和前面关联起来了,我们设置'0'和'1‘,九宫格相减的结果就是附近具体的雷数,具体代码如下
void find_mine(char arr[ROWS][COLS], char mine[ROWS][COLS] ,int row, int col)
{
int x = 0,y = 0,sum=0,n;
while (1)
{
static int count = 0;
if (count == ROW * COL - EASY_COUNT)
{
printf("you win");
break;
}
else
{
printf("请输入:>\n");
scanf("%d %d", &x, &y);
if (arr[x][y] == '1')
{
printf("你输了\n");
print_board(arr, ROW, COL);
break;
}
else
{
sum = 0;
for (int i = -1; i <= 1; i++)
{
for (int j = -1; j <= 1; j++)
{
sum = sum + arr[x + i][y + j];
}
}
n = sum - 9 * '0';
mine[x][y] = '0' + n;
print_board(mine, ROW, COL);
}
count++;
}
6.打印棋盘
这里我们可以把打印棋盘封装成一个函数,给上面的代码进行调用,也就是我上面的printf_board函数,具体代码如下
void print_board(char arr[ROWS][COLS], int row, int col)
{
int i, j;
printf("_____________扫雷_____________\n");
for (i = 0; i <= row; i++)
{
printf(" %d ",i);
}
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");
}
到这里,扫雷的全部功能就已经实现了,剩下的就是用代码来执行了
7.全部代码
全部代码在这里
//game.h
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
void Init(char arr[ROWS][COLS],int rows, int cols, char set);
void print_board(char arr[ROWS][COLS], int row , int col);
void set_mine(char arr[ROWS][COLS], int row, int col);
void find_mine(char arr[ROWS][COLS],char mine[ROWS][COLS] ,int row,int col);
//test.c
#include"game.h"
void menu()
{
printf("*****************************\n");
printf("************1.play ********\n");
printf("***********0.exit**********\n");
printf("*****************************\n");
}
void game()
{
srand((unsigned int)time(NULL));
char arr[ROWS][COLS];
char mine[ROWS][COLS];
Init(arr, ROWS, COLS, '0');
Init(mine, ROWS, COLS, '*');
set_mine(arr, ROW, COL);
print_board(mine, ROW, COL);
find_mine(arr,mine, ROW, COL);
print_board(mine, ROW, COL);
}
int main()
{
int input;
do
{
menu();
scanf("%d",&input);
switch (input)
{
case 1:
{
game();
break;
}
case 0:
{
printf("退出游戏\n");
break;
}
default:
{
printf("输入错误,请重新输入\n");
break;
}
}
} while (input);
return 0;
}
//game.c
#include"game.h"
void Init(char arr[ROWS][COLS], int rows, int cols, char set)
{
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
arr[i][j] = set;
}
}
}
void print_board(char arr[ROWS][COLS], int row, int col)
{
int i, j;
printf("_____________扫雷_____________\n");
for (i = 0; i <= row; i++)
{
printf(" %d ",i);
}
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");
}
void set_mine(char arr[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
for (int i = 1; i <= EASY_COUNT; i++)
{
while(1)
{
x = rand() % 9 + 1;//1-9
y = rand() % 9 + 1;
if (arr[x][y] == '0')
{
arr[x][y] = '1';
break;
}
}
}
}
void find_mine(char arr[ROWS][COLS], char mine[ROWS][COLS] ,int row, int col)
{
int x = 0,y = 0,sum=0,n;
while (1)
{
static int count = 0;
if (count == ROW * COL - EASY_COUNT)
{
printf("you win");
break;
}
else
{
printf("请输入:>\n");
scanf("%d %d", &x, &y);
if (arr[x][y] == '1')
{
printf("你输了\n");
print_board(arr, ROW, COL);
break;
}
else
{
sum = 0;
for (int i = -1; i <= 1; i++)
{
for (int j = -1; j <= 1; j++)
{
sum = sum + arr[x + i][y + j];
}
}
n = sum - 9 * '0';
mine[x][y] = '0' + n;
print_board(mine, ROW, COL);
}
count++;
}
}
}
快去试试吧