小学生python游戏编程arcade----坦克大战3

news2024/11/18 3:48:20

小学生python游戏编程arcade----坦克大战3

    • 前言
    • 整体解绍
      • 1、坦克大战3--未完,只是功能初具
        • 1.1 文件结构
        • 1.2 类
        • 1.3 角色类
        • 1.4 粒子类
        • 1.5 主程序框
        • 1.6 main函数
        • 1.7 效果图
        • 1.8 代码实现
    • 源码获取

前言

接以上多篇文章解绍arcade游戏编程的基本知识,回归主题,继续完善孩子的梦想,坦克大战,学习单词,搭建整体的框架,主要包括,游戏的开始界面,进行界面,结束界面,角色控制,子弹发射,地图加载,英语单词显示,提示,分数显示,爆炸显示及精灵,敌人自动寻路,开火,碰撞检测等,初具模型,慢慢加载完善。

整体解绍

1、坦克大战3–未完,只是功能初具

1.1 文件结构

在这里插入图片描述

1.2 类

界面类:guigl
粒子类:particle
基本设置:seting_tank
角色类:tank

1.3 角色类

在这里插入图片描述

1.4 粒子类

在这里插入图片描述

1.5 主程序框

在这里插入图片描述

1.6 main函数

注释处,为了调试方便,不显示开始界面,直接进行主程序
def main():
“”“主函数”“”
window = arcade.Window(SCREEN_width, SCREEN_height, SCREEN_title)
# menu_view = MainMenu()
menu_view = GameView()
window.show_view(menu_view)
arcade.run()

1.7 效果图

在这里插入图片描述
在这里插入图片描述

1.8 代码实现


from arcadegame.guigl import *
from arcadegame.particle import *
from arcadegame.tank import *
import os
import random


class GameView(arcade.View):
    
    def __init__(self):
        super().__init__()
        self.scene = None
        self.wanjia = None

        file_path = os.path.dirname(os.path.abspath(__file__))
        os.chdir(file_path)

        arcade.set_background_color(arcade.csscolor.BLACK)

        self.physics_engine = None
        self.camera = None  # 摄象机
        self.gui_camera = None  # 第二摄象机
        self.score = 0
        # 加载声音
        self.collect_coin_sound = arcade.load_sound("sounds/coin2.wav")
        self.game_over = arcade.load_sound(":resources:sounds/gameover1.wav")
        self.shoot_sound = arcade.load_sound(":resources:sounds/hurt5.wav")
        self.hit_sound = arcade.load_sound(":resources:sounds/hit5.wav")
        self.hit_sound1 = arcade.load_sound(":resources:sounds/explosion1.wav")
        self.hit_sound2 = arcade.load_sound(":resources:sounds/explosion2.wav")
        self.hit_sound3 = arcade.load_sound(":resources:sounds/hit1.wav")
        self.hit_sound4 = arcade.load_sound(":resources:sounds/hit2.wav")

        # 设置地图
        self.tile_map = None
        # 是否重新设置分数
        self.reset_score = True
        # 地图的最右边
        self.end_of_map = 0
        self.top_of_map = 0
        # 关卡级别
        self.level = 1
        self.tankdl = 0.1

        self.ememy_name='scholl'
        self.words = '请不要打击你的朋友--'
        self.init_rect()
        self.frame_count=0

    def setup_enemy(self):
        # pass
        self.scene.add_sprite_list_after(LAYER_tanks, 'wj')
        words={'book':'书','bag':'书包','english':'英语'}

        for x in words:
            tank = Enemy_tank("images/坦克2.png", 0.5, SCREEN_width*random.random(), SCREEN_height - 200)
            tank.word = x
            tank.hz = words[x]
            self.scene.add_sprite(LAYER_tanks,tank)

    def setup_player(self):
        # 添加角色.
        self.wanjia = Tank("images/坦克.png", 0.5, self.end_of_map, self.top_of_map)
        self.wanjia.center_x = PLAYER_start_x
        self.wanjia.center_y = PLAYER_start_y
        self.scene.add_sprite("wj", self.wanjia)

        self.scene.add_sprite_list_after("wj", LAYER_platforms)  # 添加精灵列表,把玩家放在哪一层,前后层在此关健
        self.scene.add_sprite("wj",self.wanjia)
        self.physics_engine = arcade.PhysicsEngineSimple(
            self.wanjia,
            walls=self.scene['建筑物'])

    def setup_map(self):
        # 初始化场景
        map_name = f"地图\佛相广场.json"  # jia{self.level}.json"
        # 层属性
        layer_options = {
            LAYER_platforms: {
                "use_spatial_hash": True,
            },
            LAYER_tree: {
                "use_spatial_hash": False,
            },
            '建筑物': {
                "use_spatial_hash": True,
            },
            # 'tizi': {
            #     "use_spatial_hash": True,
            # },
            # 'Enemies': {
            #     "use_spatial_hash": True,
            # },
        }

        # 读地图文件
        self.tile_map = arcade.load_tilemap(map_name, TILE_Scaling, layer_options)
        # 使用我们的TileMap初始化场景,这将自动添加所有层,以正确的顺序在场景中显示为SpriteList。
        self.scene = arcade.Scene.from_tilemap(self.tile_map)
        print(self.tile_map.width,self.tile_map.height)
        self.end_of_map = self.tile_map.width * self.tile_map.tile_height * TILE_Scaling
        self.top_of_map = self.tile_map.height * self.tile_map.tile_width * TILE_Scaling

    def setup(self):
        # 摄象机
        self.camera = arcade.Camera(SCREEN_width, SCREEN_height)
        self.gui_camera = arcade.Camera(SCREEN_width, SCREEN_height)
        self.setup_map()

        if self.reset_score:
            self.score = 0
        self.reset_score = True

        # 添加角色.
        self.setup_player()
        self.setup_enemy()
        # 增加子弹层
        self.scene.add_sprite_list_after(LAYER_bullet, 'wj')
        # 增加爆炸粒子列表
        self.scene.add_sprite_list_after(LAYER_explosions, 'wj')


    def on_show_view(self):
        self.setup()

    def on_key_press(self, key: int, modifiers: int):
        if not self.wanjia.respawning and key == arcade.key.SPACE and self.wanjia.bullets>0:
            bullet_sprite = BulletSprite(":resources:images/space_shooter/"
                                          "laserBlue01.png",
                                          1)
            self.wanjia.bullets -= 1
            bullet_sprite.guid = "子弹"
            bullet_speed = 13
            bullet_sprite.change_y = \
                math.cos(math.radians(self.wanjia.angle)) * bullet_speed
            bullet_sprite.change_x = \
                -math.sin(math.radians(self.wanjia.angle)) \
                * bullet_speed

            bullet_sprite.center_x = self.wanjia.center_x
            bullet_sprite.center_y = self.wanjia.center_y
            bullet_sprite.update()

            self.scene[LAYER_bullet].append(bullet_sprite)

            arcade.play_sound(self.shoot_sound, speed=random.random() * 3 + 0.5)

        if key == arcade.key.LEFT:
            self.wanjia.change_angle = 3
        elif key == arcade.key.RIGHT:
            self.wanjia.change_angle = -3
        elif key == arcade.key.UP:
            self.wanjia.thrust = self.tankdl
        elif key == arcade.key.DOWN:
            self.wanjia.thrust = -self.tankdl

    def on_key_release(self, key: int, modifiers: int):

        if key == arcade.key.LEFT:
            self.wanjia.change_angle = 0
        elif key == arcade.key.RIGHT:
            self.wanjia.change_angle = 0
        elif key == arcade.key.UP:
            self.wanjia.thrust = 0
        elif key == arcade.key.DOWN:
            self.wanjia.thrust = 0

    def init_rect(self):
        self.shapes = arcade.ShapeElementList()
        # color1 = (199, 237, 204)
        # # 参数:距形中心位置,宽,高,颜色,线宽
        # rect = arcade.create_rectangle(SCREEN_width/2, SCREEN_height-60/2,SCREEN_width,60,color1)
        # self.shapes.append(rect)

        self.text_remind = arcade.Text(
            f"提醒: {self.words+self.ememy_name}",
            start_x=(SCREEN_width-len(self.words+self.ememy_name)*18)/2,
            start_y=SCREEN_height-30,
            color=arcade.csscolor.RED,
            font_size=18,
        )

    def on_draw(self):
        self.clear()
        self.camera.use()  # 摄象机
        self.scene.draw()  # 摄相机与scence的顺序不能放错,否则不会移动
        for aa in self.scene[LAYER_tanks]:
            aa.draw_word(aa.left, aa.top + 20)
        # for enemy in self.scene[LAYER_enemies]:
        #     arcade.draw_text(enemy.string, enemy.left, enemy.top+20, arcade.csscolor.RED, 30, )

        self.gui_camera.use()
        # 在屏幕上绘制分数,用屏幕滚动
        score_text = f"得分: {self.wanjia.top}地图高{self.top_of_map}"
        arcade.draw_text(score_text, 10, 500, arcade.csscolor.RED, 18, )

        score_text = f"子弹数: {self.wanjia.bullets}"
        arcade.draw_text(score_text, 10, 400, arcade.csscolor.RED, 18, )
        self.shapes.draw()
        self.text_remind.draw()


    # 摄相机随角色移动
    def center_camera_to_player(self):
        """摄相机随角色移动"""
        screen_center_x = self.wanjia.center_x - (self.camera.viewport_width / 2)
        screen_center_y = self.wanjia.center_y - (self.camera.viewport_height / 2)

        # 防止相机出界
        if screen_center_x < 0:
            screen_center_x = 0
        if screen_center_y < 0:
            screen_center_y = 0

        player_centered = screen_center_x, screen_center_y
        # print(player_centered)
        self.camera.move_to(player_centered)

    # 子弹碰撞检测
    def collision_bullet(self):
        # 子弹的碰撞检测
        for bullet in self.scene[LAYER_bullet]:
            # hit_list = arcade.check_for_collision_with_list(bullet,  self.scene['建筑物'])
            hit_list = arcade.check_for_collision_with_lists(
                bullet,
                [
                    # self.scene[LAYER_enemies],
                    # self.scene[LAYER_tree],
                    self.scene['建筑物'],
                ],
            )

            if hit_list:
                bullet.remove_from_sprite_lists()

                # for collision in hit_list:
                #     if (self.scene[LAYER_enemies] in collision.sprite_lists):
                #         # 磁撞的是敌人 根据子弹伤害及敌人生命值确定争分数及消失
                #         collision.health -= BULLET_shanghai
                #
                #         if collision.health <= 0:
                #             collision.remove_from_sprite_lists()
                #             self.score += 100
                #
                #         # 声音
                #         arcade.play_sound(self.hit_sound)

                for cc in hit_list:
                    print(cc)
                    if (self.scene['建筑物'] in cc.sprite_lists):
                        # 磁撞的是建筑物,  制造爆炸
                        for i in range(20):
                            particle = Particle(self.scene[LAYER_explosions])
                            particle.position = cc.position  # 粒子位置,也即敌人位置
                            self.scene[LAYER_explosions].append(particle)

                        smoke = Smoke(30)
                        smoke.position = cc.position  # 烟雾位置
                        self.scene[LAYER_explosions].append(smoke)

                        cc.remove_from_sprite_lists()

                        # 爆炸声音
                        arcade.sound.play_sound(self.hit_sound)
                return

            # 如过子弹超过屏幕则删掉.
            if (bullet.right < 0) or (bullet.bottom > SCREEN_height) or (
                    bullet.left > (self.tile_map.width * self.tile_map.tile_width) * TILE_Scaling) :
                bullet.remove_from_sprite_lists()

    # 碰撞检测
    def collision_all(self):
        self.collision_bullet()
        # 碰撞检测
        # player_collision_list = arcade.check_for_collision_with_lists(
        #     self.wanjia,
        #     [
        #         # self.scene[LAYER_tree],
        #         self.scene[LAYER_enemies],
        #     ],
        # )

        # 检测磁到的是硬币还是敌人
        # for collision in player_collision_list:
        #     if self.scene[LAYER_enemies] in collision.sprite_lists:
        #         arcade.play_sound(self.game_over)
        #         self.setup()
        #         return
        #     else:
        #         # 算出这枚硬币值多少分
        #         if "Points" not in collision.properties:
        #             print("警告,收集的硬币没有点数属性.")
        #         else:
        #             points = int(collision.properties["Points"])
        #             self.score += points
        #
        #         # Remove the coin
        #         collision.remove_from_sprite_lists()
        #         arcade.play_sound(self.collect_coin_sound)

        # # 是否走到地图尽头
        # if self.wanjia.center_x >= self.end_of_map:
        #     # 关卡升级
        #     self.level += 1
        #     # 不需重新积分
        #     self.reset_score = False
        #     # 加载下个场景
        #     self.setup()

    # 敌人更新
    def update_ememy_tank(self):

        self.frame_count += 1

        for enemy in self.scene[LAYER_tanks]:
            enemy.update()
            # 首先,计算与角色的角度。我们可以这样做只有当子弹发射时,但在这种情况下,我们会轮换
            # 敌人每一帧都要面对玩家,所以我们会这样做
            # 起始位置
            start_x = enemy.center_x
            start_y = enemy.center_y

            # 目标位置
            dest_x = self.wanjia.center_x
            dest_y = self.wanjia.center_y

            # 计算子弹行进的角度。
            x_diff = dest_x - start_x
            y_diff = dest_y - start_y
            angle = math.atan2(y_diff, x_diff)

            # 设置敌人面向角色
            enemy.angle = math.degrees(angle) - 90

            # 每60帧发射一次
            # to_player_leng=
            if (self.frame_count % 60 == 0):
                # 利用粒子制子弹
                bullet = arcade.SpriteCircle(8, arcade.color.RED)
                bullet.center_x = start_x
                bullet.center_y = start_y

                # 设置子弹角度朝向角色
                bullet.angle = math.degrees(angle)

                # 根据角度,计算子弹的变化change_x和change_y。速度是子弹行进的速度。
                bullet.change_x = math.cos(angle) * 10
                bullet.change_y = math.sin(angle) * 10

                self.scene.add_sprite(LAYER_bullet,bullet)
                # self.bullet_list.append(bullet)

        self.scene[LAYER_tanks].update()

    def on_update(self, delta_time: float):
        self.physics_engine.update()  # 运用引擎移动角色
        self.collision_all()

        self.scene['wj'].update()
        self.scene[LAYER_bullet].update()
        self.scene[LAYER_explosions].update()
        # # 掉下或level达到最后一关时,游戏结束,或重新开始
        # if self.wanjia.center_y < -100 or self.level == 3:
        #     self.wanjia.center_x = PLAYER_start_x
        #     self.wanjia.center_y = PLAYER_start_y
        #     arcade.play_sound(self.game_over)

        # 更新动画
        self.update_ememy_tank()
        self.center_camera_to_player()  # 摄象机


class MainMenu(arcade.View):
    """Class that manages the 'menu' view."""

    def on_show_view(self):
        """设置背景"""
        arcade.set_background_color(arcade.color.WHITE)
        self.g = GuiGL()
        # 初始化场景
        self.background = arcade.Sprite("images/战场1.png", 1.3)
        self.background.center_x = SCREEN_width / 2
        self.background.center_y = SCREEN_height / 2
        # 设置背景色
        arcade.set_background_color(arcade.color.DARK_BLUE_GRAY)

        #  事件方法2,自定义方法函数
        self.g.start_button.on_click = self.on_click_start

    def on_draw(self):
        self.clear()
        self.background.draw()
        self.g.manager.draw()
        score_text = f"坦克大战"
        arcade.draw_text(
            score_text,
            SCREEN_width / 2-80,
            SCREEN_height / 2+220,
            arcade.csscolor.GOLD,
            30,
        )

    def on_click_start(self, event):
        print("自定义方法调用--开始:", event)
        game_view = GameView()
        self.window.show_view(game_view)


class GameOverView(arcade.View):
    """结整界面"""

    def on_show_view(self):
        """设置背景"""
        arcade.set_background_color(arcade.color.BLACK)

    def on_draw(self):
        """Draw the game overview"""
        self.clear()
        arcade.draw_text(
            "游戏结束,点击重新开始",
            SCREEN_width / 2,
            SCREEN_height / 2,
            arcade.color.WHITE,
            30,
            anchor_x="center",
        )

    def on_mouse_press(self, _x, _y, _button, _modifiers):
        """Use a mouse press to advance to the 'game' view."""
        game_view = GameView()
        self.window.show_view(game_view)



def main():
    """主函数"""
    window = arcade.Window(SCREEN_width, SCREEN_height, SCREEN_title)
    menu_view = MainMenu()
    # menu_view = GameView()
    window.show_view(menu_view)
    arcade.run()


if __name__ == "__main__":
    main()


源码获取

关注博主后,私聊博主免费获取
需要技术指导,育娃新思考,企业软件合作等更多服务请联系博主

今天是以此模板持续更新此育儿专栏的第 27/50次。
可以关注我,点赞我、评论我、收藏我啦。

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

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

相关文章

数商云B2B电商系统商品管理功能剖析,助力家用电器企业业务提效

如今&#xff0c;传统家用电器企业的发展空间不断受到电商渠道的积压&#xff0c;由于许多家电企业缺乏数字化的管理工具&#xff0c;导致管理低效&#xff0c;还很容易产生存货积压、供不应求等问题。随着家用电器市场需求疲软、竞争日趋白热化&#xff0c;家用电器企业亟须加…

密码学 数字签名

消息鉴别的缺陷 消息鉴别保证了数据完整性&#xff0c;消息不被第三方侵犯&#xff0c;但是不保证双方之间的欺骗。如果A发送认证消息给B&#xff0c;可能会存在多种争议&#xff1a; B伪造一个不同的消息&#xff0c;声称是A发的 A否认发过这个消息&#xff0c;B无法证明A确实…

爬虫软件是什么意思

爬虫软件的正宗名称是python计算机编程语言&#xff0c;广泛应用于系统管理任务的处理和Web编程。 python软件为什么叫爬虫软件&#xff1f;爬虫通常指的是网络爬虫&#xff0c;就是一种按照一定的规则&#xff0c;自动地抓取万维网信息的程序或者脚本。所以Python被很多人称为…

抗疫众志成城网页设计成品 抗击疫情感动人物网页制作模板 大学生抗疫静态HTML网页源码 dreamweaver网页作业致敬逆行者网页设计作品

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

缓存过期都有哪些策略?

常见以下四种缓存过期策略&#xff1a; 定时过期&#xff1a;每个设置过期时间的key都需要创建⼀个定时器&#xff0c;到过期时间就会立即清除。该策略可以⽴ 即清除过期的数据&#xff0c;对内存很友好&#xff1b;但是会占⽤⼤量的CPU资源去处理过期的数据&#xff0c;从⽽影…

C++11、17、20的内存管理-指针、智能指针和内存池从基础到实战(上)

C11、17、20的内存管理-指针、智能指针和内存池从基础到实战&#xff08;上&#xff09;第一章 指针原理和快速入门1、第一个指针程序-详解指针代码2、图示进程的内存空间划分分析代码区_堆栈_内核空间3、各种内存空间-堆_栈_全局地址代码演示4、图解堆栈空间分配对应的指针代码…

中学化学教学参考杂志社中学化学教学参考编辑部2022年第12期目录

教学论坛《中学化学教学参考》投稿&#xff1a;cn7kantougao163.com 探索有效问题的层次化设计和结构化布局 于滨; 1-5 “双减”政策下初中化学作业设计策略与方法探究 王洁; 5-7 中学化学课程思政教学案例设计 兰青;靳素娟;马玲;谢海泉; 8-9 化学教学情境创设…

5G无线技术基础自学系列 | 基础参数及帧结构

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 5G在空中接口的参数定义大多和LTE一致&…

Centos7 安装Seata1.5.1

一、环境说明 IP操作系统程序备注10.0.61.22centos7.9PostgreSQL-14.11已提前部署10.0.61.21centos7.9Nacos-2.1.0已提前部署10.0.61.22centos7.9seata-server-1.5.1本文将要部署 二、部署 1. 下载 wget https://github.com/seata/seata/releases/download/v1.5.1/seata-ser…

【Java八股文总结】之Spring MVC

文章目录Spring MVC1、Spring MVC介绍2、Spring MVC的核心组件3、Spring MVC工作流程4、Spring MVC Restful风格的接口的流程&#xff1f;5、Spring MVC请求参数的种类1. 请求参数&#xff08;传递json数据&#xff09;2. 日期类型参数传递6、Spring MVC开发中用到的工具7、Spr…

SRM采购管理系统投标管理模块:阳光招采,助力建筑材料企业智慧采购

在建筑行业企业材料管理的四大业务环节即采购、运输、储备和供应&#xff0c;采购是首要环节&#xff0c;没有采购&#xff0c;就没有材料供应&#xff0c;就没有施工生产的顺利进行&#xff0c;因此采购是决定其他三项业务环节的基础因素。 随着流通环节的不断发展壮大&#…

[go学习笔记.第十六章.TCP编程] 1.基本介绍以及入门案例

1.基本介绍 Golang 的主要设计目标之一就是面向大规模后端服务程序&#xff0c;网络通信这块是服务端程序必不可少也是至关重要的一部分. 网络编程有两种户 (1).TCP Socket 编程&#xff0c;是网络编程的主流。之所以叫TCP Socket 编程&#xff0c;是因为底层是基于 TCP/IP 协议…

镍离子去除专业吸附技术,深度除镍工程段工艺设计

含镍废水具有较大的复杂性&#xff0c;难以利用单一的处理方法进行有效处理&#xff0c;现多采用综合处理技术来实现其达标排放及资源的综合利用。 现有的含镍废水处理技术可分为传统化学法、物理法以及电化学法三类。 传统的化学法包括化学沉淀法以及絮凝法等&#xff0c;是通…

因果推理专题讨论01:因果推理概述

因果推理本质属于统计学范畴&#xff0c;并试图从根源上对基于相关性的统计学进行改革。当年诞生统计学科时就发生过分歧&#xff0c;因果被压下去了。直到最近&#xff0c;基于相关性的统计方法几乎发展到尽头&#xff0c;人工智能进一步发展&#xff0c;目前的统计工具已经难…

HTML5期末大作业:仿商城网站设计—— 绿色特产商城购物Html+Css+javascript的网页制作

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

外卖好评回复模板

好评回复很重要&#xff0c;客户花费时间写好评&#xff0c;如果可以得到商家用心的回复&#xff0c;会更增加客户的好感度&#xff0c;从而将客户转化为店铺忠实粉丝的概率会更大。 前言 在外卖评价上&#xff0c;很多店铺老板都比较重视差评回复&#xff0c;反而会比较忽视好…

【ML】关于什么是概率图模型?

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

Java程序员该如何进阶?资深阿里P8通过十年经验送你一些经验和建议!

献给迷茫中的你 我相信很多人都有过自己迷茫期&#xff0c;在开始学习之前会迷茫&#xff0c;会不知道自己要学什么&#xff0c;学这些有什么用&#xff1b;学习之后&#xff0c;学的不扎实&#xff0c;得不到认可&#xff0c;觉得自己白学了&#xff1b;真正找到一份还凑合的…

力扣(LeetCode)27. 移除元素(C++)

双指针 删除 valvalval 等价于将不等于 valvalval 的数按原来的顺序插入数组。 判断当前数和 valvalval 是否相等 。相等则跳过&#xff0c;向右遍历。不相等&#xff0c;则遇到非 valvalval 的数&#xff0c;插入待插入位置&#xff0c;待插入位置向右一位。 jjj 指向待插入…

【OpenDDS开发指南V3.20】第六章:内置主题

介绍 在 OpenDDS 中,默认情况下会创建和发布内置主题,以交换有关在部署中运行的 DDS 参与者的信息。 当使用 DCPSInfoRepo 服务在集中式发现方法中使用 OpenDDS 时,内置主题由该服务发布。 对于 DDSI-RTPS 发现,在进程中实例化的内部 OpenDDS 实现填充内置主题数据读取器…