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

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

分析
第一次循环不退出就是把第一次单独拿出来,之后循环次数再减一
而展开就是使用之前的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

相关文章

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

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

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

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

mysql如何查看当前连接数

《mysql如何查看当前连接数》:本文主要介绍mysql如何查看当前连接数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql查看当前连接数查看mysql数据库允许最大连接数总结mysql查看当前连接数查看当前连接数SHOW STATUS LIKE

python展开嵌套列表的多种方法

《python展开嵌套列表的多种方法》本文主要介绍了python展开嵌套列表的多种方法,包括for循环、列表推导式和sum函数三种方法,具有一定的参考价值,感兴趣的可以了解一下... 目录一、嵌套列表格式二、嵌套列表展开方法(一)for循环(1)for循环+append()(2)for循环+pyPhWiFd

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

Java实现Elasticsearch查询当前索引全部数据的完整代码

《Java实现Elasticsearch查询当前索引全部数据的完整代码》:本文主要介绍如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scrol... 目录需求背景通常情况Java 实现查询 Elasticsearch 全部数据写在最后需求背景通常情况下

电脑没有仿宋GB2312字体怎么办? 仿宋GB2312字体下载安装及调出来的教程

《电脑没有仿宋GB2312字体怎么办?仿宋GB2312字体下载安装及调出来的教程》仿宋字体gb2312作为一种经典且常用的字体,广泛应用于各种场合,如何在计算机中调出仿宋字体gb2312?本文将为您... 仿宋_GB2312是公文标准字体之一,仿China编程宋是字体名称,GB2312是字php符编码标准名称(简

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

豆包 MarsCode 不允许你还没有女朋友

在这个喧嚣的世界里,爱意需要被温柔地唤醒。为心爱的她制作每日一句小工具,就像是一场永不落幕的浪漫仪式,每天都在她的心田播撒爱的种子,让她的每一天都充满甜蜜与期待。 背景 在这个瞬息万变的时代,我们都在寻找那些能让我们慢下来,感受生活美好的瞬间。为了让这份浪漫持久而深刻,我们决定为女朋友定制一个每日一句小工具。这个工具会在她意想不到的时刻,为她呈现一句充满爱意的话语,让她的每一天都充满惊喜和感动