diff options
Diffstat (limited to 'examples/qml/blackjack/blackjack.scxml')
-rw-r--r-- | examples/qml/blackjack/blackjack.scxml | 372 |
1 files changed, 172 insertions, 200 deletions
diff --git a/examples/qml/blackjack/blackjack.scxml b/examples/qml/blackjack/blackjack.scxml index ab1b9cd..0c32a3e 100644 --- a/examples/qml/blackjack/blackjack.scxml +++ b/examples/qml/blackjack/blackjack.scxml @@ -1,224 +1,196 @@ -<scxml - xmlns="http://www.w3.org/2005/07/scxml" - initial="root" profile="ecmascript"> - <datamodel> +<scxml xmlns="http://www.w3.org/2005/07/scxml" initial="root" profile="ecmascript"> + <datamodel> <data id="points" expr="1000" /> <data id="pot" expr="0" /> <data id="pointsToBet" expr="0" /> - </datamodel> + <data id="myHand" expr="new Deck()" /> + <data id="dealerHand" expr="new Deck()" /> + <data id="availDeck" expr="new Deck()" /> + </datamodel> <script><![CDATA[ - var Suits = "CDHS"; - var Ranks = "-A23456789TJQK"; - - function Card (r,s) - { - this.rank = r; - this.suit = s; - this.minValue = Math.min(r,10); - this.toString = function() { - return "" + Ranks[this.rank] + Suits[this.suit]; - }; -; + var Suits = "CDHS"; + var Ranks = "-A23456789TJQK"; + + function Card (r,s) + { + this.rank = r; + this.suit = s; + this.minValue = Math.min(r,10); + } + + Card.prototype.toString = function() { + return "" + Ranks[this.rank] + Suits[this.suit]; + }; + + function Deck() {} + Deck.prototype = + { + draw: function() { return this.cards.pop(); scxml.notifyChange(this);}, + cards: [], + reshuffle: function() { + this.clear (); + function randomSort(a,b) { + return Math.random() - 0.5; } - function Deck() - { - this.draw = function() - { - return this.cards.pop(); - }; - this.cards = new Array(); - this.reset = function() - { - this.clear (); - for (var i=1; i <= 13; ++i) - for (var j = 0; j < 4; ++j) - this.cards.push(new Card(i,j)); - this.cards.sort(function (a,b) - { - return Math.random() * 3 - 1; - }); - }; - - this.clear = function() - { - this.cards = new Array; - }; - this.evalMin = function () - { - var minVal = 0; - var cardCount = this.cards.length; - for (c in this.cards) { - minVal += this.cards[c].minValue; - } - if (cardCount > 4 && minVal < 22) - minVal = 21; - return minVal; - }; - - this.evalBest = function() - { - var bestVal = this.evalMin(); - if (bestVal > 21) - return 0; - else if (bestVal == 21) - return bestVal; - - for (i in this.cards) { - if (this.cards[i].rank == 1) - { - var v = bestVal + 10; - if (v <= 21) - bestVal = v; - } - } - return bestVal; - - }; - this.toString = function() - { - var s = ""; - for (i in this.cards) - s += this.cards[i].toString() + ":"; - - return s; - }; - - this.drawFrom = function(d) - { - var c = d.draw (); - this.cards.push(c); -// updateDisplay (); - }; + for (var i=1; i <= 13; ++i) + for (var j = 0; j < 4; ++j) + this.cards.push(new Card(i,j)); + this.cards.sort(randomSort); + }, + + clear: function() { + this.cards = []; + scxml.notifyChange(this); + }, + evalMin: function () { + var minVal = 0; + var cardCount = this.cards.length; + for (c in this.cards) { + minVal += this.cards[c].minValue; } - - - function hitMe () - { - myDeck.drawFrom (availDeck); + if (cardCount > 4 && minVal < 22) + minVal = 21; + return minVal; + }, + evalBest: function() { + var bestVal = this.evalMin(); + if (bestVal > 21) + return 0; + else if (bestVal == 21) + return bestVal; + + for (i in this.cards) { + if (this.cards[i].rank == 1) + { + var v = bestVal + 10; + if (v <= 21) + bestVal = v; + } } + return bestVal; + + }, + toString: function() { + return this.cards.join(' '); + }, + drawFrom: function(d) { + this.cards.push(d.draw ()); + scxml.notifyChange(this); + } + }; + + function hitMe () + { + _data.myHand.drawFrom (_data.availDeck); + } ]]></script> - <final id="exit" /> <state id="root" initial="newgame"> - <onentry> - <script> - var myDeck = new Deck; - var dealerCards = new Deck; - var availDeck = new Deck; - </script> - - </onentry> - <transition event="NEWGAME" target="newgame" /> - <state id="newgame"> - <transition target="newround" /> - </state> - <state id="quitdlg"> - <transition event="YES" target="exit" /> - <transition event="NO" target="gamestate" /> - </state> - <state id="game"> - <history type="deep" id="gamestate" /> - <transition event="EXIT" target="quitdlg" /> - <state id="newround"> <onentry> - <assign dataid="pot" expr="0" /> - <script> - availDeck.reset (); - myDeck.clear (); - dealerCards.clear(); - dealerCards.drawFrom(availDeck); - hitMe (); - hitMe (); - </script> + <assign dataid="myHand" expr="new Deck()" /> + <assign dataid="dealerHand" expr="new Deck()" /> + <assign dataid="availDeck" expr="new Deck()" /> </onentry> - <transition target="waitForBet" /> - </state> - <state id="waitForBet"> - <transition event="BET" target="testCards" cond="parseInt(_data.pointsToBet) <= _data.points"> - <assign dataid="pot" expr="_data.pointsToBet" /> - <assign dataid="points" expr="_data.points-_data.pot" /> - </transition> - <transition event="BET" target="betTooHigh" cond="parseInt(_data.pointsToBet) > _data.points"> - </transition> - <transition event="SURRENDER" target="newround" /> - </state> - <state id="betTooHigh"> - <transition event="OK" target="waitForBet" /> - <transition event="TIMEOUT" target="waitForBet" /> - <onentry> - <send event="TIMEOUT" delay="1500ms" /> - </onentry> - </state> - <state id="testCards"> - <transition target="loss" cond="myDeck.evalBest() == 0" /> - <transition target="getDealerCards" cond="myDeck.evalBest() == 21" /> - <transition target="waitForAction" cond="myDeck.evalBest() %21 != 0" /> - </state> - - <state id="waitForAction"> - <transition event="HIT" target="testCards"> - <script>hitMe (); </script> - </transition> - <transition event="STAND" target="getDealerCards" /> - </state> - - <state id="getDealerCards"> - <onentry> - <script><![CDATA[ - while (dealerCards.evalBest() > 0 && dealerCards.evalBest() < 17) - dealerCards.drawFrom(availDeck); - ]]></script> - <raise event="DONE" /> - </onentry> - <transition target="checkWinner" /> - </state> - - <state id="checkWinner"> + <transition event="NEWGAME" target="newgame" /> + <state id="newgame"> + <transition target="newRound" /> + </state> + <state id="quitdlg"> + <transition event="YES" target="exit" /> + <transition event="NO" target="gamestate" /> + </state> + <state id="game"> + <history type="deep" id="gamestate" /> + <transition event="EXIT" target="quitdlg" /> + <state id="newRound"> + <onentry> + <assign dataid="pot" expr="0" /> + <script> + _data.availDeck.reshuffle (); + _data.myHand.clear (); + _data.dealerHand.clear(); + _data.dealerHand.drawFrom(_data.availDeck); + hitMe (); + hitMe (); + </script> + </onentry> + <transition target="waitForBet" /> + </state> + <state id="waitForBet"> + <transition event="BET" target="testCards" cond="parseInt(_data.pointsToBet) <= _data.points"> + <assign dataid="pot" expr="_data.pointsToBet" /> + <assign dataid="points" expr="_data.points-_data.pot" /> + </transition> + <transition event="BET" target="betTooHigh" cond="parseInt(_data.pointsToBet) > _data.points" /> + <transition event="SURRENDER" target="newRound" /> + </state> + <state id="betTooHigh"> + <transition event="OK" target="waitForBet" /> + <transition event="TIMEOUT" target="waitForBet" /> + <onentry> + <send event="TIMEOUT" delay="1500ms" /> + </onentry> + </state> + <state id="testCards"> + <transition target="loss" cond="_data.myHand.evalBest() == 0" /> + <transition target="getdealerHand" cond="_data.myHand.evalBest() == 21" /> + <transition target="waitForAction" cond="_data.myHand.evalBest() %21 != 0" /> + </state> - <onentry> - <assign location="_data.diff" expr="myDeck.evalBest() - dealerCards.evalBest()" /> - </onentry> + <state id="waitForAction"> + <transition event="HIT" target="testCards"> + <script>hitMe (); </script> + </transition> + <transition event="STAND" target="getdealerHand" /> + </state> - <transition cond="diff>0" target="win" /> - <transition cond="diff<0" target="loss" /> - <transition cond="diff==0" target="draw" /> - </state> - <state id="endGame"> - <invoke type="q-bindings"><content>[[welcomeLabel,"text","Game Over"]]</content></invoke> - <transition event="TIMEOUT" target="newgame" /> - <onentry> - <send event="TIMEOUT" delay="3s" /> - </onentry> - </state> - <state id="endRound"> - <invoke type="q-bindings"><content>[[newRoundButton,"enabled",true]]</content></invoke> - <transition event="NEWROUND" target="newround" /> - <transition event="TIMEOUT" target="newround" /> - <onentry> - <send event="TIMEOUT" delay="3s" /> - </onentry> + <state id="getdealerHand"> + <onentry> + <script><![CDATA[ + while (_data.dealerHand.evalBest() > 0 && _data.dealerHand.evalBest() < 17) + _data.dealerHand.drawFrom(_data.availDeck); + ]]></script> + <raise event="DONE" /> + </onentry> + <transition target="checkWinner" /> + </state> - <state id="win"> + <state id="checkWinner"> + <onentry> + <assign location="_data.diff" expr="_data.myHand.evalBest() - _data.dealerHand.evalBest()" /> + </onentry> + <transition cond="_data.diff > 0" target="win" /> + <transition cond="_data.diff < 0" target="loss" /> + <transition cond="_data.diff==0" target="draw" /> + </state> + <state id="endGame"> + <transition event="TIMEOUT" target="newgame" /> <onentry> - <assign dataid="points" expr="Math.floor(_data.points) + Math.floor(_data.pot) * 2" /> + <send event="TIMEOUT" delay="3s" /> </onentry> - </state> - <state id="loss"> - <invoke type="q-bindings"><content>[[welcomeLabel,"text","You Lost..."]]</content></invoke> - <transition cond="points == 0" target="endGame" /> + </state> + <state id="endRound"> + <transition event="newRound" target="newRound" /> + <transition event="TIMEOUT" target="newRound" /> + <onentry> + <send event="TIMEOUT" delay="3s" /> + </onentry> + + <state id="win"> + <onentry> + <assign dataid="points" expr="Math.floor(_data.points) + Math.floor(_data.pot) * 2" /> + </onentry> + </state> + <state id="loss"> + <transition cond="_data.points == 0" target="endGame" /> </state> <state id="draw"> - <invoke type="q-bindings"><content>[[welcomeLabel,"text","You It's a draw."]]</content></invoke> - <onentry> - <assign dataid="points" expr="Math.floor(_data.points) + Math.floor(pot)" /> - </onentry> + <onentry> + <assign dataid="points" expr="Math.floor(_data.points) + Math.floor(_data.pot)" /> + </onentry> </state> </state> </state> - </state> - + <final id="exit" /> </scxml> - - - |