数组练习----简配版扫雷实现(注释版)
前言
我们用test.c写主函数,game.c来写游戏需要的函数,再新建game.h来定义一些常量和声明函
数
1.游戏主页面的创立以及代码的实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game.h"
void muen()//游戏菜单
{
printf("-------------------------------------\n");
printf("-------------1.开始游戏--------------\n");
printf("-------------2.退出游戏--------------\n");
printf("-------------------------------------\n");
}
void game()//游戏实现
{
char show[ROWS][COLS] = { 0 };//创建一个ROW行,COL列的二维数组用于显示扫雷区域
char mine[ROWS][COLS] = { 0 };//创建一个ROW行,COL列的二维数组用于创建扫雷区域
initboard(show, ROWS, COLS, '*');//初始化展示棋盘,使其全部为*
initboard(mine, ROWS, COLS, '0');//初始化棋盘使其全部为0
Printboard(show, ROW, COL);//打印展示棋盘
Printboard(mine, ROW, COL);//打印埋雷盘
random_mine(mine, ROW, COL);//埋雷
mine_sweeping(mine, show, ROW, COL);//扫雷,这里mine和show都使用了,是因为在这里他们之间就建立了联系,我们可以在其对应的函数中可见
}
int main()
{
int a = 0;
do
{
muen();
scanf_s("%d", &a);
switch (a)
{
case 1:
game();
break;
case 2:
printf("退出游戏\n");
break;
default:
printf("输入有误,请重新输入!\n");
}
} while (a!=2);
return 0;
}
2. 游戏部分主函数
void game()//游戏实现
{
char show[ROWS][COLS] = { 0 };//创建一个ROW行,COL列的二维数组用于显示扫雷区域
char mine[ROWS][COLS] = { 0 };//创建一个ROW行,COL列的二维数组用于创建扫雷区域
initboard(show, ROWS, COLS, '*');//初始化展示棋盘,使其全部为*
initboard(mine, ROWS, COLS, '0');//初始化棋盘使其全部为0
Printboard(show, ROW, COL);//打印展示棋盘
Printboard(mine, ROW, COL);//打印埋雷盘
random_mine(mine, ROW, COL);//扫雷
mine_sweeping(mine,show,ROW, COL);//扫雷,这里mine和show都使用了,是因为在这里他们之间就建立了联系,我们可以在其对应的函数中可见
}
3.游戏头文件
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASILY 80
void initboard(char board[ROWS][COLS], int rows, int cols, char set);
void Printboard(char board[ROWS][COLS], int row, int col);
void random_mine(char mine[ROWS][COLS], int row, int col);
void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
4.游戏函数实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game.h"
void initboard(char board[ROWS][COLS], int rows, int cols, char set)//初始化棋盘
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void Printboard(char board[ROWS][COLS], int row, int col) //打印棋盘
{
int i = 0;
int j = 0;
printf("---------开始扫雷----------\n");
for (j = 0; j <= col; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= row; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//埋雷
void random_mine(char mine[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = EASILY;//雷的个数
srand(time(NULL));
while (count)
{
x = rand() % row + 1;//产生随机值,+1是控制坐标范围在1-row
y = rand() % col + 1;//产生随机值,+1是控制坐标范围在1-col
if (mine[x][y] == '0')//用于判断是否正确的埋雷,只有我们这没被埋过的雷我们才自减
{
mine[x][y] = '1';
count--;
}
}
}
int statistics_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';//因为我们的雷是用的1,所以我们输入的坐标周围的八个坐标和就是雷的个数,至于减去'0'是为了让字符转变为整形
}
//扫雷
void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = 0;
while (count < row * col - EASILY)//非雷坐标的总个数
{
system("cls");//清屏
Printboard(show, ROW, COL);//打印棋盘
printf("请输入坐标:>");
while (getchar() != '\n');//吃的缓冲区的\n也就是回车,不然当你输入错误的时候程序会死循环,不信你可以屏蔽掉看看
scanf_s("%d %d", &x, &y);
if ((1 <= x && x <= row) && (1 <= y && y <= col))
{
if (mine[x][y] == '0')
{
int leng = statistics_mine(mine, x, y);//两个盘建立联系
show[x][y] = leng + '0';//转变为字符
count++;
}
else
{
printf("很遗憾你被炸死了\n");
Printboard(show, ROW, COL);
break;
}
}
else
{
printf("请输入有效数字!\n");
}
}
if (count == row * col - EASILY)
{
printf("恭喜你扫雷成功!\n");
Printboard(show, ROW, COL);
}
}
总代码
- 游戏头文件
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASILY 80
void initboard(char board[ROWS][COLS], int rows, int cols, char set);
void Printboard(char board[ROWS][COLS], int row, int col);
void random_mine(char mine[ROWS][COLS], int row, int col);
void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
- 游戏主体
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game.h"
void muen()//游戏菜单
{
printf("-------------------------------------\n");
printf("-------------1.开始游戏--------------\n");
printf("-------------2.退出游戏--------------\n");
printf("-------------------------------------\n");
}
void game()//游戏实现
{
char show[ROWS][COLS] = { 0 };//创建一个ROW行,COL列的二维数组用于显示扫雷区域
char mine[ROWS][COLS] = { 0 };//创建一个ROW行,COL列的二维数组用于创建扫雷区域
initboard(show, ROWS, COLS, '*');//初始化展示棋盘,使其全部为*
initboard(mine, ROWS, COLS, '0');//初始化棋盘使其全部为0
Printboard(show, ROW, COL);//打印展示棋盘
Printboard(mine, ROW, COL);//打印埋雷盘
random_mine(mine, ROW, COL);//埋雷
mine_sweeping(mine, show, ROW, COL);//扫雷,这里mine和show都使用了,是因为在这里他们之间就建立了联系,我们可以在其对应的函数中可见
}
int main()
{
int a = 0;
do
{
muen();
scanf_s("%d", &a);
switch (a)
{
case 1:
game();
break;
case 2:
printf("退出游戏\n");
break;
default:
printf("输入有误,请重新输入!\n");
}
} while (a!=2);
return 0;
}
- 游戏函数部分实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game.h"
void initboard(char board[ROWS][COLS], int rows, int cols, char set)//初始化棋盘
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void Printboard(char board[ROWS][COLS], int row, int col) //打印棋盘
{
int i = 0;
int j = 0;
printf("---------开始扫雷----------\n");
for (j = 0; j <= col; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= row; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
//埋雷
void random_mine(char mine[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = EASILY;//雷的个数
srand(time(NULL));
while (count)
{
x = rand() % row + 1;//产生随机值,+1是控制坐标范围在1-row
y = rand() % col + 1;//产生随机值,+1是控制坐标范围在1-col
if (mine[x][y] == '0')//用于判断是否正确的埋雷,只有我们这没被埋过的雷我们才自减
{
mine[x][y] = '1';
count--;
}
}
}
int statistics_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';//因为我们的雷是用的1,所以我们输入的坐标周围的八个坐标和就是雷的个数,至于减去'0'是为了让字符转变为整形
}
//扫雷
void mine_sweeping(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = 0;
while (count < row * col - EASILY)//非雷坐标的总个数
{
system("cls");//清屏
Printboard(show, ROW, COL);//打印棋盘
printf("请输入坐标:>");
while (getchar() != '\n');//吃的缓冲区的\n也就是回车,不然当你输入错误的时候程序会死循环,不信你可以屏蔽掉看看
scanf_s("%d %d", &x, &y);
if ((1 <= x && x <= row) && (1 <= y && y <= col))
{
if (mine[x][y] == '0')
{
int leng = statistics_mine(mine, x, y);//两个盘建立联系
show[x][y] = leng + '0';//转变为字符
count++;
}
else
{
printf("很遗憾你被炸死了\n");
Printboard(show, ROW, COL);
break;
}
}
else
{
printf("请输入有效数字!\n");
}
}
if (count == row * col - EASILY)
{
printf("恭喜你扫雷成功!\n");
Printboard(show, ROW, COL);
}
}