Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/449.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的内部函数在我的简单Javascript OOP游戏中返回为未定义_Javascript_Jquery_Oop - Fatal编程技术网

为什么我的内部函数在我的简单Javascript OOP游戏中返回为未定义

为什么我的内部函数在我的简单Javascript OOP游戏中返回为未定义,javascript,jquery,oop,Javascript,Jquery,Oop,我正在建立一个非常简单的模型!在Javascript中使用面向对象编程的游戏。分数函数, 从另一个函数中调用时,返回为“未定义” 我为“this”设置了一个var,并将其命名为“that”。然后在内部函数中使用“that” bobsGame = {} bobsGame.player = function(which){ this.which = which; this.which.score = 0; that = this; this.setScore = function(which,

我正在建立一个非常简单的模型!在Javascript中使用面向对象编程的游戏。分数函数, 从另一个函数中调用时,返回为“未定义”

我为“this”设置了一个var,并将其命名为“that”。然后在内部函数中使用“that”

bobsGame = {}

bobsGame.player  = function(which){
this.which = which;
this.which.score = 0;
that = this;

this.setScore = function(which, diceVal){
    score = that.which.score;
    console.log(score);
    $('#'+which+'-score').html(score);
    }

this.rollDice = function() {
    diceVal = Math.floor(Math.random() * 6 + 1);
    $('#'+which+'-dice-val').html(diceVal);
    /* console.log(which, diceVal); These vars are correct */
    that.setScore(which, diceVal); //returns undefined
    }
}

var player1 = new bobsGame.player('player1');
var player2 = new bobsGame.player('player2'); 

$('#roll-dice-btn-1').click(function(){
player1.rollDice();
});
$('#roll-dice-btn-2').click(function(){
player2.rollDice();
});

看起来您的问题归结为字符串作为字符串文本,而字符串作为字符串对象实例

var player = new Player("bob");
在哪里

问题的关键在于,由于JS如何处理字符串文字,因此不能动态地将属性添加到字符串文字中

Player = function (name) {
    this.name = name;
    this.score = 0;
}

应该可以正常工作。

看起来您的问题归结为字符串作为字符串文本,而不是字符串作为字符串对象实例

var player = new Player("bob");
在哪里

问题的关键在于,由于JS如何处理字符串文字,因此不能动态地将属性添加到字符串文字中

Player = function (name) {
    this.name = name;
    this.score = 0;
}
应该可以正常工作。

问题在于:

bobsGame.player  = function(which){
  this.which = which;
  this.which.score = 0;
  /* ... */
};

var player1 = new bobsGame.player('player1');
它是一个基本字符串,您正在尝试在其中定义一个属性

在对象或对象字符串中变换
哪个
,您就没事了

this.which = new String(which);
this.which.score = 0;
或者(我个人更喜欢的)

问题在于:

bobsGame.player  = function(which){
  this.which = which;
  this.which.score = 0;
  /* ... */
};

var player1 = new bobsGame.player('player1');
它是一个基本字符串,您正在尝试在其中定义一个属性

在对象或对象字符串中变换
哪个
,您就没事了

this.which = new String(which);
this.which.score = 0;
或者(我个人更喜欢的)


我认为你在比赛中遇到了一些根本性的问题,你只是没有真正理解

设置一个值
(这基本上是你的球员名字)的想法很好,但是你试图在球员名字上保留该球员的分数。如果你忽略了这个根本问题,因为名字(
)是一个字符串,正如其他答案所指出的那样,你就不可能做到这一点,并检查你正在尝试做什么;看起来您正试图在一个对象中跟踪每个玩家的得分,您可以随时访问该对象以获得完整的游戏状态。不幸的是,你建立这个的方式——那就是行不通。您正在为每个玩家创建一个新的玩家对象,这些玩家分别存储在内存中,不能相互访问

您在这里尝试构建的结构对于看起来您正在尝试做的事情是不起作用的,而且在您现在正在努力解决的实际语法和逻辑实现问题之前

你真正想要的可能更像这样:

<script type="text/javascript">
var BobsGame = function()
{
    this.Players = [];
    this.current_player_turn = 0;
}

BobsGame.prototype.addPlayer = function(Player)
{
    Player.Game = this;
    this.Players.push(Player);
    Player.setId(this.Players.length);

    return this;
}

BobsGame.prototype.updateWinner = function()
{
    var Winner = null;
    for (var i = 0, players = this.Players.length; i < players; i++)
    {
        if (!Winner || (this.getPlayer(i) && this.getPlayer(i).score > Winner.score))
        {
            Winner = this.getPlayer(i);
        }
    }

    $('#game-winner').text(Winner.name + " won with a score of " + Winner.score + "!");
}


BobsGame.prototype.getPlayer = function(id)
{
    return this.Players[ id ] || null;
}

var Player = function(name)
{
    this.Game = null;

    this.score = 0;
    this.name = 0;
    this.id = 0;
}

Player.prototype.roll = function()
{
    diceVal = Math.floor(Math.random() * 6 + 1);
    return this.setScore(diceVal);
}

Player.prototype.setScore(new_score)
{
    this.score = new_score;
    $('#' + this.name + '-dice-val').text(new_score);
    this.score = diceVal;

    return this;
}

///implementation

var myGame = new BobsGame();
var Player1 = new Player("Player 1");
var Player2 = new Player("Player 2");

myGame.addPlayer(Player1).addPlayer(Player2);

$('#roll-dice-btn-1').click(function(){
    Player1.roll();
    myGame.updateWinner();
});

$('#roll-dice-btn-2').click(function(){
    Player2.roll();
    myGame.updateWinner();
});
</script>

var BobsGame=函数()
{
这个.Players=[];
当前玩家回合=0;
}
BobsGame.prototype.addPlayer=函数(播放器)
{
Player.Game=这个;
这个。玩家。推(玩家);
Player.setId(this.Players.length);
归还这个;
}
BobsGame.prototype.updateWinner=函数()
{
var=null;
for(var i=0,players=this.players.length;iWinner.score))
{
获胜者=这个.getPlayer(i);
}
}
$(“#游戏赢家”).text(winner.name+”以“+winner.score+”!”得分获胜;
}
BobsGame.prototype.getPlayer=函数(id)
{
返回此。玩家[id]| |空;
}
var Player=函数(名称)
{
this.Game=null;
这个分数=0;
this.name=0;
此参数为0.id;
}
Player.prototype.roll=函数()
{
diceVal=Math.floor(Math.random()*6+1);
返回此.setScore(diceVal);
}
Player.prototype.setScore(新分数)
{
this.score=新的_分数;
$(“#”+this.name+'-dice val').text(新的#u分数);
this.score=diceVal;
归还这个;
}
///实施
var myGame=new BobsGame();
var Player1=新玩家(“玩家1”);
var Player2=新玩家(“玩家2”);
myGame.addPlayer(Player1.addPlayer(Player2);
$('#roll-dice-btn-1')。单击(函数(){
Player1.滚动();
myGame.updateWinner();
});
$('#roll-dice-btn-2')。单击(函数(){
Player2.滚动();
myGame.updateWinner();
});
上面的代码创建了一个游戏对象,它存储整个游戏的状态。它还定义并创建了两个Player对象,它们都负责存储自己的状态(id、name和score)。玩家知道如何掷骰子(掷骰法),然后你使用游戏对象来确定哪个玩家赢了


这种应用程序结构更易于推理,并将游戏的责任和玩家的责任分离开来。

我认为你的游戏存在一些根本性的问题,你只是没有真正理解

设置一个值
(这基本上是你的球员名字)的想法很好,但是你试图在球员名字上保留该球员的分数。如果你忽略了这个根本问题,因为名字(
)是一个字符串,正如其他答案所指出的那样,你就不可能做到这一点,并检查你正在尝试做什么;看起来您正试图在一个对象中跟踪每个玩家的得分,您可以随时访问该对象以获得完整的游戏状态。不幸的是,你建立这个的方式——那就是行不通。您正在为每个玩家创建一个新的玩家对象,这些玩家分别存储在内存中,不能相互访问

您在这里尝试构建的结构对于看起来您正在尝试做的事情是不起作用的,而且在您现在正在努力解决的实际语法和逻辑实现问题之前

你真正想要的可能更像这样:

<script type="text/javascript">
var BobsGame = function()
{
    this.Players = [];
    this.current_player_turn = 0;
}

BobsGame.prototype.addPlayer = function(Player)
{
    Player.Game = this;
    this.Players.push(Player);
    Player.setId(this.Players.length);

    return this;
}

BobsGame.prototype.updateWinner = function()
{
    var Winner = null;
    for (var i = 0, players = this.Players.length; i < players; i++)
    {
        if (!Winner || (this.getPlayer(i) && this.getPlayer(i).score > Winner.score))
        {
            Winner = this.getPlayer(i);
        }
    }

    $('#game-winner').text(Winner.name + " won with a score of " + Winner.score + "!");
}


BobsGame.prototype.getPlayer = function(id)
{
    return this.Players[ id ] || null;
}

var Player = function(name)
{
    this.Game = null;

    this.score = 0;
    this.name = 0;
    this.id = 0;
}

Player.prototype.roll = function()
{
    diceVal = Math.floor(Math.random() * 6 + 1);
    return this.setScore(diceVal);
}

Player.prototype.setScore(new_score)
{
    this.score = new_score;
    $('#' + this.name + '-dice-val').text(new_score);
    this.score = diceVal;

    return this;
}

///implementation

var myGame = new BobsGame();
var Player1 = new Player("Player 1");
var Player2 = new Player("Player 2");

myGame.addPlayer(Player1).addPlayer(Player2);

$('#roll-dice-btn-1').click(function(){
    Player1.roll();
    myGame.updateWinner();
});

$('#roll-dice-btn-2').click(function(){
    Player2.roll();
    myGame.updateWinner();
});
</script>

var BobsGame=函数()
{
这个.Players=[];
当前玩家回合=0;
}
BobsGame.prototype.addPlayer=函数(播放器)
{
Player.Game=这个;
这个。玩家。推(玩家);
Player.setId(this.Players.length);
归还这个;
}
BobsGame.prototype.updateWinner=函数()
{
var=null;