Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 07-09-2005, 13:58   #1 (permalink)
Neuer User
 
Registriert seit: Apr 2003
Beiträge: 173
Wie kann ich den Zufall umgehen.

Hallo,

ich hab folgendes Problem. Ich will ein Wortsuchspiel machen, und dafür soll ein Wort in einem Zahlenfeld mit 10 auf 10 Feldern versteckt werden. Ich bin jetzt soweit, das ich die 100 Felder dynamisch erzeuge und mit zufälligen Buchstaben fülle.

ActionScript:
  1. function erstelleKaesten(){
  2.     breite = container._width;
  3.     hoehe = container._height;
  4.     PosX = 100;
  5.     PosY = 16;
  6.     for (var i = 1; i <= 10; i++) {
  7.         for (var j = 1; j <= 10; j++) {
  8.             container.duplicateMovieClip("container"+i+"_"+j,1+(i*10+j));
  9.             fueller = chr(65 + random(25));
  10.             mc = this["container"+i+"_"+j];
  11.             mc._x = j*breite+PosX;
  12.             mc._y = i*hoehe+PosY;
  13.             mc.text_int.borderColor = 0x000000;
  14.             mc.text_int.text = fueller;
  15.         }
  16.     }
  17. };

Jetzt bin ich mit meinem Latein am Ende. Ich habe das Suchwort als String aus einem XML. Den zerleg ich erstmal in Einzelteile, klar. D.h. ich hab die einzelnen Buchstaben des Suchworts jetzt in nem Array. Nur wie positionier ich die jetzt?

Ich möchte zum einen, dass das gesuchte Wort mal vertikal, mal horizontal auftaucht (diagonal muss nicht sein). Außerdem muss ich ja überprüfen, ob das Wort von der Zeichenanzahl überhaupt reinpasst (Wörter mit mehr als 10 Buchstaben kommen einfach nicht vor )

Wie krieg ich es hin, dass er mir das Suchwort an einer zufälligen Stelle mal horizontal mal vertikal positioniert?

Bin über jede Hilfe dankbar. Gerne auch Denkanstöße, ich hab nämlich keinen Plan wie ich da ran gehen soll.

Viele Grüße
Manni

Geändert von mannimedia (07-09-2005 um 14:06 Uhr)
mannimedia ist offline   Mit Zitat antworten
Alt 07-09-2005, 14:03   #2 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
Eine Funktion schreiben die das bewerkstelligt.
Erst prüfen ob Wort überhaupt passen würde und dann die Buzchstaben halt diagonal oder senkrecht auf die MC's verteilen.
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 07-09-2005, 14:09   #3 (permalink)
Neuer User
 
Registriert seit: Apr 2003
Beiträge: 173
Ja, das ist mir klar.

Ich weiß aber nicht wie. Ich möchte ja auch, dass das Suchwort jedesmal an ner anderen Stelle ist.

Wie verteile ich z.B. innerhalb meiner Funktion das Suchwort? Soll ich die erstellten Movieclips überschreiben?

Und wie kann ich überprüfen an welcher Stelle es reinpasst.

Danke und Grüße
Manni
mannimedia ist offline   Mit Zitat antworten
Alt 07-09-2005, 14:12   #4 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
Wenn du die Wortlänge weist und dir ne zufällige diagonale aussuchst, weist du auch wie lang diese ist, folglich weist du dann auch ob es reinpassen würde.
Genauso waagerecht und senkrecht.

Kannst du den erstellten MC's kein Textfeld mitgeben in den du dann immer den entsprechenden Buchstaben per AS schreibst?
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 07-09-2005, 14:41   #5 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
ActionScript:
  1. feldsize = 10;
  2. wordlen = 8; // z.b.
  3. if (random(2)) {
  4.     richtung = 'waagrecht';
  5.     x_anf = random(feldsize)+1;
  6.     y_anf = random(feldsize-wordlen)+1;
  7. } else {
  8.     richtung = 'senkrecht';
  9.     x_anf = random(feldsize-wordlen)+1;
  10.     y_anf = random(feldsize)+1;
  11. }
"..Soll ich die erstellten Movieclips überschreiben?.."
schreibst den neuen buchstaben da rein. ein neues mc ist ja wohl blödsinn.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 07-09-2005, 16:01   #6 (permalink)
Neuer User
 
Registriert seit: Apr 2003
Beiträge: 173
klar. vielen dank, das war das was ich gebraucht hab. hab es erstmal nur für senkrecht weitergeschrieben und bin jetzt so weit:

ActionScript:
  1. function erstelleKaesten(){
  2.     tmpArr = [];
  3.     tmpArr = _global.labyrinth.pop();
  4.     suchwortString = tmpArr.suchwort.toUpperCase();
  5.     geteiltesSuchwort = suchwortString.split("");
  6.     anzahl = geteiltesSuchwort.length;
  7.    
  8.     feldsize = 10;
  9.    
  10.     breite = container._width;
  11.     hoehe = container._height;
  12.     PosX = 100;
  13.     PosY = 16;
  14.  
  15.     richtung = 'senkrecht';
  16.     x_anf = random(feldsize-anzahl);
  17.     y_anf = random(feldsize);
  18.     k = 0;
  19.    
  20.     for (var i = 0; i < feldsize; i++) {
  21.         for (var j = 0; j < feldsize; j++) {
  22.             container.duplicateMovieClip("container"+i+"_"+j,1+(i*feldsize+j));
  23.             fueller = chr(65 + random(25));
  24.             mc = this["container"+i+"_"+j];
  25.             mc._x = j*breite+PosX;
  26.             mc._y = i*hoehe+PosY;
  27.             mc.text_int.borderColor = 0x000000;
  28.             mc.text_int.text = fueller;
  29.             if(i == x_anf && j == y_anf){
  30.                 container.duplicateMovieClip("container"+i+"_"+j,1+(i*feldsize+j));
  31.                 mc = this["container"+i+"_"+j];
  32.                 mc._x = j*breite+PosX;
  33.                 mc._y = i*hoehe+PosY;
  34.                 mc.text_int.borderColor = 0x000000;
  35.                 mc.text_int.text = geteiltesSuchwort[k];
  36.                 x_anf++;
  37.                 k++;
  38.             }
  39.         }
  40.     }
  41. };

Jetzt schreibt er das Wort schon. schreibt aber senkrecht nix mehr rein, sobald der Array leer ist. Ist ja eigentlich auch klar, aber wie kann ich das umgehen, oder geh ich grad völlig falsch an die Sache ran?

Habs schon mit for-Schleifen versucht, kriegs aber nicht hin.

Vielen Dank schonmal und Grüße
Manni
mannimedia ist offline   Mit Zitat antworten
Alt 07-09-2005, 16:56   #7 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
ist doch sooo einfach ...

lerne bitte functionen zu erstellen.
das macht alles übersichtlicher und wartungsfreundlicher:
- eine funktion, die NUR dein mc -array erstellt.
- eine funktion, die ALLE texte mit zufallsbuchstaben füllt
- eine funktion, die NUR das suchwort drüberschreibt.
und nicht alles in einem einzigen spagetticode verwurschteln!!!

programmablauf ist dann:
1. init (mc's erstellen)
2. neues spiel (zufallsbuchstaben eintragen)
3. suchwort drüberschreiben
4. user sucht
5. weiter bei 2.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (07-09-2005 um 16:57 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 08-09-2005, 10:09   #8 (permalink)
Neuer User
 
Registriert seit: Apr 2003
Beiträge: 173
super danke für die hilfe.

ich bin noch am lernen, und deshalb über jeden hinweis was das rangehen an so ein script angeht sehr dankbar.

hab das jetzt mal aufgeteilt. poste mal den ganzen code.

ActionScript:
  1. mein_xml = new XML();
  2. mein_xml.ignoreWhite = true;
  3. mein_xml.load("config.xml");
  4. mein_xml.onLoad = function(success) {
  5.     _global.labyrinth = [];
  6.     if (success) {
  7.         var l = this.firstChild.childNodes;
  8.         for (var i in l) {
  9.             var lia = l[i].attributes;
  10.             _global.labyrinth.push({suchwort:lia.suchwort,frage:lia.frage});
  11.         }
  12.         _global.labyrinth.sort(function(){return random(3)-1;});
  13.         erstelleArray();
  14.     } else {}
  15. };
  16.  
  17. function erstelleArray(){
  18.     tmpArr = [];
  19.     tmpArr = _global.labyrinth.pop();
  20.     suchwortString = tmpArr.suchwort.toUpperCase();
  21.     geteiltesSuchwort = suchwortString.split("");
  22.     anzahl = geteiltesSuchwort.length;
  23.     erstelleKaesten();
  24. };
  25.  
  26. function erstelleKaesten(){
  27.     breite = container._width;
  28.     hoehe = container._height;
  29.     PosX = 100;
  30.     PosY = 16;
  31.     for (var i = 0; i < 10; i++) {
  32.         for (var j = 0; j < 10; j++) {
  33.             container.duplicateMovieClip("container"+i+"_"+j,1+(i*10+j));
  34.             fueller = chr(65 + random(25));
  35.             mc = this["container"+i+"_"+j];
  36.             mc._x = j*breite+PosX;
  37.             mc._y = i*hoehe+PosY;
  38.             mc.text_int.borderColor = 0x000000;
  39.             mc.text_int.text = fueller;
  40.         }
  41.     }
  42.     erstelleSuchwort();
  43. };
  44.  
  45. function erstelleSuchwort(){
  46.     feldsize = 10;
  47.     if (random(2)) {
  48.         richtung = 'waagrecht';
  49.         x_anf = random(feldsize)+1;
  50.         y_anf = random(feldsize-anzahl)+1;
  51.         k = 0;
  52.         for(m = y_anf; m <= anzahl; m++ ){
  53.             mc = this["container"+x_anf+"_"+m];
  54.             mc.text_int.borderColor = 0x000000;
  55.             mc.text_int.text = geteiltesSuchwort[k];
  56.             k++;
  57.         }
  58.     } else {
  59.             richtung = 'senkrecht';
  60.             x_anf = random(feldsize-anzahl)+1;
  61.             y_anf = random(feldsize)+1;
  62.             k = 0;
  63.             for(m = x_anf; m <= anzahl; m++ ){
  64.                 mc = this["container"+m+"_"+y_anf];
  65.                 mc.text_int.borderColor = 0x000000;
  66.                 mc.text_int.text = geteiltesSuchwort[k];
  67.                 k++;
  68.             }
  69.         }
  70. };


das klappt jetzt auch schon beinah. das komische ist nur das er die for-Schleife manchmal komplett macht, aber meistens nicht vollständig fertig macht. Woran liegt das?

Und dann noch ne grundsätzliche Frage: Wann sind Variablen den lokal und wann global? Ich versteh jetzt z.B. nicht warum ich in der Funktion erstelleSuchwort() auf die Variablen anzahl oder geteiltesSuchwort zugreifen kann. Die sind doch eigentlich nur in der Funktion erstelleArray() definiert. Aber ich habs mir per trace ausgeben lassen und das ging.

Neulich hat mir jmd. gesagt man soll immer schauen so wenig globale Variablen zu verwenden wie möglich. Stimmt das, und wenn ja warum?

Danke schonmal und Grüße
Manni
mannimedia ist offline   Mit Zitat antworten
Alt 08-09-2005, 23:04   #9 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
"..ich bin noch am lernen.."
wer ist das nicht?

"..Wann sind Variablen den lokal und wann global?.."
var <-- macht eine variable lokal

"..so wenig globale Variablen zu verwenden wie möglich.."
functionen sollten möglichst 'autark' funktionieren. so kann man sie auch für andere projekte einsetzen. bei sehr komplexen programmen besteht die gefahr, das man eine globale benützt, die man schon wo anders benützt hat - dann gibts durcheinander. wer aber ordentlich initialisiert, der hat damit keine probleme ;-)

das aufteilen ist schon ok, aber du bist immer noch am verwurschteln ;-)
mach ein hautp-programm (main) und nicht: 'eine funktion ruft die nächste auf'.

hab die sache mal überarbeitet. u.a.:
man kann sehr gut mit xml arbeiten. ist nicht immer notwendig, das in ein array zu überschreiben.
Angehängte Dateien
Dateityp: zip Wortsuchspiel.zip (9,9 KB, 5x aufgerufen)
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (08-09-2005 um 23:13 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 09-09-2005, 12:13   #10 (permalink)
Neuer User
 
Registriert seit: Apr 2003
Beiträge: 173
Wow, vielen Dank.

Das sieht ja jetzt ganz anders aus. Ich hab das jetzt noch ein bißchen umgeschrieben

ActionScript:
  1. //
  2. // [url]www.SeibsProgrammLaden.de[/url]
  3. //
  4. // init
  5. _root.createEmptyMovieClip('plan', 1);
  6. plan = _root['plan'];
  7. plan.size = 10;
  8. plan._x = 30;
  9. plan._y = 55;
  10. plan.abstand = 44;
  11. fInitPlan.call(plan);
  12. //
  13. suchworte = new XML();
  14. suchwortnr = 0;
  15. fLoadSuchworte();
  16. //
  17. function fPlay() {
  18.     fClearChars.call(plan);
  19.     fInitRandomChars.call(plan);
  20.     fInitSuchwort();
  21. }
  22. next_btn.onPress = fPlay;
  23. //
  24. //
  25. // erzeuge size x size buchstaben-mc's
  26. function fInitPlan() {
  27.     var level = 0;
  28.     for (var x = 0; x<this.size; x++) {
  29.         for (var y = 0; y<this.size; y++) {
  30.             var mc = this.attachMovie("mc", "c"+level, ++level);
  31.             mc._x = x*this.abstand;
  32.             mc._y = y*this.abstand;
  33.         }
  34.     }
  35. }
  36. //
  37. // fuelle buchstaben-mc's mit zufalls-buchstaben
  38. function fInitRandomChars() {
  39.     for (i in this) {
  40.         this[i].text_int.text = chr(65+random(25));
  41.     }
  42. }
  43. //
  44. // fuelle buchstaben-mc's mit leerzeichen
  45. function fClearChars() {
  46.     for (i in this) {
  47.         this[i].text_int.text = " ";
  48.     }
  49. }
  50. //
  51. // lade suchworte-xml
  52. function fLoadSuchworte() {
  53.     suchworte.ignoreWhite = true;
  54.     suchworte.load("suchworte.xml");
  55.     suchworte.onLoad = function(success) {
  56.         if (success) {
  57.             fPlay();
  58.         } else {
  59.             // error, no xml
  60.         }
  61.     };
  62. }
  63. //
  64. // naechstes suchwort
  65. function fInitSuchwort() {
  66.     var _xml = suchworte[suchwortnr++];
  67.     //
  68.     _root.frage.text = _xml.firstChild+' ?';
  69.     var _str = _xml.attributes.suchwort;
  70.     //
  71.     var x = random(plan.size);
  72.     var y = random(plan.size-_str.length+1);
  73.     if (random(2)) {
  74.         var level = y*plan.size+x+1;
  75.         for (var i = 0; i<_str.length; i++) {
  76.             plan['c'+(level+i*plan.size)].text_int.text = _str.charAt(i);
  77.         }
  78.     }
  79.     else{
  80.         var level = x*plan.size+y+1;
  81.         for (var i = 0; i<_str.length; i++) {
  82.             plan['c'+(level+i)].text_int.text = _str.charAt(i);
  83.         }
  84.     }
  85. }


Zum einen reicht es wenn die Suchwörter nur vorwärts lesbar sind, deshalb hab ich unten das if random(2) reingeschrieben. Mein Problem ist jetzt, wie krieg ich hier nen Zufall mit rein, damit die Reihenfolge der Wörter jedesmal anders ist? Deshalb hatte ich eigentlich den Array. Oder geht das jetzt auch mit diesen Funktionen. So wie ich das sehe könnte ich höchstens sagen er soll an ein bestimmte Stelle im XML springen, und dann der Reihenfolge nach die Wörter durchgehen, oder?

Dann noch ein paar allgemeine Fragen:
- Brauch ich im XML die ID? Wenn ja wofür?
- Ist die Funktion fClearChars() nötig? Oder war die nur da um's testen zu können?

Vielen Dank schonmal für Deine Mühe. Hoffe ich nerv die nicht zu sehr

LG
Manni
mannimedia ist offline   Mit Zitat antworten
Alt 09-09-2005, 13:55   #11 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
"..damit die Reihenfolge.."
du musst nicht den berg umgraben, nur damit du ihn von der anderen seite besteigen kannst. es langt, wenn du die indizes per zufall auswählst (hier suchwortnr).

"..Brauch ich im XML die ID? Wenn ja wofür?.."
ob du die brauchst weiss ich nicht. ich jedenfalls greife damit
var _xml = suchworte[suchwortnr++];
auf die notes zu ;-)
p.s. fragen kann man sich auch selbst beantworten, durch einfaches ausprobieren.

"..Ist die Funktion fClearChars() nötig?.."
gegenfrage: ist dein wortsuchspiel nötig?
a) das war in 3 millisekunden erstellt.
b) beim testen kann ich so prima sehen, wo die wörter hingeschrieben werden. das könnte man z.b. auch nutzen, um die frage zu lösen (optisch anzuzeigen) - aber nötig ist das nicht.

"..Dank schonmal für Deine Mühe.."
ditto. aber ich mache das nicht für dich :-(
ich bin hier ständig auf suche nach neuen ideen, anregungen und sachen, aus denen man was machen kann. und werde das ("..Das sieht ja jetzt ganz anders aus.." - ich klaue nichts) irgendwann auf meine homepage integrieren. also sorry, ich helfe hier niemandem, sondern nur mir selbst ;-)

p.s. du machst dir wenigstens gedanken um die sache (und keineswegs falsche :-) da antwortet man gerne!
andere 'fordern' fertige lösungen und sind sauer, wenn man darauf hinweisst, dass das hier kein kostenloser selbstbedienungsladen ist.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (09-09-2005 um 14:08 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 09-09-2005, 15:10   #12 (permalink)
Neuer User
 
Registriert seit: Apr 2003
Beiträge: 173
"..ich helfe hier niemandem, sondern nur mir selbst..."
ok, versteh ich

Find's halt nur toll wenn sich jmd. die Mühe macht, auch wenn es für ihn selbst ist :-), anderen zu helfen, und dann das Ding komplett neu schreibt. Deshalb meine Dankesworte.

Aber zurück zum Thema. Ich versuch jetzt mal mit dem Skript weiter zu basteln, da muss ja noch ein bißchen was dazu. Gefundene Buchstaben anklicken etc.. Kann sein das ich mich dann nochmal melde.

Noch ne Frage zu meinem oberen Skript. Wieso hat das mal geklappt und mal nicht? Was ist daran falsch?
mannimedia ist offline   Mit Zitat antworten
Alt 09-09-2005, 19:29   #13 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
for(m = y_anf; m <= y_anf+anzahl; m++ ){
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 12-09-2005, 13:52   #14 (permalink)
Neuer User
 
Registriert seit: Apr 2003
Beiträge: 173
Vielen dank. Hab es jetzt aber mit deinem Skript fertig gemacht. Hat auch alles wunderbar geklappt.

Bin wieder auf Arrays umgestiegen, da ich jedes Wort nur einmal haben wollte. Und das wäre ohne Arrays ja nicht gegangen.

LG
Manni

Geändert von mannimedia (12-09-2005 um 13:54 Uhr)
mannimedia 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 15:08 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele