2012-08-29 181 views
0

二十一点游戏:我做了下面的交易函数,它应该返回一个1-4之间的随机数,代表一个套装,以及1-3之间代表卡号的另一个随机数。这段代码为什么返回NaN?

当我测试通过调用console.log(getSuit(card1));它返回NaN

任何人都知道为什么代码?

// Make your card constructor again here, but make sure to use private 
// variables! 
function Card(num, suit){ 
    var num = num; 
    var suit = suit; 
    getSuit = function(){ 
     return suit; 
    }; 
    getNumber = function(){ 
     return num; 
    }; 

    getValue = function(card){ 
     if (card > 10){ 
      return 10; 
     }else if (card === 1){ 
      return 11; 
     }else{ 
      return card; 
     } 

    }; 

} 

// Make a deal function here. It should return a new card with a suit 
// that is a random number from 1 to 4, and a number that is a random 
// number between 1 and 13 

var deal = function(){ 
    var suit = Math.floor(Math.random * 4 + 1); 
    var number = Math.floor(Math.random * 13 + 1); 
    return new Card(number, suit); 
}; 


// examples of the deal function in action 
var card1 = deal(); 
var card2 = deal(); 

console.log(getSuit(card1)); 
+1

getSuit()是一个成员函数,不接受不解决问题的参数 –

回答

3

只需添加()后随机

var deal = function() { 
    var suit = Math.floor(Math.random() * 4 + 1); 
    var number = Math.floor(Math.random() * 13 + 1); 
    return new Card(number, suit); 
}; 
0

变化:

var num = num; 
var suit = suit; 

this.num = num; 
this.suit = suit; 

+0

。但是,无论如何,使它们公开(this.num = num)应该没有必要,因为我打电话给getter方法 – Leahcim

+0

@Michael Yep,我认为TMan的问题 –

1

你不是应该叫:

console.log(card1.getSuit()); 

+0

没问题,但它不是打印一个数字。它不应该打印一个数字吗? – Leahcim

+0

@Eduardo明白了,你是在引用这个函数而不是调用它。 – TMan

1

你有一些复合的问题,但你得到一个楠原因是由于您使用的随机函数。所有调用方法/函数后请包括()

卡类的其他变化。 this.将该变量分配给该类实例。这同样适用于这些功能。因此,这会改变您称为getSuit()的方式,作为方法调用。它之前有效,因为你的getSuit()被放入全局命名空间。

function Card(num, suit){ 
    this.num = num; 
    this.suit = suit; 
    this.getSuit = function(){ 
     return suit; 
    }; 
    this.getNumber = function(){ 
     return num; 
    }; 

    this.getValue = function(card){ 
     if (card > 10){ 
      return 10; 
     }else if (card === 1){ 
      return 11; 
     }else{ 
      return card; 
     } 

    }; 

} 

var deal = function(){ 
    var suit = Math.floor(Math.random() * 4 + 1); 
    var number = Math.floor(Math.random() * 13 + 1); 
    return new Card(number, suit); 
}; 


// examples of the deal function in action 
var card1 = deal(); 
var card2 = deal(); 

console.log(card1.getSuit()); 
+0

你打败了我:-) –

0

试试这个:

// Make your card constructor again here, but make sure to use private 
// variables! 
function Card(num, suit){ 
    // NOTE: "this." 
    this.num = num; 
    this.suit = suit; 
    this.getSuit = function(){ 
     return this.suit; 
    }; 
    this.getNumber = function(){ 
     return this.num; 
    }; 

    this.getValue = function(card){ 
     if (card > 10){ 
      return 10; 
     }else if (card === 1){ 
      return 11; 
     }else{ 
      return card; 
     } 
    }; 
} 

// Make a deal function here. It should return a new card with a suit 
// that is a random number from 1 to 4, and a number that is a random 
// number between 1 and 13 
var deal = function(){ 
    // NOTE: Math.random() 
    var suit = Math.floor(Math.random() * 4 + 1); 
    var number = Math.floor(Math.random() * 13 + 1); 
    return new Card(number, suit); 
}; 

// examples of the deal function in action 
var card1 = deal(); 
var card2 = deal(); 

// NOTE: card1.getSuit() 
console.log(card1.getSuit()); 
0

你有三个不同的东西来解决:

  1. 你需要Math.random()括号。
  2. 您需要拨打getSuit()像这样card1.getSuit()不是你怎么做的。
  3. 您需要执行getSuit,getNumbergetValue作为Card对象的方法。正如你已经声明的那样,它们只是Card构造函数内部的局部函数,不能从该构造函数之外调用。

有两种常见的方法来制作这些函数方法。一种是将它们分配给卡原型对象。另一种是将它们分配给构造函数中的this

这里是什么样子将它们分配给原型对象:

function Card(num, suit){ 
    this.num = num; 
    this.suit = suit; 
} 

Card.prototype = { 
    getSuit: function() { 
     return suit; 
    }, 
    getNumber: function() { 
     return num; 
    }, 
    getValue: function(card) { 
     if (card > 10){ 
      return 10; 
     }else if (card === 1){ 
      return 11; 
     }else{ 
      return card; 
     } 
    } 
}; 

// Make a deal function here. It should return a new card with a suit 
// that is a random number from 1 to 4, and a number that is a random 
// number between 1 and 13 

var deal = function(){ 
    var suit = Math.floor(Math.random() * 4 + 1); 
    var number = Math.floor(Math.random() * 13 + 1); 
    return new Card(number, suit); 
}; 


// examples of the deal function in action 
var card1 = deal(); 
var card2 = deal(); 

console.log(card1.getSuit()); 

如果你想numsuit保持私有变量,那么你必须定义里面像这样的卡的方法:

// Make your card constructor again here, but make sure to use private 
// variables! 
function Card(num, suit){ 
    var num = num; 
    var suit = suit; 
    this.getSuit = function(){ 
     return suit; 
    }; 
    this.getNumber = function(){ 
     return num; 
    }; 

    this.getValue = function(card){ 
     if (card > 10){ 
      return 10; 
     }else if (card === 1){ 
      return 11; 
     }else{ 
      return card; 
     } 

    }; 

} 

// Make a deal function here. It should return a new card with a suit 
// that is a random number from 1 to 4, and a number that is a random 
// number between 1 and 13 

var deal = function(){ 
    var suit = Math.floor(Math.random() * 4 + 1); 
    var number = Math.floor(Math.random() * 13 + 1); 
    return new Card(number, suit); 
}; 


// examples of the deal function in action 
var card1 = deal(); 
var card2 = deal(); 

console.log(card1.getSuit()); 
0

该版本保留使用私有变量。注意函数参数是自动的私有变量,所以你不需要重新声明它们。

function Card(num, suit) { 
    this.getSuit = function() { 
     return suit; 
    }; 
    this.getNumber = function() { 
     return num; 
    }; 
    this.getValue = function() { 
     if (num > 10) 
      return 10; 
     if (num == 1) 
      return 11; 
     return num; 
    }; 
}