增加dist静态资源
This commit is contained in:
204
.vitepress/dist/assets/技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.11.设置条件.md.D1w5O6yc.js
vendored
Normal file
204
.vitepress/dist/assets/技术资源汇总(杭电支持版)_3.编程思维体系构建_3.4.6.11.设置条件.md.D1w5O6yc.js
vendored
Normal 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 "11.设置条件""></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>从 "警卫阻止你...... "改为 "你走进山洞"</li><li>在一些特殊情况下,描述和细节不需要改变。但对于一个门洞或栅栏,其中之一(或两者)通常会包含一些从 "开放 "到 "关闭 "的文字。</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->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->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->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->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 "object.txt""></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 "a cave entrance to the east"</span></span>
|
||||
<span class="line"><span> tags "east", "entrance"</span></span>
|
||||
<span class="line"><span> location field</span></span>
|
||||
<span class="line"><span> destination cave</span></span>
|
||||
<span class="line"><span> detail "The entrance is just a narrow opening in a small outcrop.\\n"</span></span>
|
||||
<span class="line"><span> textGo "You walk into the cave.\\n"</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 "a cave entrance to the east"</span></span>
|
||||
<span class="line"><span> tags "east", "entrance"</span></span>
|
||||
<span class="line"><span> location field</span></span>
|
||||
<span class="line"><span> prospect cave</span></span>
|
||||
<span class="line"><span> detail "The entrance is just a narrow opening in a small outcrop.\\n"</span></span>
|
||||
<span class="line"><span> textGo "The guard stops you from walking into the cave.\\n"</span></span></code></pre></div><div class="warning custom-block"><p class="custom-block-title">🤔 思考题:尝试自己实现上面的伪代码</p></div><p>这两个 "条件 "函数是如此具体,每一个条件函数都只用这一次。现在,我们可以在我们需要的地方定义这些函数。许多编程语言都支持匿名函数,像这样:</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->health == 0 || silver->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->health > 0 && silver->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 "new object.txt""></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 <stdbool.h></span></span>
|
||||
<span class="line"><span>#include <stdio.h></span></span>
|
||||
<span class="line"><span>#include "object.h"</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 "an open field"</span></span>
|
||||
<span class="line"><span> tags "field"</span></span>
|
||||
<span class="line"><span> details "The field is a nice and quiet place under a clear blue sky."</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 "a little cave"</span></span>
|
||||
<span class="line"><span> tags "cave"</span></span>
|
||||
<span class="line"><span> details "The cave is just a cold, damp, rocky chamber."</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 "a silver coin"</span></span>
|
||||
<span class="line"><span> tags "silver", "coin", "silver coin"</span></span>
|
||||
<span class="line"><span> location field</span></span>
|
||||
<span class="line"><span> details "The coin has an eagle on the obverse."</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 "a gold coin"</span></span>
|
||||
<span class="line"><span> tags "gold", "coin", "gold coin"</span></span>
|
||||
<span class="line"><span> location cave</span></span>
|
||||
<span class="line"><span> details "The shiny coin seems to be a rare and priceless artefact."</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 "a burly guard"</span></span>
|
||||
<span class="line"><span> tags "guard", "burly guard"</span></span>
|
||||
<span class="line"><span> location field</span></span>
|
||||
<span class="line"><span> details "The guard is a really big fellow."</span></span>
|
||||
<span class="line"><span> contents "He has"</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 "yourself"</span></span>
|
||||
<span class="line"><span> tags "yourself"</span></span>
|
||||
<span class="line"><span> location field</span></span>
|
||||
<span class="line"><span> details "You would need a mirror to look at yourself."</span></span>
|
||||
<span class="line"><span> contents "You have"</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->health == 0 || silver->location == guard; }</span></span>
|
||||
<span class="line"><span> description "a cave entrance to the east"</span></span>
|
||||
<span class="line"><span> tags "east", "entrance"</span></span>
|
||||
<span class="line"><span> location field</span></span>
|
||||
<span class="line"><span> destination cave</span></span>
|
||||
<span class="line"><span> details "The entrance is just a narrow opening in a small outcrop."</span></span>
|
||||
<span class="line"><span> textGo "You walk into the cave."</span></span>
|
||||
<span class="line"><span></span></span>
|
||||
<span class="line"><span>- intoCaveBlocked</span></span>
|
||||
<span class="line"><span> condition { return guard->health > 0 && silver->location != guard; }</span></span>
|
||||
<span class="line"><span> description "a cave entrance to the east"</span></span>
|
||||
<span class="line"><span> tags "east", "entrance"</span></span>
|
||||
<span class="line"><span> location field</span></span>
|
||||
<span class="line"><span> prospect cave</span></span>
|
||||
<span class="line"><span> details "The entrance is just a narrow opening in a small outcrop."</span></span>
|
||||
<span class="line"><span> textGo "The guard stops you from walking into the cave."</span></span>
|
||||
<span class="line"><span></span></span>
|
||||
<span class="line"><span>- exitCave</span></span>
|
||||
<span class="line"><span> description "an exit to the west"</span></span>
|
||||
<span class="line"><span> tags "west", "exit"</span></span>
|
||||
<span class="line"><span> location cave</span></span>
|
||||
<span class="line"><span> destination field</span></span>
|
||||
<span class="line"><span> details "Sunlight pours in through an opening in the cave's wall."</span></span>
|
||||
<span class="line"><span> textGo "You walk out of the cave."</span></span>
|
||||
<span class="line"><span></span></span>
|
||||
<span class="line"><span>- wallField</span></span>
|
||||
<span class="line"><span> description "dense forest all around"</span></span>
|
||||
<span class="line"><span> tags "west", "north", "south", "forest"</span></span>
|
||||
<span class="line"><span> location field</span></span>
|
||||
<span class="line"><span> details "The field is surrounded by trees and undergrowth."</span></span>
|
||||
<span class="line"><span> textGo "Dense forest is blocking the way."</span></span>
|
||||
<span class="line"><span></span></span>
|
||||
<span class="line"><span>- wallCave</span></span>
|
||||
<span class="line"><span> description "solid rock all around"</span></span>
|
||||
<span class="line"><span> tags "east", "north", "south", "rock"</span></span>
|
||||
<span class="line"><span> location cave</span></span>
|
||||
<span class="line"><span> details "Carved in stone is a secret password 'abccb'."</span></span>
|
||||
<span class="line"><span> textGo "Solid rock is blocking the way."</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 "misc.c""></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;"> <stdbool.h></span></span>
|
||||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> <stdio.h></span></span>
|
||||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "object.h"</span></span>
|
||||
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">#include</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "misc.h"</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;">&&</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> obj->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;"> &&</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;"><</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;">&&</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> obj->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->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->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->location, to->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->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;"><</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->location, obj) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">&&</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;">&&</span></span>
|
||||
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> obj->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:#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;"><</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;">&&</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;">"</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;">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, location->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;">"</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">%s\\n</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, obj->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>这两个条件函数是互补的;它们有资格成为重复的代码。为了消除这一点,我们可能决定让一个函数调用另一个函数(用'!'操作符来否定结果)。一个匿名函数没有(稳定的)名字,但我们可以用它的对象来指代它。我们可以用 intoCaveBlocked 的条件函数代替。</li><li>为了简单起见,条件函数没有参数。实际上,传递一个参数 OBJECT *obj 可能更好;这使得编写更多的通用条件函数成为可能,可以在多个对象中重复使用。</li><li>在理论上,任何对象都可以成为 "条件"。在下一章,你可以看到一个类似的技术被应用于此。</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>--> go entrance The guard stops you from walking into the cave.</p><p>--> get coin You pick up a silver coin.</p><p>--> give coin You give a silver coin to a burly guard.</p><p>--> 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>--> 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};
|
||||
Reference in New Issue
Block a user