C++ 80行 极简扫雷
一共5346个字符,MinGW编译通过(强烈不建议写这种代码!!!)
压行规则:一行不超过80个字符
代码:
#include<windows.h>
#include<stdio.h>
#include<time.h>
#define turn(x, y) (mapSize.X * (y) + (x))
#define Outside(x,y) (x < 0 || mapSize.X - 1 < x || y < 0 || mapSize.Y - 1 < y)
int *map,*mark,count,bomb,firstOpen,game,bombCount,beginTime,node[8][2] = {1,0,
-1,0,0,1,0,-1,-1,-1,-1,1,1,-1,1,1};
char *num[10] = { " ", "①", "②", "③", "④", "⑤", "⑥", "⑦", "⑧", "●" };
COORD size = { 18, 11 }, origin = { 0, 0 }, mapSize = { 0, 0 }, pos = { 0, 0 };
HANDLE hOut, hIn;INPUT_RECORD Buf;
int *color[10] = { 0, 11, 10, 12, 14, 1, 2, 6, 4, 4 };
void gotoxy(int x,int y){COORD pos;pos.X=x;pos.Y=y;SetConsoleCursorPosition(
hOut,pos);}
void setScreenSize(int l,int c){COORD size={l,c};SMALL_RECT rect={0,0,size.X-1,
size.Y-1};SetConsoleWindowInfo(hOut,1,&rect);SetConsoleScreenBufferSize(hOut,
size);SetConsoleWindowInfo(hOut,1,&rect);}
void hideCursor(){CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(hOut,&
CursorInfo);CursorInfo.bVisible=0;SetConsoleCursorInfo(hOut,&CursorInfo);}
void delay(int t){static clock_t oldtime=0;while(clock()-t<oldtime)Sleep(1);
oldtime=clock();}
void open(int x,int y){if(Outside(x,y))return;if(!mark[turn(x,y)])return;mark[
turn(x,y)]=0;gotoxy(x*2,y);SetConsoleTextAttribute(hOut,color[map[turn(x,y)]]);
printf(num[map[turn(x,y)]]);count--;if(map[turn(x, y)] > 0)return;for(int i=0;i
<8;i++)open(x+node[i][0],y+node[i][1]);}
void sign(int x,int y){if(Outside(x, y))return;int *temp=&mark[turn(x,y)];if(!*
temp)return;gotoxy(x*2,y);if(*temp==1){*temp=2;SetConsoleTextAttribute(hOut,4);
printf("★");bombCount--;}else{*temp=1;SetConsoleTextAttribute(hOut,15);printf(\
"■");bombCount++;}}
void setBomb(int x,int y){for(int i=0,j,k;i<bomb;){j=rand()%mapSize.X,k=rand()%
mapSize.Y;if((-2<x-j&&x-j<2)&&(-2<y-k&&y-k<2))continue;if(map[turn(j,k)]==9)
continue;map[turn(j,k)]=9,i++;for(int i=0,m,n;i<8;i++){m=j+node[i][0],n=k+node[
i][1];if(!Outside(m,n)&&map[turn(m,n)]-9)map[turn(m,n)]++;}}}
void fun(int x,int y){int num=0;for(int i=0,j,k;i<8;i++){j=x+node[i][0],k=y+
node[i][1];if(!Outside(j,k)&&mark[turn(j,k)]==2)num++;}if(map[turn(x,y)]==num){
for(int i=0,j,k;i<8;i++) {j=x+node[i][0],k=y+node[i][1];if(Outside(j,k)||mark[
turn(j,k)]-1)continue;if(open(j,k),map[turn(j,k)]==9)game=0;}}}
int main(){DWORD mode;HANDLE hStdin=GetStdHandle((DWORD)-10);
GetConsoleMode(hStdin,&mode);mode&=~ENABLE_QUICK_EDIT_MODE;
SetConsoleMode(hStdin,mode);int Result,i=0,fps=10;hIn=GetStdHandle((DWORD)-10);
hOut=GetStdHandle((DWORD)-11);hideCursor();back:;setScreenSize(19,11);
FillConsoleOutputCharacter(hOut,' ',(size.X-1)*(size.Y+1),origin,&i);
SetConsoleCursorPosition(hOut,origin);
SetConsoleTextAttribute(hOut,15),printf(" Minesweeper! \n\n");
SetConsoleTextAttribute(hOut,10),printf(" Easy \n");
SetConsoleTextAttribute(hOut,14),printf(" Medium \n");
SetConsoleTextAttribute(hOut,13),printf(" Hard \n");
SetConsoleTextAttribute(hOut,12),printf(" Custom \n\n\n");
SetConsoleTextAttribute(hOut,11),printf(" by:_WndProc");
SetConsoleTextAttribute(hOut,15);for(;;){ReadConsoleInput(hIn,&Buf,1,&Result);
pos=Buf.Event.MouseEvent.dwMousePosition;if(Buf.Event.MouseEvent.dwButtonState)
{if(pos.Y==2)mapSize.X=mapSize.Y=9,bomb=10;else if(pos.Y==3)mapSize.X=mapSize.Y
=16,bomb=40;else if(pos.Y==4)mapSize.X=30,mapSize.Y=16,bomb=99;else if(pos.Y==5
){gotoxy(0,6);printf("input:");scanf_s("%d,%d,%d",&mapSize.X,&mapSize.Y,&bomb);
num[0]=" ";}else continue;break;}if(GetAsyncKeyState(32)&0x8000)exit(0);}
size.X=mapSize.X*2,size.Y=mapSize.Y+2;setScreenSize(size.X,size.Y);Sleep(100);
FlushConsoleInputBuffer(hIn);restart:;srand((unsigned)time(0));if(map)free(map
);if(mark)free(mark);map=(int*)calloc(mapSize.X*mapSize.Y,sizeof(int));mark=(
int*)calloc(mapSize.X*mapSize.Y,sizeof(int));count=mapSize.X*mapSize.Y,
bombCount=bomb;firstOpen=1,game=1,beginTime=clock();SetConsoleTextAttribute(
hOut,15);SetConsoleCursorPosition(hOut,origin);for(i=0;i<mapSize.X*mapSize.Y;
i++)printf("■");for(i=0;i<mapSize.X*mapSize.Y;i++)mark[i]=1;gotoxy(mapSize.X*2-
7,mapSize.Y);printf("restart");gotoxy(mapSize.X*2-5,mapSize.Y+1);printf("back"
);for(;;){if(GetNumberOfConsoleInputEvents(hIn,&i));if(i){while(i--){
ReadConsoleInput(hIn,&Buf,1,&Result);pos=Buf.Event.MouseEvent.dwMousePosition;
if(Buf.Event.MouseEvent.dwButtonState){pos.X=pos.X/2;switch(
Buf.Event.MouseEvent.dwButtonState){case FROM_LEFT_1ST_BUTTON_PRESSED:if(
firstOpen)setBomb(pos.X,pos.Y),firstOpen=0;open(pos.X,pos.Y);if(map[turn(pos.X,
pos.Y)]==9)game=0;if(pos.Y==mapSize.Y)goto restart;if(pos.Y==mapSize.Y+1)
goto back;break;case RIGHTMOST_BUTTON_PRESSED:if(!Outside(pos.X,pos.Y))sign(
pos.X,pos.Y);break;case FROM_LEFT_2ND_BUTTON_PRESSED:if(!Outside(pos.X,pos.Y))
fun(pos.X,pos.Y);break;}}}}gotoxy(0,mapSize.Y);SetConsoleTextAttribute(hOut,1);
if(count<=bomb&&printf("\nyou win! "))break;if(!game){
printf("\nGame over! ");SetConsoleTextAttribute(hOut,4);for(i=0;i<mapSize.X*
mapSize.Y;i++)if(map[i]==9&&mark[i]){gotoxy(i%mapSize.X*2,i/mapSize.X);printf(
"●");}break;}SetConsoleTextAttribute(hOut,15);printf("time:%-5d\nresidue:%-5d",
(clock()-beginTime)/1000,bombCount);delay(1000/fps);}for(;;){ReadConsoleInput(
hIn,&Buf,1,&Result);pos=Buf.Event.MouseEvent.dwMousePosition;
if(Buf.Event.MouseEvent.dwButtonState){if(pos.Y==mapSize.Y)goto restart;if(
pos.Y==mapSize.Y+1)goto back;}if(GetAsyncKeyState(32)&0x8000)break;
Sleep(1000/fps);}}
运行结果:



相关文章:
C++ 80行 极简扫雷
一共5346个字符,MinGW编译通过(强烈不建议写这种代码!!!) 压行规则:一行不超过80个字符 代码: #include<windows.h> #include<stdio.h> #include<time.h> #def…...
常见VPS服务器附加组件一览
网络主机行业竞争非常激烈,因此主机服务提供商竭尽全力为客户提供完整的解决方案,其中包含构建和管理在线项目所需的一切。但客户通常有特定需求,因此需要不同的附加组件。在管理自己的网络服务器时尤其如此。 今天,我们将介绍您…...
Electron 使用Electron-build 进行打包
看完下面两篇就可以完成! 基于vue3vite的web项目改为Electron桌面应用(一)_vue3转electron-CSDN博客 将web项目打包成electron桌面端教程(二)vue3vitets_vue3 打包桌面端-CSDN博客 打包报错 1. 首先确定依赖包 npm …...
Springboot+Websocket+Security+Vue 实现弹幕推送功能
后端部分 (Spring Boot) 1. 创建一个 Spring Boot 项目 创建一个新的 Spring Boot 项目并添加以下依赖: <dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId…...
LangChain之网络爬虫
网络爬虫 概述 网络爬虫是LangChain中的一项关键功能,允许用户自动从互联网上收集信息。这项功能对于研究和数据收集尤其有价值,因为它可以大幅减少手动搜索和信息整理的工作量。 从网络收集内容有几个主要组件: Search搜索:使用…...
VueRouter 相关信息
VueRouter 是Vue.js官方路由插件,与Vue.js深度集成,用于构建单页面应用。构建的单页面是基于路由和组件,路由设定访问路径,将路径与组件进行映射。VueRouter有两中模式 :hash 和 history ,默认是hash模式。…...
[环境配置]Pycharm:Failed to start [PowerShell.exe]
解决方法,点Local旁边的 号,点击Command Prompt,即可在Pycharm中呼出控制台。 如果要修改Command Prompt的启动时访问的cmd.exe的路径,可以去Settings→Tools→Terminal中,修改Shell Path实现,改为cmd.exe…...
搜狗爬虫(www.sogou.com)IP及UA,真实采集数据
一、数据来源: 1、这批搜狗爬虫(www.sogou.com)IP来源于尚贤达猎头网站采集数据; 2、数据采集时间段:2023年10月-2024年7月; 3、判断标准:主要根据用户代理是否包含“www.sogou.com”和IP核实…...
北京青蓝智慧科技ITSS服务经理:长安链ChainBridge“链桥”问世 加速国家级区块链网络互联互通
8月5日,据国家区块链技术创新中心消息,我国首个完全自主控制的区块链软硬件技术系统——长安链,正式推出了全场景技术平台ChainBridge“链桥”。 此平台能够支持所有异构和同构的区块链进行协作,满足跨领域、跨地域、跨行业及跨层…...
音视频入门基础:WAV专题(5)——FFmpeg源码中解码WAV Header的实现
音视频入门基础:WAV专题系列文章: 音视频入门基础:WAV专题(1)——使用FFmpeg命令生成WAV音频文件 音视频入门基础:WAV专题(2)——WAV格式简介 音视频入门基础:WAV专题…...
爬虫:csv存储:写入和读取
目录 csv写入 csv读取 csv写入 import csv# data [ # (tf, 20, 180), # (dl, 20, 170), # (hc, 18, 190) # ] # header (姓名,年龄,身高) # # # csv写入数据会默认写一行隔一行 newline就是让它不要有空行 # with open(text.csv,w,encodingutf8,newline) as f:…...
Opencv-绘制几何图形
1. 绘制圆形 1.1 circle()函数原型 void cv::circle(InputOutputArray img, Point center, int radius, const Scalar & color, int thickness 1, int lineType LINE_8, int shift 0 ) img:需要绘制圆形的图像。 center:圆形的圆心位置坐标。 …...
ElasticSearch安装与集群部署
ElasticSearch安装与集群部署 很多小伙伴第一次接触ElasticSearch的时候是一脸愁容,这个东西他怎么用啊,不知道从哪里安装,那我们今天就着重从哪里下载?怎么下载?怎么安装?来研究一下吧! windows下载安装ElasticSearch 下载地址:https://www.elastic.co/cn/do…...
盘点12款企业常用源代码加密软件,源代码防泄密很重要!
在当今的商业环境中,源代码作为企业的核心资产之一,其安全性不容忽视。源代码的泄露可能导致企业丧失竞争优势、面临法律诉讼甚至经济损失。因此,选择合适的源代码加密软件成为企业保护知识产权和核心技术的关键步骤。 1. 安秉源代码加密软件…...
文件上传和下载
要想实现文件上传和下载,其实只需要下述代码即可: 文件上传和下载 import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import com.example.common.Result; import org.springframework.web.bind.annotation.*; import org.sprin…...
机械学习—零基础学习日志(高数22——泰勒公式理解深化)
核心思想:函数逼近 在泰勒的年代,如果想算出e的0.001次方,这是很难计算的。那为了能计算这样的数字,可以尝试逼近的思想。 但是函数又不能所有地方都相等,那退而求其次,只要在一个极小的范围,…...
Java | Leetcode Java题解之第318题最大单词长度乘积
题目: 题解: class Solution {public int maxProduct(String[] words) {Map<Integer, Integer> map new HashMap<Integer, Integer>();int length words.length;for (int i 0; i < length; i) {int mask 0;String word words[i];in…...
科普文:JUC系列之多线程门闩同步器Condition的使用和源码解读
一、概述 条件锁就是指在获取锁之后发现当前业务场景自己无法处理,而需要等待某个条件的出现才可以继续处理时使用的一种锁。 比如,在阻塞队列中,当队列中没有元素的时候是无法弹出一个元素的,这时候就需要阻塞在条件notEmpty上…...
Stable Diffusion绘画 | 图生图-基础使用介绍—提示词反推
按默认设置直接出图 拖入图片值图生图框中,保持默认设置,直接生成图片,出图效果如下: 因为重绘幅度0.7,所出图片与原图有差异,但整体的框架构图与颜色与原图类似。 输入关键词后出图 在正向提示词中输入…...
正点原子imx6ull-mini-Linux驱动之Linux SPI 驱动实验(22)
跟上一章一样,其实这些设备驱动,无非就是传感器对应寄存器的读写。而这个读写是建立在各种通信协议上的,比如上一章的i2c,我们做了什么呢,就是把设备注册成一个i2c平台驱动,这个i2c驱动怎么搞的呢ÿ…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
