《Python编程从入门到实践》day24
# 昨日知识点学习
创建外星人从一个到一行
# 主程序snipdef _create_fleet(self):"""创建外星人群"""# 创建一个外星人并计算一行可容纳多少个外星人# 外星人的间距为外星人的宽度alien = Alien(self)alien_width = alien.rect.widthavailable_space_x = self.settings.screen_width - (2 * alien_width)number_aliens_x = available_space_x // (2 * alien_width)# 创建第一行外星人for alien_number in range(number_aliens_x):# 创建一个外星人并将其加入当前行alien = Alien(self)alien.x = alien_width + 2 * alien_width * alien_number# self没有定义rect属性# self.rect.x = alien.xalien.rect.x = alien.xself.aliens.add(alien) 运行结果:(一行外星人出现)

# 今日知识点学习
13.3.3 重构_create_fleet()
# 主程序片段# 创建第一行外星人for alien_number in range(number_aliens_x):self._create_alien(alien_number)def _create_alien(self, alien_number):"""创建一个外星人并将其加入当前行"""alien = Alien(self)alien_width = alien.rect.widthalien.x = alien_width + 2 * alien_width * alien_number alien.rect.x = alien.xself.aliens.add(alien) 13.3.4 添加行
可用的垂直空间=屏幕宽度-第一行外星人的上边距(外星人高度)、飞船的高度以及外星人最初与飞船之间的局里(外星人高度的两倍)
available_space_y = settings.screen_height - ( 3 * alien_height) - ship_height
每行下方的空白区域设为外星人的高度
number_rows = available_space_y // ( 2* alien_height)
import sys
import pygame
from Settings import Settings
from Ship import Ship
from alien import Alien
from bullet import Bulletclass AlienInvasion:"""管理游戏资源和行为的类"""def __init__(self):"""初始化游戏并创建游戏资源"""pygame.init()self.settings = Settings()# 非全屏运行self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))# 全屏运行# 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# 设置当前窗口标题pygame.display.set_caption("Alien Invasion")self.ship = Ship(self)# 创建子弹精灵组self.bullets = pygame.sprite.Group()# 创建外星人精灵组self.aliens = pygame.sprite.Group()self._create_fleet()def _create_fleet(self):"""创建外星人群"""alien = Alien(self)alien_width, alien_height = alien.rect.size# 创建一个外星人并计算一行可容纳多少个外星人# 外星人的间距为外星人的宽度available_space_x = self.settings.screen_width - (2 * alien_width)number_aliens_x = available_space_x // (2 * alien_width)# 计算屏幕可容纳多少行外星人ship_height = self.ship.rect.heightavailable_space_y = (self.settings.screen_height - (3 * alien_height) - ship_height)number_rows = available_space_y // (2 * alien_height)# 创建外星人群for row_number in range(number_rows):for alien_number in range(number_aliens_x):self._create_alien(alien_number, row_number)def _create_alien(self, alien_number, row_number):"""创建一个外星人并将其加入当前行"""alien = Alien(self)alien_width, alien_height = alien.rect.sizealien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xalien.rect.y = alien.rect.height + 2 * alien.rect.height * row_numberself.aliens.add(alien)def run_game(self):"""开始游戏的主循环"""while True:self._check_events()self.ship.update()self.bullets.update()self._update_bullets()# # 删除消失的子弹# for bullet in self.bullets.copy():# if bullet.rect.bottom <= 0:# self.bullets.remove(bullet)# print(len(self.bullets))self._update_screen()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_q:sys.exit()elif event.key == pygame.K_SPACE:self._fire_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 _fire_bullet(self):"""创建一颗子弹,并将其加入编组bullets中"""if len(self.bullets) < self.settings.bullets_allowed: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()self.aliens.draw(self.screen)# 让最近绘制的屏幕可见pygame.display.flip()def _update_bullets(self):"""更新子弹的位置并消除消失的子弹"""# 更新子弹的位置self.bullets.update()# 删除消失的子弹for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)if __name__ == '__main__':# 创建游戏实例并运行游戏ai = AlienInvasion()ai.run_game() 13.4 让外星人移动
13.4.1 向右移动外星人群
# Settings.py
class Settings():"""存储《外星人入侵》的所有设置的类"""def __init__(self):"""初始化游戏的设置"""# 屏幕设置self.screen_width = int(1200)self.screen_height = int(800)self.bg_color = (230, 230, 230)# 飞船设置self.ship_speed = 1.5# 子弹设置self.bullet_speed = 1.0self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60, 60, 60)self.bullets_allowed = 3# 外星人设置self.alien_speed = 1.0
# alien.py
import pygame
from pygame.sprite import Spriteclass Alien(Sprite):"""表示单个外星人的类"""def __init__(self, ai_game):"""初始化未设置其起始位置"""super().__init__()self.screen = ai_game.screenself.settings = ai_game.settings# 加载外星人图像,并设置其rect属性self.image = pygame.image.load('images/alien.bmp')self.rect = self.image.get_rect()# 每个外星人最初都在屏幕左上角附近self.rect.x = self.rect.widthself.rect.y = self.rect.height# 存储外星人的准确位置self.x = float(self.rect.x)def update(self) :"""向右移动外星人"""self.x += self.settings.alien_speedself.rect.x = self.x
# 主程序snipdef run_game(self):"""开始游戏的主循环"""while True:self._check_events()self.ship.update()self.bullets.update()self._update_bullets()self._update_aliens()self._update_screen()def _update_aliens(self):"""更新外星人群中所有外星人的位置"""self.aliens.update()
运行结果:(外星人向右移动)

13.4.2 创建表示外星人移动方向的设置
# Settings.pysnip
# 外星人设置self.alien_speed = 1.0self.fleet_drop_speed = 10# fleet_direction为1表示向右移,为-1表示向左移self.fleet_direction = 1
13.4.3 检查外星人是否撞到了屏幕边缘
# alien.pysnipdef check_edges(self):"""如果外星人处于屏幕边缘,就返回True"""screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right or self.rect.left <= 0:return Truedef update(self) :"""向右移动外星人"""self.x += (self.settings.alien_speed * self.settings.fleet_direction)self.rect.x = self.x
13.4.4 向下移动外星人群并改变移动方向
# 主程序snip def _update_aliens(self):"""检查是否有外星人位于屏幕边缘,并更新外星人的位置"""self._check_fleet_edges()self.aliens.update()def _check_fleet_edges(self):"""有外星人到达边缘时采取相应的措施"""for alien in self.aliens.sprites():if alien.check_edges():self._change_fleet_direction()breakdef _change_fleet_direction(self):"""将整群外星人下移,并改变它们的方向"""for alien in self.aliens.sprites():alien.rect.y += self.settings.fleet_drop_speedself.settings.fleet_direction *= -1
运行结果:(外星人在屏幕上左右到达屏幕边缘后向下来回移动)

13.5 射杀外星人
碰撞:游戏元素重叠在一起
使用sprite.groupcollide()检测两个编组成员之间的碰撞
13.5.1 检测子弹与外星人的碰撞
# 主程序
snipdef _update_bullets(self):"""更新子弹的位置并消除消失的子弹"""# 更新子弹的位置self.bullets.update()# 删除消失的子弹for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)# 检查是否有子弹击中了外星人# 如果是,就删除相应的子弹和外星人collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)

13.5.2 为测试创建大子弹
# Settings.pysnip
# 子弹设置self.bullet_speed = 1.0self.bullet_width = 300self.bullet_height = 15self.bullet_color = (60, 60, 60)self.bullets_allowed = 3

13.5.3 生成新的外星人群
# 主程序snipdef _update_bullets(self):"""更新子弹的位置并消除消失的子弹"""# 更新子弹的位置self.bullets.update()# 删除消失的子弹for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)if not self.aliens:# 删除现有的子弹并新建一群外星人self.bullets.empty()self._create_fleet()
13.5.4 提高子弹的速度
# Settings.pysnip
# 子弹设置self.bullet_speed = 1.5self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60, 60, 60)self.bullets_allowed = 3# 外星人设置self.alien_speed = 1.0self.fleet_drop_speed = 10# fleet_direction为1表示向右移,为-1表示向左移self.fleet_direction = 1
13.5.5 重构_update_bullets()
# 主程序snipdef _update_bullets(self):"""更新子弹的位置并消除消失的子弹"""# 更新子弹的位置self.bullets.update()# 删除消失的子弹for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)self._check_bullet_alien_collisions()def _check_bullet_alien_collisions(self):"""相应子弹和外星人碰撞"""# 删除发生碰撞的子弹和外星人collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)if not self.aliens:# 删除现有的子弹并新建一群外星人self.bullets.empty()self._create_fleet()
13.6 结束游戏
结束条件:①时间范围内未能完全消灭外星人
②外星人撞到飞船或者抵达屏幕底端
③限制玩家可使用的飞船数,飞船数量用完、
13.6.1 检测外星人与飞船碰撞
# 主程序def _update_aliens(self):"""检查是否有外星人位于屏幕边缘,并更新外星人的位置"""self._check_fleet_edges()self.aliens.update()# 检测外星人与飞船之间的碰撞if pygame.sprite.spritecollideany(self.ship, self.aliens):print("Ship hit!!!")
13.6.2 响应外星人与飞船碰撞
# game_stats.py
class GameStats:"""跟踪游戏的统计信息"""def __init__(self, ai_game):"""初始化统计信息"""self.settings = ai_game.settingsself.reset_stats()def reset_stats(self):"""初始化在游戏运行期间可能变化的统计信息"""self.ships_left = self.settings.ship_limit
# Settings.pysnip
# 飞船设置self.ship_speed = 1.5self.ship_limit = 3
# ship.py
----snip----def center_ship(self):"""让飞船在屏幕底端居中"""self.rect.midbottom = self.screen_rect.midbottomself.x = float(self.rect.x)
# 主程序
import sys
from time import sleepimport pygamefrom Settings import Settings
from game_stats import GameStats
from Ship import Ship
from alien import Alien
from bullet import Bulletclass AlienInvasion:"""管理游戏资源和行为的类"""def __init__(self):"""初始化游戏并创建游戏资源"""pygame.init()self.settings = Settings()# 非全屏运行self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))# 全屏运行# 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# 设置当前窗口标题pygame.display.set_caption("Alien Invasion")# 创建一个用于存储游戏统计信息的实例self.stats = GameStats(self)self.ship = Ship(self)# 创建子弹精灵组self.bullets = pygame.sprite.Group()# 创建外星人精灵组self.aliens = pygame.sprite.Group()self._create_fleet()def _create_fleet(self):"""创建外星人群"""alien = Alien(self)alien_width, alien_height = alien.rect.size# 创建一个外星人并计算一行可容纳多少个外星人# 外星人的间距为外星人的宽度available_space_x = self.settings.screen_width - (2 * alien_width)number_aliens_x = available_space_x // (2 * alien_width)# 计算屏幕可容纳多少行外星人ship_height = self.ship.rect.heightavailable_space_y = (self.settings.screen_height - (3 * alien_height) - ship_height)number_rows = available_space_y // (2 * alien_height)# 创建外星人群for row_number in range(number_rows):for alien_number in range(number_aliens_x):self._create_alien(alien_number, row_number)def _create_alien(self, alien_number, row_number):"""创建一个外星人并将其加入当前行"""alien = Alien(self)alien_width, alien_height = alien.rect.sizealien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xalien.rect.y = alien.rect.height + 2 * alien.rect.height * row_numberself.aliens.add(alien)def _update_aliens(self):"""检查是否有外星人位于屏幕边缘,并更新外星人的位置"""self._check_fleet_edges()self.aliens.update()# 检测外星人与飞船之间的碰撞if pygame.sprite.spritecollideany(self.ship, self.aliens):self._ship_hit()def _check_fleet_edges(self):"""有外星人到达边缘时采取相应的措施"""for alien in self.aliens.sprites():if alien.check_edges():self._change_fleet_direction()breakdef _change_fleet_direction(self):"""将整群外星人下移,并改变它们的方向"""for alien in self.aliens.sprites():alien.rect.y += self.settings.fleet_drop_speedself.settings.fleet_direction *= -1def _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_q:sys.exit()elif event.key == pygame.K_SPACE:self._fire_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 _fire_bullet(self):"""创建一颗子弹,并将其加入编组bullets中"""if len(self.bullets) < self.settings.bullets_allowed: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()self.aliens.draw(self.screen)# 让最近绘制的屏幕可见pygame.display.flip()def _update_bullets(self):"""更新子弹的位置并消除消失的子弹"""# 更新子弹的位置self.bullets.update()# 删除消失的子弹for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)self._check_bullet_alien_collisions()def _check_bullet_alien_collisions(self):"""相应子弹和外星人碰撞"""# 删除发生碰撞的子弹和外星人collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)if not self.aliens:# 删除现有的子弹并新建一群外星人self.bullets.empty()self._create_fleet()def _ship_hit(self):"""相应飞船被外星人撞到"""# 将Ship_left减1self.stats.ships_left -= 1# 清空余下的外星人和子弹self.aliens.empty()self.bullets.empty()# 创建一批新的外星人,并将飞船放到屏幕底部的中央self._create_fleet()self.ship.center_ship()# 暂停sleep(0.5)def run_game(self):"""开始游戏的主循环"""while True:self._check_events()self.ship.update()self.bullets.update()self._update_bullets()self._update_aliens()self._update_screen()if __name__ == '__main__':# 创建游戏实例并运行游戏ai = AlienInvasion()ai.run_game()
13.6.3 有外星人到达屏幕底端
# 主程序def _update_aliens(self):"""检查是否有外星人位于屏幕边缘,并更新外星人的位置"""self._check_fleet_edges()self.aliens.update()# 检测外星人与飞船之间的碰撞if pygame.sprite.spritecollideany(self.ship, self.aliens):self._ship_hit()# 检查是否有外星人到达了屏幕底部self._check_aliens_bottom()def _check_aliens_bottom(self):"""检查是否有外星人到达屏幕底端"""screen_rect = self.screen.get_rect()for alien in self.aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:# 想飞船被撞到一样处理self._ship_hit()break
13.6.4 游戏结束
# 主程序
----snip----def _ship_hit(self):"""响应飞船被外星人撞到"""if self.stats.ships_left > 0:# 将Ship_left减1self.stats.ships_left -= 1# 清空余下的外星人和子弹self.aliens.empty()self.bullets.empty()# 创建一批新的外星人,并将飞船放到屏幕底部的中央self._create_fleet()self.ship.center_ship()# 暂停sleep(0.5)else:self.stats.game_active = False# game_stats.pyclass GameStats:"""跟踪游戏的统计信息"""def __init__(self, ai_game):"""初始化统计信息"""self.settings = ai_game.settingsself.reset_stats()# 游戏在刚启动时处于活动状态self.game_active = Truedef reset_stats(self):"""初始化在游戏运行期间可能变化的统计信息"""self.ships_left = self.settings.ship_limit
13.7 确定应运行游戏的哪些部分
# 主程序
---snip---def run_game(self):"""开始游戏的主循环"""while True:self._check_events()if self.stats.game_active:self.ship.update()self.bullets.update()self._update_bullets()self._update_aliens()self._update_screen()---snip---
相关文章:
《Python编程从入门到实践》day24
# 昨日知识点学习 创建外星人从一个到一行 # 主程序snipdef _create_fleet(self):"""创建外星人群"""# 创建一个外星人并计算一行可容纳多少个外星人# 外星人的间距为外星人的宽度alien Alien(self)alien_width alien.rect.widthavailable_sp…...
【hackmyvm】 Animetronic靶机
靶机测试 arp-scanporturl枚举exiftool套中套passwordsudo 提权 arp-scan arp-scan 检测局域网中活动的主机 192.168.9.203 靶机IP地址port 通过nmap扫描,获取目标主机的端口信息 ┌──(root㉿kali)-[/usr/share/seclists] └─# nmap -sT -sV -O 192.16…...
[附源码]石器时代_恐龙宝贝内购版_三网H5手游_带GM工具
石器时代之恐龙宝贝内购版_三网H5经典怀旧Q萌全网通手游_Linux服务端源码_视频架设教程_GM多功能授权后台_CDK授权后台 本教程仅限学习使用,禁止商用,一切后果与本人无关,此声明具有法律效应!!!࿰…...
RS2255XN功能和参数介绍及PDF资料
RS2255XN是一款由Runic(润石)公司生产的模拟开关。以下是关于RS2255XN的一些技术参数和特点: 封装:MSOP-10 电源电压范围:2.5V至5.5V 工作温度范围:-40C至125C 类型:模拟开关 品牌:R…...
设计模式——外观模式(Facade)
外观模式(Facade Pattern) 是一种结构型设计模式,它为一个子系统中的一组接口提供一个统一的高层接口,使得子系统更加容易使用。这种类型的设计模式属于结构型模式,它向客户端提供了一个接口,隐藏了子系统的…...
【linux软件基础知识】Linux 中的普通进程的调度机制
活动集Active processes和过期集Expired processes 为了实现静态优先级较低的进程没有完全锁定并有机会运行,Linux 调度程序维护两个不相交的可运行进程集:活动集和过期集。 此机制是完全公平调度程序 (CFS) 算法的一部分。 以下是这两组的工作原理: 活动集Active proces…...
keil5软件安装教程(MDKv5.39)
keil5软件安装分为三部分: 目录 1.安装mdk 2.激活mdk 3.安装STM32芯片包 1.安装mdk 安装包链接:链接:https://pan.baidu.com/s/1PZoGhzI5Y19ROv7xe9QJKA?pwdgt3s 提取码:gt3s 1、下载keil5的压缩包并解压,鼠…...
改变视觉创造力:图像合成中基于样式的生成架构的影响和创新
原文地址:revolutionizing-visual-creativity-the-impact-and-innovations-of-style-based-generative 2024 年 4 月 30 日 介绍 基于风格的生成架构已经开辟了一个利基市场,它将机器学习的技术严谨性与类人创造力的微妙表现力融为一体。这一发展的核…...
【LAMMPS学习】八、基础知识(5.8)LAMMPS 中热化 Drude 振荡器教程
8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…...
基于SpringBoot的全国风景区WebGIS按省展示实践
目录 前言 一、全国风景区信息介绍 1、全国范围内数据分布 2、全国风景区分布 3、PostGIS空间关联查询 二、后台查询的设计与实现 1、Model和Mapper层 2、业务层和控制层设计 三、WebGIS可视化 1、省份范围可视化 2、省级风景区可视化展示 3、成果展示 总结 前…...
深入理解网络原理3----TCP核心特性介绍(上)【面试高频考点】
文章目录 前言TCP协议段格式一、确认应答【保证可靠性传输的机制】二、超时重传【保证可靠性传输的机制】三、连接管理机制【保证可靠性传输的机制】3.1建立连接(TCP三次握手)---经典面试题3.2断开连接(四次挥手)3.3TCP状态转换 四…...
Java并发编程之锁的艺术:面试与实战指南(三)
Java并发编程之锁的艺术:面试与实战指南(三) 文章目录 Java并发编程之锁的艺术:面试与实战指南(三)前言十七、Java中线程和进程的区别是什么?十八、什么是Java内存模型(JMMÿ…...
Final Draft 12 for Mac:高效专业剧本创作软件
对于剧本创作者来说,一款高效、专业的写作工具是不可或缺的。Final Draft 12 for Mac就是这样一款完美的选择。这款专为Mac用户设计的剧本创作软件,凭借其卓越的性能和丰富的功能,让您的剧本创作更加得心应手。 Final Draft 12支持多种剧本格…...
php字符串变量和常见的字符串函数
在 PHP 中,字符串变量用于存储文本数据。你可以使用单引号()、双引号(")或定界符(heredoc 或 nowdoc)来定义字符串。下面是一些关于 PHP 字符串变量的重要点和示例: 1. 单引号…...
PPT基础
5种ppt仅可读形式 Ⅰ 开始选项卡 1.【幻灯片】组中:新建幻灯片,从大纲中导入幻灯片;修改幻灯片的版式;节(新增节,重命名节)。 2.【字体】组中:设置字体,字体大小&…...
初识JDBC
1、JDBC是什么? Java DataBase Connectivity(Java语言连接数据库) 2、JDBC的本质是什么? JDBC是SUN公司制定的一套接口(interface) java.sql.*;(这个包下有很多接口) 接口都有调用者和实现者。 面向接口调用、面向接口写实现类,这都属于…...
React 学习-5
React 条件渲染: 与js中的写法一致 注意:在 JavaScript 中,true && expression 总是返回 expression,而 false && expression 总是返回 false。 因此,如果条件是 true,&& 右侧的元素就会被渲…...
深入浅出TCP 与 UDP
🔥 个人主页:空白诗 文章目录 🔥 引言🌐 基础认知概览💻 TCP - 稳健的信使 🛡️🎭 UDP - 敏捷的使者 🏃♂️ 🧑💻 实战演练:代码示例TCP 服务…...
Leetcode—387. 字符串中的第一个唯一字符【简单】
2024每日刷题(127) Leetcode—387. 字符串中的第一个唯一字符 实现代码 class Solution { public:int firstUniqChar(string s) {int count[26] {0};for(char c: s) {count[c - a];}for(int i 0; i < s.length(); i) {if(count[s[i] - a] 1) {re…...
Blazor入门-调用js+例子
参考: Blazor入门笔记(3)-C#与JS交互 - 半野 - 博客园 https://www.cnblogs.com/zxyao/p/12638233.html 本地环境:win10, visual studio 2022 community 其他例子写了再更新! 调用js函数并传递参数 首先要加上injec…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...
