團隊項目----基於德州撲克的數據結構分析
基於德州撲克的數據結構分析
遊戲邏輯分析
本遊戲實為“21點”撲克牌遊戲,計算機作為莊家,1人作為普通玩家參與遊戲。參與者設使自己的牌達到總分21而不超過這個數值。撲克牌的分值取他們的面值。A充當1分或11分(此時由玩家自己選擇),“Jack”,“Queen”,”King”都當做10分。在一局開始時,包括莊家在內的參與者都有兩張牌。玩家可以看到他們的所有牌以及總分,而莊家有一張牌暫時隱藏。接下來,只要願意,玩家都有機會依次再拿一張牌。如果某個玩家的總分超過了21(稱為“引爆”),則這個玩家就輸了。在玩家都拿了額外的牌後,莊家將顯示隱藏的牌。只要莊家的總分等於或小於16分,那麽莊家必須再拿牌。如果莊家引爆了,而玩家沒有引爆,玩家將獲勝;如果玩家與莊家分數相同,則莊家與玩家達成平局,所投的籌碼留為下一局使用。否則,莊家獲勝。
玩家一共有¥1000,玩家可隨意下註(不能超過剩余籌碼),若玩家勝,則莊家需要拿出等額的籌碼給玩家,若玩家輸,則下註的籌碼歸莊家。
簡單數據類型
本遊戲用到的一些簡單的數據類型如下:
undefined: 代表一切未知的事物,啥都沒有,無法想象,代碼也就更無法去處理了。
註意:typeof(undefined) 返回也是 undefined。
可以將undefined賦值給任何變量或屬性,但並不意味了清除了該變量,反而會因此多了一個屬性。
null: 有那麽一個概念,但沒有東西。無中似有,有中還無。雖難以想象,但已經可以用代碼來處理了。
註意:typeof(null)返回object,但null並非object,具有null值的變量也並非object。
boolean: 是就是,非就非,沒有疑義。對就對,錯就錯,絕對明確。既能被代碼處理,也可以控制代碼的流程。
number: 線性的事物,大小和次序分明,多而不亂。便於代碼進行批量處理,也控制代碼的叠代和循環等。
註意:typeof(NaN)和typeof(Infinity)都返回number 。
NaN參與任何數值計算的結構都是NaN,而且 NaN != NaN 。
Infinity / Infinity = NaN 。
string: 面向人類的理性事物,而不是機器信號。人機信息溝通,代碼據此理解人的意圖等等,都靠它了。
數據結構
數組,結構體(對象)
本遊戲采用包含N
var GAME={ //對象名
decks:5,
cash:0,
clearing:false,
dealing:false,
playing:false,
hitting:false,
turns:0,
maxturns:1}
JavaScript中{}用來定義一個對象,大部分情況下要有成對的屬性和值,或是函數,所以訪問時,應該用.(點)來層層訪問。
此處定義一個對象GAME,包含多個成對的屬性和值。
var SUITS=[] //牌的花色
SUITS[0]=‘Spades‘
SUITS[1]=‘Diamonds‘
SUITS[2]=‘Hearts‘
SUITS[3]=‘Spades‘
JavaScript中使用[]來定義一個數組,也可以理解為一個數組對象
此處定義一個SUITS數組存儲四種不同的花色的數據。
var VALUES=[] //牌的面值
VALUES[0]=‘Ace‘
VALUES[1]=‘Two‘
VALUES[2]=‘Three‘
VALUES[3]=‘Four‘
VALUES[4]=‘Five‘
VALUES[5]=‘Six‘
VALUES[6]=‘Seven‘
VALUES[7]=‘Eight‘
VALUES[8]=‘Nine‘
VALUES[9]=‘Ten‘
VALUES[10]=‘Jack‘
VALUES[11]=‘Queen‘
VALUES[12]=‘King‘
此處定義一個VALUES數組存儲從Ace到King的牌面值。
var newDeck=[] //用來存儲牌
for(var d=0;d<GAME.decks;d++){
for(var s=0;s<SUITS.length;s++){
for(var v=0;v<VALUES.length;v++){
newDeck.push([SUITS[s],VALUES[v]])//用for循環將牌存入數組
n+=1}}}
JavaScript中push() 方法可把它的參數順序添加到 arrayObject 的尾部。它直接修改 arrayObject,而不是創建一個新的數組。push() 方法和 pop() 方法使用數組提供的先進後出棧的功能。
此處定義一個數組newDeck,通過嵌套for循環,調用push()方法將牌面值和花色組合後存入該數組中。
function shuffle(){ //洗牌函數
var newDeck=DECK
var card1
var card2
var temp
for(var i=0;i<1000;i++){
card1=Math.floor(DECK.length*Math.random())
//隨機選牌 Math.random取0.0-0.9
card2=Math.floor(DECK.length*Math.random())
//Math.floor求一個最接近它的整數,它的值小於或等於這個浮點數
temp=DECK[card2]
DECK[card2]=DECK[card1]//互換兩張牌
DECK[card1]=temp}
DECK=newDeck}
此函數將牌的順序打亂,同樣保存在DECK數組中,相當於洗牌。
function checkscore(entity){
var hard=0
var soft=0
var h=HANDS[entity.attr(‘id‘)]
if(!h){
h=HANDS[entity.attr(‘id‘)]=[]}
for(var i=0;i<h.length;i++){
var c=$(‘#‘+HANDS[entity.attr(‘id‘)][i])
var b=c.find(‘.Back‘)
if(b.css(‘display‘)!=‘none‘){
if(b.hasClass(‘Ace‘)&&hard<=10){
hard+=11
soft+=1
}else if(b.hasClass(‘Ace‘)&&hard>10){
hard+=1
soft+=1}
else if(b.hasClass(‘Two‘)){
hard+=2
soft+=2}
else if(b.hasClass(‘Three‘)){
hard+=3
soft+=3}
else if(b.hasClass(‘Four‘)){
hard+=4
soft+=4}
else if(b.hasClass(‘Five‘)){
hard+=5
soft+=5}
else if(b.hasClass(‘Six‘)){
hard+=6
soft+=6}
else if(b.hasClass(‘Seven‘)){
hard+=7
soft+=7}
else if(b.hasClass(‘Eight‘)){
hard+=8
soft+=8}
else if(b.hasClass(‘Nine‘)){
hard+=9
soft+=9}
else if(b.hasClass(‘Ten‘)||
b.hasClass(‘Jack‘)||
b.hasClass(‘Queen‘)||
b.hasClass(‘King‘)){
hard+=10
soft+=10}}}
var ht=hard
if(hard>0){
if(soft&&hard !=soft){
if(hard !=21){
if(hard<=21){
ht=soft+‘/‘+hard
}else{
ht=soft}}}}
return ht}
此處同樣用數組保存玩家和莊家的分數值,用於判斷勝負。
總結
這個HTML遊戲用到的數據結構相對簡單,主要是對數組和對象的使用。
團隊項目----基於德州撲克的數據結構分析