Files
fzu-product/.vitepress/dist/assets/技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.11.设置条件.md.D1w5O6yc.js

205 lines
38 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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};