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

环境要求:

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 < COLUMNif (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.mzph.cn/news/122049.shtml

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

相关文章

ROS笔记之visualization_msgs-Marker学习

ROS笔记之visualization_msgs-Marker学习 code review! 文章目录 ROS笔记之visualization_msgs-Marker学习一.line_strip例程二.line_list例程一二.line_list例程二二.TEXT_VIEW_FACING例程三.附CMakeLists.txt和package.xml五.关于odom、base_link和map坐标系六.关于visualiz…

TCP / UDP 概念 + 实验(计网自顶向下)

Github源码 moranzcw/Computer-Networking-A-Top-Down-Approach-NOTES: 《计算机网络&#xff0d;自顶向下方法(原书第6版)》编程作业&#xff0c;Wireshark实验文档的翻译和解答。 (github.com) 暂定打算分2步走&#xff0c;前置是中科大对应计网黑书的视频 第1步完成14个Wire…

设置Ubuntu 20.04的静态IP地址(wifi模式下)

一、引言 自己家用的Ubuntu的&#xff0c;重启后ip地址经常会改变&#xff0c;这个时候就需要我们手动配置静态IP了。 二、优点 给Ubuntu设置一个静态IP地址有以下几个好处&#xff1a; 持久性&#xff1a;静态IP地址是固定不变的&#xff0c;与设备的MAC地址绑定。这意味着…

【广州华锐视点】VR飞行员驾驶模拟实训系统

VR飞行员驾驶模拟实训系统是一种基于虚拟现实技术的航空装备仿真测试技术&#xff0c;可以用于飞行员、乘务员和机务人员的训练。该系统可以模拟真实的飞行环境&#xff0c;包括天气、地形、飞机性能等&#xff0c;使被试者能够在虚拟环境中进行飞行操作&#xff0c;从而提高其…

SSH安全登录远程主机

SSH服务器简介 SSH即Security SHell的意思&#xff0c;它可以将连线的封包进行加密技术&#xff0c;之后进行传输&#xff0c;因此相当的安全。 SSH是一种协议标准&#xff0c;其目的是实现安全远程登录以及其它安全网络服务。 SSH协定&#xff0c;在预设的状态下&#xff0c;…

11月14号|Move生态Meetup相约浪漫土耳其

Move是基于Rust编程语言&#xff0c;由Mysten Labs联合创始人兼CTO Sam Blackshear在Meta的Libra项目中开发而来&#xff0c;旨在为开发者提供比现有区块链语言更通用的开发语言。Sam的目标是创建Web3的JavaScript&#xff0c;即一种跨平台语言&#xff0c;使开发人员能够在多个…

C++设计模式_17_Mediator 中介者

Mediator 中介者也是属于“接口隔离”模式。 文章目录 1. 动机 (Motivation)2. 模式定义3. 结构(Structure)4. 要点总结5. 其他参考 1. 动机 (Motivation) 在软件构建过程中&#xff0c;经常会出现多个对象互相关联交互的情况&#xff0c;对象之间常常会维持一种复杂的引用关系…

HCIA数据通信——基础设备配置

想了想&#xff0c;为了方便回顾复习&#xff0c;将理论和实践结合起来才是正确的&#xff0c;不然一边理论&#xff0c;又单独做实验这样不方便。 因此之前的文章都删了&#xff0c;还是以华为从头开始吧&#xff01;实验与理论应用结合起来做。 一&#xff0c;查看设备信息 …

解密Kubernetes:探索开源容器编排工具的内核

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【人脸检测 FPS 1000+】ubuntu下libfacedetection tensorrt部署

TensorRT系列之 Windows10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速…

《SpringBoot项目实战》第一篇—接口参数的一些弯弯绕绕

系列文章导航 第一篇—接口参数的一些弯弯绕绕 第二篇—接口用户上下文的设计与实现 第三篇—留下用户调用接口的痕迹 第四篇—接口的权限控制 第五篇—接口发生异常如何统一处理 本文参考项目源码地址&#xff1a;summo-springboot-interface-demo 前言 大家好&#xff01;…

Notepad++安装插件和配置快捷键

Notepad是一款轻量级、开源的文件编辑工具&#xff0c;可以编辑、浏览文本文件、二进制文件、.cpp、.java、*.cs等文件。Notepad每隔1个月&#xff0c;就有一个新版本&#xff0c;其官网是&#xff1a; https://github.com/notepad-plus-plus/notepad-plus-plus。这里介绍其插件…

Harmony 个人中心(页面交互、跳转、导航、容器组件)

个人中心 前言正文一、创建工程二、登录① 更换启动页面② 拓展修饰符③ 页面跳转④ 等待进度条 三、导航栏四、首页① 轮播图② 网格列表 五、我的① 带参数跳转 六、源码 前言 今天是1024&#xff0c;祝各位程序员们&#xff0c;钱多事少离家近&#xff0c;不秃也强bug黄。在…

mac系统u盘启动盘制作教程,更新至macOS Sonoma 14

mac系统怎么制作装系统的u盘,如果您要在多台电脑上安装 macOS&#xff0c;而又不想每次都下载安装器&#xff0c;这时可引导安装器就会很有用。一起来看苹果电脑u盘启动盘制作教程吧。 Macos系统安装包合集包揽macos 10.15&#xff0c;macos 11和苹果最新系统等多个版本 1、A…

H5游戏分享-全民找房祖名qmxzfzm

H5游戏分享-全民找房祖名qmxzfzm 一开始就比较简单 后面就会越来越难&#xff0c;而且也有时间限制 游戏的源码 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,ini…

嵌入式实时操作系统的设计与开发(消息)

消息 从概念上讲&#xff0c;消息机制和邮箱机制很类似&#xff0c;区别在于邮箱一般只能容纳一条消息&#xff0c;而消息则会包含一系列的消息。 系统定义了一个全局变量g_msgctr_header&#xff0c;通过它可以查找到任一已创建的消息容器。 每一个消息容器都可以根据其参数…

C++之左值、右值、std::forward、std::move总结(二百五十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Android Studio 导出 jar

AS版本&#xff1a;Android Studio Giraffe | 2022.3.1 Patch 1 1、File——New Module——Android Library 2、mylibrary——main——新建功能类 3、mylibrary——build.gradle——android {}内复制以下代码——Sync Now //Copy类型 tasks.register(makeJar, Copy) { //删…

react-高阶组件

一、什么是高阶组件 高阶组件&#xff08; Higher-Order Component&#xff0c;HOC &#xff09;是一个以组件作为参数&#xff0c;返回一个新组件的函数。 高阶组件最大的特点就是复用组件逻辑高阶组件本身并不是 React 的 API&#xff0c;而是React组件的一种设计模式&…

自动驾驶,从“宠儿”走进“淘汰赛”

从“一步到位”到场景、技术降维。从拼落地路径&#xff0c;到拼雷达、算力&#xff0c;再到如今的性价比之争&#xff0c;自动驾驶似乎变得愈发“接地气”。 作者|斗斗 编辑|皮爷 出品|产业家 比起去年&#xff0c;黄文欢和张放今年显得更加忙碌。 “自动驾驶赛道&…