#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//游戏主体
//初始化棋盘
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--;
}
}
//执行操作菜单
void menu2(int count)
{
printf("0.不执行任何操作 1.放置旗帜 2.排雷\n");
printf("请选择你要执行的操作>:");
}
//执行操作菜单2
void menu3()
{
printf("0.不执行任何操作 1.取消旗帜 2.排雷\n");
printf("请选择你要执行的操作>:");
}
//排雷
void find_mine(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col)
{
//用户输入横坐标
int x = 0;
//用户输入纵坐标
int y = 0;
//判断结果变量
char flag = 0;
//统计排雷数量
int count = COUNT;
//胜利标志
int win = 0;
//未排雷数量
int num = 0;
//开始排雷
while (1)
{
printf("请输入需要排查的坐标>:");
scanf("%d%d", &x, &y);//输入横纵坐标
//判断横坐标的合法性
if (x >= 1 && x <= row)
{
//判断纵坐标的合法性
if (y >= 1 && y <= col)
{
//该坐标未被排查
if (shadow[x][y] == '#')
{
menu2(count);//选择操作菜单
int input = 0;
do
{
scanf("%d", &input);//输入操作
switch (input)
{
case 0://不执行任何操作
break;
case 1:
if (count)
{
shadow[x][y] = 'P';//标记坐标
count--;
}
break;
case 2:
flag = judge_mine(shadow, mine, row, col, x, y);//判断地雷
break;
default:
printf("无法执行未知操作,请重新输入:>");//错误提示
break;
}
if (input == 1 || input == 2)
break;
} while (input);
//打印棋盘
print_board(shadow, ROW, COL, count);
}
//检查该坐标被排查,且为空
else if (shadow[x][y] == ' ')
{
printf("无效操作\n");
//打印棋盘
print_board(shadow, ROW, COL, count);
}
//该坐标被标记
else if (shadow[x][y] == 'P')
{
menu3();
int input = 0;
do
{
scanf("%d", &input);//输入操作
switch (input)
{
case 0://不执行任何操作
break;
case 1:
shadow[x][y] = '#';//取消标记
count++;
break;
case 2:
flag = judge_mine(shadow, mine, row, col, x, y);//判断地雷
break;
default:
printf("无法执行未知操作,请重新输入:>");//错误提示
break;
}
if (input == 1 || input == 2)
break;
} while (input);
//打印棋盘
print_board(shadow, ROW, COL, count);
}
//该坐标被排查且有地雷数量统计
else
{
//打印棋盘
print_board(shadow, ROW, COL, count);
printf("该坐标周围有%d个地雷\n", shadow[x][y] - '0');
}
}
}
if (flag == 'L')
{
printf("你踩到了地雷,游戏失败\n");
break;
}
win = judge_win(shadow, row, col);//判断已排查数量
if ((win == ROW * COL - COUNT) && (count != 0))//当全部排查完,但是未全部标记
{
count = auto_mark(shadow, row, col, count);
}
num = judge_win2(shadow, row, col);
//找到并标记所有地雷
if ((win == ROW * COL - COUNT) && (count == 0) && (num == 0))
{
//打印棋盘
print_board(shadow, ROW, COL, count);
printf("恭喜你找出来所有的地雷,游戏胜利\n");
break;
}
}
}
//判断坐标
char judge_mine(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y)
{
if (mine[x][y] == '*')
{
shadow[x][y] = '*';
return 'L';
}
else
{
//该坐标既未被排查,也不是地雷,统计该坐标周围地雷数
int ret = static_mine(shadow, mine, row, col, x, y);
if (ret == 0)
{
shadow[x][y] = ' ';
auto_find(shadow, mine, row, col, x, y);
}
else
{
shadow[x][y] = ret + '0';
}
}
return 'C';
}
//通过坐标周围地雷数
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 auto_find(char shadow[ROWS][COLS], char mine[ROWS][COLS], int row, int col, int x, int y)
{
for (int i = -1; i < 2; i++)
{
if (x + i >= 1 && x + i <= row)
{
for (int j = -1; j < 2; j++)
{
if (y + j >= 1 && y + j <= col)
{
if (shadow[x + i][y + j] == '#')
{
judge_mine(shadow, mine, row, col, x + i, y + j);
}
}
}
}
}
}
//判断胜利
int judge_win(char shadow[ROWS][COLS], int row, int col)
{
int count = 0;
//已排查数量
for (int i = 1; i <= row; i++)
{
for (int j = 1; j <= row; j++)
{
if ((shadow[i][j] != '#') && (shadow[i][j] != 'P'))
{
count++;
}
}
}
return count;
}
//判断未排雷数量
int judge_win2(char shadow[ROWS][COLS], int row, int col)
{
int count = 0;
//已排查数量
for (int i = 1; i <= row; i++)
{
for (int j = 1; j <= row; j++)
{
if (shadow[i][j] == '#')
{
count++;
}
}
}
return count;
}
//自动标记
int auto_mark(char shadow[ROWS][COLS], int row, int col, int count)
{
//已排查数量
for (int i = 1; i <= row; i++)
{
for (int j = 1; j <= row; j++)
{
if (shadow[i][j] == '#')
{
shadow[i][j] = 'P';
count--;
}
if (!count)
return count;
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
C语言-分支与循环、函数、数组等知识点综合应用-C语言实现扫雷小游戏3.0
共51个文件
tlog:16个
pdb:4个
obj:4个
需积分: 5 0 下载量 138 浏览量
2023-11-30
03:04:46
上传
评论
收藏 49.22MB ZIP 举报
温馨提示
游戏资源介绍 本次对之前的扫雷游戏进行了重新编写与更新,在此次的游戏实现中新增加了剩余地雷数量统计、地雷标记、地雷标记取消的功能,游戏实现的主体逻辑并未改变,相比于之前的游戏,此次的内容会更加的完善。 游戏功能介绍 1. 开始菜单:供玩家选择开始游戏还是结束游戏 2. 错误提示:玩家选择错误时给予提示 3. 棋盘初始化:在创建好棋盘后可以对棋盘进行出始化(后期会增加初始化样式功能) 4. 棋盘打印;将棋盘打印在屏幕上 5. 地雷设置:在棋盘上随机设置地雷(后期会增加修改地雷数和棋盘大小的功能) 6. 坐标判定:判断玩家输入坐标是否正确 7. 地雷标记:玩家可以主动选择在该坐标点上放置地雷标记 8. 自动排查:当玩家输入的坐标周围没有地雷时,系统会自动进行周围坐标的地雷排查 9. 地雷数量统计:在进行排查时会将坐标周围的地雷数量统计好并显示在对应坐标上 10. 剩余地雷统计:在棋盘左上角新增剩余地雷数量统计 11. 踩雷判定:当玩家输入坐标为地雷时,会提示踩到地雷判定游戏失败 12. 胜利判定:当玩家将安全区全部找到,会提示玩家获得胜利 13.重复游戏:当玩家结束一局游戏后可以再来一局
资源推荐
资源详情
资源评论
收起资源包目录
23.11.28_mine_sweeping.zip (51个子文件)
23.11.28_mine_sweeping
23.11.28_mine_sweeping.vcxproj 7KB
Release
23.11.28_mine_sweeping.ipdb 14KB
vc142.pdb 100KB
23.11.28_mine_sweeping.iobj 50KB
23.11.28_mine_sweeping.log 404B
user.obj 136KB
23.11.28_mine_sweeping.lib.recipe 152B
23.11.28.f470f664.tlog
CL.write.1.tlog 1KB
23.11.28_mine_sweeping.lastbuildstate 214B
Lib.command.1.tlog 658B
23.11.28_mine_sweeping.write.1u.tlog 1KB
CL.command.1.tlog 2KB
link.command.1.tlog 2KB
link.read.1.tlog 3KB
link.write.1.tlog 1KB
Lib-link.read.1.tlog 868B
Lib-link.write.1.tlog 520B
CL.read.1.tlog 37KB
23.11.28_mine_sweeping.exe.recipe 324B
game.obj 148KB
23.11.28_mine_sweeping.vcxproj.filters 1KB
game.h 1KB
user.c 1KB
23.11.28_mine_sweeping.vcxproj.user 168B
Debug
vc142.idb 403KB
vc142.pdb 100KB
23.11.28_mine_sweeping.ilk 439KB
23.11.28_mine_sweeping.log 286B
user.obj 29KB
23.11.28.f470f664.tlog
CL.write.1.tlog 2KB
23.11.28_mine_sweeping.lastbuildstate 212B
CL.command.1.tlog 2KB
link.command.1.tlog 2KB
link.read.1.tlog 3KB
link.write.1.tlog 878B
CL.read.1.tlog 38KB
23.11.28_mine_sweeping.exe.recipe 322B
game.obj 41KB
game.c 7KB
.vs
23.11.28_mine_sweeping
v16
Browse.VC.db 32.7MB
.suo 42KB
ipch
AutoPCH
8ec2aa8f208066c
GAME.ipch 39.25MB
d9c8cef0db860837
USER.ipch 39.25MB
eb30500942b84bce
GAME.ipch 39.25MB
8ec35a8f208191d
5f7ae48de0795321
USER.ipch 39.31MB
Release
23.11.28_mine_sweeping.pdb 3.83MB
23.11.28_mine_sweeping.lib 289KB
23.11.28_mine_sweeping.exe 131KB
Debug
23.11.28_mine_sweeping.pdb 988KB
23.11.28_mine_sweeping.exe 46KB
23.11.28_mine_sweeping.sln 1KB
共 51 条
- 1
资源评论
蒙奇D索大
- 粉丝: 1738
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功