当前位置:网站首页>一篇文章教你写扫雷(c语言基础版)
一篇文章教你写扫雷(c语言基础版)
2022-08-03 05:30:00 【张遇桥】
一.思路和分析
1.建立数组来保存棋子
2.初始化棋盘
3.打印棋盘
4.随机放置雷
5.玩家排雷
6.计算该位置周围雷的个数
7.递归拓展已选位置周围的区域
二.代码实现
1.game.h
2.game.c
3.test.c
第一部分 game.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 easy_system 10//给的最小雷数量
//初始化棋盘
void initialization_board(char arr[ROWS][COLS], int row, int col, int set);
//打印棋盘
void show_board(char show[ROWS][COLS], int row, int col);
//放置雷
void set_mine(char mine[ROWS][COLS], int row, int col);
//排查雷
void check_mine(char ine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
```c
#include "game.h"
//初始化棋盘
void initialization_board(char arr[ROWS][COLS], int row, int col, int set)
{
int i = 0;
int j = 0;
for (i = 0;i <=row; i++)
{
for (j = 0;j <=col;j++)
{
arr[i][j] = set;
}
}
}
void show_board(char show[ROWS][COLS], int row, int col)
{
{
int i = 0;
int j = 0;
//打印列号
for (i = 0; i < col-1; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i < row-1; i++)
{
printf("%d ", i); //打印行号
for (j = 1; j < col; j++)
{
printf("%c ", show[i][j]);
}
printf("\n"); //打印完一行需要换行
}
}
}
void set_mine(char mine[ROWS][COLS], int row, int col)
{
int count = easy_system;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = 1 + '0';
count--;
}
}
}
int nearby_number(char mine[ROWS][COLS], int x, int y)
{
return mine[x - 1][y] +
mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x][y + 1] +
mine[x - 1][y + 1] - (8 * '0');//周围有8格所以乘8个'0'
}
//递归拓展已选位置周围的区域
void boom_broad(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
//判断坐标是否越界
if (x == 0 || y == 0 || x == ROWS - 1 || y == COLS - 1)
return;
//判断是否已经被排除
if (show[x][y] != '*')
{
return;
}
int count = nearby_number(mine, x, y);
if (count > 0)
{
show[x][y] = count + '0';
return;
}
//递归拓展地图
else if (count == 0)
{
show[x][y] = '0';
boom_broad(mine, show, x - 1, y);
boom_broad(mine, show, x - 1, y - 1);
boom_broad(mine, show, x, y - 1);
boom_broad(mine, show, x + 1, y - 1);
boom_broad(mine, show, x + 1, y);
boom_broad(mine, show, x + 1, y + 1);
boom_broad(mine, show, x, y + 1);
boom_broad(mine, show, x - 1, y + 1);
}
}
第二部分 game.c
void check_mine(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 - easy_system)
{
printf("请输入坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("爆炸了!!");
printf("游戏失败!\n");
show[x][y] = '#';
show_board(show, ROWS, COLS);
break;
}
else
{
boom_broad(mine, show, x, y);
show[x][y] = nearby_number(mine, x, y) + '0';
show_board(show, ROWS, COLS);
count++;
}
}
else
{
printf("坐标输入错误,请重新输入!\n");
}
}
if (count == row * col - easy_system)
{
printf("恭喜你,你成功了,剩下的都是雷\n");
show_board(mine, row, col);//赢了打印雷在哪里
}
}
第三部分 test.h
#include "game.h"
void menu()//菜单
{
printf("************************\n");
printf("******* 1.play *******\n");
printf("******* 0.exit *******\n");
printf("************************\n");
}
void game()
{
srand((unsigned int)time(NULL));
//扫雷的实现
//定义含雷数组,来存放布置好的雷的信息
char mine[ROWS][COLS] = {
0 };
//用来存放排查出的雷的信息
char show[ROWS][COLS] = {
0 };
//初始化棋盘
initialization_board(mine, ROW, COL, '0');
initialization_board(show, ROW, COL, '*');
//打印棋盘
/*show_board(show, ROWS, COLS);*/
//放置雷
set_mine(mine, ROW, COL);
show_board(show, ROWS, COLS);
//排查雷
check_mine(mine, show, ROW, COL);
}
int main()
{
int change = 0;
do
{
menu();//菜单
printf("请输入选择:");
scanf("%d", &change);
switch (change)
{
case 1:
printf("扫雷游戏\n");
game();
break;
case 0:
break;
default:
printf("输入错误,重新输入\n");
}
} while (change);
return 0;
}
今天下午为温习日,把之前的知识点看了一遍,顺便把扫雷这个项目重新写两遍,比之前好些了,流畅点了,加油,今晚学点新知识点,就这样吃饭去了。
边栏推荐
- 【入职第一篇知识总结- Prometheus】
- MySQL master-slave replication
- MySQL的 DDL和DML和DQL的基本语法
- AutoInt网络详解及pytorch复现
- 【DIoU CIoU】DIoU和CIoU损失函数理解及代码实现
- HDI与普通PCB的4点主要区别
- MySQL中,对结果或条件进行字符串拼接
- UniApp scroll-view 事件不生效(@scroll、@scrolltolower、@scrolltoupper ...)
- el-tree设置选中高亮焦点高亮、选中的节点加深背景,更改字体颜色等
- ES 中时间日期类型 “yyyy-MM-dd HHmmss” 的完全避坑指南
猜你喜欢
随机推荐
MySql之json_extract函数处理json字段
ES6 - 剩余参数,Array的扩展方法,String的扩展方法
C#操作FTP上传文件后检查上传正确性
AQS、CAS、Synchronized小理解
2021-06-15
国内首款PCB资料分析软件,华秋DFM使用介绍
零代码工具拖拽流程图
在Zabbix5.4上使用ODBC监控Oracle数据库
Chrome插件开发入门
MySQL的Replace用法详解
2021-06-14
【GIoU loss】GIoU loss损失函数理解
TFS (Azure conversation) prohibit people checked out at the same time
Oracle 11g silent install
MySql的安装配置超详细教程与简单的建库建表方法
单节点部署 gpmall 商城系统(二)
Monitoring Oracle11gR2 in Zabbix6.0 of OracleLinux8.6
MySQL之concat的用法
MySQL 操作语句大全(详细)
【EA Price strategy OC1】以实时价格为依据的EA,首月翻仓!】









