71 lines
7.3 KiB
JavaScript
71 lines
7.3 KiB
JavaScript
import{_ as s,c as n,o as a,a4 as p}from"./chunks/framework.DtvhUNIn.js";const h=JSON.parse('{"title":"9.练习:生成代码","description":"","frontmatter":{},"headers":[],"relativePath":"技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.9.练习:生成代码.md","filePath":"技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.9.练习:生成代码.md"}'),e={name:"技术资源汇总(杭电支持版)/3.编程思维体系构建/3.4.6.9.练习:生成代码.md"},t=p(`<h1 id="_9-练习-生成代码" tabindex="-1">9.练习:生成代码 <a class="header-anchor" href="#_9-练习-生成代码" aria-label="Permalink to "9.练习:生成代码""></a></h1><p><em>到目前为止,我们的冒险游戏有 10 个对象。每个对象由有 5 个属性组成。一个真正的文本冒险可能有数百个甚至数千个对象,并且每个对象的属性数量也可能增加(请参阅下一章)。在目前的形式下,维护如此庞大的对象和属性列表将很困难。</em></p><p>例如,当我们在添加对象 <em>wallField</em> 和 <em>wallCave</em> 时,我们必须在三个不同的位置执行此操作:一次在 <em>object.h</em> 中(作为<em>#define</em>),两次在 <em>object.c</em> 中(数组 <em>objs</em> 中的一个元素,以及一个单独的标签数组)。这显然十分笨拙并且容易出错。</p><p>我们将不再手工维护 object. h 和 object. c,而是从更适合我们需要的单一源开始生成文件。这个新的源文件可以用你喜欢的任何语言 ( 典型的是某些特定领域的语言 ),只要你有工具把它转换回 C。下面是一个简单的例子,考虑下列布局来组织我们的对象:</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> /* Raw C code (declarations) */</span></span>
|
||
<span class="line"><span>- ObjectName</span></span>
|
||
<span class="line"><span> AttributeName AttributeValue</span></span>
|
||
<span class="line"><span> AttributeName AttributeValue</span></span>
|
||
<span class="line"><span> ...</span></span>
|
||
<span class="line"><span>- ObjectName</span></span>
|
||
<span class="line"><span> AttributeName AttributeValue</span></span>
|
||
<span class="line"><span> AttributeName AttributeValue</span></span>
|
||
<span class="line"><span> ...</span></span>
|
||
<span class="line"><span>- ...</span></span></code></pre></div><p>根据到目前为止收集的对象,我们可以构造以下源文件。文件名并不重要;我只是简单地将其命名为<em>object.txt</em>,以明确它与<em>object.h</em>和<em>object.c</em>相关。</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>#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> 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>} 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></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></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></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></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></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></span></span>
|
||
<span class="line"><span>- intoCave</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></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></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></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></code></pre></div><div class="warning custom-block"><p class="custom-block-title">🤔 思考题:你能否自己用 C 来实现这段伪代码?</p></div>`,9),l=[t];function o(i,c,u,r,d,q){return a(),n("div",null,l)}const m=s(e,[["render",o]]);export{h as __pageData,m as default};
|