扫雷
- 游戏资源介绍
- 游戏功能介绍
- 游戏代码编写教程
- 游戏功能测试
- 自动排雷测试
- 地雷标记测试
- 取消标记测试
- 踩雷判定测试
- 重复游戏测试
- 胜利判定测试
- 头文件
- 游戏主体文件
- 用户主体文件
游戏资源介绍
本次对之前的扫雷游戏进行了重新编写与更新,在此次的游戏实现中新增加了剩余地雷数量统计、地雷标记、地雷标记取消的功能,游戏实现的主体逻辑并未改变,相比于之前的游戏,此次的内容会更加的完善。
游戏代码资源如下,需要的朋友可以自取。
游戏功能介绍
在本次编写的游戏中包含以下功能:
- 开始菜单:供玩家选择开始游戏还是结束游戏
- 错误提示:玩家选择错误时给予提示
- 棋盘初始化:在创建好棋盘后可以对棋盘进行出始化(后期会增加初始化样式功能)
- 棋盘打印;将棋盘打印在屏幕上
- 地雷设置:在棋盘上随机设置地雷(后期会增加修改地雷数和棋盘大小的功能)
- 坐标判定:判断玩家输入坐标是否正确
- 地雷标记:玩家可以主动选择在该坐标点上放置地雷标记
- 自动排查:当玩家输入的坐标周围没有地雷时,系统会自动进行周围坐标的地雷排查
- 地雷数量统计:在进行排查时会将坐标周围的地雷数量统计好并显示在对应坐标上
- 剩余地雷统计:在棋盘左上角新增剩余地雷数量统计
- 踩雷判定:当玩家输入坐标为地雷时,会提示踩到地雷判定游戏失败
- 胜利判定:当玩家将安全区全部找出来时,会提示玩家获得胜利,并自动放置地雷标记
- 重复游戏:当玩家结束一局游戏后可以再来一局游戏
游戏代码编写教程
【扫雷】#C语言的第三个小游戏 #保姆级编写思路
游戏功能测试
自动排雷测试
地雷标记测试
取消标记测试
踩雷判定测试
重复游戏测试
胜利判定测试
游戏胜利后自动将地雷标记出来
本次新编写游戏部分代码如下:
头文件
//引用头文件
#include <stdio.h>
#include <Windows.h>
#include <stdlib.h>
#include <time.h>//定义标识符常量
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define COUNT 5//函数声明
void init_board(char board[ROWS][COLS], int rows, int cols, char ret);//初始化
void print_board(char board[ROWS][COLS], int row, int col, int count);//打印
void set_mine(char board[ROWS][COLS], int row, int col, char ret);//埋雷
void find_mine(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col);//排雷shadow, mine
void menu2();//选择操作菜单
void menu3();//选择操作菜单2
char judge_mine(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y);//判断地雷
int static_mine(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y);//坐标周围地雷计数
void auto_find(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y);//自动排雷
int judge_win(char shadow[ROWS][COLS], int row, int col);//判断胜利
int judge_win2(char shadow[ROWS][COLS], int row, int col);//判断未排雷数量
int auto_mark(char shadow[ROWS][COLS], int row, int col, int count);//自动标记
游戏主体文件
//初始化棋盘
void init_board(char board[ROWS][COLS], int rows, int cols, char ret)
{for (int i = 0; i < rows; i++)//初始化行元素{for (int j = 0; j < cols; j++)//初始化列元素{board[i][j] = ret;}}
}
//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col, int count)
{printf("\n *---地雷 #---未排雷区域 P---旗帜\n\n");printf("剩余地雷:%d\n", count);printf("|");for (int i = 0; i <= row; i++)//打印列坐标{printf(" %d |", i);}printf("\n");//打印分割线printf("|");for (int j = 0; j <= col; j++)//打印列{printf("---|");}printf("\n");for (int i = 1; i <= row; i++)//打印行{printf("| %d |", i);//打印行号for (int j = 1; j <= col; j++)//打印列{printf(" ");printf("%c", board[i][j]);printf(" |");}printf("\n");//打印分割线printf("|");for (int j = 0; j <= col; j++)//打印列{printf("---|");}printf("\n");}printf("\n");
}
//埋地雷
void set_mine(char board[ROWS][COLS], int row, int col, char ret)
{int count = COUNT;//地雷数量while (count){int flag = 0;//判断埋雷是否成功int i = rand() % ROW + 1;//地雷横坐标int j = rand() % COL + 1;//地雷纵坐标if (i >= 1 && i <= row)//判断横坐标的合法性1-row{if (j >= 1 && j <= col)//判断纵坐标的合法性1-col{if (board[i][j] == ' '){board[i][j] = ret;flag = 1;//成功埋雷}}}if (flag)count--;}
}
//通过坐标周围地雷数
int static_mine(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y)
{int count = 0;//计数器for (int i = -1; i < 2; i++)//横坐标判断{for (int j = -1; j < 2; j++){if (mine[x + i][y + j] == '*')//坐标点为地雷count++;//计数器+1}}return count;
}
用户主体文件
//菜单栏
void menu()
{printf("#####################\n");printf("#### 0. 退出游戏 ####\n");printf("#### 1. 退出游戏 ####\n");printf("#### 请选择<0/1> ####\n");printf("#####################\n");
}
//游戏
void game()
{//藏雷char shadow[ROWS][COLS] = { 0 };//地雷char mine[ROWS][COLS] = { 0 };//初始化棋盘init_board(shadow, ROWS, COLS, '#');init_board(mine, ROWS, COLS, ' ');//打印棋盘print_board(shadow, ROW, COL, COUNT);//埋雷set_mine(mine, ROW, COL, '*');//print_board(mine, ROW, COL,COUNT);//排雷find_mine(shadow, mine, ROW, COL);
}int main()
{int input = 0;srand((unsigned)time(NULL));do{menu();//菜单栏printf("请输入您的选择>:");scanf("%d", &input);switch (input){case 0:printf("正在退出,请耐心等候\n");Sleep(1000);system("cls");break;case 1:printf("开始扫雷\n");game();break;default:printf("输入错误,请重新输入!!!");Sleep(1000);system("cls");break;}} while (input);return 0;
}