1. 程式人生 > >團隊項目----基於德州撲克的數據結構分析

團隊項目----基於德州撲克的數據結構分析

find ring 自己的 選擇 理解 ole 以及 包含 訪問

基於德州撲克的數據結構分析

遊戲邏輯分析

本遊戲實為“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數組存儲從AceKing的牌面值。

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}}}

JavaScriptpush() 方法可把它的參數順序添加到 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遊戲用到的數據結構相對簡單,主要是對數組和對象的使用。

團隊項目----基於德州撲克的數據結構分析