在游戏中添加新单词

Posted

技术标签:

【中文标题】在游戏中添加新单词【英文标题】:Adding new words to the game 【发布时间】:2012-08-23 20:18:23 【问题描述】:

在我的拼写游戏中,新单词会一直添加,所以总是有新的单词可供选择。

添加到游戏中的每个单词都有一个图像“src”和一个提示用户在游戏中正确拼写的声音。

当我完成游戏制作后,添加新词的工作就交给了我的一位同事。这意味着他必须为图片和音频以及单词添加链接。

由于他们对这类事情知之甚少,我想让他在添加单词时尽可能轻松地添加图像和声音这玩意儿。

这样他只需输入“bug”作为单词,“.bug-pic”作为图片,“.bug-audio”作为声音,这样他就可以很容易地添加到 html 中。

这是最好的方法吗?

他们输入这些内容的最简单方法是什么?

这是我目前存储单词、声音和图像的方式...

<ul style="display:none;" id="wordlist">

    <li data-word="mum" data-audio="file:///C:/smilburn/AudioClips/mum.wav" data-pic="http://www.clker.com/cliparts/5/e/7/f/1195445022768793934Gerald_G_Lady_Face_Cartoon_1.svg.med.png"></li>

    <li data-word="cat" data-audio="file:///C:/smilburn/AudioClips/cat.wav" data-pic="http://www.clker.com/cliparts/c/9/9/5/119543969236915703Gerald_G_Cartoon_Cat_Face.svg.med.png"></li>

    <li data-word="dog" data-audio="file:///C:/smilburn/AudioClips/dog.wav" data-pic="http://www.clker.com/cliparts/e/9/4/1/1195440435939167766Gerald_G_Dog_Face_Cartoon_-_World_Label_1.svg.med.png"></li>

    <li data-word="bug" data-audio="file:///C:/smilburn/AudioClips/bug.wav" data-pic="http://www.clker.com/cliparts/4/b/4/2/1216180545881311858laurent_scarabe.svg.med.png"></li>

    <li data-word="rat" data-audio="file:///C:/smilburn/AudioClips/rat.wav" data-pic="http://www.clker.com/cliparts/C/j/X/e/k/D/mouse-md.png"></li>

    <li data-word="dad" data-audio="file:///C:/smilburn/AudioClips/dad.wav" data-pic="http://www.clker.com/cliparts/H/I/n/C/p/Z/bald-man-face-with-a-mustache-md.png"></li>

  </ul>

谢谢

【问题讨论】:

为什么要使用“file:///C:/”,这个应用程序不会上互联网吗?另外,您使用的是什么服务器端语言? 是的,但这只是暂时的,而我是@Sam 我看不出那是“服务器端”@sMilbz --BTW 我建议您为他们构建一个界面来执行此操作。 【参考方案1】:

我将在这里打破你的模式,并提出一些看起来简单从长远来看对我来说足够简单的东西(至少,比你这里的更简单)。

使用 HTML 标记来存储文字的问题在于:

    它是 HTML --- 浏览器必须解析它,然后不显示它,因为你有 &lt;ul&gt; 元素作为 display:none (这只是一种浪费的努力) , 和 XML(或HTML,无论哪个)相当臃肿,因为需要大量文本来表示信息。如果您要玩拼写游戏,我假设您将有数百或数千个这样的单词,并且您的单词的 HTML 表示是大量的带宽膨胀。

所以!以下是我的建议:

// create an external JS file to store your words,
// let's say, [words.js].

// then let's just store your words in an array
var words = [
     word : "foo" , audio : "file:///C:/smilburn/AudioClips/foo.wav", pic : "http://www.clker.com/cliparts/5/e/7/f/1195445022768793934Gerald_G_Lady_Face_Cartoon_1.svg.med.png" ,
     word : "bar" , audio : "file:///C:/smilburn/AudioClips/bar.wav", pic : "http://www.clker.com/cliparts/5/e/7/f/1195445022768793934Gerald_G_Lady_Face_Cartoon_1.svg.med.png" ,
     word : "mum" , audio : "file:///C:/smilburn/AudioClips/mum.wav", pic : "http://www.clker.com/cliparts/5/e/7/f/1195445022768793934Gerald_G_Lady_Face_Cartoon_1.svg.med.png" 
];

它只是一个包含 javascript 对象集合的普通 Javascript 数组。每个对象都有三个属性:wordaudiopic

将该文件加载到您的页面中,并从中读取一个脚本。遍历、使用和应用到您的页面会更更容易更快。读取和读取 JS 对象通常比从 DOM 解析和读取相同信息要快。

此外,标记更加紧凑,并且您不会因为(可以说)不应该做的事情而[滥用] HTML DOM。

第三,它比 HTML 标记更有条理和更清晰,我想这会让你的同事更容易更新和适应。

最后,这种方法的一个好处是可以很容易地将代码写入模块,因此您可以更轻松地处理扩展/单词包之类的东西:

// something like this can work:

// [words.js]
var words = [
    // some base words
     word : "foo", audio : "foo.wmv", pic : "foo.pic" 
    // ...
];

// [words.animals.js]
(function () 
    // do not do anything if the base [words.js] isn't loaded
    if (!words)  return; 

    // extend the base words
    words = words.concat([
        // new animal words!
         word : "dog", audio : "bark.wmv", pic : "brian.jpg" 
        // ...
    ]);

)();

想法是,您可以将words.js 文件加载到您的游戏中,它会完美运行。但是,如果用户还想添加新词(例如,动物的词),那么他们(您)可以加载辅助文件来增加您的基本词列表。

使用 JS 对象比使用 HTML 标记要容易得多

编辑

如果您确实肯定最终答案必须使用 HTML,我建议从您的 &lt;li&gt; 中删除 data-word 属性,而只使用它的文本值。

<li data-audio="dog.wmv" data-pic="dog.jpg">dog</li>

【讨论】:

唯一的问题是他们明确告诉我它必须通过 html 来适应 那么你最好将这个细节添加到你的问题中,因为这听起来会严重限制你的选择。 :) 我认为应该归功于 Richard。我还认为数据应该以 json 格式提供(可能在后期来自 $.getJSON() 调用)。【参考方案2】:

我建议,您只需像这样存储信息:

<li data-word="mum" data-audio="mum.wav" data-pic="/5/e/7/f/1195445022768793934Gerald_G_Lady_Face_Cartoon_1.svg.med.png"></li>

在阅读完你的 jsFiddle 之后,我建议你像这样创建一个 playAudio 函数:

function playAudioFile (audioFileName) 
    audioFileName = "http://www.wav-sounds.com/cartoon/" + audioFile;
    $("#mysoundclip").attr('src', audioFileName);

之后你可以替换这个:

$("#mysoundclip").attr('src', listOfWords[rndWord].audio);
audio.play();

通过这样的方式:

playAudioFile(listOfWords[rndWord].audio);

【讨论】:

如何告诉程序所有文件都来自一个文件夹,这样我就可以将音频缩写为“mum.wav”,因为目前我不能这样做@kannix 有不同的可能性。我会在你实际播放声音文件的地方实现它。因此,您只需加载 data-audio 值并将其附加到具有默认路径的字符串 appart 从您的问题中存储和管理您在 html 标记中的所有单词似乎是一个坏主意。您应该为此使用数据库或配置文件。也许您可以在 github 上托管整个项目,以便我们更好地全面了解您的代码? ok,为什么不把你的 ul list 的数据直接存入 listOfWords 数组呢? 因为需要通过 HTML 而不是 javaScript/JQuery @kannix 来添加东西【参考方案3】:

您必须使用attr() 将图像存储在默认位置。 Here 他们解释了存储图像的默认位置。

【讨论】:

你能给我举个例子吗? @user1621335【参考方案4】:

您可能还想考虑一下您还可以使用哪些服务器端技术。

如果您必须通过 html 添加选项,那么您可以在页面的该部分执行的操作是让服务器动态生成 html 元素。

'ASP Classic example

<%
set fs = server.createObject("scripting.filesystem")
set folder = fs.getFolder("your path here")
for each file in folder.getFiles("*.wav")
 strWord = left(file.name, length(file.name)-4)
%><li data-word="cat"
    data-audio="path/to/folder/<%=strWord%>.wav"
    data-pic="path/to/folder/<%=strWord%>.png"></li>
<%
next
%>

这只是一个 asp 经典示例,我相信您会找到其他特定于您使用的平台的示例。

但基本上...如果你想让它成为一个即插即用的操作,你必须在服务器上告诉输出页面什么是可用的。否则你可能会像以前一样做 html。技术并不总是会取代普通的数据输入。

【讨论】:

【参考方案5】:

嗯,在我看来,您可以为您的同事使用数据库、服务器端脚本和表单。创建一个表单,他将使用该表单将信息上传到服务器并将路径存储到数据库中。

形式:

<form method="POST" action="myscript.php" enctype="multipart/form-data">
    <p>Word:<input type="text" name="my-word" id="my_word"></p>
    <p>Audio:<input type="file" name="audio" id="my_audio" /></p>
    <p>Picture:<input type="file" name="picture" id="my_picture" /></p>
    <p><input type="submit" name="submit" value="Submit" /></p>
</form>

脚本:

<?php
    $conn = mysql_connect("your_host", "your_user", "your_pass") or die (mysql_error());
    mysql_select_db("your_database", $conn) or die (mysql_error());

    if( ( $_FILES[ 'audio' ][ 'error' ] > 0 ) || ( $_FILES[ 'picture' ][ 'error' ] ) )
        echo "Error" . "<br />";
    
    else
        move_uploaded_file($_FILES["audio"]["tmp_name"], "your/upload/directory/for/audio/" . $_FILES["audio"]["name"]);
        move_uploaded_file($_FILES["picture"]["tmp_name"], "your/upload/directory/for/images/" . $_FILES["file"]["name"]);
        mysql_query( 'INSERT INTO your_table ( word, audio, image ) values ( "' . $_POST[ 'word' ] . '", "' . $_FILES[ 'audio' ][ 'name' ] . '", "' . $_FILES[ 'picture' ][ 'name' ] . '" )', $conn );
    
?>

当然,您的数据库应该有一个存储这 3 个值和一些 id 的表。

【讨论】:

【参考方案6】:

我认为您可以在 javascript 中向这样的列表添加更多条目:

function addLI(id)
var Parent = document.getElementById(id);
var NewLI = document.createElement("LI");

NewLI.innerHTML = "this is a test";

Parent.appendChild(NewLI);

我从这里找到的:http://bytes.com/topic/javascript/answers/520885-add-new-list-item

我建议为您的朋友添加包含名称、位置和图片的输入字段,以添加更多条目,然后使用类似此 js 函数的功能添加新的子条目。

【讨论】:

他没有要求使用 js 方法将一些元素附加到 dom,此外他使用 jquery,因此他可以使用 ´.append("我是一个例子 ")` 他似乎想让他的朋友可以轻松地将新条目添加到他的声音/图片列表中。拥有一个包含 3 个字段和一个“添加”按钮的页面意味着他所要做的就是添加相关信息,并且该页面可以动态更新 XML。不需要反对票。【参考方案7】:

如果您可以使用 PHP 访问服务器,我建议将所有项目放在一个数组中,然后循环遍历它们。

我在这里写了一个例子:

<?php
    $wordsArray = array(
            array('word'=> 'randomword' , 'audio' => 'test.mp3', 'picture' =>'pic.jpg'),
            array('word'=> 'randomword2' , 'audio' => 'test2.mp3', 'picture' =>'pic2.jpg')
        );

        $html = '';
        foreach($wordsArray as $word)
            $html .= '<li data-word="'.$word['word'].'" data-audio="'.$word['audio'].'" data-pic="'.$word['picture'].'"></li>';
        
?>
    <html>
        <head>
            <title></title>
        </head>
        <body>
            <ul>
                <?php echo $html; ?>
            </ul>
        </body>
    </html>

【讨论】:

以上是关于在游戏中添加新单词的主要内容,如果未能解决你的问题,请参考以下文章

软工网络15团队作业2——团队计划

如何在Tensorflow中添加未知单词的新嵌入(训练和预设测试)

Xamarin Forms:如何为网格内单击的按钮添加背景颜色(单词搜索游戏)

如何在 Tensorflow 中为未知单词添加新的嵌入(训练和预设测试)

将 Corona SDK 中的磁贴组合成一个单词以形成 Breakout 游戏网格?

如何优化拼字游戏中的单词排列?