Pygame简单入门教程(绘制Rect、控制移动、碰撞检测、Github项目源代码)

Pygame简明教程

引言:本教程中的源码已上传个人Github: GItHub链接
视频教程推荐:YouTube教程–有点过于简单了
官方文档推荐:虽然写的一般,但还是推荐!

Navigator~

  • Pygame简明教程
  • 安装pygame
    • 一、代码框架
    • 二、案件输入
    • 三、绘制方块
      • 3.1 绘制
      • 3.2 移动
    • 四、碰撞
      • 4.1 检测方法
      • 5.2 敌人和碰撞
        • 5.2.1 敌人or朋友?
        • 5.2.2 测试碰撞

安装pygame

cmd中安装即可

pip3 install pygame

一、代码框架

main.py

import sys

import pygame
pygame.init()   # 初始化pygame模块
WIDTH, HEIGHT = 800, 1200   # 窗口宽度,高度
FPS = 60    # 帧率
running = True  # 游戏运行状态
screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 设置窗口,screen为窗口对象
pygame.display.set_caption("怀念高中第一次接触Pygame的那个暑假!") # 设置窗口标题
clock = pygame.time.Clock() # 统一游戏帧率


if __name__ == "__main__":
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: # 检测是否点击右上角窗口小x
                running = False
    pygame.quit()
    sys.exit()
    # 退出游戏辣!

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

二、案件输入

需要修改的代码:


if __name__ == "__main__":
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: # 检测是否点击右上角窗口小x
                running = False
        ############ 获取输入 ##################
        keys = pygame.key.get_pressed()
        if keys[pygame.K_DOWN]:
            print("你按下了 \/ 哦!")
        if keys[pygame.K_UP]:
            print("你按下了 /\ 哦!")
        if keys[pygame.K_LEFT]:
            print("你按下了 < 哦!")
        if keys[pygame.K_RIGHT]:
            print("你按下了 > 哦!")
        ######################################
    pygame.quit()
    sys.exit()
    # 退出游戏辣!

修改结束,完整代码如下:

main.py

import sys

import pygame
pygame.init()   # 初始化pygame模块
WIDTH, HEIGHT = 800, 1200   # 窗口宽度,高度
FPS = 60    # 帧率
running = True  # 游戏运行状态
screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 设置窗口,screen为窗口对象
pygame.display.set_caption("怀念高中第一次接触Pygame的那个暑假!") # 设置窗口标题
clock = pygame.time.Clock() # 统一游戏帧率


if __name__ == "__main__":
    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT: # 检测是否点击右上角窗口小x
                running = False
        ############ 获取输入 ##################
        keys = pygame.key.get_pressed()
        if keys[pygame.K_DOWN]:
            print("你按下了 \/ 哦!")
        if keys[pygame.K_UP]:
            print("你按下了 /\ 哦!")
        if keys[pygame.K_LEFT]:
            print("你按下了 < 哦!")
        if keys[pygame.K_RIGHT]:
            print("你按下了 > 哦!")
        ######################################
    pygame.quit()
    sys.exit()
    # 退出游戏辣!

三、绘制方块

3.1 绘制

我们使用该方法来进行绘制方块对象:

pygame.draw.rect(screen, self.color, self.hit_box)  # 更新绘制

下文会出现碰撞箱,是为了便于使用后文中定义的碰撞检测方法。

定义Player类:


class Player(object):
    def __init__(self):
        self.x = WIDTH // 2
        self.y = HEIGHT // 2
        self.width = 100
        self.height = 200
        self.hit_box = (self.x, self.y, self.width, self.height)
        self.color = pygame.Color("Blue")   # 颜色
    def update(self):
        self.hit_box = (self.x, self.y, self.width, self.height)    # 更新碰撞箱位置
        pygame.draw.rect(screen, self.color, self.hit_box)  # 更新绘制

################### 创建一个方块对象
player = Player()
###################

main.py

import sys

import pygame
pygame.init()   # 初始化pygame模块
WIDTH, HEIGHT = 800, 1200   # 窗口宽度,高度
FPS = 60    # 帧率
running = True  # 游戏运行状态
screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 设置窗口,screen为窗口对象
pygame.display.set_caption("怀念高中第一次接触Pygame的那个暑假!") # 设置窗口标题
clock = pygame.time.Clock() # 统一游戏帧率

class Player(object):
    def __init__(self):
        self.x = WIDTH // 2
        self.y = HEIGHT // 2
        self.width = 100
        self.height = 200
        self.hit_box = (self.x, self.y, self.width, self.height)
        self.color = pygame.Color("Blue")   # 颜色
    def update(self):
        self.hit_box = (self.x, self.y, self.width, self.height)    # 更新碰撞箱位置
        pygame.draw.rect(screen, self.color, self.hit_box)  # 更新绘制

################### 创建一个方块对象
player = Player()
###################

if __name__ == "__main__":
    while running:
        screen.fill(pygame.Color("White"))
        for event in pygame.event.get():
            if event.type == pygame.QUIT: # 检测是否点击右上角窗口小x
                running = False
        ############ 获取输入 ##################
        keys = pygame.key.get_pressed()
        if keys[pygame.K_DOWN]:
            print("你按下了 \/ 哦!")
        if keys[pygame.K_UP]:
            print("你按下了 /\ 哦!")
        if keys[pygame.K_LEFT]:
            print("你按下了 < 哦!")
        if keys[pygame.K_RIGHT]:
            print("你按下了 > 哦!")
        ######################################
        player.update()
        pygame.display.update()
    pygame.quit()
    sys.exit()
    # 退出游戏辣!

3.2 移动

我们可以再加点猛料,让player可以动起来:

Player类中作如下修改:

class Player(object):
    def __init__(self):
        self.x = WIDTH // 2
        self.y = HEIGHT // 2
        self.width = 100
        self.height = 200
        self.hit_box = (self.x, self.y, self.width, self.height)
        self.color = pygame.Color("Blue")   # 颜色
        self.velocity = 10
    def left(self):
        self.x -= self.velocity
    def right(self):
        self.x += self.velocity
    def up(self):
        self.y -= self.velocity
    def down(self):
        self.y += self.velocity
    def update(self):
        self.hit_box = (self.x, self.y, self.width, self.height)    # 更新碰撞箱位置
        pygame.draw.rect(screen, self.color, self.hit_box)  # 更新绘制

按键部分也进行修改:

############ 获取输入 ##################
       keys = pygame.key.get_pressed()
       if keys[pygame.K_DOWN]:
           player.down()
       if keys[pygame.K_UP]:
           player.up()
       if keys[pygame.K_LEFT]:
           player.left()
       if keys[pygame.K_RIGHT]:
           player.right()
       ######################################

完整代码如下:

main.py

import sys

import pygame
pygame.init()   # 初始化pygame模块
WIDTH, HEIGHT = 800, 1200   # 窗口宽度,高度
FPS = 60    # 帧率
running = True  # 游戏运行状态
screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 设置窗口,screen为窗口对象
pygame.display.set_caption("怀念高中第一次接触Pygame的那个暑假!") # 设置窗口标题
clock = pygame.time.Clock() # 统一游戏帧率

class Player(object):
    def __init__(self):
        self.x = WIDTH // 2
        self.y = HEIGHT // 2
        self.width = 100
        self.height = 200
        self.hit_box = (self.x, self.y, self.width, self.height)
        self.color = pygame.Color("Blue")   # 颜色
        self.velocity = 10
    def left(self):
        self.x -= self.velocity
    def right(self):
        self.x += self.velocity
    def up(self):
        self.y -= self.velocity
    def down(self):
        self.y += self.velocity
    def update(self):
        self.hit_box = (self.x, self.y, self.width, self.height)    # 更新碰撞箱位置
        pygame.draw.rect(screen, self.color, self.hit_box)  # 更新绘制

################### 创建一个方块对象
player = Player()
###################

if __name__ == "__main__":
    while running:
        screen.fill(pygame.Color("White"))
        for event in pygame.event.get():
            if event.type == pygame.QUIT: # 检测是否点击右上角窗口小x
                running = False
        ############ 获取输入 ##################
        keys = pygame.key.get_pressed()
        if keys[pygame.K_DOWN]:
            player.down()
        if keys[pygame.K_UP]:
            player.up()
        if keys[pygame.K_LEFT]:
            player.left()
        if keys[pygame.K_RIGHT]:
            player.right()
        ######################################
        player.update()
        pygame.display.update()
    pygame.quit()
    sys.exit()
    # 退出游戏辣!

由于动态不便于演示,这里省略。

四、碰撞

4.1 检测方法

pygame中对于碰撞检测的实现手段还是挺多的,可以使用Sprite精灵来统一管理,也可以自己手搓。
这里写后者~

检测两个矩形是否重叠即可判断是否碰撞,只要检测其中一个矩形的四个顶点是否在另一个矩形内部即可。

为了表示四个点,抽象出一个顶点类:

Point

class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

这里定一个一个CollisionController类来统一检测所有碰撞

CollisionController


class CollisionController():
    def RectCollide(hitbox1, hitbox2):
        '''
        检测四个点是否在另一个矩形体内即可
        box1 = (x, y, width, height)
                0  1   2     3
        :param hitbox1:
        :param hitbox2:
        :return:
        '''
        p1 = Point(hitbox1[0], hitbox1[1])
        p2 = Point(hitbox1[0] + hitbox1[2], hitbox1[1])
        p3 = Point(hitbox1[0], hitbox1[1] + hitbox1[3])
        p4 = Point(hitbox1[0] + hitbox1[2], hitbox1[1] + hitbox1[3])
        points = [p1, p2, p3, p4]
        for p in points:
            if (p.x >= hitbox2[0]
                    and p.x <= hitbox2[0] + hitbox2[2]
                    and p.y >= hitbox2[1]
                    and p.y <= hitbox2[1] + hitbox2[3]):
                return True
        return False

需要检测的时候直接调用CollisionController.RectCollide()即可,参数中传入两个矩形碰撞箱。
下文将教你写一个敌人来运用这个函数。

5.2 敌人和碰撞

5.2.1 敌人or朋友?

定义一个敌人:

class Enemy(Player):
    pass

哈哈哈,直接继承玩家类就行了,多好!人生苦短我用Python, 懒得复写我用继承,游戏开发不能没有面向对象!!

别忘记生成对象,并且在主函数中加入更新的方法:

main.py

import sys

import pygame
pygame.init()   # 初始化pygame模块
WIDTH, HEIGHT = 800, 1200   # 窗口宽度,高度
FPS = 60    # 帧率
running = True  # 游戏运行状态
screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 设置窗口,screen为窗口对象
pygame.display.set_caption("怀念高中第一次接触Pygame的那个暑假!") # 设置窗口标题
clock = pygame.time.Clock() # 统一游戏帧率

class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y
class CollisionController():
    def RectCollide(hitbox1, hitbox2):
        '''
        检测四个点是否在另一个矩形体内即可
        box1 = (x, y, width, height)
                0  1   2     3
        :param hitbox1:
        :param hitbox2:
        :return:
        '''
        p1 = Point(hitbox1[0], hitbox1[1])
        p2 = Point(hitbox1[0] + hitbox1[2], hitbox1[1])
        p3 = Point(hitbox1[0], hitbox1[1] + hitbox1[3])
        p4 = Point(hitbox1[0] + hitbox1[2], hitbox1[1] + hitbox1[3])
        points = [p1, p2, p3, p4]
        for p in points:
            if (p.x >= hitbox2[0]
                    and p.x <= hitbox2[0] + hitbox2[2]
                    and p.y >= hitbox2[1]
                    and p.y <= hitbox2[1] + hitbox2[3]):
                return True
        return False

class Player(object):
    def __init__(self):
        self.x = WIDTH // 2
        self.y = HEIGHT // 2
        self.width = 100
        self.height = 200
        self.hit_box = (self.x, self.y, self.width, self.height)
        self.color = pygame.Color("Blue")   # 颜色
        self.velocity = 10
    def left(self):
        self.x -= self.velocity
    def right(self):
        self.x += self.velocity
    def up(self):
        self.y -= self.velocity
    def down(self):
        self.y += self.velocity
    def update(self):
        self.hit_box = (self.x, self.y, self.width, self.height)    # 更新碰撞箱位置
        pygame.draw.rect(screen, self.color, self.hit_box)  # 更新绘制
class Enemy(Player):
    pass


################### 创建一个方块对象
player = Player()
enemy = Enemy()
###################



if __name__ == "__main__":
    while running:
        screen.fill(pygame.Color("White"))  # 填充一个背景色
        for event in pygame.event.get():
            if event.type == pygame.QUIT: # 检测是否点击右上角窗口小x
                running = False
        ############ 获取输入 ##################
        keys = pygame.key.get_pressed()
        if keys[pygame.K_DOWN]:
            player.down()
        if keys[pygame.K_UP]:
            player.up()
        if keys[pygame.K_LEFT]:
            player.left()
        if keys[pygame.K_RIGHT]:
            player.right()
        ######################################

        # ****************** 更新对象 *******************
        enemy.update()
        player.update()
        # ****************** ------ *******************
        pygame.display.update() # 更新画面

    pygame.quit()
    sys.exit()
    # 退出游戏辣!

运行发现多了一个小伙伴~在这里插入图片描述

5.2.2 测试碰撞
import sys

import pygame
pygame.init()   # 初始化pygame模块
WIDTH, HEIGHT = 800, 1200   # 窗口宽度,高度
FPS = 60    # 帧率
running = True  # 游戏运行状态
screen = pygame.display.set_mode((WIDTH, HEIGHT)) # 设置窗口,screen为窗口对象
pygame.display.set_caption("怀念高中第一次接触Pygame的那个暑假!") # 设置窗口标题
clock = pygame.time.Clock() # 统一游戏帧率

class Point(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

class Player(object):
    def __init__(self):
        self.x = WIDTH // 2
        self.y = HEIGHT // 2
        self.width = 100
        self.height = 200
        self.hit_box = (self.x, self.y, self.width, self.height)
        self.color = pygame.Color("Blue")   # 颜色
        self.velocity = 10
    def left(self):
        self.x -= self.velocity
    def right(self):
        self.x += self.velocity
    def up(self):
        self.y -= self.velocity
    def down(self):
        self.y += self.velocity
    def update(self):
        self.hit_box = (self.x, self.y, self.width, self.height)    # 更新碰撞箱位置
        pygame.draw.rect(screen, self.color, self.hit_box)  # 更新绘制
class Enemy(Player):
    pass

class CollisionController():
    def RectCollide(hitbox1, hitbox2):
        '''
        检测四个点是否在另一个矩形体内即可
        box1 = (x, y, width, height)
                0  1   2     3
        :param hitbox1:
        :param hitbox2:
        :return:
        '''
        p1 = Point(hitbox1[0], hitbox1[1])
        p2 = Point(hitbox1[0] + hitbox1[2], hitbox1[1])
        p3 = Point(hitbox1[0], hitbox1[1] + hitbox1[3])
        p4 = Point(hitbox1[0] + hitbox1[2], hitbox1[1] + hitbox1[3])
        points = [p1, p2, p3, p4]
        for p in points:
            if (p.x >= hitbox2[0]
                    and p.x <= hitbox2[0] + hitbox2[2]
                    and p.y >= hitbox2[1]
                    and p.y <= hitbox2[1] + hitbox2[3]):
                return True
        return False
    # def obj_collided(self, object1, object2):
    #     if self.RectCollide(object1.hit_box, object2.hit_box):
    #         return True
    #     else:
    #         return False

################### 创建一个方块对象
player = Player()
enemy = Enemy()
###################



if __name__ == "__main__":
    while running:
        screen.fill(pygame.Color("White"))  # 填充一个背景色
        for event in pygame.event.get():
            if event.type == pygame.QUIT: # 检测是否点击右上角窗口小x
                running = False
        ############ 获取输入 ##################
        keys = pygame.key.get_pressed()
        if keys[pygame.K_DOWN]:
            player.down()
        if keys[pygame.K_UP]:
            player.up()
        if keys[pygame.K_LEFT]:
            player.left()
        if keys[pygame.K_RIGHT]:
            player.right()
        ######################################

        # $$$$$$$$$$$$$$$ 碰撞检测 $$$$$$$$$$$$$$$$$$$
        if CollisionController.RectCollide(player.hit_box, enemy.hit_box):
            print("哎呀,创了一下咧!")
        # $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

        # ****************** 更新对象 *******************
        enemy.update()
        player.update()
        # ****************** ------ *******************
        pygame.display.update() # 更新画面

    pygame.quit()
    sys.exit()
    # 退出游戏辣!

可以看到,现在每次撞一下都会被聪明的计算机给发现。在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小红书释放被封手机号 无限注册

前几年抖音也可以释放被封手机号 那时候都不重视 导致现在被封手机号想释放 基本不可能的 或者就是最少几百块 有专业的人帮你通过某些信息差释放 本教程是拆解 小红书被封手机号怎么释放&#xff0c;从今年开始&#xff0c;被封的手机号无法注销了 所以很困扰 那么本教程来…

如何区分APP页面是H5还是原生页面?

刚刚接触手机测试的同学&#xff0c;或多或少都有过这样的疑问&#xff1a;APP页面哪些是H5页面&#xff1f;哪些是原生页面?单凭肉眼&#xff0c;简直太难区分了&#xff01;我总结了6个小技巧&#xff0c;希望能帮大家答疑解惑。 1、看断网的情况 断开网络&#xff0c;显示…

【生信技能树】拿到表达矩阵之后,如何使用ggplot2绘图系统绘制箱线图?

拿到表达矩阵之后&#xff0c;如何使用ggplot2绘图系统绘制箱线图&#xff1f; 目录 预备知识 绘制箱线图示例 预备知识 1.pivot_longer函数 pivot_longer 是tidyr包中的一个函数&#xff0c;用于将数据框&#xff08;data frame&#xff09;从宽格式转换为长格式。在宽格…

CPU、GPU,那NPU是,神经网络到底能做什么!

人工智能时代即将到来。随着人工智能的不断推进&#xff0c;英特尔、AMD和高通等公司也在着眼于各种硬件配置方面。随着NPU&#xff08;神经网络处理器&#xff09;的引入&#xff0c;人工智能的应用过程将被加快。 苹果在其芯片中使用NPU已经很多年了&#xff0c;所以NPU并不是…

《深入Linux内核架构》第4章 进程虚拟内存(2)

目录 4.3 内存映射原理 4.4 数据结构 4.4.1 树和链表 4.4.2 虚拟内存区域VMA的表示 4.4.3 相关数据结构 本专栏文章将有70篇左右&#xff0c;欢迎关注&#xff0c;查看后续文章。 本节讲VMA结构体struct vm_area_struct和struct address_space。 4.3 内存映射原理 所有进…

k8s概述及核心组件

一、k8s概述 1.1 引言 docker compose 单机编排工具 有企业在用 docker swarm 能够在多台主机中构建一个docker集群 基本淘汰集群化管理处理工具 容器 微服务封装 dockerfile 编写成镜像 然后进行发布 dockerfile 可以写成shell脚本&#xff08;函数做调…

【Linux网络编程】HTTPS协议

【Linux网络编程】HTTPS协议 目录 【Linux网络编程】HTTPS协议HTTPS介绍加密常见的加密方式HTTPS的工作过程探究&#xff08;重点&#xff09;常见问题完整流程总结 作者&#xff1a;爱写代码的刚子 时间&#xff1a;2024.5.9 前言&#xff1a;本篇博客将会介绍HTTPS协议 HTTPS…

【记录】常见的前端设计系统(Design System)

解释一下设计系统的定义&#xff0c;以及在国内&#xff0c;都有那些优秀的设计系统可以学习&#xff0c;希望可以帮到大家。 什么是设计系统&#xff08;Design System)&#xff1f; 设计系统&#xff08;Design System&#xff09;是一套综合性的指导原则、组件和规则&…

VBA技术资料MF152:列出工作表中所有单元格的注释

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

Linux进程——Linux环境变量

前言&#xff1a;在结束完上一篇的命令行参数时&#xff0c;我们简单的了解了一下Linux中的环境变量PATH&#xff0c;而环境变量不只有PATH&#xff0c;关于更多环境变量的知识我们将在本篇展开&#xff01; 本篇主要内容&#xff1a; 常见的环境变量 获取环境变量的三种方式 本…

GORM数据库连接池对接Prometheus

一、背景与介绍 Golang的database/sql包定了关于操作数据库的相关接口&#xff0c;但是没有去做对应数据库的实现。这些实现是预留给开发者或者对应厂商进行实现的。 其中让我比较关注的是Golang的sql包有没有实现连接池pool的机制呢? 毕竟Golang是静态语言&#xff0c;类似J…

pwn(一)前置技能

以下是pwn中的题目&#xff08;漏洞&#xff09;类型&#xff1a; 关于pwn的学习&#xff1a; 一.什么是pwn&#xff1f;&#xff08;二进制的漏洞&#xff09; "Pwn"是一个俚语&#xff0c;起源于电子游戏社区&#xff0c;经常在英语中用作网络或电子游戏文化中的…

AI中转站计费平台系统源码一站式解决方案安装说明

AI中转站计费平台系统源码一站式解决方案安装说明 功能 | Features AI 联网功能 AI online searching service 多账户均衡负载 Multi-account load balancing HTTP2 Stream 实时响应功能 HTTP2 Stream real-time response function 节流和鉴权体系 Throttling and authenticati…

GitHub中Asterank源码python修改成C++(本人python不太会)

GitHub - typpo/asterank: asteroid database, interactive visualizations, and discovery tools 主要目的是在进行多元线性回归的时候将枚举型转换为数值型 python: # # The constants used in calculations for the values of asteroids. ## General constants GENERAL_I…

基于Detectron2的计算机视觉实践

书籍&#xff1a;Hands-On Computer Vision with Detectron2: Develop object detection and segmentation models with a code and visualization approach 作者&#xff1a;Van Vung Pham&#xff0c;Tommy Dang 出版&#xff1a;Packt Publishing 书籍下载-《基于Detectr…

.OpenNJet应用引擎实践——从 0-1 体验感受

目录 一. &#x1f981; 写在前面二. &#x1f981; 安装使用2.1 安装环境2.2 配置yum源2.3 安装软件包2.4 编译代码2.5 启动 三. &#x1f981; 使用效果3.1 编辑配置文件3.2 编辑 HTML 代码 四. &#x1f981; 使用感受 一. &#x1f981; 写在前面 现在互联网体系越来越往云…

小丑的身份证和复印件 (BFS + Floyd)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 2 10 (JOKERjoke #####asdr) 输出 12 思路&#xff1a; 根据题意&#xff0c;要求最短时间&#xff0c;实际上也可以理解为最短距离。 所以应该联想到有关最短距离的算法&…

css z-Index 详解--子元素盖在父元素的兄弟元素上

前置知识 1、z-index 只有在定位元素上才会生效&#xff08;即非static定位的元素上&#xff09; 2、同级元素&#xff0c;无论是z-index 相同还是没设置。后面的元素层级比前面 3、元素上有 transform 属性 z-index 会失效 dom结构如下 // dom部分 <div><div id&quo…

latex algorithm2e 库学习总结

案例1 \documentclass{article}\usepackage{xeCJK} \usepackage[]{algorithm2e} %\usepackage{ctex} % 中文包\begin{document}\renewcommand{\algorithmcfname}{算法} % 把标题设置为“算法” \begin{algorithm…

html table thead打印时带重复表头不生效

今天做一个打印功能时要求每页都带相同的表头&#xff0c;使用的方式是table的thead标签来实现&#xff0c;结果发现thead里边的内容放多了之后只有第一页才会有表头。最后发现问题是 thead的内容不能超过table的25%。