0

我刚刚完成了关于 javascript 的 codeacademy 课程,所以请原谅我完全缺乏知识。

我正在尝试使用 javascript 和 html 创建经典的酒吧游戏 1-4-24(也称为午夜过后或午夜之后)。(这是一个视频,为那些不知道它是什么的人展示了这款游戏。

到目前为止,我已经创建了一个掷骰子并将它们存储在数组中的函数。在此代码的先前版本中,我能够将这些结果以图像形式附加到页面正文中。但是,当用户再次掷骰子时,我需要能够删除这些结果。

我决定使用 div 来分隔掷骰子、用户保留的骰子和用于掷骰子的菜单。

我的问题是:我需要在这个新的 div 中显示掷骰结果。我非常非常不成功——主要是因为即使在阅读了 W3schools 和其他网站上的多篇文章之后,我也不完全理解 appendChild() 的工作原理。

所以这是我的代码 - 具体看 addImageRolled 函数 - 我不一定希望它“修复”,我想知道如何修复它。这对我来说是一个学习项目。

    <!doctype html>
    <html>
    <head>
<title>Put your title here</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="style.css" type="text/css" rel="stylesheet" />
    </head>
    <body>

<script>
    // variables
    var diceLeft = 6;

    // arrays

    var rolls = [];
    var kept = [];

    // functions

    // rolls dice
    function rollDice() {
        for (var i = 0; i < diceLeft; i++) {
        rolls[i] = 1 + Math.floor(Math.random() * 6);
        };
            displayRoll();
    };

    // creates images for displayRoll function
    function addImageRolled(id, src, width, height, hspace) {
    var img = document.createElement("img");
    img.id = id;
    img.src = src;
    img.width = width;
    img.height = height;
    img.hspace = hspace;
    img.onmouseup= keepDie();
    document.getElementById("Rolled").appendChild(img);

    };

    // displays images based on rolls
    displayRoll() {
        switch(roll[0]) {
        case 1: addImageRolled(1, "dice-1.png", 100, 100, 5);
        break;
        case 2: addImageRolled(1, "dice-2.png", 100, 100, 5);
        break;
        case 3: addImageRolled(1, "dice-3.png", 100, 100, 5);
        break;
        case 4: addImageRolled(1, "dice-4.png", 100, 100, 5);
        break;
        case 5: addImageRolled(1, "dice-5.png", 100, 100, 5);
        break;
        case 6: addImageRolled(1, "dice-6.png", 100, 100, 5);
        break;
        };

        switch(roll[1]) {
        case 1: addImageRolled(2, "dice-1.png", 100, 100, 5);
        break;
        case 2: addImageRolled(2, "dice-2.png", 100, 100, 5);
        break;
        case 3: addImageRolled(2, "dice-3.png", 100, 100, 5);
        break;
        case 4: addImageRolled(2, "dice-4.png", 100, 100, 5);
        break;
        case 5: addImageRolled(2, "dice-5.png", 100, 100, 5);
        break;
        case 6: addImageRolled(2, "dice-6.png", 100, 100, 5);
        break;
        };

        switch(roll[2]) {
        case 1: addImageRolled(3, "dice-1.png", 100, 100, 5);
        break;
        case 2: addImageRolled(3, "dice-2.png", 100, 100, 5);
        break;
        case 3: addImageRolled(3, "dice-3.png", 100, 100, 5);
        break;
        case 4: addImageRolled(3, "dice-4.png", 100, 100, 5);
        break;
        case 5: addImageRolled(3, "dice-5.png", 100, 100, 5);
        break;
        case 6: addImageRolled(3, "dice-6.png", 100, 100, 5);
        break;
        };

        switch(roll[3]) {
        case 1: addImageRolled(4, "dice-1.png", 100, 100, 5);
        break;
        case 2: addImageRolled(4, "dice-2.png", 100, 100, 5);
        break;
        case 3: addImageRolled(4, "dice-3.png", 100, 100, 5);
        break;
        case 4: addImageRolled(4, "dice-4.png", 100, 100, 5);
        break;
        case 5: addImageRolled(4, "dice-5.png", 100, 100, 5);
        break;
        case 6: addImageRolled(4, "dice-6.png", 100, 100, 5);
        break;
        };

        switch(roll[4]) {
        case 1: addImageRolled(5, "dice-1.png", 100, 100, 5);
        break;
        case 2: addImageRolled(5, "dice-2.png", 100, 100, 5);
        break;
        case 3: addImageRolled(5, "dice-3.png", 100, 100, 5);
        break;
        case 4: addImageRolled(5, "dice-4.png", 100, 100, 5);
        break;
        case 5: addImageRolled(5, "dice-5.png", 100, 100, 5);
        break;
        case 6: addImageRolled(5, "dice-6.png", 100, 100, 5);
        break;
        };

        switch(roll[5]) {
        case 1: addImageRolled(6, "dice-1.png", 100, 100, 5);
        break;
        case 2: addImageRolled(6, "dice-2.png", 100, 100, 5);
        break;
        case 3: addImageRolled(6, "dice-3.png", 100, 100, 5);
        break;
        case 4: addImageRolled(6, "dice-4.png", 100, 100, 5);
        break;
        case 5: addImageRolled(6, "dice-5.png", 100, 100, 5);
        break;
        case 6: addImageRolled(6, "dice-6.png", 100, 100, 5);
        break;
        };
    };

</script>

<div class="content">
    <div class="Menu">
        <div class="content">
            <p>How to play: Click "Roll!" button to roll the dice. Click on any die to keep                 it.</p>
            <input type = "button" value = "Roll!" onClick = rollDice()>
        </div>
    </div>
    <div id="Rolled" class="Rolled">
        <div class="content">
        </div>
    </div>
    <div class="Kept">
        <div class="content">
        </div>
    </div>
</div>

4

3 回答 3

2

如图所示,您的代码存在几个问题,这些问题实际上都与.appendChild()您正确使用的方法无关。

在您的addImageRolled()函数中,您有以下行:

img.onmouseup= keepDie();

...但是该keepDie()函数未定义,并且您不应该有括号,否则它会立即调用该函数并将结果分配为onmouseup处理程序。您需要实际声明该函数,然后像这样使用它:

img.onmouseup = keepDie;

您的displayRoll()函数声明缺少单词function,这会给您带来语法错误。并在您引用一个名为that should bedisplayRoll()的数组。这个函数也可以做得短:rollrolls

// displays images based on rolls
function displayRoll() {
    for (var i = 0; i < diceLeft; i++) {
        addImageRolled(i + 1, "dice-" + rolls[i] + ".png", 100, 100, 5);
    }
}

您不需要六个看起来都一样的单独 switch 语句,您只需使用for循环来处理rolls数组的每个元素。然后对于任何给定的元素,rolls[i]不需要使用 switch 语句来决定添加哪个图像,因为您可以将rolls[i]元素的值直接连接到给出图像名称的字符串中。

这是一个包含这些更改的演示:http: //jsfiddle.net/YcwDb/3/(实际上没有图像,但您可以看到它们的位置。)

“我不一定想要它‘修复’,我想知道如何修复它。这对我来说是一个学习项目。”

那么上面应该让你去。通常,如果您使用浏览器的开发工具(在 Chrome 或 IE 中按 F12 或在 FF 中按 ctrl-shift-K 显示)这些类型的错误将显示在控制台中。有时错误消息有点神秘(尤其是对于初学者),但它们仍然比想知道可能出了什么问题要好。

于 2013-06-02T00:48:28.077 回答
1

我建议使用 Chrome 开发人员工具(chrome 中的 F12)来调试 javascript。进入“来源”,按左上角的箭头,找到文件,然后按滚动按钮。

我做的第一件事是在“displayRoll()”之前添加“function”关键字,因为这会引发 SyntaxError。

它显示了一些东西:

“未捕获的 ReferenceError:未定义滚动。”

将“roll”的所有实例更改为“rolls”后,因为您定义的数组是“rolls”:

“未定义未捕获的 ReferenceError keepDie()。”

删除引用“keepDie()”的行后,因为我看不到它在做什么,滚动后我在屏幕上显示了六个图像。

我还建议为您的“displayRoll()”函数使用某种循环,以使代码更清晰并更容易更改要显示的骰子数量:

function displayRoll() {
    for (var i = 0; i < 6; i++)
    {
        switch(rolls[i]) {
            case 1: addImageRolled(i+1, "dice-1.png", 100, 100, 5);
            break;
            case 2: addImageRolled(i+1, "dice-2.png", 100, 100, 5);
            break;
            case 3: addImageRolled(i+1, "dice-3.png", 100, 100, 5);
            break;
            case 4: addImageRolled(i+1, "dice-4.png", 100, 100, 5);
            break;
            case 5: addImageRolled(i+1, "dice-5.png", 100, 100, 5);
            break;
            case 6: addImageRolled(i+1, "dice-6.png", 100, 100, 5);
            break;
            };
    }
};

我不相信你对“appendChild”有任何问题,但我是一名 C# 开发人员,我的 JavaScript 知识非常少。

于 2013-06-02T00:43:57.727 回答
0
 1. onclick method 

    <input type = "button" value = "Roll!" onClick = rollDice()>

should be with wrapepd in quotes

    <input type = "button" value = "Roll!" onClick = "rollDice()">

 2. Your array is named rolls`var rolls = [];`

    but in switch you got  roll `switch(roll[0])`
于 2013-06-02T00:39:49.017 回答