2012-08-29 179 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; 
    }; 
}