c语言游戏实战(10):坤坤的篮球回避秀

  前言:

这款简易版的球球大作战是博主耗时两天半完成的,玩家需要控制坤坤在游戏界面上移动,来躲避游戏界面上方不断掉下来的篮球。本游戏使用C语言和easyx图形库编写,旨在帮助初学者了解游戏开发的基本概念和技巧。

在开始编写代码之前,我们需要先了解一下游戏的基本规则和功能:

游戏界面:游戏界面是一个矩形区域,玩家可以在这个区域内控制球的移动。

坤坤:玩家控制的坤坤可以在游戏界面内自由移动,按下特定的按键后可以跳跃。

篮球:篮球在游戏界面的正上方源源不断地生成,并下降。

坤坤触碰篮球:当坤坤触碰到上方掉下来的篮球时,坤坤的血量就会降低一格,一共五格血量降完为止。

接下来,我们将通过以下几个步骤来实现这个游戏:

1. 初始化游戏界面和模型的信息。

2. 处理键盘输入,实现玩家控制坤坤的移动和跳跃。

3. 生成足够数量的篮球。

4. 生成篮球,并控制其移动。

5. 检测篮球与坤坤之间的触碰关系,并减少相应的血量。

通过学习这个游戏的开发过程,初学者将能够掌握C语言编程和easyx图形库的基本技巧。

1. 前期准备

第一步:我们需要在easyx官网下载好easyx图形库。(具体操作可以去b站搜索相关视频)

第二步:按照下图的步骤将字符集改为多节字符集,因为如果使用的字符集只包含有限数量的字符,可能无法支持所有需要的字符,导致无法正确加载图像。因此,将字符集改为多字符集可以确保包含所有可能需要的字符,从而避免加载图像时出现错误或乱码问题。

2. 游戏的背景设置

游戏界面的长和宽根据背景图片的长宽(右键点击图片的属性可以查看)来设置,这里的背景图片有两张一张是游戏界面,另一张是游戏结束的图片。这里首先需要声明一个IMAGE类型的变量来存储加载的图片数据。这是后续对图片进行处理的基础,利用函数loadimage可以从本地文件中加载图片(尽量将游戏所需要的素材放在和代码的同一个目录里),最后利用putimage可以将图片绘制到窗口上来。

int main()
{Init();Itset();//设置窗口的长宽initgraph(Wide, Hight);//缓冲BeginBatchDraw();while (1){show();//刷新FlushBatchDraw();}closegraph;return 0;
}
//声明IMAGE类型的变量
IMAGE img[2];
//加载图片
loadimage(&img[0], "resource/微信图片_20240222202456.jpg");
loadimage(&img[1], "resource/微信图片_20240303132408.jpg");
//绘制图片
putimage(0, 0, &img[Img]);

3. 初始模型的信息

在这里篮球和坤坤的模型都是球,只是后面用图片覆盖而已。首先在游戏游戏界面的正上方生成多个球(具体数量自己定),然后在游戏的下方生成一个玩家控制的球,最后就是加载图片了。

初始化小球 

void Itset()
{//for (int i = 0; i < Ball_num; i++){Enemy[i].x = Wide / 2;Enemy[i].y = 10;Enemy[i].r = 10;}//玩家Player.x = Wide / 2;Player.r = 10;Player.y = Hight - Player.r * 4;
}

加载图片

因为loadimage函数只能加载图片,加载不了视频或者动图,所以我们需要将视频一帧一帧的加载上去,然后用循环绘制图片,这样就产生了一个动图的效果。

IMAGE kunkun[58];
IMAGE ball[Ball_num];loadimage(&kunkun[0], "resource/2月22日.png", 34, 34);loadimage(&kunkun[1], "resource/2月22日(1).png", 34, 34);loadimage(&kunkun[2], "resource/2月22日(2).png", 34, 34);loadimage(&kunkun[3], "resource/2月22日(3).png", 34, 34);loadimage(&kunkun[4], "resource/2月22日(4).png", 34, 34);loadimage(&kunkun[5], "resource/2月22日(5).png", 34, 34);loadimage(&kunkun[6], "resource/2月22日(6).png", 34, 34);loadimage(&kunkun[7], "resource/2月22日(7).png", 34, 34);loadimage(&kunkun[8], "resource/2月22日(8).png", 34, 34);loadimage(&kunkun[9], "resource/2月22日(9).png", 34, 34);loadimage(&kunkun[10], "resource/2月22日(10).png", 34, 34);loadimage(&kunkun[11], "resource/2月22日(11).png", 34, 34);loadimage(&kunkun[12], "resource/2月22日(12).png", 34, 34);loadimage(&kunkun[13], "resource/2月22日(13).png", 34, 34);loadimage(&kunkun[14], "resource/2月22日(14).png", 34, 34);loadimage(&kunkun[15], "resource/2月22日(15).png", 34, 34);loadimage(&kunkun[16], "resource/2月22日(16).png", 34, 34);loadimage(&kunkun[17], "resource/2月22日(17).png", 34, 34);loadimage(&kunkun[18], "resource/2月22日(18).png", 34, 34);loadimage(&kunkun[19], "resource/2月22日(19).png", 34, 34);loadimage(&kunkun[20], "resource/2月22日(20).png", 34, 34);loadimage(&kunkun[21], "resource/2月22日(21).png", 34, 34);loadimage(&kunkun[22], "resource/2月22日(22).png", 34, 34);loadimage(&kunkun[23], "resource/2月22日(23).png", 34, 34);loadimage(&kunkun[24], "resource/2月22日(24).png", 34, 34);loadimage(&kunkun[25], "resource/2月22日(25).png", 34, 34);loadimage(&kunkun[26], "resource/2月22日(26).png", 34, 34);loadimage(&kunkun[27], "resource/2月22日(27).png", 34, 34);loadimage(&kunkun[28], "resource/2月22日(28).png", 34, 34);loadimage(&kunkun[29], "resource/2月22日(29).png", 34, 34);loadimage(&kunkun[30], "resource/2月22日(30).png", 34, 34);loadimage(&kunkun[31], "resource/2月22日(31).png", 34, 34);loadimage(&kunkun[32], "resource/2月22日(32).png", 34, 34);loadimage(&kunkun[33], "resource/2月22日(33).png", 34, 34);loadimage(&kunkun[34], "resource/2月22日(34).png", 34, 34);loadimage(&kunkun[35], "resource/2月22日(35).png", 34, 34);loadimage(&kunkun[36], "resource/2月22日(36).png", 34, 34);loadimage(&kunkun[37], "resource/2月22日(37).png", 34, 34);loadimage(&kunkun[38], "resource/2月22日(38).png", 34, 34);loadimage(&kunkun[39], "resource/2月22日(39).png", 34, 34);loadimage(&kunkun[40], "resource/2月22日(40).png", 34, 34);loadimage(&kunkun[41], "resource/2月22日(41).png", 34, 34);loadimage(&kunkun[42], "resource/2月22日(42).png", 34, 34);loadimage(&kunkun[43], "resource/2月22日(43).png", 34, 34);loadimage(&kunkun[44], "resource/2月22日(44).png", 34, 34);loadimage(&kunkun[45], "resource/2月22日(45).png", 34, 34);loadimage(&kunkun[46], "resource/2月22日(46).png", 34, 34);loadimage(&kunkun[47], "resource/2月22日(47).png", 34, 34);loadimage(&kunkun[48], "resource/2月22日(48).png", 34, 34);loadimage(&kunkun[49], "resource/2月22日(49).png", 34, 34);loadimage(&kunkun[50], "resource/2月22日(50).png", 34, 34);loadimage(&kunkun[51], "resource/2月22日(51).png", 34, 34);loadimage(&kunkun[52], "resource/2月22日(52).png", 34, 34);loadimage(&kunkun[53], "resource/2月22日(53).png", 34, 34);loadimage(&kunkun[54], "resource/2月22日(54).png", 34, 34);loadimage(&kunkun[55], "resource/2月22日(55).png", 34, 34);loadimage(&kunkun[56], "resource/2月22日(56).png", 34, 34);for (int i = 0; i < Ball_num; i++){loadimage(&ball[i], "resource/5459.png_860.png", 36, 36);}

4. 绘制图片

图片是需要根据球来移动的,所以putimage函数的格式应该为:

putimage(x, y, Wide, Hight, &kunkun[a], 0, 0,SRCAND);
  1. x, y:图像左上角在窗口中的坐标。
  2. Wide, Hight:要绘制的图像的宽度和高度。
  3. &kunkun[a]:指向图像数据数组的指针,a是数组中图像数据的索引。
  4. 0, 0:源图像中要复制的区域的左上角坐标。

这样图片的位置就可以根据球的为止移动了。 

void show()
{srand((unsigned)time(NULL));//清屏函数cleardevice();//setbkcolor(WHITE);putimage(0, 0, &img[Img]);putimage(0, 0, &Heal[Health], SRCAND);for (int i = 0; i < Ball_num; i++){setfillcolor(RGB(229, 124, 77));solidcircle(Enemy[i].x, Enemy[i].y, Enemy[i].r);}putimage(Player.x - 14, Player.y - 14, Wide, Hight, &kunkun[a], 0, 0,SRCAND);for (int i = 0; i < Ball_num; i++){putimage(Enemy[i].x - 18, Enemy[i].y - 18, Wide, Hight, &ball[i], 0, 0, SRCAND);}
}

 5. 篮球的移动

随机生成8个随机数,然后根据这八个随机数在执行向下移动的同时执行向左或向右的指令。为了防止篮球的移动速度太快,我们需要加一个Sleep(10)函数给它降速。当篮球移动出游戏界面的时候我们让它重新生成。

void Enemy_move()
{srand((unsigned)time(NULL));for (int i = 0; i < Ball_num; i++){int direction = rand() % 8;if (direction == 0){Enemy[i].y++;Enemy[i].x--;}else if (direction == 1){Enemy[i].y++;Enemy[i].x++;}else if (direction == 2){Enemy[i].y += 2;Enemy[i].x += 2;}else if (direction == 3){Enemy[i].y += 2;Enemy[i].x -= 2;}else if (direction == 4){Enemy[i].y += 3;Enemy[i].x += 3;}else if (direction == 5){Enemy[i].y += 3;Enemy[i].x -= 3;}else if (direction == 6){Enemy[i].y += 4;Enemy[i].x -= 4;}else if (direction == 7){Enemy[i].y += 4;Enemy[i].x += 4;}if (Enemy[i].x <0 || Enemy[i].x>Wide || Enemy[i].y > Hight - Player.r * 3){Enemy[i].x = Wide / 2;Enemy[i].y = 10;Enemy[i].r = 10;}}
}

6. 玩家与球碰撞

生成游戏血条,每碰撞一次血条减少,并且重新生成篮球。

IMAGE Heal[6];loadimage(&Heal[5], "resource/微信图片_20240303142935.jpg");loadimage(&Heal[4], "resource/微信图片_20240303142958.jpg");loadimage(&Heal[3], "resource/微信图片_20240303142931.jpg");loadimage(&Heal[2], "resource/微信图片_20240303142926.jpg");loadimage(&Heal[1], "resource/微信图片_20240303142922.jpg");
//玩家与球碰撞
void collide()
{for (int i = 0; i < Ball_num; i++){if (Distance(Player.x, Player.y, Enemy[i].x, Enemy[i].y) < Player.r + Enemy[i].r && Health > 0){Health--;Enemy[i].x = Wide / 2;Enemy[i].y = 10;Enemy[i].r = 10;}}}

7. 人物的移动 

在这里需要用到GetAsyncKeyState(vk virtual key)函数获取异步按键状态,其中vk virtual key是虚拟键值,如果接受到这个虚拟键值,它会返回真。VK_UP、VK_LEFT、VK_RIGHT、0x20、0x41、0x44、0x57分别是上箭头键、左箭头键、右箭头键、空格键、a、d、w的虚拟键值。最后这里比较难处理的就是跳跃的这个动作了,我在这里设置人物跳跃后最高上升60个像素格,然后通过while循环循环上升每次上升5个像素个,如果是直接上升60个像素格的话,就是闪现了达不到跳跃的效果,在人物上升的同时其他动作是任然要进行的,所以我们还需要将这些动作函数打包放到这个人物跳跃的while循环当中。值得注意的是我们还需要在这个while循环中加一个Sleep(20)调节循环速度,使这里运动速度与主函数的while循环的运动速度一致。

void player_move()
{if (GetAsyncKeyState(VK_LEFT)|| GetAsyncKeyState(0x41)){if (Player.x > 0)Player.x -= Player_sleep;}if (GetAsyncKeyState(VK_RIGHT)|| GetAsyncKeyState(0x44)){if (Player.x < Wide)Player.x += Player_sleep;}if (Player.y == Hight - Player.r * 4){if (GetAsyncKeyState(0x20) || GetAsyncKeyState(0x57)|| GetAsyncKeyState(VK_UP)){BeginBatchDraw();while (Player.y > Hight - Player.r * 4 - 60){Sleep(20);Player.y -= 5;player_move();Enemy_move();show();collide();FlushBatchDraw();}}if (Health == 0){printf("\a");system("pause");exit(0);}}
}

效果展示:

坤坤的篮球回避秀

源码:

#include<stdio.h>
#include<easyx.h>
#include<time.h>
#include<windows.h>
#include<mmsystem.h>
#include<math.h>
#pragma comment(lib,"winmm.lib")
#define Wide 1280
#define Hight 720
#define Wide1 780
#define Hight1 286
#define Ball_num 20
#define Player_sleep 5
int Health = 5;
int sleep = 1;
int Img = 0;
struct Ball
{float x = 0;int y = 0;float r = 0;};
struct Ball Enemy[Ball_num];
struct Ball Player;
IMAGE img[2];
IMAGE kunkun[58];
IMAGE ball[Ball_num];
IMAGE Heal[6];
int a = 0;
//加载图片
void Init()
{loadimage(&img[0], "resource/微信图片_20240222202456.jpg");loadimage(&img[1], "resource/微信图片_20240303132408.jpg");loadimage(&Heal[5], "resource/微信图片_20240303142935.jpg");loadimage(&Heal[4], "resource/微信图片_20240303142958.jpg");loadimage(&Heal[3], "resource/微信图片_20240303142931.jpg");loadimage(&Heal[2], "resource/微信图片_20240303142926.jpg");loadimage(&Heal[1], "resource/微信图片_20240303142922.jpg");loadimage(&kunkun[0], "resource/2月22日.png", 34, 34);loadimage(&kunkun[1], "resource/2月22日(1).png", 34, 34);loadimage(&kunkun[2], "resource/2月22日(2).png", 34, 34);loadimage(&kunkun[3], "resource/2月22日(3).png", 34, 34);loadimage(&kunkun[4], "resource/2月22日(4).png", 34, 34);loadimage(&kunkun[5], "resource/2月22日(5).png", 34, 34);loadimage(&kunkun[6], "resource/2月22日(6).png", 34, 34);loadimage(&kunkun[7], "resource/2月22日(7).png", 34, 34);loadimage(&kunkun[8], "resource/2月22日(8).png", 34, 34);loadimage(&kunkun[9], "resource/2月22日(9).png", 34, 34);loadimage(&kunkun[10], "resource/2月22日(10).png", 34, 34);loadimage(&kunkun[11], "resource/2月22日(11).png", 34, 34);loadimage(&kunkun[12], "resource/2月22日(12).png", 34, 34);loadimage(&kunkun[13], "resource/2月22日(13).png", 34, 34);loadimage(&kunkun[14], "resource/2月22日(14).png", 34, 34);loadimage(&kunkun[15], "resource/2月22日(15).png", 34, 34);loadimage(&kunkun[16], "resource/2月22日(16).png", 34, 34);loadimage(&kunkun[17], "resource/2月22日(17).png", 34, 34);loadimage(&kunkun[18], "resource/2月22日(18).png", 34, 34);loadimage(&kunkun[19], "resource/2月22日(19).png", 34, 34);loadimage(&kunkun[20], "resource/2月22日(20).png", 34, 34);loadimage(&kunkun[21], "resource/2月22日(21).png", 34, 34);loadimage(&kunkun[22], "resource/2月22日(22).png", 34, 34);loadimage(&kunkun[23], "resource/2月22日(23).png", 34, 34);loadimage(&kunkun[24], "resource/2月22日(24).png", 34, 34);loadimage(&kunkun[25], "resource/2月22日(25).png", 34, 34);loadimage(&kunkun[26], "resource/2月22日(26).png", 34, 34);loadimage(&kunkun[27], "resource/2月22日(27).png", 34, 34);loadimage(&kunkun[28], "resource/2月22日(28).png", 34, 34);loadimage(&kunkun[29], "resource/2月22日(29).png", 34, 34);loadimage(&kunkun[30], "resource/2月22日(30).png", 34, 34);loadimage(&kunkun[31], "resource/2月22日(31).png", 34, 34);loadimage(&kunkun[32], "resource/2月22日(32).png", 34, 34);loadimage(&kunkun[33], "resource/2月22日(33).png", 34, 34);loadimage(&kunkun[34], "resource/2月22日(34).png", 34, 34);loadimage(&kunkun[35], "resource/2月22日(35).png", 34, 34);loadimage(&kunkun[36], "resource/2月22日(36).png", 34, 34);loadimage(&kunkun[37], "resource/2月22日(37).png", 34, 34);loadimage(&kunkun[38], "resource/2月22日(38).png", 34, 34);loadimage(&kunkun[39], "resource/2月22日(39).png", 34, 34);loadimage(&kunkun[40], "resource/2月22日(40).png", 34, 34);loadimage(&kunkun[41], "resource/2月22日(41).png", 34, 34);loadimage(&kunkun[42], "resource/2月22日(42).png", 34, 34);loadimage(&kunkun[43], "resource/2月22日(43).png", 34, 34);loadimage(&kunkun[44], "resource/2月22日(44).png", 34, 34);loadimage(&kunkun[45], "resource/2月22日(45).png", 34, 34);loadimage(&kunkun[46], "resource/2月22日(46).png", 34, 34);loadimage(&kunkun[47], "resource/2月22日(47).png", 34, 34);loadimage(&kunkun[48], "resource/2月22日(48).png", 34, 34);loadimage(&kunkun[49], "resource/2月22日(49).png", 34, 34);loadimage(&kunkun[50], "resource/2月22日(50).png", 34, 34);loadimage(&kunkun[51], "resource/2月22日(51).png", 34, 34);loadimage(&kunkun[52], "resource/2月22日(52).png", 34, 34);loadimage(&kunkun[53], "resource/2月22日(53).png", 34, 34);loadimage(&kunkun[54], "resource/2月22日(54).png", 34, 34);loadimage(&kunkun[55], "resource/2月22日(55).png", 34, 34);loadimage(&kunkun[56], "resource/2月22日(56).png", 34, 34);for (int i = 0; i < Ball_num; i++){loadimage(&ball[i], "resource/5459.png_860.png", 36, 36);}
}
//初始化小球的信息
void Itset()
{//for (int i = 0; i < Ball_num; i++){Enemy[i].x = Wide / 2;Enemy[i].y = 10;Enemy[i].r = 10;}//玩家Player.x = Wide / 2;Player.r = 10;Player.y = Hight - Player.r * 4;
}
void Enemy_move()
{srand((unsigned)time(NULL));for (int i = 0; i < Ball_num; i++){int direction = rand() % 8;if (direction == 0){Enemy[i].y++;Enemy[i].x--;}else if (direction == 1){Enemy[i].y++;Enemy[i].x++;}else if (direction == 2){Enemy[i].y += 2;Enemy[i].x += 2;}else if (direction == 3){Enemy[i].y += 2;Enemy[i].x -= 2;}else if (direction == 4){Enemy[i].y += 3;Enemy[i].x += 3;}else if (direction == 5){Enemy[i].y += 3;Enemy[i].x -= 3;}else if (direction == 6){Enemy[i].y += 4;Enemy[i].x -= 4;}else if (direction == 7){Enemy[i].y += 4;Enemy[i].x += 4;}if (Enemy[i].x <0 || Enemy[i].x>Wide || Enemy[i].y > Hight - Player.r * 3){Enemy[i].x = Wide / 2;Enemy[i].y = 10;Enemy[i].r = 10;}}
}
void show()
{srand((unsigned)time(NULL));cleardevice();putimage(0, 0, &img[Img]);putimage(0, 0, &Heal[Health], SRCAND);for (int i = 0; i < Ball_num; i++){setfillcolor(RGB(229, 124, 77));solidcircle(Enemy[i].x, Enemy[i].y, Enemy[i].r);}putimage(Player.x - 14, Player.y - 14, Wide, Hight, &kunkun[a], 0, 0,SRCAND);for (int i = 0; i < Ball_num; i++){putimage(Enemy[i].x - 18, Enemy[i].y - 18, Wide, Hight, &ball[i], 0, 0, SRCAND);}
}
//距离
int Distance(int x, int y, int x1, int y1)
{return sqrt((x - x1) * (x - x1) + (y - y1) * (y - y1));
}
//玩家与球碰撞
void collide()
{for (int i = 0; i < Ball_num; i++){if (Distance(Player.x, Player.y, Enemy[i].x, Enemy[i].y) < Player.r + Enemy[i].r && Health > 0){Health--;Enemy[i].x = Wide / 2;Enemy[i].y = 10;Enemy[i].r = 10;}}}
void player_move()
{if (GetAsyncKeyState(VK_LEFT)|| GetAsyncKeyState(0x41)){if (Player.x > 0)Player.x -= Player_sleep;}if (GetAsyncKeyState(VK_RIGHT)|| GetAsyncKeyState(0x44)){if (Player.x < Wide)Player.x += Player_sleep;}if (Player.y == Hight - Player.r * 4){if (GetAsyncKeyState(0x20) || GetAsyncKeyState(0x57)|| GetAsyncKeyState(VK_UP)){BeginBatchDraw();while (Player.y > Hight - Player.r * 4 - 60){Sleep(20);Player.y -= 5;player_move();Enemy_move();show();collide();FlushBatchDraw();}}if (Health == 0){printf("\a");system("pause");exit(0);}}
}
int main()
{Init();Itset();initgraph(Wide, Hight);BeginBatchDraw();while (1){Sleep(20);if (a <= 56){a++;}if (a > 56){a = 0;}if (Player.y < Hight - Player.r * 4){Player.y += 2;}if (sleep > 0){sleep--;}if (Health == 0)Img = 1;show();FlushBatchDraw();Enemy_move();player_move();collide();}closegraph;return 0;
}

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

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

相关文章

SpringMVC01、回顾MVC

1、回顾MVC 1.1、什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写&#xff0c;是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式&#xff0c;MVC是一种架构模式。…

Node.js中的并发和多线程处理

在Node.js中&#xff0c;处理并发和多线程是一个非常重要的话题。由于Node.js是单线程的&#xff0c;这意味着它在任何给定时间内只能执行一个任务。然而&#xff0c;Node.js的事件驱动和非阻塞I/O模型使得处理并发和多线程变得更加高效和简单。在本文中&#xff0c;我们将探讨…

恋爱话术小程序源码支持多种流量主模式

源码介绍 这就是一款恋爱话术小程序,该款小程序相对来说还是挺强大的 这款小程序基本分段都是和外面几千块几百块的分段是一样的,基本就是从开场-情绪-聊天-升级-邀约-约会等几大分类开始 然后每一大分类下面都有N个小分类来做识别 另外也支持输入对方的话或关键词获取相关的话…

Container killed on request. Exit code is 143

Bug信息 WARN YarnAllocator: Container marked as failed: container_e33_1480922439133_0845_02_000002 on host: hdp4. Exit status: 143. Diagnostics: Container killed on request. Exit code is 143 Container exited with a non-zero exit code 143 Killed by externa…

大数据技术(一)

大数据技术概述 大数据技术层面及其功能 数据采集与预处理 利用ETL(extract-transform-load)工具将分布的、异构数据源中的数据&#xff0c;如关系数据、平面数据文件等&#xff0c;抽取到临时中间层后进行清洗、转换、集成&#xff0c;最后加载到数据仓库或数据集市中&…

机器人 标准DH与改进DH

文章目录 1 建立机器人坐标系1.1 连杆编号1.2 关节编号1.3 坐标系方向2 标准DH(STD)2.1 确定X轴方向2.2 建模步骤2.3 变换顺序2.4 变换矩阵3 改进DH(MDH)3.1 确定X轴方向3.2 建模步骤3.3 变换顺序3.4 变换矩阵4 标准DH与改进DH区别5 Matlab示例参考链接1 建立机器人坐标系 1.1…

【Python】变量的引用

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…

微服务day04-基于Feign的远程调用

一.Feign的认识 是http客户端&#xff0c;因为使用RestTemplate存在一些问题&#xff1a;代码可读性差&#xff0c;参数配置费事&#xff0c;不够优雅… String url"http://userservice/user/"order.getUserId(); User userrestTemplate.getForObject(url,User.cla…

【AIGC】如何提高Prompt准确度

前言 随着人工智能的迅猛进展&#xff0c;AIGC&#xff08;通用人工智能聊天工具&#xff09;已成为多个行业中不可或缺的自然语言处理技术。Prompt作为AIGC系统的一项关键功能&#xff0c;在工具的有效运作中发挥了举足轻重的作用。本篇文章将深入探讨Prompt与AIGC之间的紧密…

OpenLayers线性渐变和中心渐变(径向渐变)

目录 1.前言2.添加一个面要素3.线性渐变3.1 第一个注意点3.2 第二个注意点 4.中心渐变&#xff08;径向渐变&#xff09;5.总结 1.前言 OpenLayers官网有整个图层的渐变示例&#xff0c;但是没有单个要素的渐变示例&#xff0c;我们这里来补充一下。OpenLayers中的渐变是通过fi…

PostgreSQL restartpoint 原理详解

背景 大部分人对 PG 的 checkpoint 机制会熟悉一点&#xff0c;但是对 restartpoint 却不太熟悉&#xff0c;网上介绍这方面的文章也比较少。因此&#xff0c;本文将以 PG 14.7 的社区代码为基础&#xff0c;介绍 PG 中的 restartpoint 机制。 原理介绍 什么是 restartpoint…

Docker的基础知识与应用技巧

文章目录 一.docekr简介二.docekr安装三.docker命令 一.docekr简介 Docker是一个开源的应用容器引擎&#xff0c;它可以让开发者打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的Linux或Windows操作系统的机器上。Docker基于轻量级虚拟化技术&a…

2024022701-信息安全(二)——密码学

密码学的基本概念 密码学(Cryptology)&#xff1a; 研究信息系统安全保密的科学。 密码编码学(Cryptography)&#xff1a; 研究对信息进行编码,实现对信息的隐蔽。 密码分析学(Cryptanalytics) &#xff1a; 研究加密消息的破译或消息的伪造。 消息被称为明文(Plaintext)。 用…

【CSS】(浮动定位)易忘知识点汇总

浮动特性 加了浮动之后的元素,会具有很多特性,需要我们掌握的. 1、浮动元素会脱离标准流(脱标&#xff1a;浮动的盒子不再保留原先的位置) 2、浮动的元素会一行内显示并且元素顶部对齐 注意&#xff1a; 浮动的元素是互相贴靠在一起的&#xff08;不会有缝隙&#xff09;&…

用于游戏开发的顶级 PYTHON 框架

一、说明 我们试图用python开发游戏&#xff0c;一旦产生这个念头&#xff0c;就伴随这样一个问题&#xff1a;当今用于构建游戏的领先 Python 框架有哪些&#xff1f;python下&#xff0c;支持游戏开发平台有哪些优势&#xff1f;我们在这篇博文中告诉你。 二、高级游戏平台简…

nginx使用详解--缓存

Nginx 是一个功能强大的 Web 服务器和反向代理服务器&#xff0c;它可以用于实现静态内容的缓存&#xff0c;缓存可以分为客户端缓存和服务端缓存。 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个协商缓存的请…

NOIP 2009普及组初赛试题及解析

NOIP 2009普及组初赛试题及解析 一. 单项选择题 &#xff08;共20题&#xff0c;每题1.5分&#xff0c;共计30分。每题有且仅有一个正确答案.&#xff09;。二. 问题求解&#xff08;共2题&#xff0c;每题5分&#xff0c;共计10分&#xff09;三. 阅读程序写结果&#xff08;共…

【精选】Java项目介绍和界面搭建——拼图小游戏 上

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

MYSQL---日志

1.日志的概述 日志是MySQL数据库的重要组成部分。日志文件中记录着MySQL数据库运行期间发生的变化&#xff1b;也就是说用来记录MySQL数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时&#xff0c;可以通过日志查看文件出错的原因&#xff0…

【Web】速谈FastJson反序列化中JdbcRowSetImpl的利用

目录 简要原理分析 exp 前文&#xff1a;【Web】速谈FastJson反序列化中TemplatesImpl的利用 简要原理分析 前文的TemplatesImpl链存在严重限制&#xff0c;即JSON.parseObject()需要开启Feature.SupportNonPublicField fastjson的第二条链JdbcRowSetImpl&#xff0c;主要…