目录
一.扫雷小游戏
二.游戏主体一览
编辑
三.模块化设计扫雷游戏
3.1打印欢迎菜单
3.2创建两个二维数组
3.3棋盘稍加修改
3.4布置雷
3.5排查雷
四.游戏总体代码
4.1game.h头文件
4.2game.c函数实现源文件
4.3游戏main函数主体
五.游戏效果图
一.扫雷小游戏
这是一个经典的扫雷小游戏界面,可以看出扫雷游戏实际上跟代码中的二维数组很相似,因此扫雷小游戏便是对二维数组的使用。
二.游戏主体一览
int main()
{int input = 0;do{//创造游戏菜单界面menu();printf("请选择:\n");scanf("%d", &input);switch (input){case 1://游戏函数主体部分game();break;case 0:printf("游戏已退出\n");default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}
三.模块化设计扫雷游戏
3.1打印欢迎菜单
//游戏菜单函数
void menu()
{printf(" \n");printf(" 扫雷小游戏 \n");printf("*** 1.play ***\n");printf("*** 0.exit ***\n");printf("********* *******\n");printf("********* *******\n");
}
3.2创建两个二维数组
为什么要创建两个二维数组呢?
- 创建第一个mine数组用来存放布置好的雷的信息
- 创建第二个show数组用来存放排查出的雷的信息
- 为了代码实现过程的简化要求两个数组大小一致
//创建两个二维数组,初始化char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };initboard(mine, ROWS, COLS,'0');initboard(show, ROWS, COLS,'*');
mine数组中存放的是雷的信息:1表示雷,0表示没有雷
show数组存放玩家每次排查该位置后周围雷的个数
在此之后便于我们随机化雷的位置和显示周围雷的个数。
我们打印出初始化后棋盘来看看效果:
//根据初始化内容 初始化数组函数
void initboard(char mine[ROW][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){mine[i][j] = set;}}}
//打印棋盘
void display(char mine[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (i = 1; i <= row; i++){for (j = 1; j <= col; j++){printf("%c ",mine[i][j]);}printf("\n");}}
3.3棋盘稍加修改
//游戏菜单函数
void menu()
{printf(" \n");printf(" 扫雷小游戏 \n");printf("*** 1.play ***\n");printf("*** 0.exit ***\n");printf("********* *******\n");printf("********* *******\n");
}
//根据初始化内容 初始化数组函数
void initboard(char mine[ROW][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){mine[i][j] = set;}}}
//打印棋盘
void display(char mine[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("-----扫雷-----\n");for (i = 0; i <= col; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", mine[i][j]);}printf("\n");}}
在实现代码过程中两个棋盘都打印出来是为类方便我们观察,后续真正游玩便只需打印出show数组棋盘给玩家看即可。
3.4布置雷
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col)
{int count = mine_count;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}}void game()
{char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//我们放置雷的棋盘initboard(mine, ROWS, COLS,'0');//玩家能看到的扫雷棋盘initboard(show, ROWS, COLS,'*');//布置雷set_mine(mine, ROW, COL);//让我们看一下布置雷是否成功display(mine, ROW, COL);//排查雷}
上和左的数字是棋盘的坐标,在内部9*9的表中1代表雷
3.5排查雷
//排查雷
int get_surround_mine_count(char mine[ROWS][COLS], int x, int y)
{int c = 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';return c;}void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < row * col - mine_count){printf("请输入你要排查的坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("你被炸死了\n");printf("雷区分布如下:\n");display(mine, ROW, COL);break;}else{int surround_mine_count = get_surround_mine_count(mine, x, y);show[x][y] = surround_mine_count + '0';display(show, ROW, COL);win++;}}else{printf("坐标非法,重新输入");}}if (win == row * col - mine_count){printf("成功排雷结束");display(show, ROW, COL);}
}
当我们输入一个坐标后显示一下棋盘
四.游戏总体代码
4.1game.h头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define mine_count 10void initboard(mine, rows, cols, set);void display(mine, row, col);void set_mine(mine, row, col);void find_mine(mine, show, row, col);int get_surround_mine_count(mine, x, y);
4.2game.c函数实现源文件
#include "game.h"//游戏菜单函数
void menu()
{printf(" \n");printf(" 扫雷小游戏 \n");printf("*** 1.play ***\n");printf("*** 0.exit ***\n");printf("********* *******\n");printf("********* *******\n");
}
//根据初始化内容 初始化数组函数
void initboard(char mine[ROW][COLS], int rows, int cols, char set)
{int i = 0;for (i = 0; i < rows; i++){int j = 0;for (j = 0; j < cols; j++){mine[i][j] = set;}}}
//打印棋盘
void display(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;printf("-----扫雷-----\n");for (i = 0; i <= col; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}}//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col)
{int count = mine_count;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}}//排查雷//记录排查坐标周围雷的个数
int get_surround_mine_count(char mine[ROWS][COLS], int x, int y)
{int c = 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';return c;}void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < row * col - mine_count){printf("请输入你要排查的坐标:");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("你被炸死了\n");printf("雷区分布如下:\n");display(mine, ROW, COL);break;}else{int surround_mine_count = get_surround_mine_count(mine, x, y);show[x][y] = surround_mine_count + '0';display(show, ROW, COL);win++;}}else{printf("坐标非法,重新输入");}}if (win == row * col - mine_count){printf("成功排雷结束");display(show, ROW, COL);}
}
4.3游戏main函数主体
#include "game.h"
//游戏主体函数
void game()
{char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//我们放置雷的棋盘initboard(mine, ROWS, COLS, '0');//玩家能看到的扫雷棋盘initboard(show, ROWS, COLS, '*');//打印出放置雷的棋盘//display(mine,ROW,COL);//打印出扫雷棋盘display(show,ROW,COL);//布置雷set_mine(mine, ROW, COL);//查看布置的雷//display(mine, ROW, COL);//排查雷find_mine(mine, show, ROW, COL);}
int main()
{srand((unsigned int)time(NULL));int input = 0;do{//创造游戏菜单界面menu();printf("请选择:\n");scanf("%d", &input);switch (input){case 1://游戏函数主体部分game();break;case 0:printf("游戏已退出\n");default:printf("选择错误,请重新选择\n");break;}} while (input);return 0;
}
五.游戏效果图
游玩过程中直到被炸死或者排完所有雷结束游戏。
实现扫雷游戏,感谢大家的支持