Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 08-09-2005, 16:51   #1 (permalink)
Neuer User
 
Registriert seit: Sep 2005
Beiträge: 79
Zufallsverteilung (Karten mischen) auf definierte Plätze

Hallo!
Ich habe 40 Karten-MovieClips: 8 in einer Reihe, 5 Reihen untereinander.
Die mcs heißen k1 bis k40. Sie liegen kerzengerade aneinander ohne Zwischenraum. Mit welchen Befehlen muß ich die Schaltfläche "karten mischen" belegen, um neu zu verteilen?

Ich brauche also eine Zufallsverteilung auf exakte Positionen.
Bitte um Hilfe oder Tips.
kernsche ist offline   Mit Zitat antworten
Alt 08-09-2005, 16:58   #2 (permalink)
x39
 
Benutzerbild von georgem
 
Registriert seit: Oct 2004
Ort: St.Gallen, Schweiz
Beiträge: 1.261
hier ein Codeschnippsel-prinzip, mit dem du deine 8 mal 5 Karten mischen kannst:

wir emulieren einen Stappel von 40 Karten, die ja von 1 bis 40 nummeriert sind.
Dazu definieren wie ein Array dass diese 40 Nummern in aufsteigender Reihe enthält:

ActionScript:
  1. var karten:Array = new Array()
  2. for(i=1;i<=40;i++){
  3.    karten[i]= i
  4. }

diese KArten enthält jetzt also folgendes: karten = [1,2,3,4,5,6,7...,40]

jetzt müssen wir eine Swap-Routine schreiben, die jeweils zwei dieser Zahlen- positionen mit einander austauscht, und dieser Vorgang soll x mal wiederholt werden...
das enspricht genau dem was auch der menschliche Kartenmischer macht... er bringt die Karten durcheinander, indem er ihre Positionen austauscht.
Das machst du folgendermassen:

ActionScript:
  1. for (x=0;x<100;x++){
  2.  zufall1= random(40)+1
  3.  zufall2 = random(40)+1
  4.  träger = karten[zufall1]
  5.  karten[zufall1] = karten[zufall2]
  6.  karten[zufall2] = träger
  7. }

das wäre mal vorerst die Mischung
__________________
The Sleeper Must Awaken

www.margaris.de | www.exosolar.net

Geändert von georgem (08-09-2005 um 17:11 Uhr)
georgem ist offline   Mit Zitat antworten
Alt 08-09-2005, 17:07   #3 (permalink)
x39
 
Benutzerbild von georgem
 
Registriert seit: Oct 2004
Ort: St.Gallen, Schweiz
Beiträge: 1.261
das Array karten ist nach x maligem mischeln jetzt also in dieser Form:

karten = [14,1,2,8,9,33,...,5] z.B.

es wurde ja hundertmal 2 zufällige Kartenpositionen miteinander vertauscht...

jetzt das Positioneren:

wir machen 2 schlaufen die quasi die x und y achse deiner Karten-Formationen darstellen. wir werden eine routine schreiben, die das kartenarray ausliest und die jeweiligen nummern ausgibt, während x und y positionen sich ändern. z.B. mit x Abständen 80 pixel und y auch 80:

ActionScript:
  1. var zähler:Number = 1
  2. for (y= 0;y<5;y++){
  3. for (x= 0;x<8;x++){
  4.    _root["k"+karten[zähler]]._x = x*80
  5.    _root["k"+karten[zähler]]._y = y*80
  6.    zähler+=1
  7. }
  8. }

das sollte so funktionieren
schau dir mal das Prinzip an, ich würde das mal separat programmieren, damit du den Hintergedanken kapierst.
__________________
The Sleeper Must Awaken

www.margaris.de | www.exosolar.net

Geändert von georgem (08-09-2005 um 17:13 Uhr)
georgem ist offline   Mit Zitat antworten
Alt 08-09-2005, 17:14   #4 (permalink)
Neuer User
 
Registriert seit: Sep 2005
Beiträge: 79
Wo?

Danke, das klingt schon mal sehr einleuchtend. Werd ich mich gleich dran versuchen!!!
Seh ich das richtig, dass das erste Script in Bild (1) geschrieben wird um das Array "ins Leben zu rufen", das zweite (Karten-misch-) Script auf die Schaltfläche gelegt wird?
kernsche ist offline   Mit Zitat antworten
Alt 08-09-2005, 17:20   #5 (permalink)
x39
 
Benutzerbild von georgem
 
Registriert seit: Oct 2004
Ort: St.Gallen, Schweiz
Beiträge: 1.261
das ist eben gute Frage...

Natürlich sollte das Mischen nur dann stattfinden , wenn man auf die schlatfläche drückt...

es wird aber empfohlen in solchen Button Release-Klammern nicht viel Code und Berechnungen auszuführen, das scheint manchmal probleme zu machen...

Ich muss zugeben, dass ich mich mit mehreren Frames nicht gut auskenne, eigentlich mache ich die ganze Arbeit immer nur in einem einzigen Frame.
Mein Flasharbeitsplatz sieht meist so aus: ein Layer mit einem Frame drin

sorry

dafür verwende ich aber in diesem Frame eine onEnterFrame Schlaufe, so dass deren Inhalt immer wieder ausgeführt wird..
__________________
The Sleeper Must Awaken

www.margaris.de | www.exosolar.net

Geändert von georgem (08-09-2005 um 17:23 Uhr)
georgem ist offline   Mit Zitat antworten
Alt 08-09-2005, 17:36   #6 (permalink)
Neuer User
 
Registriert seit: Sep 2005
Beiträge: 79
onEnterFrame-Schlaufe_wow

das klingt interessant:
Kann man damit auch z.B. einen mc mit Pfeil nach unten belegen und so einen Bildleisten-Mc oder text_mc unter einer Maske scrollen?
Ich hab dafür immer einen loop zwischen zwei Bildern mit der gleichen Schaltfläche benutzt. Wußte nie, was man mit onEnterFrame anfangen kann.

Ja ich weich vom Thema ab, das ist bestimmt nicht gut im Forum, weils noch Andere interessieren könnte!! (trotzdem bitte kurze Antwort)

So - und jetzt auf in die Praxis: Zufallsprogrammierung.
Wenn ich Fragen hab schreib ich die hier drunter.

Danke vorab
kernsche ist offline   Mit Zitat antworten
Alt 08-09-2005, 17:48   #7 (permalink)
x39
 
Benutzerbild von georgem
 
Registriert seit: Oct 2004
Ort: St.Gallen, Schweiz
Beiträge: 1.261
ja, das geht, prinzipiell ist alles möglich...

mit einem onEnterFram oder setIntervall kommst du am ehesten an das Prinzip von anderen Programmiersprachen ran, mit denen du dann etwas wirklich dynamisch erstellen kannst.

Allerdings sind verschiedene Frames gerechtfertigt, wenn du z.B. eineBegrüssungs-Screen text machst mit StartButton, und auch für Preloader geschichten können Frames sinnvoll sein. Dann würde das efektive Spiel, ind einem späteren Frame ablaufen sobald man das erste Mal den Frame betritt.

einen onEnterFrame könntest du in auch einem anderen Frame wieder stoppen durch z.B. delete mc.onEnterFrame
das ist das besonders interessante daran...

du lässt quasi Abläufe startetn die simultan separat ablaufen, und die du dann trotzdem wieder abstellen kannst, und zwar von überall aus
__________________
The Sleeper Must Awaken

www.margaris.de | www.exosolar.net
georgem ist offline   Mit Zitat antworten
Alt 08-09-2005, 17:58   #8 (permalink)
Neuer User
 
Registriert seit: Sep 2005
Beiträge: 79
:)

...hatte ich eigentlich schon erwähnt, dass ich programmiertechnisch noch auf der "Rotkäppchen-Ebene" bin?

Das kopier ich mir und befass mich später damit, weils nach was sehr nützlichem klingt.



Jetzt aber zurück zu meiner Zufallsprogrammierung.
Mache gleich den Test.swf!!
kernsche ist offline   Mit Zitat antworten
Alt 08-09-2005, 18:03   #9 (permalink)
x39
 
Benutzerbild von georgem
 
Registriert seit: Oct 2004
Ort: St.Gallen, Schweiz
Beiträge: 1.261
rotkäppchen's potential ist ja allgemein bekannt, die hat gar den armen Wolf ganz schön gelinkt, die Sau...
__________________
The Sleeper Must Awaken

www.margaris.de | www.exosolar.net
georgem ist offline   Mit Zitat antworten
Alt 08-09-2005, 18:10   #10 (permalink)
Neuer User
 
Registriert seit: Sep 2005
Beiträge: 79
Danke,

vielleicht sollte ich meinen Usernamen in "Rotkäppchen" ändern...


Zurück zur drückenden Praxis:
Bei "karten mischen" passiert leider gar nichts.
Kann das damit zusammenhängen, dass meine Karten mit Instanznamen "k1" bis "k40" heißen? muß ich die Namen löschen?
oder sprichst Du sie nur noch übers Array an und die Namen stören nicht?

den letzten Absatz hab ich nämlich nicht ganz geblickt. Kannst Dus mir kurz
erläutern? Vielleicht find ich den Fehler ja ohne jemand die .fla zu schicken.
Wäre gut fürs Ego.
kernsche ist offline   Mit Zitat antworten
Alt 08-09-2005, 18:25   #11 (permalink)
x39
 
Benutzerbild von georgem
 
Registriert seit: Oct 2004
Ort: St.Gallen, Schweiz
Beiträge: 1.261
nein, das macht nichts, es ist inOrdnung dass deine 40 Instanzen auch sauber nummeriert sind

ich sprech sie ja durch _root["k"+variable] an.

hm, heissen denn die Karten-Namen in deiner Bibliothek k? im letzten mail hiessen sie doch karte, also musst du auch _root["karte"+.... schreiben.

leider ist der COde deines Flash etwas zu unüberschtlich (für mich wohlgemerkt, muss für dich nicht so sein) , ich würde es anders machen...

Also das mischen würde ich komplett in eine function reinschmeissen

also

ActionScript:
  1. function mischen(){
  2. var karten:Array = new Array()
  3. for(i=1;i<=40;i++){
  4.         karten[i]= i
  5. }
  6. for (x=0;x<100;x++){
  7.         zufall1= random(40)+1
  8.         zufall2 = random(40)+1
  9.         träger = karten[zufall1]
  10.         karten[zufall1] = karten[zufall2]
  11.         karten[zufall2] = träger
  12. }
  13. var zähler:Number = 1
  14. for (y= 0;y<5;y++){
  15.         for (x= 0;x<8;x++){
  16.                 _root["karte"+karten[zähler]]._x = x*80
  17.                 _root["karte"+karten[zähler]]._y = y*80
  18.                 zähler+=1
  19.         }
  20. }
  21. }

diese Function sollte im ersten Frame drin sein...

du kannst sie glaub ich dann einfach innerhalb der schaltfläche ausführen indem du dort mischen() eingibst
__________________
The Sleeper Must Awaken

www.margaris.de | www.exosolar.net

Geändert von georgem (08-09-2005 um 18:27 Uhr)
georgem ist offline   Mit Zitat antworten
Alt 08-09-2005, 19:12   #12 (permalink)
Neuer User
 
Registriert seit: Sep 2005
Beiträge: 79
irgendwas mach ich falsch!

ja, die karten in der Bibliothek heißen karte1 bis karte40.

Ich hab an zwei Stellen die Scripts:
auf frame(2) des Films, wo er ja von der Schaltfläche immer wiedre hingeschickt wird:
//initieren des Karten-Arrays und misch-Angabe
function mischen(){
var karten:Array = new Array()
for(i=1;i<=40;i++){
karten[i]= i
}
for (x=0;x<100;x++){
zufall1= random(40)+1
zufall2 = random(40)+1
träger = karten[zufall1]
karten[zufall1] = karten[zufall2]
karten[zufall2] = träger
}
var zähler:Number = 1
for (y= 0;y<5;y++){
for (x= 0;x<8;x++){
_root["karte"+karten[zähler]]._x = x*80
_root["karte"+karten[zähler]]._y = y*80
zähler+=1
}
}
}


Und auf der Schaltfläche:
// // drÙcken der sf: karten mischen,setze alle Karten wieder auf RÙckseite
on (press) {
mischen()
// Variablenzahl und bild werden zurückgesetzt
on(release){
_root.zahl = 0;
_root.bild = 0;
gotoAndPlay(2);
}

Da wird ein Scriptfehler gemeldet. Hab ich einen Blanc zuviel oder so?

und was bedeutet das Sternchen in: x*80?
kernsche ist offline   Mit Zitat antworten
Alt 08-09-2005, 19:36   #13 (permalink)
Neuer User
 
Registriert seit: Sep 2005
Beiträge: 79
Für heut langts.

Mir brummt der Schädel vom Probieren. Kann grad nimmer denken. Mach Feierabend. Will heim.
Muß erst mal das Ganze Neue verabeiten mit klarem Kopp.

Morgen probier ich weiter.

Gut Nacht!
kernsche ist offline   Mit Zitat antworten
Alt 08-09-2005, 20:05   #14 (permalink)
x39
 
Benutzerbild von georgem
 
Registriert seit: Oct 2004
Ort: St.Gallen, Schweiz
Beiträge: 1.261
Sternzeichen bedeutet mal, x mal 80 also...

on (press) {
mischen()
}
// Variablenzahl und bild werden zurückgesetzt
on(release){
_root.zahl = 0;
_root.bild = 0;
gotoAndPlay(2);
}


nach mischen fehlt ein Klammer-zu, wie oben markiert, deshalb gibts einen ERROR
__________________
The Sleeper Must Awaken

www.margaris.de | www.exosolar.net

Geändert von georgem (08-09-2005 um 20:06 Uhr)
georgem ist offline   Mit Zitat antworten
Alt 09-09-2005, 11:41   #15 (permalink)
Neuer User
 
Registriert seit: Sep 2005
Beiträge: 79
Ooops!,

darauf hätte ich aber auch selbst kommen müssen!! (war ein heftiger Arbeitstag, =peinlich). Scriptfehler wird jetzt nicht mehr gemeldet.

DENNOCH:
Karten mischen geht immer noch nicht. Irgendwo ist noch der Wurm drin.

Mein Problem ist, dass ich einfach noch nicht so weit bin mit Action Script, um Deine Scripts zu verstehen. Du erstellst ein Array (quasi karten1...bis karten40).
Den Rest mit x= und zufall und träger etc. begreif ich einfach nicht.

Zum Erklären ist das wahrscheinlich zu kompliziert (wie gesagt: noch Rotkäppchenebene)

Will mich übers WE im ActionScript-Buch schlauer machen. Kannst Du mir einen Tipp geben,unter was für einem Kapitel ich suchen muß? Sieht alles so logisch aus, ich würde es gerne verstehen.

Soll ich die fla schicken oder genügen die Scripts hier im Forum?
Es funktioniert alles außer dem "mischen"
kernsche 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 12:11 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele