0

我完全不明白这一点。添加 while 循环会导致变量抛出“未捕获的类型错误无法读取 'perp' 的属性”。我尝试了很多解决方案,分离代码,添加额外的类型,尝试制作:任何类型,我真的很茫然。

小背景信息:我正在尝试制作一个名为“三是犯罪”的快速小游戏,本质上我有一个算法可以显示最多 3 名罪犯,其中最多 2 名可能是真正的肇事者。

所有代码都可以公开查看:https ://github.com/treehau5/ThreesACrime

function main(num) {
    var is_over = false;
    var game = new GameObject.Game(shuffled_criminals, num);

    $('body').append(game.display());
    $("#status").text("Turn in progress");
    $('body').append('<div class="container"><p>Enter your guess<p><div class="input-append" id="turn_form"><form>\
         <input class="span2" id="Text1" type="text" />\
         <button class="btn" id="Button1" type="button">Go!</button>\
         </form>\
     </div></div>');

    console.log(game.getThree());
    while (true)          //removing this while loop causes above line to work fine.
    { }
}

这是游戏类中的 getThree 方法

       getThree() {
        var result: Criminal[] = [];
        var temp: Criminal[] = _.shuffle(this.criminals);
        var num_perp = 0;
        while (result.length != 3) {
            while ((num_perp != 3) && (result.length != 3)) {
                var x: Criminal = temp.pop();
                result.push(x);
                if (x.perp == true)
                    num_perp++;
                temp = _.shuffle(temp);
            }
            do {
                temp = _.shuffle(temp);
                var y: Criminal = temp.pop();
                if (y.perp == false)
                    result.push(y);
            }
            while (result.length != 3)

        }

        return result;
    }//end displayThree

我正在使用 underscorejs 进行改组,并使用 distinctlyTyped 下划线分型。

随意查看或克隆 repo 以尝试。这个错误发生在 Google Chrome 26 中。所有代码都在 game.ts、gameobject.ts 和 main.ts 中,有很多对外部库的引用,比如下划线和 jquery ui,我打算在我完成后稍微修饰一下 GUI完成主游戏逻辑。

感谢您甚至费心阅读所有这些内容,非常感谢您的帮助。

编辑:所以我试图使用这样的循环在游戏中放置一个“转弯”

 while (is_over)
    {
        break;
    }
4

2 回答 2

2

在您的问题中,您使用的是以下示例:

while (true)          //removing this while loop causes above line to work fine.
{ }

这个紧密的循环将阻止几乎任何事情发生(通常浏览器会询问您是否要终止脚本。

如果这不是您正在使用的代码,请显示您正在使用的代码 - 最好是演示问题的缩短版本,而不是整个程序。我已经在 TypeScript 中测试了几种循环变体,并且发现 while 循环没有问题。

于 2013-04-16T19:12:22.333 回答
1

尝试

while(false){
 // Unreachable code
 do_something;
 break;
}

如果条件里面有什么,即。anything在您的情况下,永远不会成为错误,那么while(true)正如 steve fenton 提到的那样,它实际上会被浏览器停止或崩溃。

更好的循环方式是:

function loop(){
   var result = do_something();
   // Repeat 
   if (result) {setTimeout(loop,100);}
   // Break
   else return; 
}
setTimeout(loop,100);

虽然我建议使用游戏引擎而不是 setTimeout。例如http://www.createjs.com/#!/EaselJS

于 2013-04-17T05:01:16.480 回答