C++实现推箱子游戏

推箱子游戏

运行之后的效果如视频所示,在完成游戏后播放音乐 

准备工作:建立一个新的文件夹,并在文件夹中任意增加一张背景图片,以及各个部件的照片文件

因为这里用到了贴图技术,要使用graphic.h这个函数,不安装的话是不能在vs里面显示图案的,所以要安装Easy x 这个图形库,下载地址[http://www.easyx.cn/downloads/]

具体下载安装见我的博客这一篇:CSDNhttps://mp.csdn.net/mp_blog/creation/editor/134126314icon-default.png?t=N7T8https://mp.csdn.net/mp_blog/creation/editor/134126314

图中用到的资源图形是(借用下面博主的图形音乐资源,代码并不相同,整体代码更好维护):

c/c++推箱子游戏开发基础入门(附全部源码)_堆箱子c++完整代码-CSDN博客

文件的全部代码在最下面:

1.地图初始化----背景色

#define _CRT_SECURE_NO_WARNINGS
#include<graphics.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>using namespace std;int main()
{IMAGE bg_img;//设置图片变量initgraph(960,768);//设置终端窗口大小loadimage(&bg_img, _T("bakeground.bmp"), 960, 768, true);//将背景图片赋值到图片变量putimage(0, 0, &bg_img);//将背景图片刷到终端窗口system("pause");return 0;}

 

2.初始化界面:

#define _CRT_SECURE_NO_WARNINGS
#include<graphics.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>using namespace std;//定义图片数据
IMAGE images[6];//游戏地图
int map[9][12] = {{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()
{IMAGE bg_img;//设置图片变量//搭台唱戏initgraph(960, 768);//设置终端窗口大小loadimage(&bg_img, _T("bakeground.bmp"), 960, 768, true);//将背景图片赋值到图片变量putimage(0, 0, &bg_img);//将背景图片刷到终端窗口//加载道具图标loadimage(&images[0], _T("7.bmp"), 61, 61, TRUE);loadimage(&images[1], _T("0.bmp"), 61, 61, TRUE);loadimage(&images[2], _T("3.bmp"), 61, 61, TRUE);loadimage(&images[3], _T("5.bmp"), 61, 61, TRUE);loadimage(&images[4], _T("4.bmp"), 61, 61, TRUE);loadimage(&images[0], _T("1.bmp"), 61, 61, TRUE);for (int i = 0; i < 9; i++){for (int j = 0; j < 12; j++){putimage(125+j*61, 120+i*61, &images[map[i][j]]);}}system("pause");return 0;}

 3.小人移动控制

#define _CRT_SECURE_NO_WARNINGS
#include<graphics.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<conio.h>#define RATIO 61    //宏定义
#define SCREEN_WIDTH 960
#define SCREEN_HEIGHT 768
#define LINE 9
#define COLUMN 12
#define START_X 125
#define START_Y 120//控制键 上下左右控制方向,'q'退出
#define KEY_UP  'w'
#define KEY_LEFT  'a'
#define KEY_RIGHT  'd'
#define KEY_DOWN  's'
#define KEY_QUIT  'q'#define isVaile(pos) pos.x>=0&&pos.x<LINE&&pos.y>=0&&pos.y<COLUMNusing namespace std;//定义道具类型(用枚举类型使用),增加文章可读性
//WALL墙0,FLOOR地板1,BOX_DES目的地2,MAN人3,BOX篮球4,JI篮球命中目标5
enum _PROSE {WALL,FLOOR,BOX_DES,MAN,BOX,JI,ALL
};//游戏控制方向
enum _DIRECTION
{UP,DOWN,LEFT,RIGHT
};
//游戏地图 ,可以直接由上面的枚举类型的数值进行替换,这里不做替换
int map[LINE][COLUMN] = {{WALL,0,0,0,0,0,0,0,0,0,0,0},{0,FLOOR,0,1,1,1,1,1,1,1,0,0},{0,1,4,1,0,BOX_DES,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,MAN,1,1,1,4,1,0},{0,1,2,1,1,BOX,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},
};//定义图片数据
IMAGE images[ALL];//存储小人位置
struct _POS {int x;//小人所在的二维数组的行int y;//小人所在的二维数组的列};
struct _POS man;/*******************************
*改变游戏地图视图中一格对应道具并重新显示
* 输入:
*     line---道具在地图数组的行下标
*     column---道具在地图数组的列下标
*     prop----道具的类型
* 返回值:无
************************************/
void changeMap(struct _POS *pos, enum _PROSE prop) {map[pos->x][pos->y] = prop;//将此时小人的道具改变putimage(START_X + pos->y * RATIO, START_Y + pos->x * RATIO, &images[prop]);
}/****************************************
*实现游戏四个方向(上下左右)的控制
* 输入:
*    direct---人前进的方向
* 输出:无
********************************************/
void gameControl(enum _DIRECTION direct) {struct _POS next_pos = man;switch (direct) {case UP:next_pos.x--;break;case DOWN:next_pos.x++;break;case LEFT:next_pos.y--;break;case RIGHT:next_pos.y++;break;}//宏展开isVaileif (isVaile(next_pos)&& map[next_pos.x][next_pos.y] == FLOOR) {changeMap(&next_pos, MAN);//小人前进一格changeMap(&man , FLOOR);man = next_pos;}
}int main()
{IMAGE bg_img;//设置图片变量//搭台唱戏initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//设置终端窗口大小loadimage(&bg_img, _T("bakeground.bmp"), 960, 768, true);//将背景图片赋值到图片变量putimage(0, 0, &bg_img);//将背景图片刷到终端窗口//加载道具图标loadimage(&images[WALL], _T("WALL.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.bmp"), RATIO, RATIO, TRUE);loadimage(&images[BOX], _T("BOX.bmp"), RATIO, RATIO, TRUE);loadimage(&images[JI], _T("JI.bmp"), RATIO, RATIO, TRUE);//初始化表盘for (int i = 0; i < LINE; i++){for (int j = 0; j < COLUMN; j++){//知道小人在哪个位置if (map[i][j] == MAN){man.x = i;man.y = j;}putimage(START_X +j* RATIO, START_Y+i* RATIO, &images[map[i][j]]);}}//游戏环节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);//0.1s} while (quit==false);//!quitsystem("pause");return 0;}

 4.功能实现

#define _CRT_SECURE_NO_WARNINGS
#include<graphics.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<conio.h>#define RATIO 61    //宏定义
#define SCREEN_WIDTH 960
#define SCREEN_HEIGHT 768
#define LINE 9
#define COLUMN 12
#define START_X 125
#define START_Y 120//控制键 上下左右控制方向,'q'退出
#define KEY_UP  'w'
#define KEY_LEFT  'a'
#define KEY_RIGHT  'd'
#define KEY_DOWN  's'
#define KEY_QUIT  'q'#define isVaile(pos) pos.x>=0&&pos.x<LINE&&pos.y>=0&&pos.y<COLUMNusing namespace std;//定义道具类型(用枚举类型使用),增加文章可读性
//WALL墙0,FLOOR地板1,BOX_DES目的地2,MAN人3,BOX篮球4,JI篮球命中目标5
enum _PROSE {WALL,FLOOR,BOX_DES,MAN,BOX,JI,ALL
};//游戏控制方向
enum _DIRECTION
{UP,DOWN,LEFT,RIGHT
};//游戏地图 ,可以直接由上面的枚举类型的数值进行替换,这里不做替换
int map[LINE][COLUMN] = {{WALL,0,0,0,0,0,0,0,0,0,0,0},{0,FLOOR,0,1,1,1,1,1,1,1,0,0},{0,1,4,1,0,BOX_DES,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,MAN,1,1,1,4,1,0},{0,1,2,1,1,BOX,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},
};//定义图片数据
IMAGE images[ALL];//存储小人位置
struct _POS {int x;//小人所在的二维数组的行int y;//小人所在的二维数组的列};
struct _POS man;/*******************************
*改变游戏地图视图中一格对应道具并重新显示
* 输入:
*     line---道具在地图数组的行下标
*     column---道具在地图数组的列下标
*     prop----道具的类型
* 返回值:无
************************************/
void changeMap(struct _POS *pos, enum _PROSE prop) {map[pos->x][pos->y] = prop;//将此时小人的道具改变putimage(START_X + pos->y * RATIO, START_Y + pos->x * RATIO, &images[prop]);
}/****************************************
*实现游戏四个方向(上下左右)的控制
* 输入:
*    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;}if (isVaile(next_pos)&& map[next_pos.x][next_pos.y] == FLOOR) {//宏展开isVaile,人的前方是地板changeMap(&next_pos, MAN);//小人前进一格changeMap(&man , FLOOR);man = next_pos;}else if (isVaile(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, JI);changeMap(&next_pos, MAN);//小人前进一格changeMap(&man, FLOOR);man = next_pos;}}
}int main()
{IMAGE bg_img;//设置图片变量//搭台唱戏initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//设置终端窗口大小loadimage(&bg_img, _T("bakeground.bmp"), 960, 768, true);//将背景图片赋值到图片变量putimage(0, 0, &bg_img);//将背景图片刷到终端窗口//加载道具图标loadimage(&images[WALL], _T("WALL.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.bmp"), RATIO, RATIO, TRUE);loadimage(&images[BOX], _T("BOX.bmp"), RATIO, RATIO, TRUE);loadimage(&images[JI], _T("JI.bmp"), RATIO, RATIO, TRUE);//初始化表盘for (int i = 0; i < LINE; i++){for (int j = 0; j < COLUMN; j++){//知道小人在哪个位置if (map[i][j] == MAN){man.x = i;man.y = j;}putimage(START_X +j* RATIO, START_Y+i* RATIO, &images[map[i][j]]);}}//游戏环节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);//0.1s} while (quit==false);//!quit//游戏结束,释放资源closegraph();system("pause");return 0;}

5.游戏结束

/****************************************
*判断游戏是否结束,如果所有篮球目的地都不存在,则表示游戏结束
* 输入:无
* 输出: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 gameOver(IMAGE* bg_img) {putimage(0, 0, bg_img);settextcolor(WHITE);//设置文本颜色为白色RECT rec = { 0,0,SCREEN_WIDTH,SCREEN_HEIGHT };//设置一个矩形settextstyle(20,0,_T("宋体"));//设置字体的位置drawtext(_T("游戏成功,基尼太美~~~~"), &rec, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//设置文字字体位置}

6.优化头文件

7.成功后添加音乐

 全部代码文件:

库文件:box_man.h

#pragma once
#define RATIO 61    //宏定义
#define SCREEN_WIDTH 960
#define SCREEN_HEIGHT 768
#define LINE 9
#define COLUMN 12
#define START_X 125
#define START_Y 120//控制键 上下左右控制方向,'q'退出
#define KEY_UP  'w'
#define KEY_LEFT  'a'
#define KEY_RIGHT  'd'
#define KEY_DOWN  's'
#define KEY_QUIT  'q'#define isVaile(pos) pos.x>=0&&pos.x<LINE&&pos.y>=0&&pos.y<COLUMN//类型定义
typedef enum _DIRECTION     DIRECTION;
typedef enum _PROSE       PROSE;
typedef struct _POS      POS;//定义道具类型(用枚举类型使用),增加文章可读性
//WALL墙0,FLOOR地板1,BOX_DES目的地2,MAN人3,BOX篮球4,JI篮球命中目标5
enum _PROSE {WALL,FLOOR,BOX_DES,MAN,BOX,JI,ALL
};//游戏控制方向
enum _DIRECTION
{UP,DOWN,LEFT,RIGHT
};//存储小人位置
struct _POS {int x;//小人所在的二维数组的行int y;//小人所在的二维数组的列};

运行程序:box_man.cpp 

#define _CRT_SECURE_NO_WARNINGS
#include<graphics.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<MMSystem.h>//播放音乐所需要的头文件
#pragma comment(lib,"winmm.lib")//告诉编译器,加载winmm.lib库文件#include"box_man.h"//#define RATIO 61    //宏定义
//#define SCREEN_WIDTH 960
//#define SCREEN_HEIGHT 768
//#define LINE 9
//#define COLUMN 12
//#define START_X 125
//#define START_Y 120
//
控制键 上下左右控制方向,'q'退出
//#define KEY_UP  'w'
//#define KEY_LEFT  'a'
//#define KEY_RIGHT  'd'
//#define KEY_DOWN  's'
//#define KEY_QUIT  'q'
//
//#define isVaile(pos) pos.x>=0&&pos.x<LINE&&pos.y>=0&&pos.y<COLUMNusing namespace std;类型定义
//typedef enum _DIRECTION     DIRECTION;
//typedef enum _PROSE       PROSE;
//typedef struct _POS      POS;
//
定义道具类型(用枚举类型使用),增加文章可读性
WALL墙0,FLOOR地板1,BOX_DES目的地2,MAN人3,BOX篮球4,JI篮球命中目标5
//enum _PROSE {
//	WALL,
//	FLOOR,
//	BOX_DES,
//	MAN,
//	BOX,
//	JI,
//	ALL
//};
//
游戏控制方向
//enum _DIRECTION
//{
//	UP,
//	DOWN,
//	LEFT,
//	RIGHT
//};//游戏地图 ,可以直接由上面的枚举类型的数值进行替换,这里不做替换
int map[LINE][COLUMN] = {{WALL,0,0,0,0,0,0,0,0,0,0,0},{0,FLOOR,0,1,1,1,1,1,1,1,0,0},{0,1,4,1,0,BOX_DES,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,MAN,1,1,1,4,1,0},{0,1,2,1,1,BOX,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},
};//定义图片数据
IMAGE images[ALL];存储小人位置
//struct _POS {
//	int x;//小人所在的二维数组的行
//	int y;//小人所在的二维数组的列
//
//};
POS man;/*******************************
*改变游戏地图视图中一格对应道具并重新显示
* 输入:
*     line---道具在地图数组的行下标
*     column---道具在地图数组的列下标
*     prop----道具的类型
* 返回值:无
************************************/
void changeMap(POS *pos, PROSE prop) {map[pos->x][pos->y] = prop;//将此时小人的道具改变putimage(START_X + pos->y * RATIO, START_Y + pos->x * RATIO, &images[prop]);
}/****************************************
*实现游戏四个方向(上下左右)的控制
* 输入:
*    direct---人前进的方向
* 输出:无
********************************************/
void gameControl(DIRECTION direct) {//小人移动的方向POS next_pos = man;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;}if (isVaile(next_pos)&& map[next_pos.x][next_pos.y] == FLOOR) {//宏展开isVaile,人的前方是地板changeMap(&next_pos, MAN);//小人前进一格changeMap(&man , FLOOR);man = next_pos;}else if (isVaile(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, JI);changeMap(&next_pos, MAN);//小人前进一格changeMap(&man, FLOOR);man = next_pos;}}
}/****************************************
*判断游戏是否结束,如果所有篮球目的地都不存在,则表示游戏结束
* 输入:无
* 输出: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 gameOver(IMAGE* bg_img) {putimage(0, 0, bg_img);settextcolor(WHITE);//设置文本颜色为白色RECT rec = { 0,0,SCREEN_WIDTH,SCREEN_HEIGHT };//设置一个矩形settextstyle(20,0,_T("宋体"));//设置字体的位置drawtext(_T("游戏成功,基尼太美~~~~"), &rec, DT_CENTER | DT_VCENTER | DT_SINGLELINE);//设置文字字体位置//重复播放基尼太美mciSendString(_T("play 1.mp3 repeat"), 0, 0, 0);//播放音乐
}int main()
{IMAGE bg_img;//设置图片变量//搭台唱戏initgraph(SCREEN_WIDTH, SCREEN_HEIGHT);//设置终端窗口大小loadimage(&bg_img, _T("bakeground.bmp"), 960, 768, true);//将背景图片赋值到图片变量putimage(0, 0, &bg_img);//将背景图片刷到终端窗口//加载道具图标loadimage(&images[WALL], _T("WALL.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.bmp"), RATIO, RATIO, TRUE);loadimage(&images[BOX], _T("BOX.bmp"), RATIO, RATIO, TRUE);loadimage(&images[JI], _T("JI.bmp"), RATIO, RATIO, TRUE);//初始化表盘for (int i = 0; i < LINE; i++){for (int j = 0; j < COLUMN; j++){//知道小人在哪个位置if (map[i][j] == MAN){man.x = i;man.y = j;}putimage(START_X +j* RATIO, START_Y+i* RATIO, &images[map[i][j]]);}}//游戏环节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;}if(isGameOver()) {gameOver(&bg_img);quit = true;}}Sleep(100);//0.1s} while (quit==false);//!quitsystem("pause");//游戏结束,释放资源closegraph();return 0;}

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

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

相关文章

海外云手机三大优势

在全球化潮流下&#xff0c;企业因业务需求对海外手机卡等设备的需求不断攀升&#xff0c;推动了海外云手机业务的蓬勃发展。相较于自行置备手机设备&#xff0c;海外云手机不仅能够降低成本&#xff0c;还具备诸多优势&#xff0c;让我们深入探讨其中的三大黄金优势。 经济实惠…

【Linux】进程概述

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

统计学-R语言-8.1

文章目录 前言方差分析方差分析的原理什么是方差分析误差分解 单因子方差分析数学模型效应检验 练习 前言 本片开始介绍有关方差分析的知识。 方差分析 方差分析的基本原理是在20世纪20年代由英国统计学家Ronald A.Fisher在进行实验设计时为解释实验数据而首先引入的。方差分…

最新多功能PHP图床源码 /兰空图床Lsky Pro开源版v2.1/ 单纯的图床程序源码

源码介绍&#xff1a; Lsky Pro 是一个用于在线上传、管理图片的图床程序&#xff0c;中文名&#xff1a;兰空图床&#xff0c;你可以将它作为自己的云上相册&#xff0c;亦可以当作你的写作贴图库。 该程序的最初版本诞生于2017年10月&#xff0c;由ThinkPHP 5框架精心打造而…

【Linux 基础】常用基础指令(上)

文章目录 一、 创建新用户并设置密码二、ls指令ls指令基本概念ls指令的简写操作 三、pwd指令四、cd指令五、touch指令六、rm指令七、mkdir指令八、rmdir 指令 一、 创建新用户并设置密码 ls /home —— 查看存在多少用户 whoami —— 查看当前用户名 adduser 用户名 —— 创建新…

08 BGP 华为官方文档 十一条选路原则

BGP 华为官方文档 十一条选路原则 丢弃下一跳不可达的路由 1&#xff09;比较“协议首选值-pref-val”属性&#xff0c;数值越大越好&#xff0c;默认值是0&#xff0c;只在本设备生效&#xff0c;不在网络中传递 2&#xff09;比较“本地优先级-local_pref”属性&#xff0c;…

Ceph分布式存储自动化运维平台开发实践

文章目录 1. 背景介绍1.1 什么是Ceph&#xff1f;1.1.1 Ceph的核心组件1.1.2 Ceph的优势 1.2 自动化运维的需求目标 2. 平台架构设计和组件版本2.1 平台架构设计2.2 组件版本2.3 模块划分&#xff08;已经脱敏处理&#xff09;2.3.1 当前版本V1.0支持功能2.3.2 前后端代码结构t…

利用 “diart“ 和 OpenAI 的 Whisper 简化实时转录

利用 "diart" 和 OpenAI 的 Whisper 简化实时转录 工作原理 Diart 是一个基于人工智能的 Python 库&#xff0c;用于实时记录说话者语言&#xff08;即 "谁在什么时候说话"&#xff09;&#xff0c;它建立在 pyannote.audio 模型之上&#xff0c;专为实时…

微信小程序 仿微信聊天界面

1. 需求效果图 2. 方案 为实现这样的效果&#xff0c;首先要解决两个问题&#xff1a; 2.1.点击输入框弹出软键盘后&#xff0c;将已有的少许聊天内容弹出&#xff0c;导致看不到的问题 点击输入框弹出软键盘后&#xff0c;将已有的少许聊天内容弹出&#xff0c;导致看不到的问…

银行数据仓库体系实践(8)--主数据模型设计

主数据区域中保留了数据仓库的所有基础数据及历史数据&#xff0c;是数据仓库中最重要的数据区域之一&#xff0c;那主数据区域中主要分为近源模型区和整合&#xff08;主题&#xff09;模型区。上一节讲到了模型的设计流程如下图所示。那近源模型层的设计在第2.3和3这两个步骤…

85 总结一下最近遇到的一些 jar发布 相关的知识

前言 呵呵 最近有一些构建服务, 发布服务的一些需求 我们这里的服务 一般来说是 java application, spring boot application 针对发布, 当然最好是 增量发布, 尽量的减少需要传递给 发布服务器 的资源的大小 比如 我的这个 java application, 可能会存在很多依赖, 常规…

探讨Go语言在构建HTTP代理时的优势和挑战

亲爱的读者&#xff0c;让我们一起来探讨一下Go语言在构建HTTP代理时的优势和挑战。 首先&#xff0c;让我们来谈谈Go语言在构建HTTP代理时的优势。Go语言是一种高性能的编程语言&#xff0c;它具有简洁、高效的特点&#xff0c;非常适合构建高效的代理服务器。使用Go语言&…

springboot第52集:微服务分布式架构,统一验证,oauth,订单,地区管理周刊

在计算机领域中&#xff0c;FGC 通常代表 Full Garbage Collection&#xff0c;即全垃圾收集。垃圾收集是一种自动管理内存的机制&#xff0c;它负责回收不再被程序使用的内存&#xff0c;以便释放资源和提高程序性能。 当系统执行 Full Garbage Collection 时&#xff0c;它会…

【代码随想录-数组】二分查找

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

Android源码设计模式解析与实战第2版笔记(三)

第三章 自由扩展你的项目–Builder 模式 Builder 模式的定义 将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 Builder 模式的使用场景 相同的方法&#xff0c;不同的执行顺序&#xff0c;产生不同的事件结果时 多个部件或零件&…

【驱动系列】C#获取电脑硬件显卡核心代号信息

欢迎来到《小5讲堂》&#xff0c;大家好&#xff0c;我是全栈小5。 这是《驱动系列》文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点…

msvcp140.dll丢失,有什么好的解决方法?

msvcp140.dll 是 Microsoft Visual C Redistributable Package 的一部分&#xff0c;这是一个由微软开发并发布的运行时库文件。具体而言&#xff1a; 功能与用途&#xff1a; msvcp140.dll 是动态链接库&#xff08;DLL&#xff09;文件&#xff0c;包含了 C 标准库的实现和…

CSS3如何实现从右往左布局的按钮组(固定间距)

可以通过下方CSS实现&#xff0c;下面的CSS表示按钮从右往左布局&#xff0c;且间距为10px: .right-btn {position: relative;float: right;margin-right: 10px; }类似这种&#xff1a; 这种&#xff1a; 注意&#xff1a; 不能使用right:10px代替margin-right:10px&#x…

STM32第三节——点亮第一个LED灯

1 STM32CubeMX新建工程 如果是第一次打开STM32CubeMX&#xff0c;软件会自动下载一些组件&#xff0c;等待下载完成即可。 1.2 点击ACCESS TO MCU SELECTOR 选择CPU型号&#xff0c;我用的是STM32F103ZET6&#xff0c;选择 STM32F103ZETx&#xff0c;可以点击旁边的收藏图标…

husky结合commitlint审查commit信息

commintlint是一个npm包用来规范化我们的commit信息&#xff0c;当然这个行为的操作时期是在git的commit-msg生命周期期间&#xff0c;这一点当然是有husky来控制&#xff0c;需要注意的是commit-msg作为一个git生命周期会被git commit和git merge行为唤醒&#xff0c;并且可以…