扫雷代码优化(第一次踩雷不退出并且当前坐标的周围坐标没有雷时展开)

本文主要是介绍扫雷代码优化(第一次踩雷不退出并且当前坐标的周围坐标没有雷时展开),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

分析
第一次循环不退出就是把第一次单独拿出来,之后循环次数再减一
而展开就是使用之前的Sum()函数将周围坐标雷的个数计算出来然后展示。这个部分我们再定义一个函数ShowMoreMine()来实现。
接下来继续看代码
test.h

#ifndef _TEST_
#define _TEST_
#include<stdio.h>
#include<windows.h>
#include<time.h>
#include<string.h>
#define ROW 12
#define COL 12
#define MINENUM 20
#pragma  warning(disable:4996)void Game();void SetMine(char mine[][COL], int row, int col);void ShowBoard(char show[][COL], int row, int col);char Sum(char mine[][COL], int row, int col);int GetRandom(int start, int end);void ShowMoreMine(char show[][COL], char mine[][COL], int x,int y);            //多声明一个函数#endif

main.c(没有变化)

#include "test.h"
void Menu()
{printf("********************************\n");printf("******1. play    2.exit   ******\n");printf("********************************\n");}int main()
{int select = 0;int quit = 0;while (!quit){Menu();printf("please enter your choose");scanf("%d", &select);switch (select){case(1) :Game();break;case(2):printf("bye bye");quit = 1;break;default:printf("what you enter is wrong ,please enter again!");break;}}system("pause");getchar();return 0;}

test.c

#include "test.h"
int GetRandom(int start,int end){return rand() % (end - start + 1) + start;
}
void SetMine(char mine[][COL], int row, int col)
{srand((unsigned long)time(NULL));int count = 0;while (count <= MINENUM){int x = GetRandom(1, 10);int y = GetRandom(1, 10);if (mine[x][y] == '0'){mine[x][y] = '1';count++;}}}
void ShowBoard(char show[][COL], int row, int col)
{printf("   ");int i = 1;for (i=1; i <= 10; i++){printf("%6d", i);}printf("\n--------------------------------------------------------------\n");for (i = 1; i <= 10; i++){printf("%3d|", i);int j = 1;for (j = 1; j <= 10; j++)printf("  %c | ", show[i][j]);printf("\n");printf("---------------------------------------------------------------\n");}}
char Sum(char mine[][COL], int row, int col)
{return mine[row - 1][col - 1] + mine[row - 1][col] + mine[row - 1][col + 1] + mine[row][col - 1] \+mine[row][col + 1] + mine[row + 1][col - 1] + mine[row + 1][col] + mine[row + 1][col + 1] - 7 * '0' ;
}
**void ShowMoreMine(char show[][COL], char mine[][COL], int row, int col)
{if (mine[row - 1][col - 1] == '0'){show[row - 1][col - 1] = Sum(mine, row - 1, col - 1);}if (mine[row - 1][col] == '0'){show[row - 1][col] = Sum(mine, row - 1, col );}if (mine[row - 1][col + 1] == '0'){show[row - 1][col + 1] = Sum(mine, row - 1, col + 1);}if (mine[row][col - 1] == '0'){show[row][col - 1] = Sum(mine, row , col - 1);}if(mine[row][col + 1] == '0'){show[row][col + 1] = Sum(mine, row , col + 1);}if(mine[row + 1][col - 1] == '0'){show[row + 1][col - 1] = Sum(mine, row + 1, col - 1);}if (mine[row + 1][col] == '0'){show[row + 1][col] = Sum(mine, row +1, col );}if (mine[row + 1][col + 1] == '0'){show[row + 1][col + 1] = Sum(mine, row + 1, col +1);}}**          //    将周围坐标展开void Game()
{char mine[ROW][COL];char show[ROW][COL];memset(mine, '0', sizeof(mine));memset(show, '*', sizeof(show));SetMine(mine, ROW, COL);int x = 0;int y = 0;int count = 80;int n=0;//         判断扫雷时的循环次数**while (1){printf("please enter what you choose first:");scanf("%d %d", &x, &y);if (x >= 1 && x <= ROW - 2 && y <= COL - 2 && y >= 1){if (mine[x][y] == '1'){show[x][y] = '#';printf("you meet mine first ,please follow me!\n");      //第一次踩雷将雷展示为#break;}else{char number = Sum(mine, x, y);show[x][y] = number;n=1;  //标志第一次没有踩雷printf("what you choose is right,keep going!\n");break;}}else{printf("what you enter is wrong ,please enter again\n");}}**while (1){ShowBoard(show, ROW, COL);printf("please enter what you choose:");scanf("%d %d", &x, &y);if (x >= 1 && x <= ROW-2 && y <= COL-2 &&y >= 1){if (mine[x][y] =='1'){printf("you  fail");break;}else{char num = Sum(mine, x, y);show[x][y] = num;if (num == '0'){ShowMoreMine(show, mine, x, y);}count--;if (n == 1)              //如果n=1,表示第一次没有踩雷,循环次数减一{if (count < 0){printf("you win");break;}}else{if (count <= 0)         //  否则第一次踩雷,循环次数不减一{printf("you win");break;}}}}else{printf("what you enter is wrong ,please enter again");}}
}

这篇关于扫雷代码优化(第一次踩雷不退出并且当前坐标的周围坐标没有雷时展开)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/471143

相关文章

创建springBoot模块没有目录结构的解决方案

《创建springBoot模块没有目录结构的解决方案》2023版IntelliJIDEA创建模块时可能出现目录结构识别错误,导致文件显示异常,解决方法为选择模块后点击确认,重新校准项目结构设置,确保源... 目录创建spChina编程ringBoot模块没有目录结构解决方案总结创建springBoot模块没有目录

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介