pygame 实现三体运动

2023-10-11 23:30
文章标签 实现 pygame 运动 三体

本文主要是介绍pygame 实现三体运动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

pygame 实现三体运动

  • 效果
  • 实现方法
  • 预备知识
    • 1.向量
    • 2.合力的计算
    • 3.引力的计算
    • 4.python的运用
  • 开始
    • 系统(system)
    • 物体(object)
    • 计算
    • 显示
  • 运行
  • 进阶

效果

V1.0.10版
效果
新增添加物体功能
移除物体功能
稍微加快了一点点

实现方法

对于N体模拟,可以这样思考

  • 计算出一个系统中每一个对象(物体Object)的受力情况
  • 根据受力情况计算出每一个物体受的合力
  • 该物体下一帧运动的速度和方向就是所受合力的大小和方向

通过这种方法,就可以简单的模拟出N体运动

预备知识

1.向量

向量,也称矢量,是一种具有大小和方向的量
它可以用一个箭头表示
可以用箭头表示
在坐标系中,可以表示为
a[3.1]
[-2.9]
表示方法
涉及向量的原因是力本身就表示为一个向量
例如:
一个苹果受到10N的重力,在这里10N是力的大小,而方向则是竖直向下

2.合力的计算

合力的计算其实也就是向量的加法
根据平行四边形法则:
平行四边形法则
图甲中F1和F2的合力为F
如果
F1表示为[100,0]
F2表示为[10,60]
那么F就可以表示为[110,60]
至于图乙其实与图甲是一样的
那么,问题来了,物体的受力情况不一定仅有两个啊,怎么办呢?
其实,我们可以两个两个力的算,直到把所有力都算完,就得到了一个最终的合力了

3.引力的计算

两个可看作质点的物体之间的万有引力,可以用以下公式计算:
万有引力公式
即万有引力等于引力常量乘以两物体质量的乘积 除以它们距离的平方。

也就是说,引力与两物体之间距离的平方成反比,
而与两物体质量的乘积成正比

说人话就是靠的近引力就大,靠的远引力就小
在同样的距离时,质量越大引力越大,反之亦然

4.python的运用

你需要拥有这些:

  • python的基本语法
  • pygame库的用法
  • 一个IDE,所谓磨刀不误砍柴工,个人推荐PyCharm
  • 以及…伊文斯的介绍信,嗯,很好,组织没有看错你 ^ _ ^

开始

所有的代码都在最后
先从头开始吧:
注意,如果你对 类(class)不熟悉,那请点

系统(system)

总要有一个系统来容纳一切吧!

class System(object):	# 继承object类name = ""			objects = []		# 所有的对象(物体)都在这里

非常简单的一个类,不过还应该来点东西

def __init__(self, name):self.name = name		# 在建立系统的时候有一个名字的!def add_object(self, obj):	# 添加物体self.objects.append(obj)

嗯,基本的东西以及好了,下面需要一个可以制造物体的神了!

物体(object)

class Objects(object):mass = 0        # 质量power = []      # 受到的力,矢量[大小,方向]speed = []      # 加速度,矢量[大小,方向]position = []   # 位置position_ = []  # 最初位置move_to = []    # 下一帧移动的距离,方向positions = []  # 所有的点volume = 0      # 体积color = []      # 颜色name = ""       # 名字def __init__(self, name, mass, speed, position, volume, color):self.mass = massself.position = positionself.volume = volumeself.speed = speedself.color = colorself.name = nameself.positions.append(position[:])self.position_ = position[:]

这一次要多一点,但都很简单,在创作一个物体时当然需要很多数据!

计算

到目前为止,我们拥有了一个系统,拥有了可以创造物体的神
但它们不会动,这显然是无聊的,于是在系统中加入了

def work_power(self):for obj in self.objects:		# 遍历系统中的所有物体obj.power = []				# 把它们的受力情况清空if obj.speed == [0, 0]:		# 如果加速度为0,则跳过passelse:						# 否则将加速度变成力(物体的加速度可以看作一种力(根据F=am))obj.speed[0] = obj.speed[0] * obj.massobj.speed[1] = obj.speed[1] * obj.massobj.power.append(obj.speed)				# 把惯性力添加到受力情况中for o in self.objects:						# 遍历其他物体v0 = o.position[0] - obj.position[0]	# 算x轴上的距离v1 = o.position[1] - obj.position[1]	# 算y轴上的距离distance_2 = v0 ** 2 + v1 ** 2			# 算距离,根据勾股定理if distance_2 == 0:						# 如果距离为0,则不受力passelse:v0 *= G/distance_2*(obj.mass*o.mass)	# 根据万有引力公式算引力向量v1 *= G/distance_2*(obj.mass*o.mass)obj.power.append([v0, v1])				# 将引力添加到改物体的受力情况中

上面的代码算出了每个物体的受力情况
但合力却没有算…
那就再来个方法把!(在system类中)

def work_force(self):for obj in self.objects:		# 依然是遍历每个物体for n in range(len(obj.power) - 1):		# 遍历物体所受的每一个力f1 = obj.power[0]		# 把它们取出来f2 = obj.power[1]f_t = [f1[0]+f2[0], f1[1]+f2[1]]	# 根据合力的算法将合力算出来del obj.power[0]		# 把算过的的力删掉del obj.power[0]obj.power.append(f_t)	# 把合力添加进去obj.position[0] += obj.power[0][0]/obj.mass		# 将物体的位置沿合力的方向移动obj.position[1] += obj.power[0][1]/obj.massobj.speed = [obj.power[0][0]/obj.mass, obj.power[0][1]/obj.mass]	#将合力变为加速度

OK,计算部分也完成了
但,我们看不见啊,看不见慌的很啊!

显示

轨道的实现其实是pygame中aalines方法的作用,
通过收集最近经过的点绘制 “曲线”

def display(self, scr, show_orbit, length=500):		# 接受3个参数,scr就是pygame的screen, show_orbit则是是否显示轨道,length就是轨道的长度for obj in self.objects:		# 遍历遍历pygame.draw.circle(scr, obj.color, (int(obj.position[0]), int(obj.position[1])), obj.volume)	# 给我画下来!if show_orbit:				# 如果要显示的话obj.positions = obj.positions[:]obj.positions.insert(0, [int(obj.position[0]), int(obj.position[1])])	# 收集点pygame.draw.aalines(scr, obj.color, False, obj.positions, 3)			# 画轨道if len(obj.positions) > length:				# 让轨道在长度之后消失del obj.positions[-1]elif len(obj.positions) > len(self.objects):	# 解决一个互传问题if obj.position_ in obj.positions:for n in range(len(self.objects)):del obj.positions[-1]

除了图像,我们还需要一些数据:

def display_data(self, scr, c):font = pygame.font.SysFont("Consolas", 25)fps = font.render("FPS: "+str(round(c.get_fps(), 2)), False, (255, 255, 255))scr.blit(fps, (50, 50))if self.objects:for index, obj in enumerate(self.objects):pos = font.render(obj.name+": "+str(int(obj.position[0])) + "  " +str(int(obj.position[1])), False, (255, 255, 255))scr.blit(pos, (50, 80+index*35))

这里不再过多解释,可以自行百度

运行

完成一切后,
就可以疯狂的调用了
来一波四体运动!

universe = System("Earth University")earth = Objects("Earth", 1000, [0, 0], [200, 200], 5, [115, 15, 249])
sun = Objects("Sun", 1000, [0, 0], [500, 600], 5, [255, 0, 0])
moon = Objects("Moon", 1000, [0, 0], [500, 300], 5, [0, 255, 0])
mars = Objects("Mars", 1000, [0, 0], [600, 400], 5, [15, 215, 249])universe.add_object(earth)
universe.add_object(sun)
universe.add_object(moon)
universe.add_object(mars)universe.work_power()
universe.work_force()pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode([1500, 1200])
pygame.display.set_caption("Force")keep = Truewhile keep:for event in pygame.event.get():if event.type == pygame.QUIT:keep = Falsescreen.fill((0, 0, 0))universe.work_power()universe.work_force()universe.display(screen, True)universe.display_data(screen, clock)pygame.display.update()clock.tick(200)pygame.quit()

是不是超级简单啊?
OK,全部代码:

import pygame
"""
万有引力公式:
F = G * (m1*m2)/r**2
其中 F 为受某力的大小,m1,m2分别为两物体的质量,r为距离
牛顿第二定律:
F = am
a为加速度
m为物体质量
推导公式:
a = F/m
m = F/a
"""global G, PI
G = 6.754*0.00001
PI = 3.14159265358979323class System(object):name = ""objects = []def __init__(self, name):self.name = namedef add_object(self, obj):self.objects.append(obj)def work_power(self):for obj in self.objects:obj.power = []if obj.speed == [0, 0]:passelse:obj.speed[0] = obj.speed[0] * obj.massobj.speed[1] = obj.speed[1] * obj.massobj.power.append(obj.speed)for o in self.objects:v0 = o.position[0] - obj.position[0]v1 = o.position[1] - obj.position[1]distance_2 = v0 ** 2 + v1 ** 2if distance_2 == 0:passelse:v0 *= G/distance_2*(obj.mass*o.mass)v1 *= G/distance_2*(obj.mass*o.mass)obj.power.append([v0, v1])def work_force(self):for obj in self.objects:for n in range(len(obj.power) - 1):f1 = obj.power[0]f2 = obj.power[1]f_t = [f1[0]+f2[0], f1[1]+f2[1]]del obj.power[0]del obj.power[0]obj.power.append(f_t)obj.position[0] += obj.power[0][0]/obj.massobj.position[1] += obj.power[0][1]/obj.massobj.speed = [obj.power[0][0]/obj.mass, obj.power[0][1]/obj.mass]# print(obj.speed)def display(self, scr, show_orbit, length=500):for obj in self.objects:pygame.draw.circle(scr, obj.color, (int(obj.position[0]), int(obj.position[1])), obj.volume)if show_orbit:obj.positions = obj.positions[:]obj.positions.insert(0, [int(obj.position[0]), int(obj.position[1])])pygame.draw.aalines(scr, obj.color, False, obj.positions, 3)if len(obj.positions) > length:del obj.positions[-1]elif len(obj.positions) > len(self.objects):if obj.position_ in obj.positions:for n in range(len(self.objects)):del obj.positions[-1]def display_data(self, scr, c):font = pygame.font.SysFont("Consolas", 25)fps = font.render("FPS: "+str(round(c.get_fps(), 2)), False, (255, 255, 255))scr.blit(fps, (50, 50))if self.objects:for index, obj in enumerate(self.objects):pos = font.render(obj.name+": "+str(int(obj.position[0])) + "  " +str(int(obj.position[1])), False, (255, 255, 255))scr.blit(pos, (50, 80+index*35))class Objects(object):mass = 0        # 质量power = []      # 受到的力,矢量[大小,方向]speed = []      # 初速度,矢量[大小,方向]position = []   # 位置position_ = []  # 最初位置move_to = []    # 下一帧移动的距离,方向positions = []  # 所有的点volume = 0      # 体积color = []      # 颜色name = ""       # 名字def __init__(self, name, mass, speed, position, volume, color):self.mass = massself.position = positionself.volume = volumeself.speed = speedself.color = colorself.name = nameself.positions.append(position[:])self.position_ = position[:]universe = System("Earth University")earth = Objects("Earth", 1000, [0, 0], [200, 200], 5, [115, 15, 249])
sun = Objects("Sun", 1000, [0, 0], [500, 600], 5, [255, 0, 0])
moon = Objects("Moon", 1000, [0, 0], [500, 300], 5, [0, 255, 0])
mars = Objects("Mars", 1000, [0, 0], [600, 400], 5, [15, 215, 249])universe.add_object(earth)
universe.add_object(sun)
universe.add_object(moon)
universe.add_object(mars)universe.work_power()
universe.work_force()pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode([1500, 1200])
pygame.display.set_caption("Force")keep = Truewhile keep:for event in pygame.event.get():if event.type == pygame.QUIT:keep = Falsescreen.fill((0, 0, 0))universe.work_power()universe.work_force()universe.display(screen, True)universe.display_data(screen, clock)pygame.display.update()clock.tick(200)pygame.quit()

进阶

要实现V.1.0.10版就要添加功能:添加和移除物体
实际上就是添加一个方法:

    def set_object(self, scr, k):def draw_mesh(w, h, e, scr_, color):	# 画网格for n in range(0, w, e):pygame.draw.line(scr_, color, (n, 0), (n, h))for n in range(0, h, e):pygame.draw.line(scr_, color, (0, n), (w, n))for n in range(0, w, e * 10):pygame.draw.line(scr_, (255, 255, 255), (n, 0), (n, h), 1)for n in range(0, h, e * 10):pygame.draw.line(scr_, (255, 255, 255), (0, n), (w, n), 1)def draw_mouse(scr_):pygame.draw.line(scr_, (255, 0, 0), (x, 0), (x, 800), 2)pygame.draw.line(scr_, (255, 0, 0), (0, y), (1000, y), 2)def display_data(scr_, mx, my):font_ = pygame.font.SysFont("Consolas", 25)pos = font_.render("Pos: " + str(mx) + "  " + str(my), False, (255, 255, 255))scr_.blit(pos, (50, 50))def adding_mode(x_, y_):def name_it():self.name_ = input("Please name the object")named = Thread(target=name_it)named.start()while True:for event__ in pygame.event.get():if event__.type == pygame.QUIT:breakscr.fill((0, 0, 0))pygame.mouse.set_visible(True)# 画数据font_ = pygame.font.SysFont("Consolas", 25)fun_ = font_.render("Enter Object's name", False, (155, 155, 255))scr.blit(fun_, (550, 50))if self.name_ != "":new_object = Objects(self.name_, 1000, [0, 0], [x_, y_], 5, [random.randint(55, 255),random.randint(55, 255),random.randint(55, 255)])self.add_object(new_object)self.name_ = ""breakif k[pygame.K_a]:while True:for event_ in pygame.event.get():if event_.type == pygame.QUIT:breakscr.fill((0, 0, 0))pygame.mouse.set_visible(False)     # 隐藏鼠标# 画网格x, y = pygame.mouse.get_pos()screen.fill((0, 0, 0))draw_mesh(1000, 800, 20, screen, (110, 110, 110))draw_mouse(scr)display_data(scr, x, y)# 画数据font = pygame.font.SysFont("Consolas", 25)fun = font.render("Press 'q' to stop adding", False, (155, 155, 255))scr.blit(fun, (550, 50))k = pygame.key.get_pressed()if pygame.mouse.get_pressed()[0] == 1:adding_mode(x, y)# 退出添加模式if k[pygame.K_q]:pygame.mouse.set_visible(True)      # 显示鼠标breakpygame.display.update()elif k[pygame.K_m]:f = Falseindex = -1def name_it_():self.name_ = input("Please enter the object's name")named_ = Thread(target=name_it_)named_.start()while True:for event___ in pygame.event.get():if event___.type == pygame.QUIT:breakscr.fill((0, 0, 0))pygame.mouse.set_visible(True)# 画数据font__ = pygame.font.SysFont("Consolas", 25)fun__ = font__.render("Enter Object's name", False, (155, 155, 255))scr.blit(fun__, (550, 50))if self.name_ != "":for n_ in self.objects:index += 1if n_.name == self.name_:f = Truedel self.objects[index]if f:print("Find it and remove it!")else:print("None!")self.name_ = ""breakpygame.display.update()

代码很好理解,就不再赘述
Ok,放V1.0.10版全部代码

import pygame, random
from threading import Thread
"""
万有引力公式:
F = G * (m1*m2)/r**2
其中 F 为受某力的大小,m1,m2分别为两物体的质量,r为距离
牛顿第二定律:
F = am
a为加速度
m为物体质量
推导公式:
a = F/m
m = F/a
"""
G, PI = 6.754*0.00001, 3.14159265358979323class System(object):name = ""objects = []name_ = ""def __init__(self, name):self.name = namedef add_object(self, obj):self.objects.append(obj)def work_power(self):for obj in self.objects:obj.power = []if obj.speed == [0, 0]:passelse:obj.speed[0] = obj.speed[0] * obj.massobj.speed[1] = obj.speed[1] * obj.massobj.power.append(obj.speed)for o in self.objects:v0 = o.position[0] - obj.position[0]v1 = o.position[1] - obj.position[1]distance_2 = v0 ** 2 + v1 ** 2if distance_2 == 0:passelse:v0 *= G/distance_2*(obj.mass*o.mass)v1 *= G/distance_2*(obj.mass*o.mass)obj.power.append([v0, v1])def work_force(self):for obj in self.objects:for n in range(len(obj.power) - 1):f1 = obj.power[0]f2 = obj.power[1]f_t = [f1[0]+f2[0], f1[1]+f2[1]]del obj.power[0]del obj.power[0]obj.power.append(f_t)obj.position[0] += obj.power[0][0]/obj.massobj.position[1] += obj.power[0][1]/obj.massobj.speed = [obj.power[0][0]/obj.mass, obj.power[0][1]/obj.mass]# print(obj.speed)def display(self, scr, show_orbit, length=500):for obj in self.objects:pygame.draw.circle(scr, obj.color, (int(obj.position[0]), int(obj.position[1])), obj.volume)if show_orbit:obj.positions = obj.positions[:]obj.positions.insert(0, [int(obj.position[0]), int(obj.position[1])])pygame.draw.aalines(scr, obj.color, False, obj.positions, 3)if len(obj.positions) > length:del obj.positions[-1]elif len(obj.positions) > len(self.objects):if obj.position_ in obj.positions:for n in range(len(self.objects)):del obj.positions[-1]def display_data(self, scr, c):font = pygame.font.SysFont("Consolas", 25)fps = font.render("FPS: "+str(round(c.get_fps(), 2)), False, (255, 255, 255))fun = font.render("Press 'a' to add a object", False, (155, 155, 255))scr.blit(fun, (550, 50))fun = font.render("Press 'm' to remove a object", False, (155, 155, 255))scr.blit(fun, (550, 100))scr.blit(fps, (50, 50))if self.objects:for index, obj in enumerate(self.objects):pos = font.render(obj.name+": "+str(int(obj.position[0])) + "  " +str(int(obj.position[1])), False, (255, 255, 255))scr.blit(pos, (50, 80+index*35))def set_object(self, scr, k):def draw_mesh(w, h, e, scr_, color):for n in range(0, w, e):pygame.draw.line(scr_, color, (n, 0), (n, h))for n in range(0, h, e):pygame.draw.line(scr_, color, (0, n), (w, n))for n in range(0, w, e * 10):pygame.draw.line(scr_, (255, 255, 255), (n, 0), (n, h), 1)for n in range(0, h, e * 10):pygame.draw.line(scr_, (255, 255, 255), (0, n), (w, n), 1)def draw_mouse(scr_):pygame.draw.line(scr_, (255, 0, 0), (x, 0), (x, 800), 2)pygame.draw.line(scr_, (255, 0, 0), (0, y), (1000, y), 2)def display_data(scr_, mx, my):font_ = pygame.font.SysFont("Consolas", 25)pos = font_.render("Pos: " + str(mx) + "  " + str(my), False, (255, 255, 255))scr_.blit(pos, (50, 50))def adding_mode(x_, y_):def name_it():self.name_ = input("Please name the object")named = Thread(target=name_it)named.start()while True:for event__ in pygame.event.get():if event__.type == pygame.QUIT:breakscr.fill((0, 0, 0))pygame.mouse.set_visible(True)# 画数据font_ = pygame.font.SysFont("Consolas", 25)fun_ = font_.render("Enter Object's name", False, (155, 155, 255))scr.blit(fun_, (550, 50))if self.name_ != "":new_object = Objects(self.name_, 1000, [0, 0], [x_, y_], 5, [random.randint(55, 255),random.randint(55, 255),random.randint(55, 255)])self.add_object(new_object)self.name_ = ""breakif k[pygame.K_a]:while True:for event_ in pygame.event.get():if event_.type == pygame.QUIT:breakscr.fill((0, 0, 0))pygame.mouse.set_visible(False)     # 隐藏鼠标# 画网格x, y = pygame.mouse.get_pos()screen.fill((0, 0, 0))draw_mesh(1000, 800, 20, screen, (110, 110, 110))draw_mouse(scr)display_data(scr, x, y)# 画数据font = pygame.font.SysFont("Consolas", 25)fun = font.render("Press 'q' to stop adding", False, (155, 155, 255))scr.blit(fun, (550, 50))k = pygame.key.get_pressed()if pygame.mouse.get_pressed()[0] == 1:adding_mode(x, y)# 退出添加模式if k[pygame.K_q]:pygame.mouse.set_visible(True)      # 显示鼠标breakpygame.display.update()elif k[pygame.K_m]:f = Falseindex = -1def name_it_():self.name_ = input("Please enter the object's name")named_ = Thread(target=name_it_)named_.start()while True:for event___ in pygame.event.get():if event___.type == pygame.QUIT:breakscr.fill((0, 0, 0))pygame.mouse.set_visible(True)# 画数据font__ = pygame.font.SysFont("Consolas", 25)fun__ = font__.render("Enter Object's name", False, (155, 155, 255))scr.blit(fun__, (550, 50))if self.name_ != "":for n_ in self.objects:index += 1if n_.name == self.name_:f = Truedel self.objects[index]if f:print("Find it and remove it!")else:print("None!")self.name_ = ""breakpygame.display.update()class Objects(object):mass = 0        # 质量power = []      # 受到的力,矢量[大小,方向]speed = []      # 初速度,矢量[大小,方向]position = []   # 位置position_ = []  # 最初位置move_to = []    # 下一帧移动的距离,方向positions = []  # 所有的点volume = 0      # 体积color = []      # 颜色name = ""       # 名字def __init__(self, name, mass, speed, position, volume, color):self.mass = massself.position = positionself.volume = volumeself.speed = speedself.color = colorself.name = nameself.positions.append(position[:])self.position_ = position[:]universe = System("Earth University")universe.work_power()
universe.work_force()pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode([1000, 800])
pygame.display.set_caption("Force")keep = Truewhile keep:for event in pygame.event.get():if event.type == pygame.QUIT:keep = Falsescreen.fill((0, 0, 0))universe.work_power()universe.work_force()universe.display(screen, True)universe.display_data(screen, clock)pygame.display.update()clock.tick(200)key = pygame.key.get_pressed()universe.set_object(screen, key)pygame.quit()

转载请声明来处.

这篇关于pygame 实现三体运动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/191637

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机