模拟实现string类
目录
一.构造与析构函数
二.基础小功能的实现
1.clear
2.c_str
3外部对私有的查看
三.实现string的迭代器
四.string的增删查改
1.push_back尾插
1.1reserve扩容
1.2尾插
3.运算符重载+=
4.insert在任意位置插入
5.erase删除
5.1npos的处理
5.2函数的实现
6.find查找
6.1查找字符
6.2查找一个串
7.substr
五.比较运算符的重载
1.流提取
2.流插入!!
3.getline(流插入的变形)
一.构造与析构函数
1.定义自己的命名空间,这里我们简便取名为my,防止和std里的string冲突
2.声明成员变量,实现string需要一个指向存储内容的char*指针,_size记录存储内容的长度(不包括\0),_capacity记录开辟的空间大小(同样也不包括\0)
3.声明构造函数,并且实现析构函数,析构函数直接释放掉str申请的内存,并且重置三个成员变量即可,实现比较简单
4.实现默认构造函数
4.1.首先,我们先实现这个默认构造函数,参数为缺省的一个指向字符串的指针
4.2.先用初始化列表对_size进行初始化,内容的长度与字符串长度一致
4.3.空间大小与长度一致
4.4.申请_capacity+1个空间,给_str
4.5.利用strcpy函数拷贝字符串到申请的空间里面
5.实现n个ch的构造函数
申请n+1个空间,然后利用for循环赋值,实现较为简单,不过多讲解,需要注意的是,需要自己手动将_str[_size]赋值为\0,之前的那个默认构造函数因为使用的strcpy函数就不需要
6.实现拷贝构造函数
简单来说,就是申请capacity+1个空间然后进行拷贝,不过多讲解了
二.基础小功能的实现
1.clear
clear函数的作业是清空string,由于string是线性结构,所以把_str的第一个元素改为\0,并且将_size改为0,那么在读取的时候,到第一个元素就停止了,就实现了clear
2.c_str
c_str的作用是返回一个指向存储内容的指针,这样就可以使用cout或者printf来打印string的内容了,方便我们查看,并且兼容c语言的功能
3外部对私有的查看
由于外部无法直接查看类的私有成员变量,所以我们可以通过public成员函数的方式来简介提供查看,_size用来查看长度,_capaciti用来查看容量,同时,由于string很像字符数组,所以我们运算符重载了[],方便他人使用
三.实现string的迭代器
begin返回初始位置,也就是_str,end返回最后一个元素的下一个位置,也就是_str+_size,有了迭代器的实现,我们就可以使用范围for来便利string了,效果如下
四.string的增删查改
1.push_back尾插
1.1reserve扩容
在尾插中,要检查空间是否足够,经常会出现扩容的情况,所以把扩容封装成一个函数
这是c加加标准库的解释,我们只完成扩容的情况
只有在n大于空间时,才进行扩容,我们只需要新申请一块空间然后将原来空间的内容拷贝过去就可以了,类似于深拷贝,最后不要忘记释放原有空间
1.2尾插
尾插之前,我们需要先判断空间是否足够,如果_size==_capacity说明空间已经满了,无法再插入,那么我们就需要使用reserve扩容,我们这里实现的是二倍扩容,但是要处理一下特殊情况,也就是_capacity为0的时候,此时如果二倍扩容,那么扩容后的空间也为0,所以,我们这里使用了三目操作符,如果空间为0,就扩容为4,其他情况就二倍扩容,然后插入即可
2.append
append函数通过在string的末尾加字符来扩展字符串,也算是增加的一种,我们只实现加一个串
首先,我们先判断空间是否足够再插入一个字符串,如果不够,我们就进行扩容,扩容的逻辑就是二倍扩容,如果二倍不够,那么就扩容到_size+len,接着使用strcpy函数来拷贝一下,最后记得更新size的值,就完成了
3.运算符重载+=
总体来说,和append差不多,我们实现+=一个字符和+=一个字符串
这里就是简单的函数复用,很容易就可以完成
4.insert在任意位置插入
作用就是在pos位置之前插入内容
这里我们实现了两种,在pos位置前插入n个字符和在pos位置前插入一个串
总体来说,思路就是先检查空间,然后把pos之后的内容后移n(n为插入元素的个数)个位置,然后进行插入,最后,一定要记得更新_size的值
5.erase删除
总的来说erase函数的作用就是在第pos个位置,删除len个字符,最后返回这个string对象。
5.1npos的处理
此函数的第二个参数有缺省值,为npos,就是最大的长度,我们可以把npos封装为一个静态成员变量,然后将其再类外初始化为-1,因为size_t是无符号整数,所以他的值将会为size_t的最大值,(在32位系统中,size_t
通常是32位无符号整数,最大值为 2^32 - 1
,即 4294967295
。在64位系统中,size_t
通常是64位无符号整数,最大值为 2^64 - 1
。)肯定可以到达字符串末尾
5.2函数的实现
如果删除的长度超出了剩余的长度,那么就是将pos及其后面的位置都删除掉,我们只需要把pos的位置设置为\0,并且更新_size的值就可以了
如果没有超出,那么我们用一个变量end记录要删除的最后一个位置的下一个位置,即pos后第一个不需要被删除的位置,然后进行数据的挪动,如上图代码所示,最后更新_size的值就好了
最后,不要忘记返回这个对象,即*this
6.find查找
find用来查找字符串中匹配的内容,并且返回它的位置
6.1查找字符
我们直接遍历整个字符串,找到就返回它的位置,找不到直接返回npos
6.2查找一个串
在这里,我们可以直接使用strstr函数来加快我们实现的速度,简单说一下strstr函数的作用就是,返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回 null 指针。
这样,我们如果没找到就返回npos,找到了返回指针相减的值,即位置
7.substr
简单来说,就是返回字符串的一部分
实现substr的功能,我们需要先更新len的值,如果长度超过了剩余长度,那么就是返回从pos到剩下的全部,然后,创建一个临时的string类来存储字符串的一部分,最后将它返回,需要注意的是,返回值不能为string&,因为tmp创建在栈中,出了栈会自动析构
五.比较运算符的重载
实现比较运算符的重载,我们一定要学会复用,我们可以先实现一个==(等于)的,那么!==不就是!=(不等于)了吗。以此类推,很快就可以实现了,在这里面,我们使用strcmp函数,它可以帮助我们比较两个字符串的大小,(大于就返回一个>0的数,小于就返回一个小于0的数,等于就直接返回0)
六.流插入和流提取的重载
istream是 C++ 标准库中的一个类,用于表示输入流(Input Stream),ostream表示输出流
我们重载流插入和流提取,一定要重载到全局,因为对象一定在>>或者<<的后面,如果直接重载为成员函数,那么第一个参数就被固定为this指针,无法正确使用
1.流提取
流提取直接使用范围for遍历即可
2.流插入!!
这段代码是经过优化后的代码,我在这里需要着重解释一下
首先,进入函数时,我们需要先清除字符串本身的内容,因为流提取的内弄会对原内容进行覆盖(std标准库就是这么实现的)
然后,我们为了防止输入的串过长,需要不断扩容降低运行效率,我们创建了一个buff数组来存储输入的内容,大小定为1024,然后通过+=的方式来对字符串更新(+=一个串会调用append,里面使用的是一次扩容,能够提高效率)
如果输入的内容过多,buff数组满了,那么就直接+=然后重置i为0,出了循环在判断一下,如果i不是0的话就再+=一次
3.getline(流插入的变形)
流插入是遇到空格或者\n时停止,getline可以自定义遇到停止的内容,所以,实现getlne只需要改变流提取的if判断即可(默认getline是遇到\n停止,即读取一行)
相关文章:
模拟实现string类
目录 一.构造与析构函数 二.基础小功能的实现 1.clear 2.c_str 3外部对私有的查看 三.实现string的迭代器 四.string的增删查改 1.push_back尾插 1.1reserve扩容 1.2尾插 3.运算符重载 4.insert在任意位置插入 5.erase删除 5.1npos的处理 5.2函数的实现 6.find查…...
使用一个大语言模型对另一个大语言模型进行“调教”
使用一个大语言模型对另一个大语言模型进行“调教”(通常称为微调或适配),是一种常见的技术手段,用于让目标模型更好地适应特定的任务、领域或风格。以下是基于搜索结果整理的详细步骤和方法: 1.准备工作 安装必要的…...
十二、Docker Compose 部署 SpringCloudAlibaba 微服务
一、部署基础服务 0、项目部署结构 项目目录结构如下: /home/zhzl_hebei/ ├── docker-compose.yml └── geochance-auth/└── Dockerfile└── geochance-auth.jar └── geochance-system/└── Dockerfile└── geochance-system.jar └── geochance-gateway/…...
深入浅出:旋转变位编码(RoPE)在现代大语言模型中的应用
在现代大语言模型(LLMs)中,位置编码是一个至关重要的组件。无论是 Meta 的 LLaMA 还是 Google 的 PaLM,这些模型都依赖于位置编码来捕捉序列中元素的顺序信息。而旋转变位编码(RoPE) 作为一种创新的位置编码…...
C# 使用ADO.NET访问数据全解析
.NET学习资料 .NET学习资料 .NET学习资料 在 C# 的应用开发中,数据访问是极为关键的部分。ADO.NET作为.NET 框架下用于数据访问的核心技术,能够帮助开发者便捷地与各类数据源进行交互。本文将深入剖析ADO.NET,带你掌握使用 C# 通过ADO.NET访…...
趣解单词,实现快速记忆
英文单词 love,是“爱”的意思: love v./n.爱;喜欢;热爱;爱情;心爱的人 那什么是爱呢?love,首字母为l,是一根绳子,ve-通f,love通life࿰…...
TEMU电池法规:CE-battery法规指令主要检测以下这三样,汞、镉、铅
TEMU电池法规:CE-battery法规的指令主要检测以下这三样,汞、镉、铅有害物质: CE-Battery认证是依据欧盟新电池法规EU 2023/1542指令进行的电池安全检测报告。该认证针对所有类别的电池,包括内置或添加到产品中的电池,…...
vscode 如何通过Continue引入AI 助手deepseek
第一步: 在deepseek 官网上注册账号,得到APIKeys(deepseek官网地址) 创建属于自己的APIKey,然后复制这个key,(注意保存自己的key)! 第二步: 打开vscode,在插件市场安装Continue插件, 点击设置,添加deepseek模型,默认…...
【大数据技术】搭建完全分布式高可用大数据集群(Scala+Spark)
搭建完全分布式高可用大数据集群(Scala+Spark) scala-2.13.16.tgzspark-3.5.4-bin-without-hadoop.tgz注:请在阅读本篇文章前,将以上资源下载下来。 写在前面 本文主要介绍搭建完全分布式高可用集群Spark的详细步骤。 注意: 统一约定将软件安装包存放于虚拟机的/softwa…...
【翻译+论文阅读】DeepSeek-R1评测:粉碎GPT-4和Claude 3.5的开源AI革命
目录 一、DeepSeek-R1 势不可挡二、DeepSeek-R1 卓越之处三、DeepSeek-R1 创新设计四、DeepSeek-R1 进化之路1. 强化学习RL代替监督微调学习SFL2. Aha Moment “啊哈”时刻3. 蒸馏版本仅采用SFT4. 未来研究计划 部分内容有拓展,部分内容有删除,与原文会有…...
前缀和练习——洛谷P8218:求区间和
题目: 这道题很简单,直接根据题目无脑套公式 代码: #include<bits/stdc.h> using namespace std; const int N 1e5 9; using ll long long; ll a[N], perfix[N]; int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);//取消同步输…...
uv 安装包
是的,你可以使用 uv 来安装 Python 包。uv 是一个高性能的 Python 包安装器和解析器,由 astral.sh 团队开发,旨在替代 pip 和 pip-tools,提供更快的包安装体验。 ### 如何使用 uv 安装包 1. **安装 uv**: 如果你还…...
【机器学习】训练(Training)、验证(Validation)和测试(Testing)
机器学习中训练(Training)、验证(Validation)和测试(Testing)这三个阶段的作用和关系。 1. 训练阶段 (Training) - 使用训练集数据来训练模型 - 模型通过学习训练数据的特征和模式来调整其内部参数 - 这个阶段模型会不断优化以减少预测误差 - 通常使用最大的数据集比例&…...
3. k8s二进制集群之负载均衡器高可用部署
Haproxy 和 Keepalived安装Haproxy配置文件准备Keepalived配置及健康检查启动Haproxy & Keepalived服务继续上一篇文章《K8S集群架构及主机准备》,下面介绍负载均衡器搭建过程 Haproxy 和 Keepalived安装 在负载均衡器两个主机上安装即可 apt install haproxy keepalived…...
C++游戏开发实战:从引擎架构到物理碰撞
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 C 是游戏开发中最受欢迎的编程语言之一,因其高性能、低延迟和强大的底层控制能力,被广泛用于游戏…...
MSPFN 代码复现
1、环境配置 conda create -n MSPFN python3.9 conda activate MSPFN pip install opencv-python pip install tensorflow pip install tqdm pip install matplotlib2、train 2.1 创建数据集 2.1.1 数据集格式 |--rainysamples |--file1: |--file2:|--fi…...
[c语言日寄]浮点数在内存中的储存
【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...
PySpark学习笔记5-SparkSQL
sparkSql的数据抽象有两种。 一类是data set适用于java和Scala 一类是data frame适用于java,Scala,python 将r d d转换为data frame #方式一 df spark.createDataFrame(rdd,schema[name,age]) #方式二 schema Structtype(). add(id,integertype(),nu…...
支持 APQP (先期产品质量策划) 的软件系统-汽车电子行业专用研发管理信息化平台
支持 APQP (先期产品质量策划) 的软件系统 在制造业竞争白热化的当下,产品质量已然成为企业立足市场的核心竞争力。APQP(先期产品质量策划)作为保障产品质量的关键流程,贯穿于产品从概念萌生到最终交付的整个生命周期,…...
配置@别名路径,把@/ 解析为 src/
路径解析配置 webpack 安装 craco npm i -D craco/craco 项目根目录下创建文件 craco.config.js ,内容如下 const path require(path) module.exports {webpack: {// 配置别名alias: {// 约定: 使用 表示src文件所在路径: path.resolve(__dirname,src)…...
以为是响应式对象丢失导致数据没有回显
背景:之前ruoyi生成的vue2代码, <el-form ref“form”,后面我改成vue3的写法,没有实例化form, 在vue3中是需要定义const form ref(); 导致点击了修改后,页面弹框显示出来,数据没有回显。 一直…...
【汇编语言】直接定址表(二)—— 「代码‘导航员’:直接定址表的功能与应用」
文章目录 前言1. 直接定址表1.1 问题引入(一)—— 为算法清晰而查表1.2 分析与解决问题1.2.1 两个十六进制表示一个字节1.2.2 得到数值对应的数码字符1.2.2.1 最粗暴的方法——比较1.2.2.2 使用映射关系来解决1.2.2.3 存在的问题及解决 1.3 得到子程序1.…...
05vue3实战-----配置项目代码规范
05vue3实战-----配置项目代码规范 1.集成editorconfig配置2.使用prettier工具2.1安装prettier2.2配置.prettierrc文件:2.3创建.prettierignore忽略文件2.4VSCode需要安装prettier的插件2.5VSCod中的配置2.6测试prettier是否生效 3.使用ESLint检测3.1VSCode需要安装E…...
不含101的数
不含101的数 真题目录: 点击去查看 E 卷 200分题型 题目描述 小明在学习二进制时,发现了一类不含101的数: 将数字用二进制表示,不能出现 101 。 现在给定一个整数区间 [l,r] ,请问这个区间包含了多少个不含 101 的数ÿ…...
Linux/C高级(精讲)----shell结构语句、shell数组
shell脚本 功能性语句 test 可测试对象三种:字符串 整数 文件属性 每种测试对象都有若干测试操作符 1)字符串的测试: s1 s2 测试两个字符串的内容是否完全一样 s1 ! s2 测试两个字符串的内容是否有差异 -z s1 测试s1 字符串的长度是…...
基于微信小程序的消防隐患在线举报系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
java基础2(黑马)
一、变量里的数据在计算机中的存储原理 1.二进制 .二进制:只有0、1, 按照逢二进一的方式表示数据。 十进制数字11转换为:1011 方法:除二取余法 计算机中表示数据的最小单元,一个字节(Byte,简…...
计算机中数值表示:原码、反码、补码与移码
1 前言 计算机科学中,数字的表示方式至关重要,因为计算机内部只能识别处理二进制数据。为了在计算机中实现对整数的表示,提出了多种数值编码方式,其中最常用的是原码、反码、补码和移码。 2 原码 2.1 原码的定义 原码(Signed …...
1.8 组合模式(Composite Pattern)
定义 组合模式(Composite Pattern) 是一种结构型设计模式,它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式让客户端可以以相同的方式对待单个对象和对象集合。组合模式使得客户可以统一处理树形结构中的单个对象和对象的集合…...
QFileDialog::getOpenFileName(this,“文件对话框“,“.“,“c++ files(*.cpp);;“); 文件对话框显示乱码
在使用 QFileDialog::getOpenFileName 时,如果文件对话框显示乱码,通常是因为编码问题。Qt 默认使用 UTF-8 编码,但如果你的系统或源代码文件的编码不一致,可能会导致乱码。 以下是几种可能的解决方法: 1. 确保源代码…...
【C语言系列】深入理解指针(5)
深入理解指针(5) 一、sizeof和strlen的对比1.1sizeof1.2strlen1.3sizeof和strlen的对比 二、数组和指针笔试题解析2.1 一维数组2.2 字符数组2.2.1代码1:2.2.2代码2:2.2.3代码3:2.2.4代码4:2.2.5代码5&#…...
为什么使用nohup 和 启动的python脚本,日志没有在nohup.out中
当你使用 nohup 和 & 启动 Python 脚本时,输出通常会被重定向到 nohup.out 文件,但是有几个原因可能导致日志没有出现在这个文件中: Python 程序的输出被重定向了: 如果你的 Python 脚本中使用了 sys.stdout 或 sys.stderr 进…...
MySQL的存储引擎对比(InnoDB和MyISAM)
InnoDB 特点: 事务支持:InnoDB 是 MySQL 默认的事务型存储引擎,支持 ACID(原子性、一致性、隔离性、持久性)事务。行级锁定:支持行级锁,能够并发执行查询和更新操作,提升多用户环境…...
uniapp访问django目录中的图片和视频,2025[最新]中间件访问方式
新建中间件, middleware.py 匹配,以/cover_image/ 开头的图片 匹配以/episode_video/ 开头的视频 imageSrc: http://192.168.110.148:8000/cover_image/12345/1738760890657_mmexport1738154397386.jpg, videoSrc: http://192.168.110.148:8000/episode_video/12345/compres…...
Python递归复习题
寒假打卡第二十一天,当前mit6.100L进度(16/26) ,今天补一下递归复习题。 问题1:编写一个递归程序来计算正和n(n-2)(n-4)的整数(直到且不包括n-x<0) def sum_series(n…...
2025 年前端开发趋势展望,开启新征程
新年伊始,作为一名深耕 Web 前端开发领域的博主,我迫不及待地想和大家分享我对 2025 年前端开发趋势的洞察。过去一年里,前端领域的技术创新和变革令人目不暇接,而新的一年,更是充满无限可能。 框架与工具的持续演进 …...
90,【6】攻防世界 WEB Web_php_unserialize
进入靶场 进入靶场 <?php // 定义一个名为 Demo 的类 class Demo { // 定义一个私有属性 $file,默认值为 index.phpprivate $file index.php;// 构造函数,当创建类的实例时会自动调用// 接收一个参数 $file,用于初始化对象的 $file 属…...
Redis --- 使用GEO实现经纬度距离计算
什么是GEO? Spring Boot 项目中可以通过 Spring Data Redis 来使用 Redis GEO 功能,主要通过 RedisTemplate 和 GeoOperations 接口来操作地理位置数据。 Service public class GeoService {Autowiredprivate RedisTemplate<String, Object> red…...
同步 CDC
同步 CDC 当设计包括来自同一 MMCM/PLL 的时钟之间的同步 CDC 路径时,您可以使用以下技术来更好地控制时钟插入延迟和 时滞,并因此控制这些路径上的松弛。 重要提示: 如果 CDC 路径在源自不同 MMCM/PLL 的时钟之间,则跨越 …...
Linux环境下载Ollama慢或卡顿解决方案
一、下载方式 官方下载方式是到ollama官网下载ollama: https://ollama.com/ 复制下载链接执行: curl -fsSL https://ollama.com/install.sh | sh二、卡顿现象 执行后经常会出现下载失败或者进度条特别慢的情况,甚至直接退出下载: 三、…...
生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (下)
今天小李哥将开启全新的技术分享系列,为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来生成式 AI 安全市场正迅速发展。据IDC预测,到2025年全球 AI 安全解决方案市场规模将突破200亿美元,年复合增长率超过30%,而Gartn…...
2025年家用音响市场分析:潜力无限,音质为王的新纪元
引言:音质革命引领市场新风尚 在数字化浪潮的推动下,家用音响市场正经历一场前所未有的变革,其增长潜力犹如破晓之光,照亮了音频技术的未来之路。随着消费者对高品质生活追求的不断提升,以及对智能家居生态融合的日益…...
neo4j-在Linux中安装neo4j
目录 切换jdk 安装neo4j 配置neo4j以便其他电脑可以访问 切换jdk 因为我安装的jdk是1.8版本的,而我安装的neo4j版本为5.15,Neo4j Community 5.15.0 不支持 Java 1.8,它要求 Java 17 或更高版本。 所以我需要升级Java到17 安装 OpenJDK 17 sudo yu…...
AI 场景下,函数计算 GPU 实例模型存储最佳实践
作者:有松 当前,函数计算 FC 已被广泛应用在各种 AI 场景下,函数计算支持通过使用容器镜像部署 AI 推理应用,并且提供多种选项来访问训练好的模型。为了帮助开发者高效地在函数计算上部署 AI 推理应用,并快速解决不同…...
股指入门:股指期货是什么意思?在哪里可以做股指期货交易?
股指期货是一种以股票指数为标的物的期货合约,也可以称为股票指数期货或期指。 股指期货是什么意思? 股指期货是一种金融衍生品,其标的资产是股票市场上的股指,例如标普500指数、道琼斯工业平均指数、上证50指数等。 股指期货允…...
【分布式理论六】分布式调用(4):服务间的远程调用(RPC)
文章目录 一、RPC 调用过程二、RPC 动态代理:屏蔽远程通讯细节1. 动态代理示例2. 如何将动态代理应用于 RPC 三、RPC 序列化四、RPC 协议编码1. 协议编码的作用2. RPC 协议消息组成 五、RPC 网络传输1. 网络传输流程2. 关键优化点 一、RPC 调用过程 RPC(…...
aliyun 的 ip 设置方法
aliyun 的 ip 设置方法 阿里云:网络编程 bind:cannot assign requested address errno:99 问题。 公网IP,,弹性公网IP,主私网IP 1. 公网IP, --> NAT --> 主私网IP ,设置方法: 服务器端 ip 为&…...
ASP.NET Core分布式缓存
目录 分布式缓存 概述 IDistributedCache接口中定义的主要方法及主要的扩展方法 用什么做缓存服务器 使用 封装分布式缓存操作 分布式缓存 概述 分布式系统中,内存缓存不满足要求的话,把缓存数据保存到专门的缓存服务器,所有Web应用通…...
【CUDA】内存模型
目录 一、Programmable 1.1 寄存器(Registers) 1.2 本地内存(Local Memory) 1.3 共享内存(shared Memory) 1.4 常量内存(Constant Memory) 1.5 全局内存(Global Memory) 1.6 纹理内存(Textrue Memory) 1.7 总结 二、Cache(Non-programmable) 三、固定内存 四、零拷贝…...
使用Pygame制作“吃豆人”游戏
本篇博客展示如何使用 Python Pygame 编写一个简易版的“吃豆人(Pac-Man)” 风格游戏。这里我们暂且命名为 Py-Man。玩家需要控制主角在一个网格地图里移动、吃掉散布在各处的豆子,并躲避在地图中巡逻的幽灵。此示例可帮助你理解网格地图、角…...