Home
Scripts
Games
   · Battleships
   · BlackJack
   · Zahlen-Puzzle
   · Slotmachine
   · 4 Gewinnt
Referenz
Links
Gäste
Kontakt

< BlackJack >


Das Kartenspiel BlackJack mit WML und WMLScript.

Spiele wie BlackJack sind gerade für einfache Programmiersprachen wie WMLScript besonders geeignet, da dem Programm keine Intelligenz einprogrammiert werden muss.

WAP-Standard: 1.1+

blackjack.wml

<?xml version="1.0"?> 
<!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN"
      "http://www.wapforum.org/DTD/wml_1.1.xml">

<wml>

  <card id="bj1" title="BlackJack" ontimer="blackjack.wmls#init()">
    <timer value="1"/>
    <p>Programm wird geladen ...</p>
  </card>

  <card id="bj2" title="BlackJack">
    <p>
      <img src="$(c0)" alt=""/>
      <img src="$(c1)" alt=""/>
      <img src="$(c2)" alt=""/>
      <img src="$(c3)" alt=""/>
      <img src="$(c4)" alt=""/>
      <img src="$(c5)" alt=""/>
      <img src="$(c6)" alt=""/>
      <img src="$(c7)" alt=""/>
    </p>
    <p>
      <small>Pts: $(pPts)$(dPts) &#160;Acc: $(acc)</small><br/>
      <small>
        <a href="blackjack.wmls#hit()">Hit</a>&#160;
        <a href="blackjack.wmls#stand()">Stand</a>&#160;
        <a href="blackjack.wmls#deal()">Deal</a>&#160;
        <a href="blackjack.wmls#double()">Double</a>
      </small><br/>
      <small>
        <a href="blackjack.wmls#bet()">Bet:</a>&#160;$(bet)
      </small><br/>
    </p>
  </card>

  <card id="bj3" title="BlackJack">
    <p>Bet:
      <select name="bet">
        <option value="2">2 US $$</option>
        <option value="10">10 US $$</option>
        <option value="50">50 US $$</option>
        <option value="100">100 US $$</option>
      </select>
    </p>
    <do type="accept" label="OK">
      <go href="blackjack.wmls#deal()"/>
    </do>
  </card>

</wml>

In blackjack.wml werden höchstens sieben Karten ausgegeben, was in den meisten Fällen auch ausreicht. Die dann maximale Breite von 95 Pixeln wird von fast allen Displays angezeigt.
Allerdings unterstützen leider nicht alle Wap-Browser die Nebeneinander-Darstellung von Bildern, sondern zeigen jedes Bild in einer neuen Zeile an.


blackjack.wmls

extern function init() {
  WMLBrowser.setVar("deal", 1);
  WMLBrowser.setVar("acc", 1000);
  WMLBrowser.setVar("bet", 50);
  deal();
}

In init() wird das erste Spiel freigegeben (deal=1), der Kontostand (acc für account) auf 1000 und der Wetteinsatz (bet) auf 50 US $ gesetzt.

function cards(x) {
  var i,k=x;
  for(i=2;i<10;i++) k += i+" "+x;
  return k+"T "+x+"J "+x+"Q "+x+"K "+x+"A";
}


extern function deal() {
  var acc = WMLBrowser.getVar("acc")*1;
  var bet = WMLBrowser.getVar("bet")*1;

  if(WMLBrowser.getVar("deal")==1 && acc>=bet) {
    WMLBrowser.setVar("double", 0);
    WMLBrowser.setVar("dPts", " ");

    var pool =
        cards("d")+" "+cards("h")+" "+cards("s")+" "+cards("c");

Die Funktion deal() leitet eine neue Runde ein.
Im Array pool wird über die Funktion cards() ein neues Kartenspiel mit 52 Karten initialisiert (amerikanisches Blatt mit diamonds, hearts, spades und clubs sowie T für 10).
Zuvor wurde der aktuelle Kontostand und der Wetteinsatz abgefragt (das *1 macht dabei aus dem String eine Zahl), geprüft, ob das Spiel freigegeben war und ob der Wetteinsatz nicht den Kontostand übertrifft. Außerdem wurden gegebenenfalls Angaben aus einer vorherigen Runde zurückgesetzt.

    var r = Lang.random(51);
    var pH = "x"+char2(pool,r);
    pool = rem(pool,r);

    r = Lang.random(50);
    var dH = "x"+char2(pool,r);
    pool = rem(pool,r);

    r = Lang.random(49);
    pH += " "+val(pool,r);
    pool = rem(pool,r);

    r = Lang.random(48);
    dH += " "+val(pool,r);
    pool = rem(pool,r);

Die ersten beiden Karten werden per Zufallsfunktion gezogen und damit das Array pH (Player Hand = Blatt des Spielers) und dH (Dealer Hand = Blatt des Händlers) initialisiert.
Wegen des begrenzten Platzes auf den Browser-Displays wird nur die zuletzt gezogene Karte ganz und alle anderen nur zur Hälfte (Werte x2 bis xA) angezeigt. Die Funktion char2() (s.u.) trennt den Wert der gezogenen Karte ab (2 bis A) und setzt ein x davor.
Nach jeder Ziehung wird die gezogene Karte aus dem Karten-Pool mit der Funktion rem() (s.u.) gelöscht.

    var i;
    for(i=0;i<2;i++) WMLBrowser.setVar("c"+i, val(pH,i)+".wbmp");
    WMLBrowser.setVar("c2", "space.wbmp");
    WMLBrowser.setVar("c3", val(dH,0)+".wbmp");
    WMLBrowser.setVar("c4", "X.wbmp");
    for(i=5;i<8;i++) WMLBrowser.setVar("c"+i, "dummy.wbmp");

Die ermittelten Karten-Werte werden hier in Form einer .wbmp-Datei-Angabe an den WML-Browser übergeben und in den Variablen c0 bis c7 gespeichert (s. blackjack.wml, Card bj2).
space ist der Abstandshalter zwischen Player- und Dealer-Karten, X die verdeckte Dealer-Karte und dummy ein Platzhalter für eventuell weitere Karten.
Die 52 ganzen und 13 halben Karten sowie Dummy und Abstandshalter liegen als .wbmp-Dateien im gleichen Verzeichnis wie die .wml- und die .wmls-Datei zum Abruf bereit.

    var pPts = points(pH);
    WMLBrowser.setVar("pPts", pPts);

    if(pPts<21) {
      WMLBrowser.setVar("pool", pool);
      WMLBrowser.setVar("pH", pH);
      WMLBrowser.setVar("dH", dH);
      WMLBrowser.setVar("deal", 0);
    }
    else {
      var dPts = points(dH);
      if(dPts!=21) {
        acc += bet*3 div 2;
        WMLBrowser.setVar("acc", acc);
      }
      if(!Lang.isInt(char2(dH,0))) {
        WMLBrowser.setVar("c4", val(dH,1)+".wbmp");
        WMLBrowser.setVar("dPts", "-"+dPts);
      }
    }

    WMLBrowser.go("blackjack.wml#bj2");
  }
}

Die Player-Points werden gezählt (s. points()) und an den WML-Browser übergeben.
Hat der Player einen BlackJack (21 Punkte mit zwei Karten) erhält er den 1.5-fachen Einsatz als Gewinn (bet*3 div 2, um ein Ganzzahlergebnis zu erhalten), sofern der Dealer nicht selbst einen BlackJack hat. Die verdeckte Karte wird aber nur gedreht, wenn die offene ein Ass oder eine 10er-Karte ist.
Hat der Player keinen BlackJack werden die Daten für pool, pH und dH im Browser gespeichert und deal() für einen sofortigen Wiederaufruf gesperrt. Das verhindert eine Fehlbedienung (und Schummeln!).
Abschließend wird das Ergebnis auf dem Display angezeigt.

extern function hit() {
  if(WMLBrowser.getVar("deal")==0) {
    var pool = WMLBrowser.getVar("pool");
    var pH = WMLBrowser.getVar("pH");
    var dH = WMLBrowser.getVar("dH");
    var pHE = el(pH);

    pH = String.replaceAt(pH,"x"+char2(pH,pHE-1),pHE-1," ");

    var r = Lang.random(el(pool)-1);
    pH += " "+val(pool,r);
    pool = rem(pool,r);
    WMLBrowser.setVar("pH", pH);
    WMLBrowser.setVar("pool", pool);

Über die Funktion hit() kann der Player eine weitere Karte kaufen.
Nachdem die Standartdaten angefordert wurden, wird die 'ganze' Player-Karte durch eine 'halbe' gleichen Werts ersetzt. Die Anzahl der Karten (pHE = Player Hand Elements), die durch die Funktion el() ermittelt wird (s.u.), bildet dabei eine nützliche Hilfsgröße.
Nun wird eine neue Karte gezogen, dem Array pH hinzugefügt und dann aus dem Array pool gelöscht.

    var i;
    for(i=pHE-1;i<pHE+1;i++)
    WMLBrowser.setVar("c"+i, val(pH,i)+".wbmp");
    WMLBrowser.setVar("c"+(pHE+1), "space.wbmp");
    WMLBrowser.setVar("c"+(pHE+2), val(dH,0)+".wbmp");
    WMLBrowser.setVar("c"+(pHE+3), "X.wbmp");

Die neuen Bilder-Daten werden an den Browser übermittelt. Die erste Player-Karte bleibt unverändert, Abstandshalter und Dealer-Karten rücken um einen weiter und die Dummys werden gegebenenfalls einfach überschrieben.

    var pPts = points(pH);
    WMLBrowser.setVar("pPts", pPts);
    if(pPts>21) {
      var acc = WMLBrowser.getVar("acc")*1
          -WMLBrowser.getVar("bet")*1;
      WMLBrowser.setVar("acc", acc);
      WMLBrowser.setVar("deal", 1);
    }

    if(WMLBrowser.getVar("double")==0)
      WMLBrowser.go("blackjack.wml#bj2");
    else stand();
  }
}

Hat der Player sich überkauft (über 21, "Bust"), ist der Einsatz verloren und ein neues Spiel kann beginnen. Wurde verdoppelt (s.u.), wird nach dem Erhalt einer Karte sofort mit dem Ziehen der Dealer-Karten fortgefahren.
Anderenfalls kann eine neue Endscheidung (Hit oder Stand) getroffen werden.

extern function stand() {
  if(WMLBrowser.getVar("deal")==0) {
    var pool = WMLBrowser.getVar("pool");
    var pH = WMLBrowser.getVar("pH");
    var dH = WMLBrowser.getVar("dH");
    var poolE = el(pool);
    var pHE = el(pH);
    var dHE = el(dH);

    var dPts = points(dH);
    while(dPts<17) {
      dH = String.replaceAt(dH,"x"+char2(dH,dHE-1),dHE-1," ");

      var r = Lang.random(poolE-1);
      dH += " "+val(pool,r);
      pool = rem(pool,r);

      poolE--;
      dHE++;
      dPts = points(dH);
    }

Analog zu hit() zieht in der Funktion stand() der Dealer seine Karten. Jedoch nur solange, bis mindestens 17 Punkte erreicht wurden.

    var i;
    for(i=pHE+2;i<pHE+2+dHE-1;i++)
      WMLBrowser.setVar("c"+i, val(dH,i-pHE-1)+".wbmp");

    var pPts = points(pH);
    var acc = WMLBrowser.getVar("acc")*1;
    var bet = WMLBrowser.getVar("bet")*1;

    if(WMLBrowser.getVar("double")==1) bet *= 2;
    if(dPts>21 || pPts>dPts) acc += bet;
    else if(pPts<dPts) acc -= bet;
    else if(pPts==dPts && dPts==21 && dHE==1) acc -= bet;

    WMLBrowser.setVar("acc", acc);
    WMLBrowser.setVar("dPts", "-"+dPts);
    WMLBrowser.setVar("deal", 1);

    WMLBrowser.go("blackjack.wml#bj2");
  }
}

Hat der Dealer über 21 Punkte oder weniger als der Player so gewinnt der Player. Hat der Dealer mehr Punkte verliert der Player.
Bei einem Gleichstand ("Push") erhält der Player seinen Einsatz zurück, es sei denn der Dealer hat einen BlackJack.
Gegebenenfalls wird der Einsatz doppelt gewertet.

extern function double() {
  if(WMLBrowser.getVar("deal")==0) {
    var pH = WMLBrowser.getVar("pH");
    var pHE = el(pH);
    var pPts = points(pH);
    var acc = WMLBrowser.getVar("acc")*1;
    var bet = WMLBrowser.getVar("bet")*1;

    if(pHE==2 && pPts<12 && pPts>8 && acc>=bet*2) {
      WMLBrowser.setVar("double", 1);
      hit();
    }
  }
}

Hat der Player mit den ersten beiden Karten einen Punkte-Wert von 9, 10 oder 11 kann der Einsatz verdoppelt werden ("Double Down"). Danach kann jedoch nur noch eine weitere Karte gezogen werden, was gleich automatisch geschieht.

extern function bet() {
  if(WMLBrowser.getVar("deal")==1)
    WMLBrowser.go("blackjack.wml#bj3");
}

VOR jedem neuen Spiel kann der Wetteinsatz verändert werden. (vgl. blackjack.wml Card bj3)

function points(xH) {
  var i, v, pts = 0, xHE = el(xH);
  for(i=0;i<xHE;i++) {
    v = char2(xH,i);
    if(Lang.isInt(v)) pts += v*1;
    else if(v=="A") pts += 11;
    else pts += 10;
  }

  if(pts>21) {
    var a=0;
    for(i=0;i<xHE;i++) if(char2(xH,i)=="A") a++; 

    if(pts<32 && a>0) pts -= 10;
    else if(pts<42 && a>1) pts -= 20;
    else if(pts<52 && a>2) pts -= 30;
    else if(a>3) pts -= 40;
    else pts -= a*10;
  }
  return pts;
}

Die Zählung der Punkte wird dadurch verkompliziert, dass ein Ass den Wert 1 oder 11 haben kann. Die anderen Karten zählen 10, bzw. 2 bis 9.
Solange die Gesamt-Punktzahl kleiner oder gleich 21 ist, werden alle Asse mit 11 gewertet und bei überschreiten dieser Grenze jeweils auf 1 reduziert.

function val(a,i) {
  return String.elementAt(a,i," ");
}

function rem(a,i) {
  return String.removeAt(a,i," ");
}

function char2(a,i) {
  return String.charAt(val(a,i),1);
}

function el(a) {
  return String.elements(a," ");
}

Diese genaue Bedeutung dieser Hilfsfunktionen können Sie u.a. in der String-Library der Referenz nachlesen.


Zum besseren Verständnis des Programms ist es ganz nützlich zu wissen, wie das Spiel BlackJack als solches eigentlich funktioniert.
Deshalb hier ein kleiner Link zu den BlackJack-Regeln.


Download  BlackJack.zip (mit allen Karten-Bildern ca. 13 kb)




Copyright © 2002-2003 by wmlscript.de - Alle Rechte vorbehalten
Impressum | Datenschutz | eMail


BlackJack im
WAP-Browser:

BlackJack mit WML und WMLScript

BlackJack mit WML und WMLScript 2

BlackJack mit WML und WMLScript 3

Überkauft. ("Bust")


BlackJack mit WML und WMLScript 4

BlackJack mit WML und WMLScript 5

Gewonnen !


BlackJack mit WML und WMLScript 6

BlackJack !



Alle angebotenen Spiele können Sie mit einem WAP- und WMLScript-fähigen Entgerät auf

www.wmlscript.de/wap

testen.