Easyx-----c++实现经典Windows扫雷

2023-11-03

一些说明

关于扫雷的基本实现,我在这篇博客已经详细介绍Easyx-----c语言实现简易版扫雷_考拉爱睡觉鸭~的博客-CSDN博客

这里不再描述,主要是以c++单例设计模式的方式实现扫雷,多加了右键点击笑脸作弊功能,不会扫雷的小伙伴也可以愉快玩耍了

效果展示

 

 

 

右键点击笑脸作弊,点击左键还原

 

 Common.h         公共的头文件

#pragma once
#include <graphics.h>
#include <iostream>
#include <string>
#include <map>
#include<array>
#include <list>
#include <thread>
#include <vector>
#include <ctime>
#include <mmsystem.h>
#pragma comment(lib,"winmm.lib")
using namespace std;

Res.h        资源文件加载 

#pragma once
#include "Common.h"
class Res
{
private:
	Res();
public:
	static int WIDTH(string name);
	static int HEIGHT(string name);
	static Res* GetInstance();
	static void Draw_IMG(int x, int y, string name);			    //背景图片绘制
	static void DrawIMG(int x, int y, string name,int preIndex);	//其他图片绘制
	static DWORD WINAPI PlayMusic(LPVOID lparame);					//播放音乐
	~Res();
public:
	static map<string, IMAGE*> img;		//图片
	static map<string, string> music;	//音乐
	static int MineNum;					//雷的数量
	static int ROW;						//行|列
	static int COL;
};

Res.cpp

#include "Res.h"
map<string, IMAGE*> Res::img;		//图片
map<string, string> Res::music;	    //音乐
int Res::MineNum = 10;				//雷的数量
int Res::ROW = 9;						    //行|列
int Res::COL = 9;
/*———————————————————————————————————————————

		加载 和 初始化 图片相关内容

————————————————————————————————————————————*/
Res::Res()
{
	//背景
	string background = "./res/background.png";
	//砖块
	string block[2] = { "./res/block/common_block.png","./res/block/press_block.png" };
	//笑脸标识 smile victory  fail error(外挂)
	string face[4] = { "./res/face/smile.png","./res/face/victory.png",
					   "./res/face/fail.png","./res/face/error.png" };
	//地雷 未踩雷 标记雷 踩中雷
	string mine[3] = { "./res/mine/unstep_mine.png","./res/mine/sign_mine.png",
					  "./res/mine/step_mine.png" };
	//标识 旗帜 问号 按压问号
	string sign[3] = { "./res/sign/flag.png","./res/sign/question.png",
					  "./res/sign/press_question.png" };
	//普通数字 1-8
	for (int i = 1; i <= 8; i++) {
		string init = "./res/numbers/";
		string strURL = "0";
		strURL[0] += i;
		strURL += ".png";
		strURL = init + strURL;
		img[to_string(i - 1)] = new IMAGE;		  //img["0"]
		loadimage(img[to_string(i - 1)], strURL.c_str());
	}

	//倒计时数字 0-9
	for (int i = 0; i <= 9; i++) {
		string init = "./res/timeing/";
		string strURY = "0";
		strURY[0] += i;
		strURY += "_1.png";
		strURY = init + strURY;
		img[to_string(i - 0)+"_"] = new IMAGE;		  //img["0_"]
		loadimage(img[to_string(i - 0) + "_"], strURY.c_str());
		//cout << strURL << endl;
	}

		img["背景"] = new IMAGE;
		img["砖块"] = new IMAGE[2];
		img["笑脸"] = new IMAGE[4];
		img["地雷"] = new IMAGE[3];
		img["标识"] = new IMAGE[3];
		loadimage(img["背景"], background.c_str());	//370-250=120 479-320=159
		for (int i = 0; i < 3; i++)
		{
			loadimage(img["地雷"] + i, mine[i].data());
			loadimage(img["标识"] + i, sign[i].data());
		}
		for (int i = 0; i < 4; i++)
		{
			loadimage(img["笑脸"] + i, face[i].data());
		}
		for (int i = 0; i < 2; i++)
		{
			loadimage(img["砖块"] + i, block[i].data());
		}
}
//获取图片的高度
int Res::WIDTH(string name)
{
	return GetInstance()->img[name]->getwidth();
}

int Res::HEIGHT(string name)
{
	return GetInstance()->img[name]->getheight();
}

Res* Res::GetInstance()
{
	static Res* res = new Res;
	return res;
}
//只有一张图片的贴图: 背景图贴图 
void Res::Draw_IMG(int x, int y, string name)
{
	putimage(x, y, GetInstance()->img[name]);
}
void Res::DrawIMG(int x, int y, string name, int preIndex)
{
	putimage(x, y, GetInstance()->img[name] + preIndex);
}
DWORD __stdcall Res::PlayMusic(LPVOID lparame)
{
	return 0;
}

Res::~Res()
{
	delete img["背景"];
	delete[]img["砖块"];
	delete[]img["笑脸"];
	delete[]img["地雷"];
	delete[]img["标识"];
	
}

Data.h        数据的处理

#pragma once
#include"Common.h"
//根据鼠标消息,做数据的改变
class Data {

public:
	void Set();									//设置雷|按键开盖|设置标记
	void constValue(int i, int j, int value);	//设置数据(地图中的值)	限定数据|改变数据
	void changeValue(int i, int j, int value);
	array<array<int, 9>, 9>& getMap();			//在外面画图要访问数据,提供外部访问接口 
							
protected:
	array <array< int, 9 >, 9 > map = {0};
	
};

 Data.cpp

#include "Data.h"
#include "Res.h"             //用到资源
#include"Common.h"
void Data::constValue(int i, int j, int value)
{
	map[i][j] = value;
}

void Data::changeValue(int i, int j, int value)
{
	map[i][j]+= value;
}

void Data::Set()
{
	//设置随机数种子
	srand((unsigned)time(NULL));
	//把map全部初始化为0
	for (int i = 0; i < Res::ROW; i++) 
	{
		for (int j = 0; j < Res::COL; j++)
		{
			 map[i][j] = 0;
			 cout << map[i][j]<<"\t";
		}
		cout << endl;
	}
	cout << endl;
	
	//随机设置十个雷 用-1表示 
	for (int i = 0; i < Res::MineNum; )
	{
		//数组的有效下标 [0,9]
		int r = rand() % Res::ROW;
		int c = rand() % Res::COL;
		//随机下标可能有重复的---需要判断当前位置是否有设置为雷
		if (map[r][c] == 0)
		{
			changeValue(r, c, -1);
			//只有执行了这里的代码,才成功设置了雷 -1 后++
			i++;
		}
	}
	//把以雷为中心的九宫格数据都+1,雷除外
	for (int i = 0; i < Res::ROW; i++)
	{
		for (int k = 0; k < Res::COL; k++)
		{
			//找到雷,并遍历雷所在的九宫格
			if (map[i][k] == -1)
			{
				for (int r = i - 1; r <= i + 1; r++)
				{
					for (int c = k - 1; c <= k + 1; c++)
					{
						//对周围的数据加1,注意要防止出现数组下标为-1的情况(越界)
						if ((r >= 0 && r < Res::ROW && c >= 0 && c < Res::COL) && map[r][c] != -1)
						{
							 changeValue(r, c, 1);//++map[r][c];
						}
					}
				}
			}
		}
	}
	//加密格子 遍历每一个元素,对每一个元素加一个数处理,让它与原来不同,就不会输出原来对应的图片
	for (int i = 0; i <Res::ROW; i++)
	{
		for (int k = 0; k <Res::COL; k++)
		{
			changeValue(i,k,20);    //所有的都需要加密
		}
	}

}
array<array<int, 9>, 9>& Data::getMap()
{
	// TODO: 在此处插入 return 语句
	return map;

}

timeer.hpp        定时器制作

#pragma once
#include "Common.h"
class MyTimer
{
public:
	static bool Timer(int duration, int id)     //时间间隔    id
	{
		static int startTime[10];               //开始时间---静态变量自动初始化为0
		int endTime = clock();                  //结束时间
		if (endTime - startTime[id] >= duration)//结束时间-开始时间>=时间间隔
		{
			startTime[id] = endTime;            //把原来的结束时间改为新的开始时间
			return true;
		}
		return false;
	}
};

button.h        封装按钮

#pragma once
#include "Common.h"
#include"DrawImg.h"
class Data;
/*———————————————————————————————————————————
			   鼠标按键控制
分两种情况: 1.鼠标是游戏控制的按键  2.鼠标是地图变化的按键

————————————————————————————————————————————*/
class Button 
{
public:
	Button(int ImgSize = 24);									//地图变化的按键			
	void ClickButton(ExMessage msg, Data* pData);				/*鼠标操作的事件响应: 鼠标点击...*/
	void boomBlank(Data* pData,int row,int col);				//标记格子和连环炸开空白格子
	int judge(Data* pData, int row, int col);					//游戏结束条件
protected:

//图片的大小
	int ImgSize;
};

button.cpp

#include "button.h"
#include"Common.h"
#include"Res.h"
#include "Data.h"
Button::Button(int ImgSize) {

	this->ImgSize = ImgSize;
	Res::DrawIMG(105, 20, "笑脸", 0);
}

void Button::ClickButton(ExMessage msg, Data* pData)
{
	int r = (msg.x - 16) / ImgSize;	//x
	int c = (msg.y - 84) / ImgSize; //y

//游戏控制的边框
	
	if ((msg.x >= 105 && msg.y >= 20) && (msg.x <= 141 && msg.y <= 56))
	{
		//printf("%d %d\n", msg.x, msg.y);
		if (msg.message == WM_LBUTTONDOWN)		//左键按下还原游戏
		{
			Res::DrawIMG(105, 20, "笑脸", 0);
			for (int i = 0; i < Res::ROW; i++)
			{
				for (int k = 0; k < Res::COL; k++)	
				{
					if (pData->getMap()[i][k] >= -1 && pData->getMap()[i][k] <= 8)	//数字的还原
						pData->changeValue(i, k, 20);

					if(pData->getMap()[i][k] >= 39 && pData->getMap()[i][k] < 59)	//旗子的还原
						pData->changeValue(i, k,-20);

					if (pData->getMap()[i][k] >= 59)								//问号的还原
						pData->changeValue(i, k, -40);
				}
			}
		}
		else if (msg.message == WM_RBUTTONDOWN)		//右键按下开启bug
		{
			Res::DrawIMG(105, 20, "笑脸", 3);
			for (int i = 0; i < Res::ROW; i++)
			{
				for (int k = 0; k < Res::COL; k++)
				{
					if (pData->getMap()[i][k] >= 19 && pData->getMap()[i][k] <= 28)
						pData->changeValue(i, k, -20);
				}
			}
		}
	}
	
	//地图的边框
	if ((msg.x >= 16 && msg.y >= 84) && (msg.x <= 232 && msg.y <= 300))
	{
		//鼠标左键按下,有事件响应,左键打开格子
		if (msg.message == WM_LBUTTONDOWN)
		{
			printf("%d %d\n", msg.x, msg.y);
			printf("%d %d\n", r, c);
			//什么时候能够打开,没有打开的时候就打开(只能点击1次有效数字不会再变化)
			if (pData->getMap()[r][c] >= 19 && pData->getMap()[r][c] <= 28)
			{
				pData->changeValue(r, c, -20);      //map[r][c] -= 20  
				boomBlank(pData, r, c);	//检测一下是不是空白格子,是,炸开,不是直接退出
			}
		}
		//鼠标右键按下,有事件响应,右键标记格子
		else if (msg.message == WM_RBUTTONDOWN)
		{
			//是否能够标记:如果没有打开就能标记
			if (pData->getMap()[r][c] >= 19 && pData->getMap()[r][c] <= 28)
			{
				pData->changeValue(r, c, 20);		//再次加密 map[r][c] += 20
			}
			else if (pData->getMap()[r][c] >= 39 && pData->getMap()[r][c] < 59)
			{
				pData->changeValue(r, c, 20);		//再次点击能够出现问号 再次加密 map[r][c] += 20

			}
			else if (pData->getMap()[r][c] >= 59)	//再次点击能够取消格子 双层解密 map[r][c] -= 20
			{
				pData->changeValue(r, c, -40);
			}
		}
	}
	
}

void Button::boomBlank(Data* pData, int row, int col)
{
	//判断row col位置是不是空白格子(如果不是直接退出)
	if (pData->getMap()[row][col] == 0)
	{
		for (int r = row - 1; r <= row + 1; r++)            //遍历九宫格,是空白直接炸开
		{
			for (int c = col - 1; c <= col + 1; c++)
			{
				if ((r >= 0 && r < Res::ROW && c >= 0 && c < Res::COL)				//没越界
					&& pData->getMap()[r][c] >= 19 && pData->getMap()[r][c] <= 28)	//没有打开
				{
					pData->changeValue(r, c, -20);			 //map[r][c] -= 20
					boomBlank(pData, r, c);					 //继续遍历新的九宫格,继续打开
				}
			}
		}
	}
}
//游戏结束条件 [每点击一次就判断一下] 输了返回 -1  没结束返回 0 赢了返回 1
int Button::judge(Data* pData, int row, int col)
{
	if (!(row >= 0 && col >= 0 && row< Res::ROW && col< Res::COL))
	{
		return 0;
	}
	//点到了雷,结束	输了
	if (pData->getMap()[row][col] == -1 || pData->getMap()[row][col] == 19)    //任何时候都可以判断
	{
		return -1;
	}
	//点完了格子,结束 赢了 点开了81 - 10 = 71 个格子(都点开了)
	int cnt = 0;
	for (int i = 0; i < Res::ROW; i++)
	{
		for (int k = 0; k < Res::COL; k++)
		{
			//统计打开的格子的数量
			if (pData->getMap()[i][k] >= 0 && pData->getMap()[i][k] <= 8)
			{
				++cnt;    //最终有71个
			}
		}
	}
	if (Res::ROW * Res::COL - Res::MineNum == cnt)
	{
		return 1;
	}
	return 0;
}

 DrawImg.h        绘制图片

#pragma once
#include"Common.h"
#include"Data.h"
class Data;
class Draw
{
public:
	Draw();
	void Game_Draw();		//根据数据画图片|数据的处理封装在Game中
	void showData();
	Data* getData() { return pData; }
	int& getTime() { return timeCnt; }
protected:
	Data* pData;			//游戏需要用到数据,包含数据的指针
	int timeCnt = 0;			//秒数变量
};

 DrawImg.cpp 

#include "DrawImg.h"
#include"Res.h"
#include"Data.h"
#include"time.hpp"
Draw::Draw():pData(new Data)
{
	pData->Set();
	//背景
	initgraph(Res::WIDTH("背景"), Res::HEIGHT("背景"), EW_SHOWCONSOLE);
	Res::Draw_IMG(0, 0, "背景");
	Res::Draw_IMG(21, 21, "0_");
	Res::Draw_IMG(21 + 20, 21, "1_");
	Res::Draw_IMG(21 + 20 * 2, 21, "0_");

	Res::Draw_IMG(21 + 20 * 6 + 25, 21, "0_");
	Res::Draw_IMG(21 + 20 * 8 + 4, 21, "0_");
	Res::Draw_IMG(21 + 20 * 9 + 4, 21, "0_");
}
void Draw::showData()
{
	for (int i = 0; i < Res::ROW; i++)
	{
		for (int k = 0; k < Res::COL; k++)
		{
			cout << pData->getMap()[k][i] << "\t";
		}
		cout << endl;
	}
	cout << endl;
}
void Draw::Game_Draw()
{
	int ge=0, shi=0, bai=0;
	if (MyTimer::Timer(1000, 0))
	{
		getTime()++;	//秒数变量的叠加
	}
	
		ge  = getTime() % 10;
		shi = getTime() / 10 % 10;
		bai = getTime() / 100;
//ge
		Res::Draw_IMG(21 + 20 * 9 + 4, 21,to_string(ge) + "_");
//shi
		Res::Draw_IMG(21 + 20 * 8 + 4, 21, to_string(shi) + "_");
//bai
		Res::Draw_IMG(21 + 20 * 6 + 25, 21, to_string(bai) + "_");
	
	for (int i = 0; i < Res::ROW; i++)
	{
		for (int k = 0; k < Res::COL; k++)
		{
			//周围全是雷中间是8---周围没有雷中间是0
			if (pData->getMap()[i][k] >= 0 && pData->getMap()[i][k] <= 8)	//范围[0,8]
			{		
				switch (pData->getMap()[i][k]) {					//0 1 2 3 4 5 6 7 
				case 0:
					Res::DrawIMG(16 + 24 * i, 84 + 24 * k, "砖块",1);	
					break;
				case 1:				
					Res::Draw_IMG(16 + 24 * i, 84 + 24 * k, "0");	//对应数字1
					break;
				case 2:		
					Res::Draw_IMG(16 + 24 * i, 84 + 24 * k, "1");	//对应数字2
					break;		 
				case 3:	
					Res::Draw_IMG(16 + 24 * i, 84 + 24  * k,"2");	//对应数字3
					break;		 
				case 4:			 
					Res::Draw_IMG(16 + 24 * i, 84 + 24 * k, "3");	//对应数字4
					break;		 
				case 5:				
					Res::Draw_IMG(16 + 24 * i, 84 + 24 * k, "4");	//对应数字5
					break;		 
				case 6:				
					Res::Draw_IMG(16 + 24 * i, 84 + 24 * k, "5");	//对应数字6
					break;		
				case 7:				
					Res::Draw_IMG(16 + 24 * i, 84 + 24 * k, "6");	//对应数字7
					break;
				case 8:
					Res::Draw_IMG(16 + 24 * i, 84 + 24 * k, "7");	//对应数字8
					break;
				}
			}
			else if (pData->getMap()[i][k] == -1)
			{
				Res::DrawIMG(16 + 24 * i, 84 + 24 * k, "地雷",0);
			}
			else if (pData->getMap()[i][k] >= 19 && pData->getMap()[i][k] <= 28)  //画盖子---范围判断 最小和最大的
			{
				Res::DrawIMG(16 + 24 * i, 84 + 24 * k, "砖块",0);
			}
			else if (pData->getMap()[i][k] >= 39 && pData->getMap()[i][k] < 59)	 //-1 + 20 + 20
			{
				Res::DrawIMG(16 + 24 * i, 84 + 24 * k,"标识",0); //旗子
			}
			else if (pData->getMap()[i][k] >= 59)
			{
				Res::DrawIMG(16 + 24 * i, 84 + 24 * k, "标识", 1);//问号
			}
		}
	}
}

扫雷.cpp        主函数部分

#include"DrawImg.h"
#include"Data.h"
#include"button.h"
#include"Res.h"
int main()
{
	Draw draw;
	
	Button* pp = new Button();		//按钮
	ExMessage msg;					//定义鼠标消息
	while (true)
	{
		while (peekmessage(&msg, EM_MOUSE))  //获取鼠标消息
		{
			switch (msg.message)
			{
			case WM_LBUTTONDOWN:	         //鼠标左键和右键点击
			case WM_RBUTTONDOWN:
				pp->ClickButton(msg, draw.getData());
				draw.showData();			//显示数据
				int ret=pp->judge(draw.getData(), (msg.x - 16) / 24, (msg.y - 84) / 24);	//每点击一次,判断一次
				printf("judge:%d\n", ret);													//根据返回值判断是赢了还是输了
				if (ret == -1)				//输了,输出哭脸|弹出对话框
				{							//句柄|对话|标题|按钮
					draw.Game_Draw();		//绘制
					Res::DrawIMG(105, 20, "笑脸", 2);
					Res::DrawIMG(16 + 24 * ((msg.x - 16) / 24), 84 + 24 * ((msg.y - 84) / 24), "地雷", 1);
					int select_1=MessageBox(GetHWnd(), "不会吧?初级扫雷都玩不过?敢不敢再来一把?", "c++扫雷",MB_OKCANCEL);		
					//看用户的选择
					if (select_1 == IDOK)	//再来一把
					{
					//重新初始化	
						Res::DrawIMG(105, 20, "笑脸", 0);
						draw.getTime() = 0;
						draw.getData()->Set();
					}
					else					//退出
					{				
						exit(0);
					}
				}
				else if (ret == 1)			//赢了,输出帅脸|弹出对话框
				{
					Res::DrawIMG(105, 20, "笑脸", 1);
					int select_2 = MessageBox(GetHWnd(), "不错哦!要不要再来一把?", "c++扫雷", MB_OKCANCEL);
					if (select_2 == IDOK)	//再来一把
					{
											//重新初始化
						draw.getData()->Set();
						Res::DrawIMG(105, 20, "笑脸", 0);
					}
					else					//退出
					{
						exit(0);
					}
				}
				break;
			}
		}
		draw.Game_Draw();					//绘制
	}
	return 0;
}

部分素材展示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Easyx-----c++实现经典Windows扫雷 的相关文章

  • 为什么相同的代码在同一台计算机上的执行时间可能不同?

    我是 C 编程新手 我编写了代码并希望获得它的运行时 这就是我所做的 每次运行代码时 我都会得到不同的运行时值 这样对吗 或者我的代码有问题吗 int main int argc char argv time t start end sta
  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 启动时出现 OData v4 错误:找不到段“Whatever”的资源

    我正在构建新的 v4 服务 一切进展顺利 直到我为新模型 实体添加了新控制器 并在启动站点进行测试运行时收到此错误 控制器似乎编码正确 就像其他控制器一样 控制器 CustomersOData 中的操作 GetFeed 上的路径模板 Cus
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • PlaySound 可在 Visual Studio 中运行,但不能在独立 exe 中运行

    我正在尝试使用 Visual Studio 在 C 中播放 wav 文件 我将文件 my wav 放入项目目录中并使用代码 PlaySound TEXT my wav NULL SND FILENAME SND SYNC 我按下播放按钮 或
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • .NET中的LinkedList是循环链表吗?

    我需要一个循环链表 所以我想知道是否LinkedList是循环链表吗 每当您想要移动列表中的 下一个 块时 以循环方式使用它的快速解决方案 current current Next current List First 电流在哪里Linke
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 有没有办法强制显示工具提示?

    我有一个验证字段的方法 如果无法验证 该字段将被清除并标记为红色 我还希望在框上方弹出一个工具提示 并向用户显示该值无效的消息 有没有办法做到这一点 并且可以控制工具提示显示的时间 我怎样才能让它自己弹出而不是鼠标悬停时弹出 If the
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable

随机推荐

  • .NET Core使用EF Core框架

    文章目录 概述 安装EF Core 使用EF Core增删改查 单表查询 插入数据 修改数据 删除数据 概述 Entity Framework EF Core 是轻量化 可扩展 开源和跨平台版的常用 Entity Framework 数据访
  • linux的用户和组

    linux是一个多用户 多任务的分时操作系统 windows是一个单用户操作系统 linux系统中的用户类型 1 root 超级管理员 uid 用户ID 0 权限大于Windows中的Administrator 2 系统用户 伪用户 uid
  • panda 修改行名字 报错 Index does not support mutable operations

    在进行panda数据操作 扩充时出现两个tricks 使用data pd append 进行行扩充数据时 行名需要相同 才能实现自动扩充 使用data pd columns 修改行名时 不允许切片操作 只能按照原数据长建立一个列表赋值修改
  • Python从txt文件中逐行读取数据

    非常的简单 提供三种方法 方法一 f open foo txt 返回一个文件对象 line f readline 调用文件的 readline 方法 while line print line 后面跟 将忽略换行符 print line e
  • 如何做好一份前端工程师的简历?

    一 你是前端工程师 虽然简历都会有一些常规信息 但职业决定了这份简历核心内容和求职成败 所以 这份简历应该尽可能体现你自己是一个合格的前端工程师 专业的前端工程师是什么可以看看去年Nate Koechley的演讲 Professional
  • 二叉树相关算法

    二叉树类算法 一 二叉树的路径和 二叉树的每个节点为0 9的一个数字 根到叶子的一条路径拼成一个数 求所有路径形成的数字和 struct TreeNode TreeNode left TreeNode right int value int
  • Ab3d.DXEngine 6.0 Crack 2023

    Ab3d DXEngine 不是另一个游戏引擎 如Unity 它强迫您使用其游戏编辑器 其架构 并且需要许多技巧和窍门才能在标准 Net 应用程序中使用 Ab3d DXEngine 是一个新的渲染引擎 它是从头开始构建的 旨在用于标准桌面
  • 基于yolov5的NEU-NET产品缺陷目标检测

    一 yolov5的使用 1 1 1 YOLOv5的介绍与特点 1 1 2 YOLOv5的基本使用 1 1 3目录结构树 2 二 数据预处理与模型训练 4 2 1 NET NET数据集 4 三 模型评价与分析 8 第一次写 没啥经验 内容的话
  • Spring 自学笔记

    Spring 自学笔记终 前言 Spring全家桶 spring springmvc spring boot spring cloud spring 出现时间2002年左右 解决企业开发难度 作用 减轻对项目模块之间的管理 类和类之间的管理
  • 华为od机考试题-字符串单词首字母转换大小写

    while 1 try nums input split dp f w 0 upper w 1 for w in nums print join dp except Exception as e break
  • 常见哈希算法总结

    目录 哈希算法概述 常见的哈希算法 MD5算法 SHA 1算法 哈希算法的用途 校验下载文件 存储用户密码 Hmac MD5算法 哈希算法概述 哈希算法又称摘要算法 它的作用是 对任意一组输入数据进行计算 得到一个固定长度的输出摘要 哈希算
  • Python编写微信打飞机小游戏(七)

    如果觉得这篇文章对您有所启发 欢迎关注我的公众号 我会尽可能积极和大家交流 谢谢 Python编写微信打飞机小游戏 一 Python编写微信打飞机小游戏 二 Python编写微信打飞机小游戏 三 Python编写微信打飞机小游戏 四 Pyt
  • webpack

    一 是什么 loader 用于对模块的 源代码 进行转换 在 import 或 加载 模块时预处理文件 webpack做的事情 仅仅是分析出各种模块的依赖关系 然后形成资源列表 最终打包生成到指定的文件中 如下图所示 在webpack内部中
  • 保证业务高效运营 专有云虚拟网络是关键

    随着越来越多的企业用户上云 且客户业务场景多种多样的情况下 云计算面临的挑战也越来越多 如企业多 IDC 异地办公区 远程运维人员接入到企业内网需要一致的体验等场景下 还要提供高可靠 安全和易维护的网络能力 我们可以通过组合百度智能云网络模
  • ue4 解决编译保存蓝图时报无法报存资源.uasset错

    当你在打开蓝图时 逻辑没有任何错误 甚至你没有做任何修改 在编译保存时报资源错误 如下图 这时候 你打开任务管理器 在后台进程 你会发现一个在跑的ue进程 结束任务后就可以继续正常的编译保存了
  • 廉价的家用工作站方案:ThinkPad 存储升级及数据迁移

    最近 给当台式服务器一样使用了两年的 ThinkPad 做了存储升级和数据迁移 对硬盘也做了额外的散热处理 本篇文章里 我们分享下相关的经验和思考 希望能够帮助到有同样诉求的你 写在前面 本文的 主角 是一台 7x24 小时使用了两年的 T
  • 【基础篇】关于专栏介绍及ESP32环境搭建(vs code)

    前言 本专栏将会从零到实战的学习ESP32开发 将会持续更新 其中大概包括基础篇 实战篇和提高篇以及一些常见的错误如何解决 一 ESP32介绍 ESP32是 Espressif 开发的一系列低成本 低功耗的片上系统 SoC 微控制器 包括
  • matlab练习程序(模拟退火SA)

    模拟退火首先从某个初始候选解开始 当温度大于0时执行循环 在循环中 通过随机扰动产生一个新的解 然后求得新解和原解之间的能量差 如果差小于0 则采用新解作为当前解 如果差大于0 则采用一个当前温度与能量差成比例的概率来选择是否接受新解 温度
  • 带头结点的头插法和尾插法创建单链表

    首先我们先定义一个链表的结构体 typedef int DataType typedef struct Node DataType data struct Node next SLNode SLnode 定义链表的结构体 因为是带头节点的链
  • Easyx-----c++实现经典Windows扫雷

    一些说明 关于扫雷的基本实现 我在这篇博客已经详细介绍Easyx c语言实现简易版扫雷 考拉爱睡觉鸭 的博客 CSDN博客 这里不再描述 主要是以c 单例设计模式的方式实现扫雷 多加了右键点击笑脸作弊功能 不会扫雷的小伙伴也可以愉快玩耍了