增加dist静态资源

This commit is contained in:
2024-08-10 22:35:37 +08:00
parent bd752e71c2
commit 5c879a0f2b
455 changed files with 18759 additions and 3 deletions

View File

@@ -0,0 +1,204 @@
import{_ as s,c as a,o as i,a4 as n}from"./chunks/framework.DtvhUNIn.js";const g=JSON.parse('{"title":"11.设置条件","description":"","frontmatter":{},"headers":[],"relativePath":"技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.11.设置条件.md","filePath":"技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.11.设置条件.md"}'),p={name:"技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.11.设置条件.md"},l=n(`<h1 id="_11-设置条件" tabindex="-1">11.设置条件 <a class="header-anchor" href="#_11-设置条件" aria-label="Permalink to &quot;11.设置条件&quot;"></a></h1><p>到目前为止,所有对象的属性都是数据:文本、数字。但属性也可以是代码。</p><p>在上一章中,我们通过关闭洞穴入口(进入洞穴的通道)来限制玩家的行动自由。这已经让游戏变得更有挑战性了,但这并没有带来多少谜题,除非我们为玩家提供一个微小的可能性来打开通道。真正的挑战应该是让玩家找到通道打开的条件。</p><p>让我们举一个简单的例子。为了越过守卫进入山洞,玩家必须杀死或贿赂守卫(或两者兼而有之,这很有价值)。换句话说:</p><ul><li>当警卫死亡时HP=0入口开放</li><li>当警卫拿着银币 (贿赂警卫) 时,入口开放</li><li>两者都不是,入口关闭</li></ul><p>打开一个封闭的通道(在这里是进入洞穴)涉及到改变一些属性值:</p><ul><li>目的地从 NULL(空地点) 变为洞穴</li><li><strong>textGo</strong>从 &quot;警卫阻止你...... &quot;改为 &quot;你走进山洞&quot;</li><li>在一些特殊情况下,描述和细节不需要改变。但对于一个门洞或栅栏,其中之一(或两者)通常会包含一些从 &quot;开放 &quot;到 &quot;关闭 &quot;的文字。</li></ul><p>有许多方法来实现这一目标。在这里,我们将讨论一种简单、可维护和通用的方法。</p><p>首先,我们定义了两个独立的通道:一个代表开放通道,另一个代表封闭通道。除了上面列出的那些,这两条通道在每一个属性上都是相同的。(在你下面看到的生成的地图中,注意有两个箭头通向洞穴;一个是实线,一个是虚线)。</p><p>接下来,我们引入一个名为条件的新属性,它决定了某个对象是否存在。这两个通道将被赋予互斥的条件,因此在任何时候都只能有一个存在。</p><p>每个条件将被实现为一个布尔函数:<strong>TRUE</strong>意味着该对象存在,<strong>FALSE</strong>意味着它不存在。</p><div class="language-c vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">bool</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> intoCaveIsOpen</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">void</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> guard-&gt;health </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ||</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> silver-&gt;location </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> guard;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">bool</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> intoCaveIsClosed</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">void</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> guard-&gt;health </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&gt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> &amp;&amp;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> silver-&gt;location </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">!=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> guard;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">🤔 思考题:你能仿照上面例子自己写一些条件函数吗?</p></div><p>新的属性条件是一个指向这样一个函数的指针。</p><div class="language-c vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">bool</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">condition)(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">void</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span></span></code></pre></div><p>接下来,我们可以立即开始为 object.txt 中的新属性分配函数。</p><h2 id="object-txt" tabindex="-1">object.txt <a class="header-anchor" href="#object-txt" aria-label="Permalink to &quot;object.txt&quot;"></a></h2><div class="language-txt vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>- intoCave</span></span>
<span class="line"><span> condition intoCaveIsOpen</span></span>
<span class="line"><span> description &quot;a cave entrance to the east&quot;</span></span>
<span class="line"><span> tags &quot;east&quot;, &quot;entrance&quot;</span></span>
<span class="line"><span> location field</span></span>
<span class="line"><span> destination cave</span></span>
<span class="line"><span> detail &quot;The entrance is just a narrow opening in a small outcrop.\\n&quot;</span></span>
<span class="line"><span> textGo &quot;You walk into the cave.\\n&quot;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>- intoCaveBlocked</span></span>
<span class="line"><span> condition intoCaveIsClosed</span></span>
<span class="line"><span> description &quot;a cave entrance to the east&quot;</span></span>
<span class="line"><span> tags &quot;east&quot;, &quot;entrance&quot;</span></span>
<span class="line"><span> location field</span></span>
<span class="line"><span> prospect cave</span></span>
<span class="line"><span> detail &quot;The entrance is just a narrow opening in a small outcrop.\\n&quot;</span></span>
<span class="line"><span> textGo &quot;The guard stops you from walking into the cave.\\n&quot;</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">🤔 思考题:尝试自己实现上面的伪代码</p></div><p>这两个 &quot;条件 &quot;函数是如此具体,每一个条件函数都只用这一次。现在,我们可以在我们需要的地方定义这些函数。许多编程语言都支持匿名函数,像这样:</p><div class="language-txt vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>- intoCave</span></span>
<span class="line"><span> condition { return guard-&gt;health == 0 || silver-&gt;location == guard; }</span></span>
<span class="line"><span> ...</span></span>
<span class="line"><span></span></span>
<span class="line"><span>- intoCaveBlocked</span></span>
<span class="line"><span> condition { return guard-&gt;health &gt; 0 &amp;&amp; silver-&gt;location != guard; }</span></span>
<span class="line"><span> ...</span></span></code></pre></div><p>所以现在我们可以把额外的段落和条件添加到 object.txt 中,就像前面解释的那样。</p><h2 id="new-object-txt" tabindex="-1">new object.txt <a class="header-anchor" href="#new-object-txt" aria-label="Permalink to &quot;new object.txt&quot;"></a></h2><div class="language-txt vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">txt</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>#include &lt;stdbool.h&gt;</span></span>
<span class="line"><span>#include &lt;stdio.h&gt;</span></span>
<span class="line"><span>#include &quot;object.h&quot;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>typedef struct object {</span></span>
<span class="line"><span> bool (*condition)(void);</span></span>
<span class="line"><span> const char *description;</span></span>
<span class="line"><span> const char **tags;</span></span>
<span class="line"><span> struct object *location;</span></span>
<span class="line"><span> struct object *destination;</span></span>
<span class="line"><span> struct object *prospect;</span></span>
<span class="line"><span> const char *details;</span></span>
<span class="line"><span> const char *contents;</span></span>
<span class="line"><span> const char *textGo;</span></span>
<span class="line"><span> int weight;</span></span>
<span class="line"><span> int capacity;</span></span>
<span class="line"><span> int health;</span></span>
<span class="line"><span>} OBJECT;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>extern OBJECT objs[];</span></span>
<span class="line"><span></span></span>
<span class="line"><span>- field</span></span>
<span class="line"><span> description &quot;an open field&quot;</span></span>
<span class="line"><span> tags &quot;field&quot;</span></span>
<span class="line"><span> details &quot;The field is a nice and quiet place under a clear blue sky.&quot;</span></span>
<span class="line"><span> capacity 9999</span></span>
<span class="line"><span></span></span>
<span class="line"><span>- cave</span></span>
<span class="line"><span> description &quot;a little cave&quot;</span></span>
<span class="line"><span> tags &quot;cave&quot;</span></span>
<span class="line"><span> details &quot;The cave is just a cold, damp, rocky chamber.&quot;</span></span>
<span class="line"><span> capacity 9999</span></span>
<span class="line"><span></span></span>
<span class="line"><span>- silver</span></span>
<span class="line"><span> description &quot;a silver coin&quot;</span></span>
<span class="line"><span> tags &quot;silver&quot;, &quot;coin&quot;, &quot;silver coin&quot;</span></span>
<span class="line"><span> location field</span></span>
<span class="line"><span> details &quot;The coin has an eagle on the obverse.&quot;</span></span>
<span class="line"><span> weight 1</span></span>
<span class="line"><span></span></span>
<span class="line"><span>- gold</span></span>
<span class="line"><span> description &quot;a gold coin&quot;</span></span>
<span class="line"><span> tags &quot;gold&quot;, &quot;coin&quot;, &quot;gold coin&quot;</span></span>
<span class="line"><span> location cave</span></span>
<span class="line"><span> details &quot;The shiny coin seems to be a rare and priceless artefact.&quot;</span></span>
<span class="line"><span> weight 1</span></span>
<span class="line"><span></span></span>
<span class="line"><span>- guard</span></span>
<span class="line"><span> description &quot;a burly guard&quot;</span></span>
<span class="line"><span> tags &quot;guard&quot;, &quot;burly guard&quot;</span></span>
<span class="line"><span> location field</span></span>
<span class="line"><span> details &quot;The guard is a really big fellow.&quot;</span></span>
<span class="line"><span> contents &quot;He has&quot;</span></span>
<span class="line"><span> health 100</span></span>
<span class="line"><span> capacity 20</span></span>
<span class="line"><span></span></span>
<span class="line"><span>- player</span></span>
<span class="line"><span> description &quot;yourself&quot;</span></span>
<span class="line"><span> tags &quot;yourself&quot;</span></span>
<span class="line"><span> location field</span></span>
<span class="line"><span> details &quot;You would need a mirror to look at yourself.&quot;</span></span>
<span class="line"><span> contents &quot;You have&quot;</span></span>
<span class="line"><span> health 100</span></span>
<span class="line"><span> capacity 20</span></span>
<span class="line"><span></span></span>
<span class="line"><span>- intoCave</span></span>
<span class="line"><span> condition { return guard-&gt;health == 0 || silver-&gt;location == guard; }</span></span>
<span class="line"><span> description &quot;a cave entrance to the east&quot;</span></span>
<span class="line"><span> tags &quot;east&quot;, &quot;entrance&quot;</span></span>
<span class="line"><span> location field</span></span>
<span class="line"><span> destination cave</span></span>
<span class="line"><span> details &quot;The entrance is just a narrow opening in a small outcrop.&quot;</span></span>
<span class="line"><span> textGo &quot;You walk into the cave.&quot;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>- intoCaveBlocked</span></span>
<span class="line"><span> condition { return guard-&gt;health &gt; 0 &amp;&amp; silver-&gt;location != guard; }</span></span>
<span class="line"><span> description &quot;a cave entrance to the east&quot;</span></span>
<span class="line"><span> tags &quot;east&quot;, &quot;entrance&quot;</span></span>
<span class="line"><span> location field</span></span>
<span class="line"><span> prospect cave</span></span>
<span class="line"><span> details &quot;The entrance is just a narrow opening in a small outcrop.&quot;</span></span>
<span class="line"><span> textGo &quot;The guard stops you from walking into the cave.&quot;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>- exitCave</span></span>
<span class="line"><span> description &quot;an exit to the west&quot;</span></span>
<span class="line"><span> tags &quot;west&quot;, &quot;exit&quot;</span></span>
<span class="line"><span> location cave</span></span>
<span class="line"><span> destination field</span></span>
<span class="line"><span> details &quot;Sunlight pours in through an opening in the cave&#39;s wall.&quot;</span></span>
<span class="line"><span> textGo &quot;You walk out of the cave.&quot;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>- wallField</span></span>
<span class="line"><span> description &quot;dense forest all around&quot;</span></span>
<span class="line"><span> tags &quot;west&quot;, &quot;north&quot;, &quot;south&quot;, &quot;forest&quot;</span></span>
<span class="line"><span> location field</span></span>
<span class="line"><span> details &quot;The field is surrounded by trees and undergrowth.&quot;</span></span>
<span class="line"><span> textGo &quot;Dense forest is blocking the way.&quot;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>- wallCave</span></span>
<span class="line"><span> description &quot;solid rock all around&quot;</span></span>
<span class="line"><span> tags &quot;east&quot;, &quot;north&quot;, &quot;south&quot;, &quot;rock&quot;</span></span>
<span class="line"><span> location cave</span></span>
<span class="line"><span> details &quot;Carved in stone is a secret password &#39;abccb&#39;.&quot;</span></span>
<span class="line"><span> textGo &quot;Solid rock is blocking the way.&quot;</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">🤔 思考题:尝试自己实现这些功能,并看看与你之前设计的有何不同</p></div><p>为了使这些条件发挥作用,我们需要调整函数 isHolding 和 getDistance。</p><h2 id="misc-c" tabindex="-1">misc.c <a class="header-anchor" href="#misc-c" aria-label="Permalink to &quot;misc.c&quot;"></a></h2><div class="language-c vp-adaptive-theme"><button title="Copy Code" class="copy"></button><span class="lang">c</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &lt;stdbool.h&gt;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &lt;stdio.h&gt;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;object.h&quot;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;misc.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">bool</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> isHolding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(OBJECT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">container</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, OBJECT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">obj</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> validObject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(obj) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&amp;&amp;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> obj-&gt;location </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> container;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">OBJECT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">getPassage</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(OBJECT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, OBJECT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">to</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (from </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">!=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> NULL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> &amp;&amp;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> to </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">!=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> NULL</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> OBJECT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">obj;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> objs; obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&lt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> endOfObjs; obj</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">isHolding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(from, obj) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&amp;&amp;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> obj-&gt;prospect </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> to)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> obj;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> NULL</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">DISTANCE </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">getDistance</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(OBJECT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">from</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, OBJECT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">to</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> to </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> NULL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> distUnknownObject </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> !</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">validObject</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(to) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> distNotHere </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> to </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">==</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> from </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> distSelf </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> isHolding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(from, to) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> distHeld </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> isHolding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(to, from) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> distLocation </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> isHolding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(from-&gt;location, to) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> distHere </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> isHolding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(from, to-&gt;location) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> distHeldContained </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> isHolding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(from-&gt;location, to-&gt;location) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> distHereContained </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> getPassage</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(from-&gt;location, to) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">!=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> NULL</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> distOverthere </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> distNotHere;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">OBJECT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">actorHere</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">void</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> OBJECT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">obj;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> objs; obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&lt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> endOfObjs; obj</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">isHolding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(player-&gt;location, obj) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&amp;&amp;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">!=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> player </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&amp;&amp;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> obj-&gt;health </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&gt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> obj;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> NULL</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">int</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> listObjectsAtLocation</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(OBJECT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">location</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> int</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> count </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> OBJECT </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">*</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">obj;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> objs; obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&lt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> endOfObjs; obj</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">++</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (obj </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">!=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> player </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&amp;&amp;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> isHolding</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(location, obj))</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (count</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">++</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> ==</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%s</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">\\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, location-&gt;contents);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> printf</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%s\\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, obj-&gt;description);</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> count;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">🤔 思考题:想想我们调整了什么</p></div><p>注意:</p><ol><li>警卫不可能会死,所以可以说我们的条件函数中的<strong>HP</strong>是很无用的。当然,这很容易通过添加一个 kill 命令来解决,见第 20 章。</li><li>这两个条件函数是互补的;它们有资格成为重复的代码。为了消除这一点,我们可能决定让一个函数调用另一个函数(用&#39;&#39;操作符来否定结果)。一个匿名函数没有(稳定的)名字,但我们可以用它的对象来指代它。我们可以用 intoCaveBlocked 的条件函数代替。</li><li>为了简单起见,条件函数没有参数。实际上,传递一个参数 OBJECT *obj 可能更好;这使得编写更多的通用条件函数成为可能,可以在多个对象中重复使用。</li><li>在理论上,任何对象都可以成为 &quot;条件&quot;。在下一章,你可以看到一个类似的技术被应用于此。</li></ol><div class="warning custom-block"><p class="custom-block-title">🤔 思考题:想一想上面第二点要怎么用 C 来实现?</p></div><p>输出样例</p><p>Welcome to Little Cave Adventure. You are in an open field. You see: a silver coin a burly guard a cave entrance to the east dense forest all around</p><p>--&gt; go entrance The guard stops you from walking into the cave.</p><p>--&gt; get coin You pick up a silver coin.</p><p>--&gt; give coin You give a silver coin to a burly guard.</p><p>--&gt; go entrance You walk into the cave.</p><p>You are in a little cave. You see: a gold coin an exit to the west solid rock all around</p><p>--&gt; quit</p><p>Bye!</p>`,41),t=[l];function e(h,k,o,E,r,c){return i(),a("div",null,t)}const y=s(p,[["render",e]]);export{g as __pageData,y as default};