【问题标题】:representing a character at various array in an html table w/JQuery/JavaScript使用/JQuery/JavaScript 表示 html 表中各种数组中的字符
【发布时间】:2016-02-16 00:34:41
【问题描述】:

我在 Hangman 游戏中通过 J Query 以图形方式表示我的一些数据时遇到了一些问题 - 现在我正在处理我的 play(space) 函数的最后一部分,以考虑是否有超过一个单词中一个正确猜到的字母并显示该字母的所有实例-我创建了一个函数来循环通过拆分单词创建的数组,我得到了这些字母的正确索引,我只是善良关于如何通过 J Query 在我的表中的这些索引处正确显示这些字母的问题,我有点卡住了……我一直在 console.log 记录我的数据,我得到了正确的数据(字母和该字母在我的数组中的索引),我现在只需要弄清楚如何在我的 html 表中以与表相对应的正确索引显示这些字母(我感觉有点卡住并想知道这是否可能打捞-我确定一定有办法做到这一点,我只是还没弄清楚-我不确定是否应该创建字典对象t 将正确的字母与数组中的索引配对,以使用 .each() 循环以在我的表中以图形方式表示,或者如果有办法以图形方式表示它与数据原样)。非常感谢任何帮助。

这是我的代码: JS/JQuery:

var wordBank = ["modernism", "situationalist", "sartre", "camus", "hegel", "lacan", "barthes", "baudrillard", "foucault", "debord", "baudrillard"];
var word = [];
var wrongGuesses = [];
var rightGuesses = [];
var images = [gallows, head, body, armL, handL, armR, handR, legL, footL, legR, footR];
var y = 0;
var i = 1;
$(document).ready(function() {
  function randomWord() {
    var random = Math.floor(Math.random() * wordBank.length);
    var toString = wordBank[random];
    console.log(toString);
    word = toString.split("");
    console.log(word);
  }
  randomWord();

  function wordSpaces() {
    for (var i = 0; i < word.length; i++) {
      $(".word-spaces > tbody > tr").append('<td data-idx=i>' + word[i] + '</td>')
    }
  }
  wordSpaces();

  function play(space) {
    //indexOf()==inArray() 
    var lIndex = jQuery.inArray(space, word);
    console.log(lIndex);
    if (lIndex == -1) {
      wrongGuesses.push(space);
      var wrong = wrongGuesses.length;
      console.log('wrong ' + wrong);
      $('.wrongLetters tbody tr td:nth-of-type(' + wrong + ')').text(space);

//      $(this).css("background-color", "#ff4500").fadeIn(300).delay(800).fadeOut(300);
      $(images[i - 1]).hide();
      $(images[i]).show();
      i++;
      $("html").css("background-color", "#ff4500").fadeIn(300).delay(300).fadeOut(300).fadeIn(100);
      console.log(word);
    } else { 
      console.log(word + "word"); 
      console.log(space + "space");
        function getInstances(word,space) {
          var indexes = [], w;
          for(w=0; w<word.length;w++ )
          if (word[w] === space)
          indexes.push(w);
          return indexes;
        }
      console.log(word + "word"); 
      console.log(space + "space");
      var indexes = getInstances(word, space);
      console.log(indexes);
      rightGuesses.push(space);
      console.log(rightGuesses); 
      $(".word-spaces tbody tr td:nth-of-type(" + indexes + ")").css('color', 'black');
  //    rightGuesses.push(space);

    }
  }

  $(".form-control").keypress(function(event) {
    var keycode = (event.keyCode ? event.keyCode : event.which);
    if (keycode == 13) {
      var space = $(this).val();
      play(space);
      $(this).val('');
      endGame();
      return false;
    }
  });


  function endGame() {
    if (wrongGuesses.length >= 10 || rightGuesses.length == word.length) {
      $("body").css("background-color", "#ff4500");
      $(".form-control").prop('disabled', true);
    }

  }

});
html:
<header>
  <h2 style="font-family:paganini;">
    Hangman
    </h2>
</header>
<main style="font-family:paganini;">
  <figure class="hangman">
    <img src="https://i.imgur.com/gSxmkUf.gif" id="gallows" align="middle top">
    <img src="https://i.imgur.com/Mb4owx9.gif" id="head" align="middle top" style="display:none;">
    <img src="https://i.imgur.com/xkXISte.gif" id="body" align="middle top" style="display:none;">
    <img src="https://i.imgur.com/U44ReUi.gif" id="armL" align="middle top" style="display:none;">
    <img src="https://i.imgur.com/49kkaQF.gif" id="handL" align="middle top" style="display:none;">
    <img src="https://i.imgur.com/tqtNazW.gif" id="armR" align="middle top" style="display:none;">
    <img src="https://i.imgur.com/ydnz7eX.gif" id="handR" align="middle top" style="display:none;">
    <img src="https://i.imgur.com/dlL7Kek.gif" id="legL" align="middle top" style="display:none;">
    <img src="https://i.imgur.com/3AQYFV9.gif" id="footL" align="middle top" style="display:none;">
    <img src="https://i.imgur.com/j9noEN7.gif" id="legR" align="middle top" style="display:none;">
    <img src="https://i.imgur.com/kJofX7M.gif" id="footR" align="middle top" style="display:none;">
  </figure>

  <table class="word-spaces">
    <caption>Your Word is: </caption>
    <tbody>
      <tr>
      </tr>
    </tbody>
  </table>
  <br/>
  <fieldset class="guessIn">
    <legend>
      Guess a Letter
    </legend>
    <label for="form">Type a Letter then Click <b>Enter</b></label>
    <input type="text" id="form" class="form-control" placeholder="guess">

  </fieldset>

  <table class="wrongLetters">
    <caption>Letters Guessed Wrong:</caption>
    <tbody>
      <tr>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
      </tr>
    </tbody>
  </table>
</main>
<footer>
</footer>

【问题讨论】:

  • 仅供参考,下次如果您制作一个显示错误的 jsFiddle,您的问题可能会得到更多关注;)

标签: javascript jquery html


【解决方案1】:

请注意,当您进行选择时,您会在控制台中收到以下错误:

未捕获的错误:语法错误,无法识别的表达式::nth-of-type

那是因为这条线:

$(".word-spaces tbody tr td:nth-of-type(" + indexes + ")").css('color', 'black');

由于正确的猜测可以设置多个索引,因此您需要使用循环来进行正确的猜测,如下所示:

$.each(indexes,function(e,i){
    $(".word-spaces tbody tr td:nth-of-type(" + i + ")").css('color', 'black');
})

另外,我认为这行是错误的:

 $(".word-spaces > tbody > tr").append('<td data-idx=i>' + word[i] + '</td>')

您可能打算像这样使用 i 的值:

$(".word-spaces > tbody > tr").append('<td data-idx='+i+'>' + word[i] + '</td>')

(尽管您根本不需要 data-idx 属性,因为它始终与 tr 标记中的子索引相同,并且无论如何您都在使用它来获取单元格)

Here is a working jsFiddle

【讨论】:

  • 我实际上只是这样修复它:
  • 对不起,我实际上只是这样修复它:indexes.forEach(function (index){ $(".word-spaces tbody tr td:nth-of-type(" + (index + 1 ) + ")").css('颜色', '黑色'); }); @DelightedD0D 我不确定这是否也有效
  • 哦,哇,我不知道 :eq() 选择器——也许我也应该更改之前的选择器以包含它?谢谢4你的帮助! @DelightedD0D
  • @H.Hirschfeld 老实说,我不认为:nth-of-type 是一个jQuery 选择器,但它似乎是,我一直使用:eq(),它也可以像$(".word-spaces td").eq(0) 一样使用。如果不出意外,它会更短:)
【解决方案2】:

我自己发现了这一点(我有点惊慌):首先我创建了一个 .forEach 循环来循环遍历单词,然后问题是 JS 和 html/css 中的 btwn 数组连接不同...我创建了索引变量,并在括号外添加了一个 & 一个额外的加号......所以,这解决了问题:

indexes.forEach(函数(索引) { $(".word-spaces tbody tr td:nth-of-type(" + (index + 1) + ")").css('color', 'black'); });

【讨论】:

  • 对你有好处,我们同时完成了这很有趣。
  • :-) 我几乎完成了整个游戏@zer00ne,但我非常坚持最后一个小部分-我完成了所有工作并正常工作,一切正常,但后来我做了 2 个该表格只接受单个字母的输入(没有#'s,没有空格等,只有 a-z)&我现在已经工作了 24 小时+(我有 2 个快速休息,现在有 2 个期中考试)& 仍然可以'没有得到这个简单的限制 2 工作 w/o 完全搞砸了我的显示和/或游戏功能(表示正确的猜测是错误的,等等) - 我觉得有一个简单的解决方案我没有看到或者我的语法是错误的?我发个链接
  • 如果你有时间,这里有一个链接stackoverflow.com/questions/35470222/…@zer00ne - 我觉得你比任何人都更了解我的游戏流程(我在这个函数的所有差异位置尝试了条件语句&2没有有用) - 也许我只是没有看到我做错了什么?无论如何,对不起 2 打扰你,如果你有空闲时间,也许你可以看看 - 我有点吓坏了 ;-) ...希望你有一个美好的一天并感谢你 4 的所有帮助 - 我学到了很多这样做......
  • 你看version 2了吗?它只接受一个字符,以及其他一些重要功能。所以你需要一个字符过滤器?我会看看我能做什么。
【解决方案3】:

好的,它现在可以完成所有工作。除了first version's features,版本2还有以下内容:

  • 如果一个字母被猜错了不止一次,警报会通知玩家这样做并忽略它。

  • 如果一个正确的猜测有多个字母,所有的字母都会被暴露。

  • 改进了 endGame() 函数并带有一条消息,但它还需要一个修复,我将把那个留给你 ;-)

Plunker

<!doctype>
<html>

<head>
    <meta charset="utf-8">
    <title>35387864</title>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" />
    <style>
        html {
            font: 400 16px/1.428 'Verdana';
        }
        
        main {
            padding: 20px;
        }
        
        footer,
        header {
            padding: 5px 20px;
        }
        
        footer {
            border-top: 2px ridge #666;
        }
        
        header {
            border-bottom: 2px ridge #666;
        }
        
        .wordSpaces,
        .wrongLetters {
            border: 1px ridge grey;
            table-layout: fixed;
            border-collapse: collapse;
            margin: 10px 0;
        }
        
        .wordSpaces td,
        .wrongLetters td {
            border: 2px inset #BBB;
            width: 3ch;
            height: 1.5rem;
            padding: 1px;
            text-align: center;
            -webkit-user-select: none;
            -moz-user-select: none;
            -ms-user-select: none;
            user-select: none;
            color: white;
        }
        
        .wrongLetters td {
            color: red;
        }
        
        .form-control {
            width: 10ch;
            text-align: center;
        }
        
        ul {
            font-size: 1rem;
            list-style: none;
            padding-left: 0;
        }
        
        .msg {
            font-size: 0;
            color: #000;
            text-align: center;
        }
    </style>
</head>

<body>
    <header>
        <h2> Hangman </h2>
    </header>
    <main>
        <figure class="hangman"> <img src="https://i.imgur.com/gSxmkUf.gif" id="gallows" align="middle top"> <img src="https://i.imgur.com/Mb4owx9.gif" id="head" align="middle top" style="display:none;"> <img src="https://i.imgur.com/xkXISte.gif" id="body" align="middle top" style="display:none;"> <img src="https://i.imgur.com/U44ReUi.gif" id="armL" align="middle top" style="display:none;"> <img src="https://i.imgur.com/49kkaQF.gif" id="handL" align="middle top" style="display:none;"> <img src="https://i.imgur.com/tqtNazW.gif" id="armR" align="middle top" style="display:none;"> <img src="https://i.imgur.com/ydnz7eX.gif" id="handR" align="middle top" style="display:none;"> <img src="https://i.imgur.com/dlL7Kek.gif" id="legL" align="middle top" style="display:none;"> <img src="https://i.imgur.com/3AQYFV9.gif" id="footL" align="middle top" style="display:none;"> <img src="https://i.imgur.com/j9noEN7.gif" id="legR" align="middle top" style="display:none;"> <img src="https://i.imgur.com/kJofX7M.gif" id="footR" align="middle top" style="display:none;"> </figure>
        <table class="wordSpaces">
            <caption>
                Your Word is:
            </caption>
            <tbody>
                <tr>
                </tr>
            </tbody>
        </table>
        <br/>
        <h1 class="msg">
</h1>
        <fieldset class="guessIn">
            <legend> Guess a Letter </legend>
            <label for="form">Type a Letter then Click <kbd>Enter</kbd></label>
            <input type="text" id="form" class="form-control" placeholder="guess" maxlength="1" required/>
        </fieldset>
        <table class="wrongLetters">
            <caption>
                Letters Guessed Wrong:
            </caption>
            <tbody>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td></td>
                </tr>
            </tbody>
        </table>
    </main>
    <footer>
        <ul>
            <li><a href="https://stackoverflow.com/questions/35387864/hangman-gameplay-in-javascript">Hangman Gameplay in JavaScript</a></li>
            <li><a href="https://jsfiddle.net/zer00ne/0fa56t3s/">jsFiddle</a></li>
        </ul>
    </footer>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
    <script src="https://code.jquery.com/ui/1.11.4/jquery-ui.min.js"></script>
    <script>
        var wordBank = ["modernism", "situationalist", "sartre", "camus", "hegel", "lacan", "barthes", "baudrillard", "foucault", "debord", "baudrillard"];
        /*var wordBank = ["xxxbnvkllyyybns"];*/
        var word = [];
        var wrongGuesses = [];
        var rightGuesses = [];
        var images = [gallows, head, body, armL, handL, armR, handR, legL, footL, legR, footR];
        var img = 1;

        $(document).ready(function() {
            function randomWord() {
                var random = Math.floor(Math.random() * wordBank.length);
                var toString = wordBank[random];
                console.log(toString);
                word = toString.split("");
                console.log(word);
            }
            randomWord();

            function wordSpaces() {
                for (var i = 0; i < word.length; i++) {
                    $(".wordSpaces > tbody > tr").append('<td data-idx=i>' + word[i] + '</td>')
                }
            }
            wordSpaces();

            function play(letter) {
                var wIdx = jQuery.inArray(letter, word);
                var wrong = wrongGuesses.length;
                if (wIdx === -1) {
                    if (wrong === 0) {
                        wrongGuesses.push(letter);
                        $('.wrongLetters tbody tr td:first-of-type').text(letter);
                        hangman();
                    } else {

                        for (var j = 0; j < wrong; j++) {
                            if (wrongGuesses[j] === letter) {
                                alert('The "' + letter + '" has already beem played.\nPlease try again.');
                                return true;
                            }
                            console.log('wrong' + wrong);
                        }
                        wrongGuesses.push(letter);
                        $('.wrongLetters tbody tr td:nth-of-type(' + (wrong + 1) + ')').text(letter);
                        hangman();
                    }
                } else {
                    for (var w = 0; w < word.length; w++) {
                        if (word[w] === letter) {
                            W = w + 1;
                            $(".wordSpaces tbody tr td:nth-of-type(" + W + ")").css("color", "black");
                            rightGuesses.push(letter);
                        }
                    }
                }
            }
            $(".form-control").keypress(function(event) {
                var keycode = (event.keyCode ? event.keyCode : event.which);
                if (keycode == 13) {
                    var letter = $(this).val();
                    play(letter);
                    $(this).val('');
                    endGame();
                    return false;
                }
            });

            function hangman() {
                $(images[img - 1]).hide();
                $(images[img]).show();
                img++;
                $("html").css("background-color", "#ff4500").fadeIn(300).delay(300).fadeOut(300).fadeIn(100);
            }

            function endGame() {
                if (rightGuesses.length == word.length) {
                    $("body").css("background-color", "rgba(0, 185, 41, .3)");
                    $(".msg").text(word + " is correct!\nYou win!").css("font-size", "24px");
                    $(".form-control").prop('disabled', true);
                } else if (wrongGuesses.length === 10) {
                    $("body").css("background-color", "rgba(227, 0, 0, .3)");
                    $(".msg").text(word + " was the answer.\nYou lose.").css("font-size", "24px");
                    $(".form-control").prop('disabled', true);
                } else return false;
            }

        });
    </script>
</body>

</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 2016-12-11
    • 2020-01-16
    • 2015-05-10
    • 2014-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多