<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>HAN_TREE BLOG</title>
        <link>https://hantreeblog.com/</link>
        <description>Tech Art</description>
        <lastBuildDate>Tue, 23 Dec 2025 15:04:29 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>zh-CN</language>
        <copyright>All rights reserved 2025, hantree</copyright>
        <item>
            <title><![CDATA[游戏开发学习笔记01 - [1.1 实例代码的分析]]></title>
            <link>https://hantreeblog.com/article/game_dev-01</link>
            <guid>https://hantreeblog.com/article/game_dev-01</guid>
            <pubDate>Sun, 22 Jan 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[《世嘉新人培训教材—游戏开发》学习笔记]]></description>
            <content:encoded><![CDATA[<div id="notion-article" class="mx-auto overflow-hidden "><main class="notion light-mode notion-page notion-block-73c79f6b66c943a1ab322ebda620cf3c"><div class="notion-viewport"></div><div class="notion-collection-page-properties"></div><blockquote class="notion-quote notion-block-59a23d7611804a1f85717eeb8b4daba1"><div>学习资料来自《世嘉新人培训教材—游戏开发》[日]平山尚 著  罗水东 译</div></blockquote><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-f1c867a3f54143f680476e6a6c76ef6f" data-id="f1c867a3f54143f680476e6a6c76ef6f"><span><div id="f1c867a3f54143f680476e6a6c76ef6f" class="notion-header-anchor"></div><a class="notion-hash-link" href="#f1c867a3f54143f680476e6a6c76ef6f" title="🎮1.1 第一个游戏：实例代码分析"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🎮1.1 第一个游戏：实例代码分析</span></span></h2><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-6fde3b28d8204ca5a11fc3518012bb6c" data-id="6fde3b28d8204ca5a11fc3518012bb6c"><span><div id="6fde3b28d8204ca5a11fc3518012bb6c" class="notion-header-anchor"></div><a class="notion-hash-link" href="#6fde3b28d8204ca5a11fc3518012bb6c" title="👉 简单介绍"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">👉 简单介绍</span></span></h3><div class="notion-blank notion-block-d0017cabc6a1419f9eaa60c0385caa57"> </div><div class="notion-text notion-block-303ca2daf7c7464d932c29526d93111a">这本书的第一章主要由三个部分构成：<span class="notion-red">(注：和原书分类不一致，是根据个人理解分类)</span></div><ol start="1" class="notion-list notion-list-numbered notion-block-29552e0f0c734cd797b013cf329417fb" style="list-style-type:decimal"><li><b>实例代码的分析（结构和功能）</b> </li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-078fd47a2efe44c084e227c3a5403e69" style="list-style-type:decimal"><li>添加游戏开发中的重要功能：读取场景数据 </li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-613f077fb5364a58bd9ef73feb5f8d61" style="list-style-type:decimal"><li>C++知识点</li></ol><div class="notion-text notion-block-1f3c6ca2c71241ba940bad3e43400a91"><b>这篇文章主要讲解 </b><em><b>1.实例代码的分析（结构与功能），</b></em><b>会展示不同代码块的源码，并分别分析它们的主要功能和逻辑，提出需要注意的点。</b></div><div class="notion-blank notion-block-74e3bf27dba5433f970d1a7440a6e0fe"> </div><div class="notion-text notion-block-401e529487a34c20be3a82654dd5926a">（其中下划线和带星号的部分是我没有理解全面的地方，连同最后的疑难问题，我会尝试在下一个同主题文章中解答）</div><h3 class="notion-h notion-h2 notion-h-indent-1 notion-block-c6da8b39c0bb44e392103cbab9623fcc" data-id="c6da8b39c0bb44e392103cbab9623fcc"><span><div id="c6da8b39c0bb44e392103cbab9623fcc" class="notion-header-anchor"></div><a class="notion-hash-link" href="#c6da8b39c0bb44e392103cbab9623fcc" title="🦝实例代码分析（结构和功能）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🦝实例代码分析（结构和功能）</span></span></h3><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-d9dac9f066b04bc0ae4d048ef91fae47" data-id="d9dac9f066b04bc0ae4d048ef91fae47"><span><div id="d9dac9f066b04bc0ae4d048ef91fae47" class="notion-header-anchor"></div><a class="notion-hash-link" href="#d9dac9f066b04bc0ae4d048ef91fae47" title="🦈关于游戏程序的最简单总结："><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🦈关于游戏程序的最简单总结：</span></span></h4><div class="notion-text notion-block-1fadf22aed524132b3ae48dda4def182">游戏程序：</div><ol start="1" class="notion-list notion-list-numbered notion-block-240703929bf644c6992a1fc732af72ff" style="list-style-type:decimal"><li>获取输入</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-b727cadc8f1c47b1a999cabd1b46f938" style="list-style-type:decimal"><li>将输入更新到游戏中</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-a034c1e2c4e049c4bc0dcfc7dd8456f9" style="list-style-type:decimal"><li>显示结果</li></ol><div class="notion-text notion-block-80f66a25af1f4e949ad294458f1f6372">简单代码：</div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-b054ffdd3d6a4b89a5e15b35aba21620" data-id="b054ffdd3d6a4b89a5e15b35aba21620"><span><div id="b054ffdd3d6a4b89a5e15b35aba21620" class="notion-header-anchor"></div><a class="notion-hash-link" href="#b054ffdd3d6a4b89a5e15b35aba21620" title="《箱子搬运工》小游戏代码分析"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">《箱子搬运工》小游戏代码分析</span></span></h4><div class="notion-text notion-block-4c73a4f01b1643db879d65c4e1ed5beb">这里分析一下《箱子搬运工》小游戏代码的大致结构</div><div class="notion-text notion-block-c1f6bc9bfaab4290a4a3cb7f11772843">💥<em><b>代码由《世嘉新人培训教材—游戏开发》一书提供，可以自行使用（包括商用），作者和笔者不承担任何责任，使用时请尊重他人劳动成果，请不要损毁世嘉和笔者的名誉。</b></em></div><div class="notion-blank notion-block-ff15f5735de04bcaba1d8b0fa4bb88e7"> </div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-11481041465f43af967726c62b0715c8" data-id="11481041465f43af967726c62b0715c8"><span><div id="11481041465f43af967726c62b0715c8" class="notion-header-anchor"></div><a class="notion-hash-link" href="#11481041465f43af967726c62b0715c8" title="一）include头部文件"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>一）include头部文件</b></span></span></h4><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-4737f153e13843b9933a3f4bf9b29f8b" data-id="4737f153e13843b9933a3f4bf9b29f8b"><span><div id="4737f153e13843b9933a3f4bf9b29f8b" class="notion-header-anchor"></div><a class="notion-hash-link" href="#4737f153e13843b9933a3f4bf9b29f8b" title="二）场景数据常量"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>二）场景数据常量</b></span></span></h4><div class="notion-text notion-block-ef150b1629bb49f1a79558ec053d680e">注意点：</div><ul class="notion-list notion-list-disc notion-block-56dcd35e8b4f43ffa80db3761bbd4a20"><li>为什么不一开始用0代表空间，1代表玩家：先用容易理解的字符串进行赋值，游戏开始后再将其转化为其他形式，这样做更简单。</li></ul><ul class="notion-list notion-list-disc notion-block-52f8651007bb49aa9b1f0070ae7dfa00"><li><b>因为这里的值后续都不需要修改，所以使用全局变量const，可避免很多bug</b></li></ul><ul class="notion-list notion-list-disc notion-block-6edc763e9fde4e4a8a74eaf8ef7a83e8"><li>全局变量可以在程序中的任何地方被访问，所以命名时可以以g开头，方便识别</li></ul><div class="notion-blank notion-block-a08c06a3bcf6477790c6d5ea580f5610"> </div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-ef1c328c93854346a5932d637890b945" data-id="ef1c328c93854346a5932d637890b945"><span><div id="ef1c328c93854346a5932d637890b945" class="notion-header-anchor"></div><a class="notion-hash-link" href="#ef1c328c93854346a5932d637890b945" title="三）枚举类型"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>三）枚举类型</b></span></span></h4><div class="notion-text notion-block-388e0c21d70944c2a9f2fa141609766a">注意点：</div><ul class="notion-list notion-list-disc notion-block-68a134f3c5e94a0bbe4bc9fa9b511288"><li>枚举类型数组的作用：保存场景中的所有状态（在一个容量等于“宽*高”的枚举类型数组中）</li></ul><ul class="notion-list notion-list-disc notion-block-ecc8208909664acd9938f2f2f788793f"><li>另一种存放数据的方法：将<span class="notion-inline-underscore">是否是目的地的信息*</span>存放在另一个数组中，或者通过<span class="notion-inline-underscore">位运算*</span>将两种信息保存在同一个数组里</li></ul><div class="notion-blank notion-block-2fd58f4a96e6458ba8a35712cb5ed1ea"> </div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-71e9332d3cf448d58685e511c068e430" data-id="71e9332d3cf448d58685e511c068e430"><span><div id="71e9332d3cf448d58685e511c068e430" class="notion-header-anchor"></div><a class="notion-hash-link" href="#71e9332d3cf448d58685e511c068e430" title="四）函数原型（声明需要使用的函数）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>四）函数原型（声明需要使用的函数）</b></span></span></h4><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-cfe93e63529c4b1cac19a58739f2aa51" data-id="cfe93e63529c4b1cac19a58739f2aa51"><span><div id="cfe93e63529c4b1cac19a58739f2aa51" class="notion-header-anchor"></div><a class="notion-hash-link" href="#cfe93e63529c4b1cac19a58739f2aa51" title="五）main函数（游戏主逻辑，会调用上述函数）"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>五）main函数（游戏主逻辑，会调用上述函数）</b></span></span></h4><div class="notion-text notion-block-46076b3150624da78dc9a338ba639278">注意点：</div><ul class="notion-list notion-list-disc notion-block-e7fd1b6011b642d5b8fdbbe45851d75a"><li>枚举类型是一种用于列举的类型，所以可以通过new生成，<span class="notion-inline-underscore">也可以用作参数和返回值*</span></li></ul><ul class="notion-list notion-list-disc notion-block-ab10e48484a74c9095da5131df7c96a8"><li>枚举类型内部的变量只能通过枚举类型来赋值，如果直接赋值会导致编译错误</li></ul><ul class="notion-list notion-list-disc notion-block-4b5dc8777b11495a94146b86857d5ef8"><li>逻辑上Object应该是一个二维数组，但是这里<b>使用了一维数组的创建方式</b>，原因是二维数组无法通过new动态创建，会丧失灵活性。</li></ul><ul class="notion-list notion-list-disc notion-block-3b38e9c064204ded986774252a653bca"><li>养成<b>及时释放空间</b>的习惯，注意是delete[]而非delete</li></ul><ul class="notion-list notion-list-disc notion-block-4349ba0c45074b8793011ea0c9a56772"><li>释放空间后最好<b>将指针赋值为0</b>，很大程度上避免指针相关的bug</li></ul><ul class="notion-list notion-list-disc notion-block-7a58c2683f684d6ea7c4fb0330b5a991"><li><b>注意主循环中函数的顺序：draw() → checkClear() → getInput → update()</b></li></ul><ul class="notion-list notion-list-disc notion-block-9559adcb91a34f04a75db96f04263829"><li>getInput之前需要先检测是否通关，避免响应输入之前已经通关了却没有被检测出来</li></ul><div class="notion-blank notion-block-e216ad6d7e954d8d8f5701f9eb058e84"> </div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-752d3fe385ed4a5b89b3769657a4187e" data-id="752d3fe385ed4a5b89b3769657a4187e"><span><div id="752d3fe385ed4a5b89b3769657a4187e" class="notion-header-anchor"></div><a class="notion-hash-link" href="#752d3fe385ed4a5b89b3769657a4187e" title="六）初始化场景"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>六）初始化场景</b></span></span></h4><div class="notion-text notion-block-6af5f8db466f4c378be0350277f17f67">注意点：</div><ul class="notion-list notion-list-disc notion-block-bae9cbf20ddb48c0aa5de2c35f3d973b"><li><span class="notion-red"><b>初始化部分的代码主要逻辑是：逐个读取字符并将其转换为Object类型。将stageData里的字符串转化为Object类型写入state数组中。</b></span></li></ul><ul class="notion-list notion-list-disc notion-block-ed75939521054ad3b2b1e34ed426ce75"><li>最后的if语句是为了忽略非法输入。最好的方法是通过场景数据自行计算出宽度和高度值，<span class="notion-inline-underscore">我们可以封装一个函数来实现这个功能*</span></li></ul><div class="notion-blank notion-block-c494f2f158d647cd8009065be241bd02"> </div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-62f33500e2874a168599caf26681f1e3" data-id="62f33500e2874a168599caf26681f1e3"><span><div id="62f33500e2874a168599caf26681f1e3" class="notion-header-anchor"></div><a class="notion-hash-link" href="#62f33500e2874a168599caf26681f1e3" title="七）绘制"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title"><b>七）绘制</b></span></span></h4><div class="notion-text notion-block-4c4e58cce4c242ecbad58d1dfb1c4bd6">注意点：</div><ul class="notion-list notion-list-disc notion-block-a1b0d77a852a45cd928d419a3afdd734"><li>draw()的功能和initialize()正好相反，是把Object数组里的内容转化成字符，再通过cout输出。这部分在一些游戏中也是类似的，只不过是把程序内的数据转化为图像渲染出来。</li></ul><ul class="notion-list notion-list-disc notion-block-715a30c0245d4a1eb80ceb6bdcc714f3"><li>这里的思路是，创建一个char array，并且数组中字符的顺序对应Object数组的内元素的顺序，这样在for循环中，o的int值就代表了与之对应的字符的index，font[o]可以直接打印出我们想要的字符。另一种方法是在for循环中用switch进行处理：</li></ul><div class="notion-blank notion-block-3a44aab2828543729b69117a6ceaf109"> </div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-198771f9964e44c6914ec82c1912b805" data-id="198771f9964e44c6914ec82c1912b805"><span><div id="198771f9964e44c6914ec82c1912b805" class="notion-header-anchor"></div><a class="notion-hash-link" href="#198771f9964e44c6914ec82c1912b805" title="八）更新"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">八）更新</span></span></h4><div class="notion-text notion-block-ffb57a0054d244b8b69bb3c05ffdc639">Update部分往往是游戏的核心，所以代码也比较长，我会逐步讲解。</div><div class="notion-text notion-block-d1a59f3b44a74819bf4decc6e7fae747">🦁<b>参数</b></div><ul class="notion-list notion-list-disc notion-block-2d65def934af4934a7db447135f50bf7"><li>一般来说，用单个的字母作为参数变量名不是很好的习惯。但是如果该变量所在的代码很短，使用频率也很高，单个字母不容易和其他变量搞混，那只要在一开始加上详细的注释，就可以使用单个字母来命名。</li></ul><div class="notion-blank notion-block-cf71887dd49e4471bf836e1d8811182d"> </div><div class="notion-text notion-block-a7c3ac904f5a43719d3ded9b2823fead">🐯<b>输入</b></div><div class="notion-blank notion-block-55f7ca55ab6d4bdfb6e5c67014425262"> </div><div class="notion-text notion-block-6f2e58c501074276bf3a48a011d29ae4">🐱<b>检测玩家位置</b></div><div class="notion-text notion-block-d4cbbca7215243f19d1dca638071e0dd">注意点：</div><ul class="notion-list notion-list-disc notion-block-ca8075450c19489d9f87b11b490f6e5f"><li>有方法可以不需要检索玩家位置，而且运行起来更快：将玩家位置保存在某个变量中。</li></ul><ul class="notion-list notion-list-disc notion-block-85d73784337646c3af0eca286f37464a"><li><span class="notion-inline-underscore">书中提到的方法：创建一个Satge类等，并在其中设置一个成员变量，用于查找结束时保存玩家的位置，那么就可以在保持代码简洁的同时保证处理效率。*</span> 但是这个方法可能也会导致错误，即通过查找获取的玩家位置和保存在变量中的玩家位置可能会不一样（*是在何种情况中呢？）所以在不影响速度的情况下可以每次都检查一遍玩家位置。</li></ul><ul class="notion-list notion-list-disc notion-block-8e971b4a9c9047878abb15abab27aa77"><li>代码中的</li><ul class="notion-list notion-list-disc notion-block-8e971b4a9c9047878abb15abab27aa77"><div class="notion-text notion-block-5f31c8b460cc4c1f9642f90ba7a04987">将玩家的情况分为了两类，显得不够简洁，可以封装在isPlayer()这样的函数中或者单独将“是否是目的地”的信息保存到另外的变量中（*可以之后尝试）</div></ul></ul><div class="notion-blank notion-block-cd440ec1cb204862a48a60d5b8e9a820"> </div><div class="notion-text notion-block-2682b6ad605c4369a2dd32f39728e8aa">🦊<b>移动</b></div><div class="notion-text notion-block-cf6b9092874440a58984f513641a4d52">注意点：</div><ul class="notion-list notion-list-disc notion-block-2806573849a5498397755e6b69096d65"><li>命名习惯中：dx中的d是“difference”，tx中的t是“temporary”</li></ul><ul class="notion-list notion-list-disc notion-block-23c8b9194aa24e10a3d7b1fa7b157bb2"><li>这里最重要的就是搞清楚人物移动有哪几种具体情况，这里有两大情况玩家可以移动：</li><ul class="notion-list notion-list-disc notion-block-23c8b9194aa24e10a3d7b1fa7b157bb2"><div class="notion-text notion-block-a23af48d74284dce8b566a0d27d39888">A.Target Position是空白或者目的地：<div class="notion-text-children"><div class="notion-text notion-block-a046400ac3984bb6bace62d002391e01">     判断tp是空白还是目的地，然后改变tp和p的Object值</div></div></div><div class="notion-text notion-block-9df8ccc80b8e4ceaa73e59d29c7fab7f">B.Target Position是箱子，并且沿该方向的下一个网格是空白或者目的地：</div><div class="notion-text notion-block-8e99102320564fecbf9c53335092e4d1">       判断tp有没有箱子和tp2是不是空白或者目的地，然后逐步改变tp2,tp,p的位置</div></ul></ul><ul class="notion-list notion-list-disc notion-block-85865211ca9a490192b948799b98268f"><li>如果将“是否在目的地”的信息储存在别处，代码会更加简洁（*之后可尝试）</li></ul><ul class="notion-list notion-list-disc notion-block-46a82cfd78524fdba7ed1aceee00729b"><li>作者省略了tp为墙壁的代码，但是为了让代码更容易理解应当加上</li></ul><ul class="notion-list notion-list-disc notion-block-09cb011008a94436b6ed4837b439f154"><li>注意检测推动的有效性</li></ul><div class="notion-blank notion-block-8f63dc907c034f308ab8ec9b4394b681"> </div><h4 class="notion-h notion-h3 notion-h-indent-2 notion-block-1304c2ac98da4880a69aaaf525e41f50" data-id="1304c2ac98da4880a69aaaf525e41f50"><span><div id="1304c2ac98da4880a69aaaf525e41f50" class="notion-header-anchor"></div><a class="notion-hash-link" href="#1304c2ac98da4880a69aaaf525e41f50" title="九）通关检测"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">九）<b>通关检测</b></span></span></h4><div class="notion-text notion-block-3d2957238fe0472fb8bd29d9f60dd4c9">注意点:</div><ul class="notion-list notion-list-disc notion-block-b282698f78ea473ca1f7c9dcae71b0a4"><li>如果场景数据出错，导致目的地的数量比箱子还多，也依然会判定通过。所以初始化时必须仔细检查场景数据。</li></ul><div class="notion-blank notion-block-4d343d1ab1dd45c694cbd0898c161223"> </div><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-b526c2c0ddbb42508c6ad7cf818e82f0" data-id="b526c2c0ddbb42508c6ad7cf818e82f0"><span><div id="b526c2c0ddbb42508c6ad7cf818e82f0" class="notion-header-anchor"></div><a class="notion-hash-link" href="#b526c2c0ddbb42508c6ad7cf818e82f0" title="🐃总结归纳"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🐃总结归纳</span></span></h2><div class="notion-text notion-block-fc899ff697af47d480c9b9014ed97ec6">回顾一下这160行代码的主要结构：</div><ol start="1" class="notion-list notion-list-numbered notion-block-91b03e799d5a45918df78bc20a5521ae" style="list-style-type:decimal"><li>包含头文件 #inclue ..</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-936441d725ed4d56ae3126ba168cc5f2" style="list-style-type:decimal"><li>枚举类型 enum xx {}；</li></ol><ol start="3" class="notion-list notion-list-numbered notion-block-0f7c16536dc2436794c37cf51eee8498" style="list-style-type:decimal"><li>数据场景常量 </li></ol><ol start="4" class="notion-list notion-list-numbered notion-block-8e3c585782f7487d93891a9d08226fed" style="list-style-type:decimal"><li>函数声明</li></ol><ol start="5" class="notion-list notion-list-numbered notion-block-b6eb4f580c4a4abaa4215f0f6fe0493f" style="list-style-type:decimal"><li>游戏主逻辑（main函数）：初始化initialize() loop: draw()→checkClear()→getInput→update()</li></ol><ol start="6" class="notion-list notion-list-numbered notion-block-1313c44304b940c1bb15478fd02d4c32" style="list-style-type:decimal"><li>初始化函数initialize()：逐个读取字符并将其转换为Object类型</li></ol><ol start="7" class="notion-list notion-list-numbered notion-block-68daade22bca4ead888d2287dce95ca4" style="list-style-type:decimal"><li>绘制函数draw()：是把Object数组里的内容转化成字符，再通过cout输出</li></ol><ol start="8" class="notion-list notion-list-numbered notion-block-45cb4fcb67d14bcc991b70bba6c88427" style="list-style-type:decimal"><li>更新函数update():输入，检测玩家位置，移动</li></ol><ol start="9" class="notion-list notion-list-numbered notion-block-257b45061c9d4e6d9053fdd207bf0a7a" style="list-style-type:decimal"><li>通关检测函数</li></ol><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-8ffedc583b1c43ec8f1e647adc531ed4" data-id="8ffedc583b1c43ec8f1e647adc531ed4"><span><div id="8ffedc583b1c43ec8f1e647adc531ed4" class="notion-header-anchor"></div><a class="notion-hash-link" href="#8ffedc583b1c43ec8f1e647adc531ed4" title="🐄待解答问题"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">🐄待解答问题</span></span></h2><div class="notion-text notion-block-b05b2065b4a04e1882a9177f34fac45e">（下一篇本主题文章的时候会尝试解答，如果找到正确答案会将问题划去）</div><ol start="1" class="notion-list notion-list-numbered notion-block-8f5186177aa1459081e4558ac8a74cd8" style="list-style-type:decimal"><li>如何调试来看看到枚举类型的名字？</li></ol><ol start="2" class="notion-list notion-list-numbered notion-block-0633e2ebdd6d41e9be0ec3b9761aaca3" style="list-style-type:decimal"><li>main函数中，为什么最后只释放了枚举类型的指针？stageData为什么不需要释放？</li></ol><h2 class="notion-h notion-h1 notion-h-indent-0 notion-block-26167e54f7f24acb887685516a4836e2" data-id="26167e54f7f24acb887685516a4836e2"><span><div id="26167e54f7f24acb887685516a4836e2" class="notion-header-anchor"></div><a class="notion-hash-link" href="#26167e54f7f24acb887685516a4836e2" title="下一章提要"><svg viewBox="0 0 16 16" width="16" height="16"><path fill-rule="evenodd" d="M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z"></path></svg></a><span class="notion-h-title">下一章提要</span></span></h2><div class="notion-callout notion-gray_background_co notion-block-a82ae7fb388b430691a9435c3438144d"><div class="notion-page-icon-inline notion-page-icon-span"><span class="notion-page-icon" role="img" aria-label="💡">💡</span></div><div class="notion-callout-text">添加游戏开发中的重要功能：读取场景数据 </div></div></main></div>]]></content:encoded>
        </item>
    </channel>
</rss>