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

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

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

相关文章

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

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

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

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

hihocoder1114 小Hi小Ho的惊天大作战:扫雷·一

1114 : 小Hi小Ho的惊天大作战:扫雷·一 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 故事背景:密室、监视器与充满危机的广场 “我们还是循序渐进,先来考虑这样一个简单化问题:”小Hi思索片刻,道:“在一个大小为2*N的广场,其中第一行里的某一些格子里可能会有至多一个地雷,而第二行的格子里全都为数字,表示第一行中距离与这个格子不超过2的格子里总共有多少个

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

批处理以当前时间为文件名创建文件

批处理以当前时间为文件名创建文件 批处理创建空文件 有时候,需要创建以当前时间命名的文件,手动输入当然可以,但是有更省心的方法吗? 假设我是 windows 操作系统,打开命令行。 输入以下命令试试: echo %date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2% 输出类似: 2019_06

Weex入门教程之4,获取当前全局环境变量和配置信息(屏幕高度、宽度等)

$getConfig() 获取当前全局环境变量和配置信息。 Returns: config (object): 配置对象;bundleUrl (string): bundle 的 url;debug (boolean): 是否是调试模式;env (object): 环境对象; weexVersion (string): Weex sdk 版本;appName (string): 应用名字;

Linux 删除 当前下的 mysql-8.0.31 空文件夹

在Linux中,如果你想要删除当前目录下的名为mysql-8.0.31的空文件夹(即该文件夹内没有任何文件或子文件夹),你可以使用rmdir命令。但是,如果mysql-8.0.31文件夹并非完全为空(即它包含文件或子文件夹),rmdir命令会失败。 如果你的目标是删除mysql-8.0.31文件夹及其内部的所有内容(无论是否为空),你应该使用rm命令结合-r(或-R,它们是等价的)选项来递归地删

安装SQL2005后SQL Server Management Studio 没有出来的解决方案

一种情况,在安装 sqlServer2005 时 居然出现两个警告: 1 Com+ 目录要求 2 Edition change check 郁闷!网上说出现两个警告,是肯定装不成功的!我抱着侥幸的态度试了下,成功了。 安装成功后,正准备 “ 仅工具、联机丛书和示例(T)” 但是安装不了,他提示我“工作站组件”安装过了对现有组件无法更新或升级。 解决办法: 1 打开“控

SW - 引入第三方dwg图纸后,修改坐标原点

文章目录 SW - 引入第三方dwg图纸后,修改坐标原点概述笔记设置图纸新原点END SW - 引入第三方dwg图纸后,修改坐标原点 概述 在solidworks中引入第三方的dwg格式图纸后,坐标原点大概率都不合适。 全图自动缩放后,引入的图纸离默认的原点位置差很多。 需要自己重新设置原点位置,才能自动缩放后,在工作区中间显示引入的图纸。 笔记 将dwg图纸拖到SW中

C++中第一次听到构造函数

在C++中第一次听到构造函数这个名词,在C#中又遇到了。   在创建某个类时,由于对该对象的状态(数据)不是很明确,因此需要对其进行初始化。比如说我们要在长方形这个类中创建一个对象,或者说新建一个长方形,那么我们首先要确定他的长和宽,假如我们无法确定它的长和宽,那么我们是无法造出一个长方形来的。所以就要使用这个长方形类中一个用来构造该类所有对象的函数--构造函数。由于该函数要在创建一个新对象