Python笔记14-实战小游戏飞机大战(上)

文章目录

  • 功能规划
  • 安装pygame
  • 绘制游戏窗口
  • 添加玩家飞机图像
  • 屏幕上绘制飞船
  • 代码重构
  • 驾驶飞船
  • 全屏模式
  • 射击

本示例源码地址 点击下载

功能规划

玩家控制一艘最初出现在屏幕底部中央的飞船。玩家可以使用箭头键左右移动飞船,还可使用空格键射击。游戏开始时,一群外星人出现在天空中,并向屏幕下方移动。玩家的任务是射杀这些外星人。玩家将所有外星人都消灭干净后,将出现一群新的外星人,其移动速度更快。只要有外星人撞到玩家的飞船或到达屏幕底部,玩家就损失一艘飞船。玩家损失三艘飞船后,游戏结束。

第一阶段将为玩家创建一艘飞船,它可左右移动,并且能在用户按空格键时开火。
第二阶段生成一群外星人。然后让这群外星人向两边和下面移动,并删除被子弹击中的外星人。示玩家拥有的飞船数量,并在玩家的飞船
用完后结束游戏
第三阶段添加一个Play按钮,让玩家能够开始游戏,以及在游戏结束后重玩。每当玩家消灭一群外星人后,我们都将加快游戏的节奏,并添加一个记分系统

安装pygame

Pygame是一组功能强大而有趣的模块,可用于管理图形、动画乃至声音,让你能够更轻松地开发复杂的游戏
执行如下命令安装pygame

C:\Users\eric>python -m pip install --user pygame
Collecting pygameObtaining dependency information for pygame from https://files.pythonhosted.org/packages/82/61/93ae7afbd931a70510cfdf0a7bb0007540020b8d80bc1d8762ebdc46479b/pygame-2.5.2-cp311-cp311-win_amd64.whl.metadataDownloading pygame-2.5.2-cp311-cp311-win_amd64.whl.metadata (13 kB)
Downloading pygame-2.5.2-cp311-cp311-win_amd64.whl (10.8 MB)---- ----------------------------------- 1.2/10.8 MB 20.4 kB/s eta 0:07:49 ---------------------------------------- 10.8/10.8 MB 14.7 kB/s eta 0:00:00
Installing collected packages: pygame
Successfully installed pygame-2.5.2
[notice] A new release of pip is available: 23.2.1 -> 23.3.2
[notice] To update, run: python.exe -m pip install --upgrade pip

绘制游戏窗口

建空的Pygame窗口。为此,在文本编辑器中新建一个文件,将其保存为alien_invasion.py,代码如下

import sys
import pygame
class AlienInvasion:"""管理游戏资源和行为的类"""def __init__(self):"""初始化游戏并创建游戏资源。"""pygame.init()self.screen = pygame.display.set_mode((1200, 800))pygame.display.set_caption("Alien Invasion")def run_game(self):"""开始游戏的主循环"""while True:# 监视键盘和鼠标事件。for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()# 让最近绘制的屏幕可见pygame.display.flip()if __name__ == '__main__':# 创建游戏实例并运行游戏。ai = AlienInvasion()ai.run_game()

运行可以看到个黑色屏幕窗口如下:
在这里插入图片描述
给游戏添加新功能时,通常也将引入一些新设置。下面来编写一个名为settings 的模块,在其中包含一个名为Settings 的类,用于将所有设置都存储在一个地方,以免在代码中到处添加设置。这样,每当需要访问设置时,只需使用一个设置对象。另外,在项目增大时,这使得修改游戏的外观和行为更容易:要修改游戏,只需修改(接下来将创建的)settings.py中的一些值,而无须查找散布在项目中的各种设置。

class Settings:"""存储游戏《外星人入侵》中所有设置的类"""def __init__(self):"""初始化游戏的设置。"""# 屏幕设置self.screen_width = 1200self.screen_height = 800self.bg_color = (230, 230, 230)

修改原来的窗口代码,并使用settings中的配置项设置背景颜色,宽度 高度

import sys
import pygame
from settings import Settings
class AlienInvasion:"""管理游戏资源和行为的类"""def __init__(self):"""初始化游戏并创建游戏资源。"""pygame.init()self.settings = Settings()self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))pygame.display.set_caption("Alien Invasion")def run_game(self):"""开始游戏的主循环"""while True:# 每次循环时都重绘屏幕。self.screen.fill(self.settings.bg_color)# 监视键盘和鼠标事件。for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()# 让最近绘制的屏幕可见pygame.display.flip()if __name__ == '__main__':# 创建游戏实例并运行游戏。ai = AlienInvasion()ai.run_game()

运行效果
在这里插入图片描述

添加玩家飞机图像

下面将飞船加入游戏中。为了在屏幕上绘制玩家的飞船,我们将加载一幅图像,再使用Pygame方法blit() 绘制它。为游戏选择素材时,务必要注意许可。最安全、最不费钱的方式是使用Pixabay等网站提供的免费图形,无须授权许可即可使用并修改。
我们使用如下图片
在这里插入图片描述

选择用于表示飞船的图像后,需要将其显示到屏幕上。我们创建一个名为ship 的模块,其中包含Ship 类,负责管理飞船的大部分行为。

import pygame
class Ship:"""管理飞船的类ai_game参数就是游戏窗口对象"""def __init__(self, ai_game):"""初始化飞船并设置其初始位置。"""self.screen = ai_game.screenself.screen_rect = ai_game.screen.get_rect()# 加载飞船图像并获取其外接矩形。self.image = pygame.image.load('images/me1.png')self.rect = self.image.get_rect()# 对于每艘新飞船,都将其放在屏幕底部的中央。 这里通过飞穿图像 和 游戏窗口图像 的中间位置相等,来实现放在中间self.rect.midbottom = self.screen_rect.midbottomdef blitme(self):"""在指定位置绘制飞船。"""self.screen.blit(self.image, self.rect)#绘制图像

Pygame之所以高效,是因为它让你能够像处理矩形(rect 对象)一样处理所有的游戏元素,即便其形状并非矩形。像处理矩形一样处理游戏元素之所以高效,是因为矩形是简单的几何形状。例如,通过将游戏元素视为矩形,Pygame能够更快地判断出它们是否发生了碰撞。这种做法的效果通常很好,游戏玩家几乎注意不到我们处理的并不是游戏元素的实际形状。在这个类中,我们将把飞船和屏幕作为矩形进行处理。

屏幕上绘制飞船

创建一艘飞船并调用其方法blitme()代码如下:

import sys
import timeimport pygame
from settings import Settings
from ship import Shipclass AlienInvasion:"""管理游戏资源和行为的类"""def __init__(self):"""初始化游戏并创建游戏资源。"""pygame.init()self.settings = Settings()self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))pygame.display.set_caption("Alien Invasion")self.ship = Ship(self)def run_game(self):"""开始游戏的主循环"""while True:# 每次循环时都重绘屏幕。self.screen.fill(self.settings.bg_color)self.ship.blitme()# 绘制飞船# 监视键盘和鼠标事件。for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()# 让最近绘制的屏幕可见pygame.display.flip()time.sleep(0.05) #设置每50ms刷新一次if __name__ == '__main__':# 创建游戏实例并运行游戏。ai = AlienInvasion()ai.run_game()

运行效果
在这里插入图片描述

代码重构

在大型项目中,经常需要在添加新代码前重构既有代码。重构旨在简化既有代码的结构,使其更容易扩展。本节将把越来越长的方法run_game() 拆分成两个辅助方法(helper method)。辅助方法 在类中执行任务,但并非是通过实例调用的。在Python中,辅助方法的名称以单个下划线打头。
把管理事件的代码移到一个名为_check_events() 的方法中,以简化run_game() 并隔离事件管理循环。通过隔离事件循环,可将事件管理与游戏的其他方面(如更新屏幕)分离
简化run_game() ,将更新屏幕的代码移到一个名为_update_screen() 的方法中:

import sys
import timeimport pygame
from settings import Settings
from ship import Shipclass AlienInvasion:"""管理游戏资源和行为的类"""def __init__(self):"""初始化游戏并创建游戏资源。"""pygame.init()self.settings = Settings()self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))pygame.display.set_caption("Alien Invasion")self.ship = Ship(self)def run_game(self):"""开始游戏的主循环"""while True:#检测事件self._check_events()# 每次循环时都重绘屏幕。self._update_screen()time.sleep(0.05) #设置每50ms刷新一次def _check_events(self):"""响应按键和鼠标事件。"""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()def _update_screen(self):"""更新屏幕上的图像,并切换到新屏幕。"""self.screen.fill(self.settings.bg_color)self.ship.blitme()pygame.display.flip()if __name__ == '__main__':# 创建游戏实例并运行游戏。ai = AlienInvasion()ai.run_game()

驾驶飞船

每当用户按键时,都将在Pygame中注册一个事件。事件都是通过方法pygame.event.get() 获取的,因此需要在方法_check_events() 中指定要检查哪些类型的事件。每次按键都被注册为一个KEYDOWN 事件。
玩家按住右箭头键不放时,我们希望飞船不断向右移动,直到玩家松开为止。我们将让游戏检测pygame.KEYUP 事件,以便知道玩家何时松开右箭头键。然后,结合使用KEYDOWN 和KEYUP 事件以及一个名为moving_right 的标志来实现持续移动,当标志moving_right 为False 时,飞船不会移动。玩家按下右箭头键时,我们将该标志设置为True ,在玩家松开时将该标志重新设置为False 。
飞船的属性都由Ship 类控制,因此要给这个类添加一个名为moving_right 的属性和一个名为update() 的方法。方法update() 检查标志moving_right 的状态。如果该标志为True ,就调整飞船的位置。我们将在while 循环中调用这个方法,以调整飞船的位置。

import pygame
class Ship:"""管理飞船的类ai_game参数就是游戏窗口对象"""def __init__(self, ai_game):"""初始化飞船并设置其初始位置。"""self.screen = ai_game.screenself.screen_rect = ai_game.screen.get_rect()# 加载飞船图像并获取其外接矩形。self.image = pygame.image.load('images/me1.png')self.rect = self.image.get_rect()# 对于每艘新飞船,都将其放在屏幕底部的中央。 这里通过飞穿图像 和 游戏窗口图像 的中间位置相等,来实现放在中间self.rect.midbottom = self.screen_rect.midbottom# 移动标志。self.moving_right = Falseself.moving_left = Falsedef update(self):"""根据移动标志调整飞船的位置。"""if self.moving_right:self.rect.x += 1if self.moving_left:self.rect.x -= 1def blitme(self):"""在指定位置绘制飞船。"""self.screen.blit(self.image, self.rect)#绘制图像

修改_check_events() ,使其在玩家按下右箭头键时将moving_right 设置为True ,并在玩家松开时将moving_right 设置为False
向左移动的逻辑和向右相同

   import sys
import timeimport pygame
from settings import Settings
from ship import Shipclass AlienInvasion:"""管理游戏资源和行为的类"""def __init__(self):"""初始化游戏并创建游戏资源。"""pygame.init()self.settings = Settings()self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))pygame.display.set_caption("Alien Invasion")self.ship = Ship(self)def run_game(self):"""开始游戏的主循环"""while True:#检测事件self._check_events()#更新飞船位置self.ship.update()# 每次循环时都重绘屏幕。self._update_screen()time.sleep(0.05) #设置每50ms刷新一次def _check_events(self):"""响应按键和鼠标事件。"""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_RIGHT:self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:self.ship.moving_left = Trueelif event.type == pygame.KEYUP:if event.key == pygame.K_RIGHT:self.ship.moving_right = Falseelif event.key == pygame.K_LEFT:self.ship.moving_left = Falsedef _update_screen(self):"""更新屏幕上的图像,并切换到新屏幕。"""self.screen.fill(self.settings.bg_color)self.ship.blitme()pygame.display.flip()if __name__ == '__main__':# 创建游戏实例并运行游戏。ai = AlienInvasion()ai.run_game()

运行 可以左右移动飞船了

目前飞船每次移动1像素,在Settings 类中添加属性ship_speed ,用于控制飞船的速度。我们将根据这个属性决定飞船在每次循环时最多移动多远。下面演示了如何在settings.py中添加这个新属性:

class Settings:"""存储游戏《外星人入侵》中所有设置的类"""def __init__(self):"""初始化游戏的设置。"""# 屏幕设置self.screen_width = 1200self.screen_height = 800self.bg_color = (230, 230, 230)#飞船移动速度self.ship_speed =5

修改 飞船 类代码,按照配置中的速度 移动飞船,支持小数设置,同时限制飞船的移动范围

import pygame
from settings import Settings
class Ship:"""管理飞船的类ai_game参数就是游戏窗口对象"""def __init__(self, ai_game):"""初始化飞船并设置其初始位置。"""self.screen = ai_game.screenself.screen_rect = ai_game.screen.get_rect()# 加载飞船图像并获取其外接矩形。self.image = pygame.image.load('images/me1.png')self.rect = self.image.get_rect()# 对于每艘新飞船,都将其放在屏幕底部的中央。 这里通过飞穿图像 和 游戏窗口图像 的中间位置相等,来实现放在中间self.rect.midbottom = self.screen_rect.midbottom# 在飞船的属性x中存储小数值。self.x = float(self.rect.x)self.settings = ai_game.settings# 移动标志。self.moving_right = Falseself.moving_left = Falsedef update(self):"""根据移动标志调整飞船的位置。"""# 更新飞船而不是rect对象的x值。if self.moving_right and self.rect.right < self.screen_rect.right:self.x += self.settings.ship_speedif self.moving_left and self.rect.left >0:self.x -= self.settings.ship_speed# 根据self.x更新rect对象。 自动转成int型self.rect.x = self.xdef blitme(self):"""在指定位置绘制飞船。"""self.screen.blit(self.image, self.rect)#绘制图像

运行发现飞船的速度可以调整,而且飞船只能在屏幕范围内移动

拆分 _check_events方法,将keyup 和 keydown 事件处理分开,并增加按F1退出的事件监听

  def _check_events(self):"""响应按键和鼠标事件。"""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:self._check_keydown_events(self, event)elif event.type == pygame.KEYUP:self._check_keyup_events(self, event)def _check_keydown_events(self, event):"""响应按键。"""if event.key == pygame.K_RIGHT:self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:self.ship.moving_left = Trueelif event.key == pygame.K_F1: #按F1 退出sys.exit()def _check_keyup_events(self, event):"""响应松开。"""if event.key == pygame.K_RIGHT:self.ship.moving_right = Falseelif event.key == pygame.K_LEFT:self.ship.moving_left = False

全屏模式

Pygame支持全屏模式,你可能会更喜欢在这种模式下而非常规窗口中运行游戏。有些游戏在全屏模式下看起来更舒服,而在macOS系统中用全屏模式运行会提升性能。要在全屏模式下运行该游戏,可在__init__() 中做如下修改:

class AlienInvasion:"""管理游戏资源和行为的类"""def __init__(self):"""初始化游戏并创建游戏资源。"""pygame.init()self.settings = Settings()self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)self.settings.screen_width = self.screen.get_rect().widthself.settings.screen_height = self.screen.get_rect().height# self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))pygame.display.set_caption("Alien Invasion")self.ship = Ship(self)

射击

更新settings.py,在方法__init__() 末尾存储新类Bullet所需的值,创建宽3像素、高15像素的深灰色子弹。子弹的速度比飞船稍低

#子弹设置
self.bullet_speed = 1.0
self.bullet_width = 3
self.bullet_height = 15
self.bullet_color = (60, 60, 60)

Bullet 类继承了从模块pygame.sprite 导入的Sprite 类。通过使用精灵(sprite),可将游戏中相关的元素编组,进而同时操作编组中的所有元素。为创建子弹实例,init() 需要当前的AlienInvasion 实例,我们还调用了super() 来继承Sprite 。另外,我们还定义了用于存储屏幕以及设置对象和子弹颜色的属性。

import pygame
from pygame.sprite import Sprite
class Bullet(Sprite):"""管理飞船所发射子弹的类"""def __init__(self, ai_game):"""在飞船当前位置创建一个子弹对象。"""super().__init__()self.screen = ai_game.screenself.settings = ai_game.settingsself.color = self.settings.bullet_color#在(0,0)处创建一个表示子弹的矩形,再设置正确的位置。self.rect = pygame.Rect(0, 0, self.settings.bullet_width,self.settings.bullet_height)self.rect.midtop = ai_game.ship.rect.midtop# 存储用小数表示的子弹位置。self.y = float(self.rect.y)def update(self):"""向上移动子弹。"""# 更新表示子弹位置的小数值。self.y -= self.settings.bullet_speed# 更新表示子弹的rect的位置。self.rect.y = self.ydef draw_bullet(self):"""在屏幕上绘制子弹。"""pygame.draw.rect(self.screen, self.color, self.rect)

定义Bullet 类和必要的设置后,便可编写代码在玩家每次按空格键时都射出一发子弹了。我们将在AlienInvasion 中创建一个编组(group),用于存储所有有效的子弹,以便管理发射出去的所有子弹。这个编组是pygame.sprite.Group 类的一个实例。pygame.sprite.Group 类似于列表,但提供了有助于开发游戏的额外功能。在主循环中,将使用这个编组在屏幕上绘制子弹以及更新每颗子弹的位置。
在这里插入图片描述
后在while 循环中更新子弹的位置

    def run_game(self):"""开始游戏的主循环"""while True:#检测事件self._check_events()#更新飞船位置self.ship.update()#更新子弹"""对编组调用update() 时,编组自动对其中的每个精灵调用update() 。因此代码行bullets.update() 将为编组bullets中的每颗子弹调用bullet.update()"""self.bullets.update()# 每次循环时都重绘屏幕。self._update_screen()time.sleep(0.05) #设置每50ms刷新一次

发射
在AlienInvasion 中,需要修改_check_keydown_events() ,以便在玩家按空格键时发射一颗子弹,此编写一个新方法_fire_bullet() 来完成这项任务

    def _check_keydown_events(self, event):"""响应按键。"""if event.key == pygame.K_RIGHT:self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:self.ship.moving_left = Trueelif event.key == pygame.K_F1: #按F1 退出sys.exit()elif event.key == pygame.K_SPACE: # 空格发射子弹self._fire_bullet()def _fire_bullet(self):"""创建一颗子弹,并将其加入编组bullets中。"""new_bullet = Bullet(self)self.bullets.add(new_bullet)def _update_screen(self):"""更新屏幕上的图像,并切换到新屏幕。"""self.screen.fill(self.settings.bg_color)self.ship.blitme()for bullet in self.bullets.sprites():bullet.draw_bullet()pygame.display.flip()

删除子弹
子弹在抵达屏幕顶端后消失,但这仅仅是因为Pygame无法在屏幕外面绘制它们。这些子弹实际上依然存在,其 坐标为负数且越来越小。这是个问题,因为它们将继续消耗内存和处理能力

def run_game(self):"""开始游戏的主循环"""while True:#检测事件self._check_events()#更新飞船位置self.ship.update()#更新子弹"""对编组调用update() 时,编组自动对其中的每个精灵调用update() 。因此代码行bullets.update() 将为编组bullets中的每颗子弹调用bullet.update()"""self.bullets.update()# 删除消失的子弹。for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)print(len(self.bullets))# 每次循环时都重绘屏幕。self._update_screen()time.sleep(0.05) #设置每50ms刷新一次

限制子弹数量
很多射击游戏对可同时出现在屏幕上的子弹数量进行了限制,以鼓励玩家有目标地射击

在settings.py中存储最大子弹数

 self.bullets_allowed = 3

在创建新子弹前检查未消失的子弹数是否小于该设置

    def _fire_bullet(self):"""创建一颗子弹,并将其加入编组bullets中。"""if len(self.bullets) < self.settings.bullets_allowed:new_bullet = Bullet(self)self.bullets.add(new_bullet)

创建一个名为_update_bullets() 的新方法,存放子弹管理的逻辑,完整代码如下

import sys
import timeimport pygame
from settings import Settings
from ship import Ship
from bullet import Bulletclass AlienInvasion:"""管理游戏资源和行为的类"""def __init__(self):"""初始化游戏并创建游戏资源。"""pygame.init()self.settings = Settings()#全屏模式代码# self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)# self.settings.screen_width = self.screen.get_rect().width# self.settings.screen_height = self.screen.get_rect().height#非全屏模式self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))pygame.display.set_caption("Alien Invasion")self.ship = Ship(self)self.bullets = pygame.sprite.Group()def run_game(self):"""开始游戏的主循环"""while True:#检测事件self._check_events()#更新飞船位置self.ship.update()#更新子弹"""对编组调用update() 时,编组自动对其中的每个精灵调用update() 。因此代码行bullets.update() 将为编组bullets中的每颗子弹调用bullet.update()"""self._update_bullets()# 每次循环时都重绘屏幕。self._update_screen()time.sleep(0.05) #设置每50ms刷新一次def _update_bullets(self):"""更新子弹的位置并删除消失的子弹。"""# 更新子弹的位置。self.bullets.update()# 删除消失的子弹。for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)def _check_events(self):"""响应按键和鼠标事件。"""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:self._check_keydown_events( event)elif event.type == pygame.KEYUP:self._check_keyup_events( event)def _check_keydown_events(self, event):"""响应按键。"""if event.key == pygame.K_RIGHT:self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:self.ship.moving_left = Trueelif event.key == pygame.K_F1: #按F1 退出sys.exit()elif event.key == pygame.K_SPACE: # 空格发射子弹self._fire_bullet()def _fire_bullet(self):"""创建一颗子弹,并将其加入编组bullets中。"""if len(self.bullets) < self.settings.bullets_allowed:new_bullet = Bullet(self)self.bullets.add(new_bullet)def _check_keyup_events(self, event):"""响应松开。"""if event.key == pygame.K_RIGHT:self.ship.moving_right = Falseelif event.key == pygame.K_LEFT:self.ship.moving_left = Falsedef _update_screen(self):"""更新屏幕上的图像,并切换到新屏幕。"""self.screen.fill(self.settings.bg_color)self.ship.blitme()for bullet in self.bullets.sprites():bullet.draw_bullet()pygame.display.flip()if __name__ == '__main__':# 创建游戏实例并运行游戏。ai = AlienInvasion()ai.run_game()

运行之后可以发射子弹了,并且最多三个子弹
在这里插入图片描述

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

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

相关文章

1948-2022年金融许可信息明细数据

1948-2022年金融许可信息明细数据 1、时间&#xff1a;1948-2022年 2、来源&#xff1a;银监会&#xff08;银监会许可证发布系统&#xff09; 3、指标&#xff1a;来源表、机构编码、机构名称、所属银行、机构类型、业务范围、机构住所、地理坐标、行政区划代码、所属区县、…

Leetcode—2942. 查找包含给定字符的单词【简单】

2023每日刷题&#xff08;一零一&#xff09; Leetcode—2942. 查找包含给定字符的单词 实现代码 class Solution { public:vector<int> findWordsContaining(vector<string>& words, char x) {vector<int> ans;for(int i 0; i < words.size(); i)…

【Linux】动态库和静态库——动态库和静态库的打包和使用、gcc编译、拷贝到系统默认的路径、建立软连接

文章目录 动态库和静态库1.静态库和动态库的介绍2.静态库的打包和使用2.1生成静态库2.2使用静态库的三种方式2.2.1gcc编译2.2.2拷贝到系统默认的路径2.2.3建立软连接 3.动态库的打包和使用3.1生成动态库3.2使用动态库3.3解决加载不到动态库的方法 动态库和静态库 1.静态库和动…

linux 下scrcpy 手机投屏到电脑,QT+ffmpeg 获取视频流,处理等等

linux 下scrcpy 手机投屏到电脑,QT+ffmpeg 获取视频流,处理 1 安装 scrcpy 地址 https://github.com/Genymobile/scrcpy 转到 relese 下载 我这里下载的是linux系统 v2.3.1 版本 scrcpy-2.3.1.tar.gz 下载 scrcpy-server v2.3.1 版本 scrcpy-server-v2.3.1 解压scrcpy-2.3…

林浩然的奇幻编程之旅:幽默探索图灵的智慧宇宙

林浩然的奇幻编程之旅&#xff1a;幽默探索图灵的智慧宇宙 Lin Haoran’s Fantastical Coding Journey: Humorous Exploration of Turing’s Intelligent Universe 林浩然&#xff0c;一个对计算机科学怀揣着无尽好奇的探索者&#xff0c;像一只闯入魔法森林的小狐狸&#xff0…

网安培训第二期——sql注入+中间件+工具

文章目录 宽字节注入插入注入二次注入PDO模式(动态靶机&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;)sql注入读取文件sql注入导出文件linux命令 10.12笔记sqlmapsqlmap参数 10.13笔记sqlmap 文件读写前后缀常用tamper及适用场景 10.…

Excel·VBA时间范围筛选及批量删除整行

看到一个帖子《excel吧-筛选开始时间&#xff0c;结束时间范围内的所有记录》&#xff0c;根据条件表中的开始时间和结束时间构成的时间范围&#xff0c;对数据表中的开始时间和结束时间范围内的数据进行筛选 目录 批量删除整行&#xff0c;整体删除批量删除整行&#xff0c;分…

多维时序 | Matlab实现DBO-LSTM蜣螂算法优化长短期记忆神经网络多变量时间序列预测

多维时序 | Matlab实现DBO-LSTM蜣螂算法优化长短期记忆神经网络多变量时间序列预测 目录 多维时序 | Matlab实现DBO-LSTM蜣螂算法优化长短期记忆神经网络多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现DBO-LSTM多变量时间序列预测&#x…

关机恶搞小程序

1. system("shutdown")的介绍 当system函数的参数是"shutdown"时&#xff0c;它将会执行系统的关机命令。 具体来说&#xff0c;system("shutdown")的功能是向操作系统发送一个关机信号&#xff0c;请求关闭计算机。这将触发操作系统执行一系列…

vscode的扩展商店使用时报错 XHR failed

文章目录 前言解决扩展商店的使用github的相关问题 前言 这几天使用vscode扩展商店安装插件时发现一搜索就报错&#xff0c;网上搜了一些解决方法&#xff0c;看起来不大靠谱。而且用了好几年了vscode都没出现过这个问题&#xff0c;感觉是网络问题。 解决扩展商店的使用 首先…

用 CanvasKit 实现超级丝滑的原神地图(已开源)!!!

首先给大家送上预览地址&#xff1a; 官网地址&#xff1a;https://webstatic.mihoyo.com/ys/app/interactive-map/index.html canvaskit地址&#xff1a;http://106.55.55.247/ky-genshin-map/ 为什么 canvaskit 有如此高的性能&#xff1f; 第一个问题&#xff0c;官方网页…

JVM性能分析工具——Arthas及火焰图的使用

Arthas的使用 Arthas常用命令Arthas的安装Linux压测工具Apache Bench安装火焰图的使用火焰图如何分析火焰图的互动 Arthas常用命令 help &#xff1a;查看所有命令dashboard &#xff1a;仪表板&#xff0c;查看线程的CPU信息等heapdump &#xff1a;不同类对象占用内存比重&a…

python算法与数据结构---滑动窗口双指针

学习目标 了解滑动窗口的基本原理&#xff1b;学会用使用python语言解答滑动窗口经典题目&#xff1b;了解双指针的基本原理&#xff1b;学会使用python语言解答双指针经典题目&#xff1b; 滑动窗口 209. 长度最小的子数组 https://leetcode.cn/problems/minimum-size-sub…

初识人工智能,一文读懂机器学习之逻辑回归知识文集(6)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

深入理解TCP网络协议(1)

目录 1.TCP协议的段格式 2.TCP原理 2.1确认应答 2.2超时重传 3.三次握手(重点) 4.四次挥手 1.TCP协议的段格式 我们先来观察一下TCP协议的段格式图解: 源/目的端口号:标识数据从哪个进程来,到哪个进程去 32位序号/32位确认号:TCP会话的每一端都包含一个32位&#xff08…

linux 的nobody是什么用户? 对安全有没有影响?

目录 一、nobody是不是可疑用户&#xff1f; 二、Linux系统中的nobody用户&#xff1f; 三、有nobody用户存在&#xff0c;安全吗&#xff1f; 一、nobody是不是可疑用户&#xff1f; 在Linux系统中&#xff0c;nobody是一个特殊的用户账户&#xff0c;通常用于运行系统服务…

UE5在VisualStudio升级后产生C++无法编译的问题

往期的虚幻引擎项目在VS更新后&#xff0c;编译时会报错&#xff0c;这一般出现在VS升级之后&#xff0c;UE对于VC的编译器定位没有更新导致&#xff1b; 有出现如下问题&#xff1a; 问题1&#xff1a; Running I:/EPCI/Epic Games/UE_5.3/Engine/Build/BatchFiles/Build.ba…

C++设计模式介绍:优雅编程的艺术

物以类聚 人以群分 文章目录 简介为什么有设计模式&#xff1f; 设计模式七大原则单一职责原则&#xff08;Single Responsibility Principle - SRP&#xff09;开放封闭原则&#xff08;Open/Closed Principle - OCP&#xff09;里氏替换原则&#xff08;Liskov Substitution …

市场复盘总结 20240124

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 昨日主题投资 连板进级率 19/43 28.2% 二进三&#xff1a; 进级率低 47% 最常用的二种方法&#xff1a; 方…

【数据结构四】栈与Stack详解

目录 栈与Stack 1.实现一个自己的栈 2.Stack的基本使用 3.栈的一些oj题训练 4.栈&#xff0c;虚拟机栈&#xff0c;栈帧的区别 栈与Stack 栈 &#xff1a;一种特殊的线性表&#xff0c;其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶…