|
< 4 Gewinnt >
Das Strategiespiel 4 Gewinnt mit WML und WMLScript.
An der Spielintelligenz des Programms kann noch gearbeitet werden. Es beherrscht die grundlegenden Regeln, sowie einige Finessen und wird ansonsten weitgehend vom Zufall gesteuert.
WAP-Standard: 1.1+
4gewinnt.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="vg1" title="4 Gewinnt" ontimer="4gewinnt.wmls#init()">
<timer value="1"/>
<p>Programm wird geladen ...</p>
</card>
<card id="vg2" title="4 Gewinnt">
<p align="center">
<small>
<table columns="7">
<tr>
<td>$(a14)</td>
<td>$(a24)</td>
<td>$(a34)</td>
<td>$(a44)</td>
<td>$(a54)</td>
<td>$(a64)</td>
<td>$(a74)</td>
</tr>
<tr>
<td>$(a13)</td>
<td>$(a23)</td>
<td>$(a33)</td>
<td>$(a43)</td>
<td>$(a53)</td>
<td>$(a63)</td>
<td>$(a73)</td>
</tr>
<tr>
<td>$(a12)</td>
<td>$(a22)</td>
<td>$(a32)</td>
<td>$(a42)</td>
<td>$(a52)</td>
<td>$(a62)</td>
<td>$(a72)</td>
</tr>
<tr>
<td><a href="4gewinnt.wmls#insert(1)">$(a11)</a></td>
<td><a href="4gewinnt.wmls#insert(2)">$(a21)</a></td>
<td><a href="4gewinnt.wmls#insert(3)">$(a31)</a></td>
<td><a href="4gewinnt.wmls#insert(4)">$(a41)</a></td>
<td><a href="4gewinnt.wmls#insert(5)">$(a51)</a></td>
<td><a href="4gewinnt.wmls#insert(6)">$(a61)</a></td>
<td><a href="4gewinnt.wmls#insert(7)">$(a71)</a></td>
</tr>
</table>
</small>
</p>
<p><a href="4gewinnt.wml">Neues Spiel</a></p>
</card>
</wml>
Die unterste Zelle einer Spalte ist zugleich der Link, der den Einwurf eines Spielsteins in diese Spalte auslöst.
4gewinnt.wmls
extern function init() {
var i, j;
// alle 28 Zellen von a11 bis a74 mit "~" initialisieren
for(i=1;i<8;i++) {
for(j=1;j<5;j++) WMLBrowser.setVar("a"+i+j,"~");
}
WMLBrowser.setVar("game",1);
WMLBrowser.go("4gewinnt.wml#vg2");
}
extern function insert(col) {
// col ist die Spalte, in der der aktuelle
// Spielstein eingeworfen wurde.
var i, j;
if(WMLBrowser.getVar("game")=="xxxx") {
Dialogs.alert("Game Over\nDu hast gewonnen !");
Lang.exit("");
}
else if(WMLBrowser.getVar("game")=="oooo") {
Dialogs.alert("Game Over\nIch habe gewonnen !");
Lang.exit("");
}
// keine Zelle mehr frei
for(i=1;i<8;i++) {
if(WMLBrowser.getVar("a"+i+4)=="~") i=8;
if(i==7) {
Dialogs.alert("Game Over\nUnentschieden !");
Lang.exit("");
}
}
// Spalte ist voll
i=col*1;
if(WMLBrowser.getVar("a"+i+4)!="~") {
Dialogs.alert("Das geht nicht !");
Lang.exit("");
}
// Spielstein einwerfen
for(j=1;j<5;j++) {
// wenn das gewählte Feld frei ist
if(WMLBrowser.getVar("a"+i+j)=="~") {
// es besetzen
WMLBrowser.setVar("a"+i+j,"x");
// und prüfen, ob ein 4er vorliegt
if(check4(i,j,"x")=="x"){
Dialogs.alert("Du hast gewonnen !");
WMLBrowser.setVar("game","xxxx");
}
// anderenfalls Zug des Programms ausführen
else pcMove();
j=4;
}
}
// Neue Spiel-Situation anzeigen
WMLBrowser.go("4gewinnt.wml#vg2");
}
function check4(c0,r0,p) {
var i, j, k;
// Für den eingeworfenen Stein im Feld (c0,r0) prüfen, ob
// dieser auf einer Seite drei gleiche Nachbarn ("x" bzw. "o"),
// oder zwei gleiche Nachbarn auf der einen Seite und
// einen auf der anderen Seite besitzt.
for(i=-1;i<2;i++) {
for(j=-1;j<2;j++) {
if(i!=0) k=0; else k=1,j=1;
if(
WMLBrowser.getVar("a"+(c0-1*i)+(r0+1*i*j-1*k))==p &&
WMLBrowser.getVar("a"+(c0-2*i)+(r0+2*i*j-2*k))==p && (
WMLBrowser.getVar("a"+(c0-3*i)+(r0+3*i*j-3*k))==p ||
WMLBrowser.getVar("a"+(c0+1*i)+(r0-1*i*j+1*k))==p))
return p;
}
}
}
function check3(i,j) {
// Prüft, ob von 5 waagerecht nebeneinander liegenden Zellen,
// die äußeren beiden frei sind und von den mittleren 3
// Zellen 2 von "x" besetzt sind und ein 3er bzw. 4er droht.
// Also: ~ x x ~ ~ oder ~ ~ x x ~ oder ~ x ~ x ~
if(
WMLBrowser.getVar("a"+i+j)=="~" &&
WMLBrowser.getVar("a"+i+(j-1))!="~" &&
WMLBrowser.getVar("a"+(i+4)+j)=="~" &&
WMLBrowser.getVar("a"+(i+4)+(j-1))!="~") {
var k;
for(k=0;k<3;k++) {
if(
WMLBrowser.getVar("a"+(i+(k+0)%3+1)+j)=="x" &&
WMLBrowser.getVar("a"+(i+(k+1)%3+1)+j)=="x" &&
WMLBrowser.getVar("a"+(i+(k+2)%3+1)+j)=="~" &&
WMLBrowser.getVar("a"+(i+(k+2)%3+1)+(j-1))!="~")
return k;
}
return -1;
}
}
function pcMove() {
var i, j, i4x=0, j4x;
for(i=1;i<8;i++) {
for(j=1;j<5;j++) {
// Prüfen, ob das gewählte Feld frei ist
if(WMLBrowser.getVar("a"+i+j)=="~") {
// Ob ein 4er komplettiert wird
if(check4(i,j,"o")=="o") {
WMLBrowser.setVar("a"+i+j,"o");
Dialogs.alert("Ich habe gewonnen !");
WMLBrowser.setVar("game","oooo");
return;
}
// Merken, ob ein 4er verhindert werden kann
else if(check4(i,j,"x")=="x") {
i4x=i, j4x=j;
}
j=4;
}
}
}
// ggf. 4er verhindern
if(i4x!=0) {
WMLBrowser.setVar("a"+i4x+j4x,"o");
return;
}
// Prüft, ob ein 3er mit Option auf einen sicheren 4er
// verhindert werden kann
var k, r, v=0;
for(i=1;i<4;i++) {
for(j=1;j<5;j++) {
k=check3(i,j);
if(k==-1) j=4;
// wenn ~ x x ~ ~ oder ~ ~ x x ~
else if(k==0||k==1) {
while(v<10) {
r = Lang.random(1);
if(check4(i+k+(r*3),j+1,"x")!="x") {
WMLBrowser.setVar("a"+(i+k+(r*3))+j,"o");
return;
}
v++;
}
}
// wenn ~ x ~ x ~
else if(k==2) {
v=0,r=1;
while(v<10) {
if(check4(i+r*2,j+1,"x")!="x") {
WMLBrowser.setVar("a"+(i+r*2)+j,"o");
return;
}
r = Lang.random(1)*2;
v++;
}
}
}
}
// Wenn möglich, die beste Position sichern
if(WMLBrowser.getVar("a41")=="~" && Lang.random(2)>0) {
WMLBrowser.setVar("a41","o");
return;
}
// Zufällige Wahl der Spalte (1 bis 7),
// ohne dem Spieler, zu einem 4er zu verhelfen.
v=0;
while(1>0) {
r=Lang.random(6)+1;
for(j=1;j<5;j++) {
if(WMLBrowser.getVar("a"+r+j)=="~") {
if(check4(r,j+1,"x")!="x" || v>20) {
WMLBrowser.setVar("a"+r+j,"o");
return;
}
j=4;
}
}
v++;
// ist notwendig, um eine Endlosschleife zu verhindern,
// falls eine unfreiwillige Hilfe unvermeidbar ist.
}
}
Die verschiedenen Zufallsfunktionen, sollen eine allzu große Berechenbarkeit des Programms vermeiden.
Download 4Gewinnt.zip (ca. 2,5 kb)
Copyright © 2002-2003 by wmlscript.de - Alle Rechte vorbehalten
Impressum | Datenschutz | eMail
|