Python笔记15-实战小游戏飞机大战(中)

文章目录

  • 创建第一个敌机
  • 创建一群敌机
  • 创建多行敌机
  • 让敌机移动
  • 射杀敌机
  • 生成新的敌机群
  • 结束游戏
  • 有敌机到达屏幕底端
  • 游戏结束

在上一篇基础上继续 本示例源码地址 点击下载

创建第一个敌机

在屏幕上放置外星人与放置飞船类似。每个外星人的行为都由Alien 类控制,我们将像创建Ship 类那样创建这个类。出于简化考虑,也将使用位图来表示外星人。你可以自己寻找表示外星人的图像 这里使用如下图像
在这里插入图片描述

创建Alien 类
除位置不同外,这个类的大部分代码与Ship 类相似。每个外星人最初都位于屏幕左上角附近。将每个外星人的左边距都设置为外星
人的宽度
Alien 类不需要一个在屏幕上绘制外星人的方法,因为我们将使用一个Pygame编组方法,自动在屏幕上绘制编组中的所有元素

import pygame
from pygame.sprite import Sprite
class Alien(Sprite):"""表示单个外星人的类。"""def __init__(self, ai_game):"""初始化外星人并设置其起始位置。"""super().__init__()self.screen = ai_game.screen# 加载外星人图像并设置其rect属性self.image = pygame.image.load('images/enemy2.png')self.rect = self.image.get_rect()# 每个外星人最初都在屏幕左上角附近。self.rect.x = self.rect.widthself.rect.y = self.rect.height# 存储外星人的精确水平位置。self.x = float(self.rect.x)

我们最终会创建一群外星人,涉及的工作量不少,因此将新建一个名为_create_fleet() 的辅助方法。放在AlienInvasion 类的方法
init() 末尾

    def _create_fleet(self):"""创建外星人群。"""# 创建一个外星人。alien = Alien(self)self.aliens.add(alien)
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()self.aliens = pygame.sprite.Group()self._create_fleet()

要让外星人现身,需要在_update_screen() 中对外星人编组调用方法draw() ,对编组调用draw() 时,Pygame将把编组中的每个元素绘制到属性rect 指定的位置。方法draw() 接受一个参数,这个参数指定了要将编组中的元素绘制到哪个surface上

   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()

运行程序看到了敌人的飞船
在这里插入图片描述

创建一群敌机

为确定一行可容纳多少个外星人,来看看可用的水平空间有多大。屏幕宽度存储在settings.screen_width 中,但需要在屏幕两边都留下一定的边距(将其设置为外星人的宽度)。因为有两个边距,所以可用于放置外星人的水平空间为屏幕宽度减去外星人宽度的两倍:

available_space_x = settings.screen_width – (2 * alien_width)
number_aliens_x = available_space_x // (2 * alien_width)

重写_create_fleet() 使其创建一行敌机

 def _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_numberalien.rect.x = alien.xself.aliens.add(alien)

运行可以看到创建了一行敌机
在这里插入图片描述

创建多行敌机

要创建外星人群,需要计算屏幕可容纳多少行,并将创建一行外星人的循环重复执行相应的次数。为计算可容纳的行数,要先计算可用的垂直空间:用屏幕高度减去第一行外星人的上边距(外星人高度)、飞船的高度以及外星人群最初与飞船之间的距离(外星人高度的两倍):
available_space_y = settings.screen_height – (3 * alien_height) – ship_height
每行下方都要留出一定的空白区域,不妨将其设置为外星人的高度。为计算可容纳的行数,将可用的垂直空间除以外星人高度的两倍。我们使用整除,因为行数只能是整数。

number_rows = available_space_y // (2 * alien_height)

重构_create_fleet 方法

    def _create_fleet(self):alien = Alien(self)alien_width, alien_height = alien.rect.sizeavailable_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)print("number_rows=",number_rows)# 创建外星人群。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)

为了效果敌机图片小一点,运行效果如下
在这里插入图片描述

让敌机移动

下面来让外星人群在屏幕上向右移动,撞到屏幕边缘后下移一定的量,再沿相反的方向移动。我们将不断移动所有的外星人,直到外星人被全部消灭,或者有外星人撞上飞船或抵达屏幕底端。下面先让外星人向右移动。
settings.py添加一个控制外星人速度的设置

def __init__(self):
--snip--
# 外星人设置
self.alien_speed = 1.0

使用这个设置来实现update()

 def update(self):"""向右移动外星人。"""self.x += self.settings.alien_speedself.rect.x = self.x

主while 循环中调用更新每个外星人位置的方法

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

对编组调用方法update() ,这将自动对每个外星人调用方法update() 。如果现在运行这个游戏,你将看到外星人群向右移动,并在屏幕右边缘消失。
创建让外星人撞到屏幕右边缘后向下移动、再向左移动的设置。实现这种行为的代码如下:

  # 外星人设置self.alien_speed = 1.0self.fleet_drop_speed = 10# fleet_direction为1表示向右移,为-1表示向左移。self.fleet_direction = 1

要编写一个方法来检查外星人是否撞到了屏幕边缘,还需修改update() 让每个外星人都沿正确的方向移动

def check_edges(self):"""如果外星人位于屏幕边缘,就返回True。"""screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right or self.rect.left <= 0:return True
def update(self):"""向左或向右移动外星人。"""self.x += (self.settings.alien_speed *self.settings.fleet_direction)self.rect.x = self.x

有外星人到达屏幕边缘时,需要将整群外行星下移,并改变它们的移动方向,为此,需要在AlienInvasion 中添加一些代码,因为
要在这里检查是否有外星人到达了左边缘或右边缘。我们编写方法_check_fleet_edges() 和_change_fleet_direction() ,并且修改_update_aliens() 。这些新方法将放在_create_alien() 后面

    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 _update_aliens(self):"""检查是否有外星人位于屏幕边缘,并更新整群外星人的位置。"""self._check_fleet_edges()self.aliens.update()

运行之后 外星人自动移动

射杀敌机

我们创建了飞船和外星人群,但子弹击中外星人时将穿过外星人,因为还没有检查碰撞。在游戏编程中,碰撞 指的是游戏元素重叠在一起。要让子弹能够击落外星人,我们将使用sprite.groupcollide() 检测两个编组的成员之间的碰撞。
子弹击中外星人时,我们需要马上知道,以便碰撞发生后让子弹立即消失。为此,我们将在更新子弹的位置后立即检测碰撞。
函数sprite.groupcollide() 将一个编组中每个元素的rect 同另一个编组中每个元素的rect 进行比较。在这里,是将每颗子弹的rect 同每个外星人的rect 进行比较,并返回一个字典,其中包含发生了碰撞的子弹和外星人。在这个字典中,每个键都是一颗子弹,而关联的值是被该子弹击中的外星人。在方法_update_bullets() 末尾,添加如下检查子弹和外星人碰撞的代码:

def _update_bullets(self):"""更新子弹的位置,并删除消失的子弹。"""--snip--# 检查是否有子弹击中了外星人。# 如果是,就删除相应的子弹和外星人。collisions = pygame.sprite.groupcollide(self.bullets, self.aliens, True, True)

这些新增的代码将self.bullets 中所有的子弹都与self.aliens中所有的外星人进行比较,看它们是否重叠在一起。每当有子弹和外星人的rect 重叠时,groupcollide() 就在它返回的字典中添加一个键值对。两个实参True 让Pygame删除发生碰撞的子弹和外星人。(要模拟能够飞行到屏幕顶端、消灭击中的每个外星人的高能子弹,可将第一个布尔实参设置为False ,并保留第二个布尔参数为True 。这样被击中的外星人将消失,但所有的子弹都始终有效,直到抵达屏幕顶端后消失。)

此时运行这个游戏,被击中的外星人将消失。如图13-5所示,有些外星人被射杀了
在这里插入图片描述

生成新的敌机群

外星人无穷无尽:一群外星人被消灭后,又会出现另一群外星人。要在一群外星人被消灭后再显示一群外星人,首先需要检查编组aliens 是否为空。如果是,就调用_create_fleet() 。我们将在_update_bullets() 末尾执行这项任务

def _update_bullets(self):--snip--if not self.aliens:# 删除现有的子弹并新建一群外星人。self.bullets.empty()self._create_fleet()

如果现在尝试在游戏中射杀外星人,可能会发现子弹的速度不太合适(有点快或有点慢),游戏感不好。当前,可通过修改设置让这
款游戏更有意思、更好玩。要修改子弹的速度,可调整settings.py中bullet_speed 的值。在我的系统中,我把bullet_speed 的值调整到1.5,让子弹的速度快些

结束游戏

如果玩家没能在足够短的时间内将整群外星人消灭干净,导致有外星人撞到了飞船或抵达屏幕底端,飞船将被摧毁。与此同时,限制玩家可使用的飞船数,在玩家用光所有的飞船后游戏将结束。
首先检查外星人和飞船之间的碰撞,以便在外星人撞上飞船时做出合适的响应。为此,在AlienInvasion 中更新每个外星人的位置后,立即检测外星人和飞船之间的碰撞:

def _update_aliens(self):--snip--self.aliens.update()# 检测外星人和飞船之间的碰撞。if pygame.sprite.spritecollideany(self.ship, self.aliens):print("Ship hit!!!")

下面来编写一个用于跟踪游戏统计信息的新类GameStats ,并将其保存为文件game_stats.py,当外星人与飞船发生碰撞时该做些什么。们不销毁Ship 实例并创建新的,而是通过跟踪游戏的统计信息来记录飞船被撞了多少次

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

在游戏运行期间,只创建一个GameStats 实例,但每当玩家开始新游戏时,需要重置一些统计信息。为此,在方法reset_stats()中初始化大部分统计信息,而不是在__init__() 中直接初始化。我们在__init__() 中调用这个方法,这样创建GameStats 实例时将妥善地设置这些统计信息,在玩家开始新游戏时也能调用reset_stats() 。
一开始玩家拥有的飞船数存储在settings.py的ship_limit中:

self.ship_limit = 3

还需对alien_invasion.py做些修改,以创建一个GameStats 实例。

from game_stats import GameStats

从Python标准库的模块time 中导入函数sleep() ,以便在飞船被外星人撞到后让游戏暂停片刻。我们还导入了GameStats 。

def __init__(self):--snip--self.screen = pygame.display.set_mode(	(self.settings.screen_width, self.settings.screen_height))pygame.display.set_caption("Alien Invasion")# 创建一个用于存储游戏统计信息的实例。self.stats = GameStats(self)self.ship = Ship(self)--snip--

有外星人撞到飞船时,将余下的飞船数减1,创建一群新的外星人,并将飞船重新放到屏幕底端的中央。另外,让游戏暂停片刻,让玩家在新外星人群出现前注意到发生了碰撞并将重新创建外星人群。实现这些功能的大部分代码放到新方法_ship_hit() 中

    def _update_aliens(self):"""检查是否有外星人位于屏幕边缘,并更新整群外星人的位置。"""self._check_fleet_edges()self.aliens.update()if pygame.sprite.spritecollideany(self.ship, self.aliens):self._ship_hit()def _ship_hit(self):"""响应飞船被外星人撞到。"""# 将ships_left减1。self.stats.ships_left -= 1# 清空余下的外星人和子弹。self.aliens.empty()self.bullets.empty()# 创建一群新的外星人,并将飞船放到屏幕底端的中央。self._create_fleet()self.ship.center_ship()# 暂停。time.sleep(0.5)

新方法center_ship() ,请将其添加到ship.py的末尾

   def center_ship(self):"""让飞船在屏幕底端居中。"""self.rect.midbottom = self.screen_rect.midbottomself.x = float(self.rect.x)

有敌机到达屏幕底端

如果有外星人到达屏幕底端,我们将像有外星人撞到飞船那样做出响应。为检测这种情况,在alien_invasion.py中添加一个新方法:

    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

们在_update_aliens() 中调用_check_aliens_bottom()

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()

游戏结束

现在这个游戏看起来更完整了,但它永远都不会结束,只是ships_left 不断变成越来越小的负数。下面在GameStats 中添加一个作为标志的属性game_active ,以便在玩家的飞船用完后结束游戏。首先,在GameStats 类的方法__init__() 末尾设置这

def __init__(self, ai_game):--snip--# 游戏刚启动时处于活动状态。self.game_active = True

_ship_hit() 中添加代码,在玩家的飞船用完后将game_active 设置为False

def _ship_hit(self):"""响应飞船被外星人撞到。"""# 将ships_left减1。if self.stats.ships_left>0:self.stats.ships_left -= 1# 清空余下的外星人和子弹。self.aliens.empty()self.bullets.empty()# 创建一群新的外星人,并将飞船放到屏幕底端的中央。self._create_fleet()self.ship.center_ship()# 暂停。time.sleep(0.5)else:self.stats.game_active=False

我们需要确定游戏的哪些部分在任何情况下都应运行,哪些部分仅在游戏处于活动状态时才运行:
在主循环中,在任何情况下都需要调用_check_events() ,即便游戏处于非活动状态。例如,我们需要知道玩家是否按了Q 键以退出游戏,或者是否单击了关闭窗口的按钮。我们还需要不断更新屏幕,以便在等待玩家是否选择开始新游戏时修改屏幕。其他的函数仅在游戏处于活动状态时才需要调用,因为游戏处于非活动状态时,不用更新游戏元素的位置。

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

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

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

相关文章

docker 部署xxl-job

docker 部署xxl-job XXL-JOB github地址 https://github.com/xuxueli/xxl-job XXL-JOB 文档地址 https://www.xuxueli.com/xxl-job/ XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品…

利用ChatGPT提升工作效率的专业指南

利用ChatGPT提升工作效率的专业指南 一、引言 在数字化时代&#xff0c;人工智能助手已经成为提高工作效率的必备工具。其中&#xff0c;ChatGPT以其强大的自然语言处理能力&#xff0c;为我们提供了全新的工作方式。本文将深入探讨如何利用ChatGPT在各个工作领域中提升效率&a…

ChatGPT与文心一言:智能回复与语言准确性的较量

在当今数字化时代&#xff0c;随着人们对智能化技术的需求不断增长&#xff0c;智能回复工具也成为了日常生活中不可或缺的一部分。ChatGPT和文心一言作为两个备受瞩目的智能回复工具&#xff0c;在智能回复、语言准确性以及知识库丰富度等方面各有卓越之处。 本文将对这两者进…

LPC系列一个定时器不同频率

1.背景 最近研究的LPC804里只有一个ctimer&#xff0c;很多时候用的捉襟见肘的&#xff0c;官方给了一份双匹配的参考例程&#xff0c;不过实际用处不大。不过我花了一晚上的时间&#xff0c;终于研究出来将一个定时器拆成四个定时器用的办法了。这个方法适用于用回调函数的LP…

贪吃蛇游戏的实现

一.技术要点: 贪吃蛇需要掌握: c语言函数,枚举,结构体,动态内存管理,预处理指令,链表,Win32 API等 二.Win32 API 1.Win32 API简介 windows可以帮应用程序卡其视窗,描绘图案,使用周边设备,,Win32 API就是windows32位平台上的应用程序编程接口 2.控制台程序 (1).使用cmd命令…

Pycharm连接云算力远程服务器(AutoDL)训练深度学习模型全过程

前言&#xff1a;在上一篇windows搭建深度学习环境中&#xff0c;我试图使用笔记本联想小新air14的mx350显卡训练一个图像检测的深度学习模型&#xff0c;但是训练时长大概需要几天时间远超我的预期&#xff0c;所以我便选择租用GPU进行训练&#xff0c;在对多家平台对比后找到…

练习12.6_横向射击_Python编程:从入门到实践(第3版)

编写一个游戏&#xff0c;将一艘飞船放在屏幕左侧&#xff0c;并允许玩家上下移动飞船。在玩家按空格键时&#xff0c; 让飞船发射一颗在屏幕中向右飞行的子弹&#xff0c;并在子弹从屏幕中消失后将其删除。 ship_shooting.py import pygame import sys from leftship impor…

玩转WEB接口之三续篇【HTTPS证书申请 - nginx验证】

文章目录 一&#xff0c; 概述二&#xff0c;nginx下载三&#xff0c;访问域名1. 做域名映射2. 运行nginx并通过域名访问 四&#xff0c;配置SSL证书1. 配置证书文件2. nginx 添加证书文件 五、运行并验证1. 测试、重新加载2. https访问 一&#xff0c; 概述 接上篇 玩转WEB接…

Mac下查看、配置和使用环境变量

Mac下查看、配置和使用环境变量 一&#xff1a;Mac怎么查看环境变量命令 printenv一&#xff1a;这个命令会一次性列出所有环境变量的键值对&#xff0c;输出格式为&#xff1a; VAR1value1 VAR2value2 ...二&#xff1a; 也可以通过给这个命令加上环境变量名参数&#xff0…

力扣hot100 每日温度 单调递减栈

Problem: 739. 每日温度 文章目录 思路复杂度&#x1f49d; 单调栈 思路 &#x1f469;‍&#x1f3eb; 参考题解 复杂度 ⏰ 时间复杂度: O ( n ) O(n) O(n) &#x1f30e; 空间复杂度: O ( n ) O(n) O(n) &#x1f49d; 单调栈 class Solution {public int[] dailyTem…

二叉树--230. 二叉搜索树中第K小的元素/medium 理解度A

230. 二叉搜索树中第K小的元素 1、题目2、题目分析3、复杂度最优解代码示例4、适用场景 1、题目 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 个最小元素&#xff08;从 1 开始计数&#xff09;。 示例 1&#xff1a…

【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.静态库和动…

多线程 之 静态代理

什么是静态代理&#xff1f; 静态代理是一种思想&#xff0c;找一个代理负责一些琐事&#xff0c;自己则专注于一件大事。 有哪些具体的表现&#xff1f; 在日常生活中做饭就是这样&#xff0c;会做饭的人需要做饭&#xff0c;那么其他的人就来帮他打杂&#xff0c;这样做饭的…

JavaScript的冒泡与捕获

1.概念。 冒泡事件&#xff1a;微软公司提出的&#xff0c;事件由子元素传递到父元素的过程叫做冒泡&#xff08;false&#xff09;。 捕获事件&#xff1a;网景公司提出的&#xff0c;事件由父元素传递到子元素的过程叫做事件捕获&#xff08;ture&#xff09;。 2.冒泡事件与…

vscode copilot怎么去掉提示代码(ghost text or incline completion)

原因&#xff1a;最近在刷题&#xff0c;被这个提示烦死了&#xff0c;记录一下怎么关掉&#xff0c;防止将来需要开启找不到了XD. 1.直接ctrlshiftp召唤设置 2.输入preferences: open usr settings找到如图第一个 3.去掉这个方框的勾选 ps直接在extension里disable不行呢 不…

使用宝塔面板部署Node.js+Mysql服务和Vue3-Admin项目到云服务器上

准备工作 一台云服务器&#xff0c;可以先用免费试用一个月的服务器进行练手&#xff1b;我这里选择的是腾讯云的轻量云服务器&#xff1b; 1、在云服务器上安装宝塔面板 宝塔面板官网地址&#xff1a;https://www.kancloud.cn/chudong/bt2017/424209 1.1 安装Xshell脚本工…

你好,C++对象

你好&#xff0c;对象 面向对象开发对象的定义 类与对象类的定义类的访问限定符及封装类的实例化类对象模型结构体内存对齐规则 this指针this指针的引入 this指针的特性 类的默认成员函数构造函数析构函数拷贝构造函数结语 面向对象开发 对象的定义 对象的含义是指具体的某一…

MySQL 聚集与非聚集索引

文章目录 1.聚集索引1.1 介绍1.2 优点1.3 缺点 2.非聚集索引3.区别参考文献 MySQL 中&#xff0c;根据索引树叶结点存放数据行还是数据行的地址&#xff0c;可以将索引分为两类&#xff1a; 存放数据行&#xff1a;聚集索引存放数据行地址&#xff1a;非聚集索引 InnoDB 使用聚…

Keil-C语言小总结

1、 &取地址符&#xff0c;*取地址内容 int *ptr;//声明指针 2、ptr &c; // 将c的地址赋值给指针变量ptr 3、可选参数函数 4、C宏定义 5、 memset&#xff1a;最快的数据清零函数 void *memset(void *s, int ch, size_t n); 分别是 字符串 要值的数据&#xff08;0…

TensorFlow2实战-系列教程4:数据增强:keras工具包/Data Augmentation

&#x1f9e1;&#x1f49b;&#x1f49a;TensorFlow2实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Jupyter Notebook中进行 本篇文章配套的代码资源已经上传 对于图像数据&#xff0c;将其进行翻转、放缩、平移、旋转操作就可以得到一组新的数据…