Zurück   Flashforum > Flash > Stuff

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 10-02-2004, 11:34   #1 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Damit die Antwort auf diesen Thread
http://www.flashforum.de/forum/showt...726#post838726
nicht untergeht, habe ich einen extra Stuff Thread draus gemacht.


Solche Sachen sind einfacher, wenn du ein abstraktes Datenmodell für dein Spiel benutzt, das du dann im Speicher ändern kannst. Die Grafik zeigt dann praktisch nur die Änderungen deiner Daten an.

Im Fall von Solitaire ist ein zweidimensionales Array gut geeignet. Wir machen uns ein Array der Groesse 9x9 und tragen in jedes Feld ein, ob es leer ist, ob es besetzt ist oder ob es ausserhalb des kreuzförmigen Spielfelds ist. Dieses "Spielfeld" kann man dann sehr einfach modifizieren, ohne sich gross Gedanken über MovieClips usw. machen zu müssen. Das macht man dann erst zum Schluss in der Anzeige-Routine.

Ich habe dir hier mal ein Beispiel gemacht. Ein Solitaire, das von alleine spielt.

ActionScript:
  1. /**
  2. * Erstelle ein neues Spiel
  3. */
  4. function neuesSpiel(){
  5.     //trace("neuesSpiel");
  6.     var board = [
  7.         [2,2,2,1,1,1,2,2,2],
  8.         [2,2,2,1,1,1,2,2,2],
  9.         [2,2,2,1,1,1,2,2,2],
  10.         [1,1,1,1,1,1,1,1,1],
  11.         [1,1,1,1,3,1,1,1,1],
  12.         [1,1,1,1,1,1,1,1,1],
  13.         [2,2,2,1,1,1,2,2,2],
  14.         [2,2,2,1,1,1,2,2,2],
  15.         [2,2,2,1,1,1,2,2,2]];
  16.     return board;
  17. }
  18.  
  19. /**
  20. * Ein paar Konstanten die die Art
  21. * eines Feldes beschreiben
  22. */
  23. POS_AUSSERHALB = 2;
  24. POS_BESETZT = 1;
  25. POS_LEER = 3;
  26.  
  27. /**
  28. * Liefere true, wenn die Position leer ist
  29. */
  30. function posLeer( board, hPos, vPos){
  31.     return (board[ hPos][ vPos] == POS_LEER)
  32. }
  33.  
  34. /**
  35. * Liefere true, wenn die Position besetzt ist
  36. */
  37. function posBesetzt( board, hPos, vPos){
  38.     return (board[ hPos][ vPos] == POS_BESETZT)
  39. }
  40.  
  41. /**
  42. * Liefere true, wenn die Position dazwischen besetzt ist
  43. * Die Position auf halber Strecke muss besetzt sein
  44. * Da hOffset und vOffset immer -2, 2, oder 0 sind, ergibt sich
  45. * beim Teilen durch 2 immer -1, 1 oder 0, also genau die
  46. * gewünschte Position
  47. */
  48. function steinDazwischen( board, hPos, vPos, hOffset, vOffset){
  49.     return (board[ hPos + hOffset/2][ vPos + vOffset/2] == POS_BESETZT)
  50. }
  51.  
  52.  
  53. /**
  54. * Liefere true, wenn die Position innerhalb des Spielfelds  ist
  55. */
  56. function posInnerhalb( board, hPos, vPos){
  57.     return hPos >= 0 && hPos < board.length &&
  58.            vPos >= 0 && vPos < board[0].length &&
  59.            board[ hPos][ vPos] != POS_AUSSERHALB
  60. }
  61.  
  62. /**
  63. * Besetze ein Feld
  64. */
  65. function setzeStein( board, hPos, vPos){
  66.     board[hPos][vPos] = POS_BESETZT;
  67. }
  68.  
  69. /**
  70. * Raeume ein Feld
  71. */
  72. function loescheStein( board, hPos, vPos){
  73.     board[hPos][vPos] = POS_LEER;
  74. }
  75.  
  76. /**
  77. * Liefere ein Array mit dem Zug, wenn dieser Zug erlaubt ist.
  78. * Wenn nicht, liefere null
  79. */
  80. function liefereZugVonNach( board, hPos, vPos, hOffset, vOffset){
  81.     var h = hPos + hOffset;
  82.     var v = vPos + vOffset;
  83.     if( posInnerhalb( board, h, v)){
  84.         if( posLeer( board, h, v)){
  85.             if( steinDazwischen( board, hPos, vPos,  hOffset, vOffset)){
  86.                 return new Array(hPos, vPos, hOffset, vOffset);
  87.             }
  88.         }
  89.     }
  90.     return null;
  91. }
  92.  
  93. /**
  94. * Liefere alle Zuege, zu denen ich von
  95. * hPos,vPos aus ziehen kann. Das sind alle
  96. * Zuege, die im Umkreis von 2 Feldern
  97. * leer sind, und zwischen Ursprung und Zielfeld
  98. * einen Stein haben.
  99. * Die Zuege haben die Form eines Arrays und
  100. * bestehen aus Ursprungsposition und dem
  101. * Offset zur Zielposition. Durch Addieren von
  102. * Ursprungsposition und Offset bekommt man
  103. * die Zielposition heraus.
  104. */
  105. function erlaubteZuegeVon( board, hPos, vPos){
  106.     var zuege = new Array();
  107.     // Wir laufen im Kreis durch alle
  108.     // Positionen im Abstand 2
  109.     for( var i= -2; i<=2; i+= 2){
  110.         for( var j= -2; j<=2; j+= 2){
  111.             var zug = liefereZugVonNach( board, hPos, vPos, i, j);
  112.             if( zug != null){
  113.                 zuege.push( zug);
  114.             }
  115.         }
  116.     }
  117.     //trace("erlaubteZuegeVon " + zuege.length);   
  118.     return zuege
  119. }
  120.  
  121. /**
  122. * Liefere alle erlaubten Zuege, die im Moment
  123. * möglich sind.
  124. */
  125. function erlaubteZuege( board){
  126.     var zuege = new Array();
  127.     // Wir laufen durch alle Positionen des Arrays
  128.     // Da die Felder ausserhalb des Spiels nicht
  129.     // als besetzt gelten, werden sie automatisch
  130.     // nicht beachtet.
  131.     for( var i=0; i<board.length; i++){
  132.         for( var j=0; j<board[i].length; j++){
  133.             if( posBesetzt( board, i, j)){
  134.                 zuege = zuege.concat( erlaubteZuegeVon( board, i, j));
  135.             }
  136.         }
  137.     }
  138.     //trace("erlaubteZuege " + [zuege.length]); 
  139.     return zuege
  140. }
  141.  
  142. /**
  143. * Mache einen erlaubten Zug
  144. */
  145. function ziehe( board, hPos, vPos, offsetH, offsetV){
  146.     //trace("ziehe " + [hPos, vPos, offsetH, offsetV]);
  147.     // Alte Position loeschen
  148.     loescheStein( board, hPos, vPos);
  149.     // Neue Position besetzen
  150.     setzeStein( board, hPos + offsetH, vPos + offsetV);
  151.     // Uebersprungenen Stein loeschen
  152.     loescheStein( board, hPos + offsetH/2, vPos + offsetV/2);
  153. }
  154.  
  155.  
  156. /**
  157. * Zeige das Brett
  158. */
  159. function zeigeSpiel( board){
  160.     //trace("zeigeSpiel");
  161.     //
  162.     _root.clear();
  163.     _root.lineStyle(20);
  164.     //
  165.     // Laufe durch alle Positionen des Arrays
  166.     // und zeige die Felder an, die besetzt sind.
  167.     for( var i=0; i<board.length; i++){
  168.         var bi = board[i];
  169.         for( var j=0; j<bi.length; j++){
  170.             if( posBesetzt( solitair, i, j)){
  171.                 _root.moveTo(i*25, j*25);
  172.                 _root.lineTo(i*25+1, j*25);
  173.             }
  174.         }
  175.     }
  176. }
  177.  
  178.  
  179. /**
  180. * Zum Testen unseres Datenmodells lassen wir den Rechner
  181. * in einer Frameschleife solange ziehen, bis keine Zuege mehr
  182. * möglich sind. Dann beginnt das Spiel von vorne.
  183. */
  184.  
  185. var solitaire = neuesSpiel();
  186.  
  187. _root.onEnterFrame = function(){
  188.     // welche zuege sind moeglich
  189.     var zuege = erlaubteZuege( solitaire);
  190.     // keine mehr, also neues Spiel
  191.     if( zuege.length == 0){
  192.         // neues spiel erzeugen
  193.         solitaire = neuesSpiel()
  194.     } else {
  195.         // per zufall einen moeglichen zug auswaehlen
  196.         var zufallsIndex = random( zuege.length);
  197.         zug = zuege[zufallsIndex];
  198.         // ziehen
  199.         ziehe( solitaire, zug[0], zug[1], zug[2], zug[3]);
  200.     }
  201.     // zeige die aenderungen an
  202.     zeigeSpiel(solitaire);
  203. }

Zum Ausprobieren musst du nur das Script in den ersten Frame eines leeren Films kopieren und starten.

Kleine Aufgabe fuer OOP-Einsteiger: Wie koennte das Script aussehen, wenn man es objektorientiert schreiben würde.


mfg r.
bokel ist offline   Mit Zitat antworten
Alt 10-02-2004, 12:29   #2 (permalink)
Neuer User
 
Registriert seit: Dec 2003
Ort: Ottobrunn
Beiträge: 37
ok danke, das hilft mir, aber meins funktioniert jetzt auch, auch wenn ich das Feld nicht so einfach mittels script ändern kann.

Also Danke nochmal

MFG
Foggie
__________________
Allzeit bereit und immer ganz oben!
Foggie200 ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 18:39 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele