主程序(初始)
主程序是一个程序的总体逻辑,可以凭借主程序了解本文的大致逻辑
在未编写游戏代码前,我们先写一些主体代码
其中“game.h”在博主前一篇三子棋游戏中详细介绍过,在这里就不过多阐述了,下面是一个很简单的程序,输入1,执行game( ),输入0则退出
#include "game.h"
void menu()
{
printf("*********************************\n");
printf("********** 1.play ***********\n");
printf("********** 0.exit ***********\n");
printf("*********************************\n");
}
int main()
{
int input = 0;
do {
menu();
printf("请输入:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
运行结果如下
游戏执行
界面的初始化
仔细观察我们所玩过的扫雷游戏,其实无非就是一个99(或者更大)数组
所以第一步我们要将数组初始化,这里我们选择将建立两个数组,一个为雷区数组用‘0’来表示,另一个则为表示无雷数组
//InitBoard(mine, ROWS, COLS, '0');
//InitBoard(show, ROWS, COLS, '*');
void InitBoard(char a[ROWS][COLS], int rows, int cols, char set)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
a[i][j] = set;
}
}
}
布置雷
因为游戏肯定不会只玩一次,所以我们雷的位置也不会每局都一样,所以设置随机数来防置雷,用来确保每局雷位置不同
void SetMine(char a[ROWS][COLS], int row, int col)
{
int count = MINECOUNT;
int x = 0, y = 0;
while (count)
{
x = rand() % row + 1;
y = rand() % col + 1;
if (a[x][y] == '0')
{
a[x][y] = '1';
count--;
}
}
}
计算周边雷的数量
玩过扫雷的小伙伴都知道,每个位置周边有几个雷就会显示几,所以我们要将周边雷个数求出来
int AroundMineCount(char a[ROWS][COLS], int x, int y)
{
return a[x - 1][y - 1] + a[x - 1][y] + a[x - 1][y + 1] + a[x][y - 1] + a[x][y + 1] + a[x + 1][y - 1] + a[x + 1][y] + a[x + 1][y + 1] - 8 * '0';
}
排雷
最后,就是玩家的行动了,要判断玩家是否输入到了雷的坐标,以及是否输入不合法(比如:越界)并给予提示
void FindMine(char a[ROWS][COLS], char b[ROWS][COLS], int row, int col)
{
int x = 0, y = 0;
int win = 0;
while (win <= ROW * COL - MINECOUNT)
{
printf("输入想排查的坐标:>\n");
scanf("%d,%d", &x, &y);
if ((x < 1 && x > ROW) && (y < 1 && y > COL))
{
printf("输错了,请重新输入:>\n");
scanf("%d,%d", &x, &y);
}
if (a[x][y] == '1')
{
printf("踩雷了,游戏结束\n");
DisplayBoard(a, ROW, COL);
break;
}
else
{
int ret = AroundMineCount(a, x, y);
b[x][y] = ret + '0';
win++;
DisplayBoard(b, ROW, COL);
}
if (win == ROW * COL - MINECOUNT)
{
printf("你赢了\n");
break;
}
}
}
代码如下
game.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//初始化布局
#define ROW 9
#define COL 9
#define MINECOUNT 10
#define ROWS ROW+2
#define COLS COL+2
void InitBoard(char a[ROWS][COLS], int rows, int cols, char set);//数组初始化
void DisplayBoard(char a[ROWS][COLS], int row, int col);//打印游戏界面
void SetMine(char a[ROWS][COLS], int row, int col);//布置雷
void FindMine(char a[ROWS][COLS], char b[ROWS][COLS], int row, int col);//排除雷
int AroundMineCount(char a[ROWS][COLS], char b[ROWS][COLS], int row, int col);//计算周边有多少雷
game.c
#include "game.h"
void InitBoard(char a[ROWS][COLS], int rows, int cols, char set)
{
int i = 0, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
a[i][j] = set;
}
}
}
void DisplayBoard(char a[ROWS][COLS], int row, int col)
{
int i = 0, j = 0;
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 ", a[i][j]);
}
printf("\n");
}
}
void SetMine(char a[ROWS][COLS], int row, int col)
{
int count = MINECOUNT;
int x = 0, y = 0;
while (count)
{
x = rand() % row + 1;
y = rand() % col + 1;
if (a[x][y] == '0')
{
a[x][y] = '1';
count--;
}
}
}
int AroundMineCount(char a[ROWS][COLS], int x, int y)
{
return a[x - 1][y - 1] + a[x - 1][y] + a[x - 1][y + 1] + a[x][y - 1] + a[x][y + 1] + a[x + 1][y - 1] + a[x + 1][y] + a[x + 1][y + 1] - 8 * '0';
}
void FindMine(char a[ROWS][COLS], char b[ROWS][COLS], int row, int col)
{
int x = 0, y = 0;
int win = 0;
while (win <= ROW * COL - MINECOUNT)
{
printf("输入想排查的坐标:>\n");
scanf("%d,%d", &x, &y);
if ((x < 1 && x > ROW) && (y < 1 && y > COL))
{
printf("输错了,请重新输入:>\n");
scanf("%d,%d", &x, &y);
}
if (a[x][y] == '1')
{
printf("踩雷了,游戏结束\n");
DisplayBoard(a, ROW, COL);
break;
}
else
{
int ret = AroundMineCount(a, x, y);
b[x][y] = ret + '0';
win++;
DisplayBoard(b, ROW, COL);
}
if (win == ROW * COL - MINECOUNT)
{
printf("你赢了\n");
break;
}
}
}
text.c
#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, '*');
DisplayBoard(show, ROW, COL);//打印玩家游戏界面
SetMine(mine, ROW, COL);//布置雷
FindMine(mine, show, ROW, COL);//排雷
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do {
menu();
printf("请输入:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("错误,请重新输入\n");
break;
}
} while (input);
return 0;
}