Zurück   Flashforum > Flash > ActionScript > Softwarearchitektur und Entwurfsmuster

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 10-03-2006, 18:02   #1 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.587
Spiel "Memory" OOp

Habe gerade angefangen das Spiel "Memory" nachzubauen.
Das Grundgerüst ist zwar fertig, aber ich denke das das nicht so sauber programmiert ist.
Wäre toll wenn der eine oder andere Tipps dazu geben könnte.

Nun bin ich auch schon am Überlegen wie man die Punktevergabe gestalten sollte.
zB sollte es für jedes gefundene Paar Punkte geben und eventuell noch für Schnelligkeit.
Später sollte man auch zur Laufzeit Funktionen übergeben können so das die Karten animiert auf der Spielfläche attached/ entfernt werden.

Bloß wie stell ich das jetzt am dümmsten an, damit dies auch etwas strukturiert ist?
Was für Klassen sollte ich erstellen, und wer soll welcher "Aufgabe" erledigen?
Ist es eventuell ratsam eine art Listener beim Memory zu erstellen der dem registrierten Objekt sagt das ein gültiges Paar gefunden wurde und das Objekt somit die Punkte errechnen kann .

Ach ja, im Anhang ist der momentane Status zu begutachten...
Angehängte Dateien
Dateityp: zip test.zip (9,6 KB, 84x aufgerufen)
__________________
ERROR: Signature is too large

Geändert von rendner[i] (10-03-2006 um 18:04 Uhr)
rendner[i] ist offline   Mit Zitat antworten
Alt 11-03-2006, 08:25   #2 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.587
Danke für deine zahlreichen Antworten .
Diese abstrakte Denkweise habe ich völlig aussen vor gelassen und gleich drauflos gebastellt.

Soweit ich das mit meinen laien verständnis in Sachen oop deuten kann, ist Spiel die "Hauptklasse" die dann in der fla später initialisiert wird und alle anderen Klassen steuert.
Ein member von Spiel ist dann die Spielrunde und diese enthällt wiederum als member Karten, Spieler und Tisch.

Nun hab ich aber wieder das Vorstellungsproblem, was für ein Sinn macht der Tisch wenn ich doch alle Karten in der Klasse Karten "gesammelt" habe?
Und sollte man auch noch eine Klasse Karte anlegen?
So das die Klasse Karten nur Objekte der Klasse Karte aufnimmt.

Bei der Klasse Cards weis ich nicht wie ich eine Collection erstellen soll.
Eine Collection ist ja eine Sammlung, bloß wie implementier ich diese?

Habe jetzt nur die Klasse Card und Cards erstellt weil ich bei dem anderen mir mit der Umsetzung nicht sicher bin.

Aber diese art der Umsetzung bringt wieder ein paar problemchen mit sich...
- wer bekommt die ButtonEvents, wenn Karte selektiert wird, die Klasse Card selber?

- Klasse Cards ist ja der "Sammelbehälter" für die einzelnen Karten und nur Cards selber weis die Instanznamen, aber woher
soll dann das Spiel wissen welche Karte selektiert werden soll wenn der user auf eine klickt..., eventuell einen index für Cards übergeben die dann eine Referenz der Karte liefert die auf dem index im Array liegt?

PHP-Code:
class Card
{
    private var 
card:MovieClip;
    
    public var 
pairID:Number;
    
    
    function 
Cardcard:MovieClip )
    {
        
this.card card;
        
        
pairID null;
    }
    
    
// Deckblatt
    
function hide():Void
    
{
        
card.gotoAndStop);
    }
    
    function 
show():Void
    
{
        
card.gotoAndStoppairID );
    }
    
    function 
kill():Void
    
{
        
card.removeMovieClip();
    }

PHP-Code:
class Cards
{
    public var 
cards:Array;
    
    function 
Cards()
    {
        
cards = new Array();
    }
    
    function 
addCardcard:Card ):Void
    
{
        
cards.pushcard );
    }
    
    function 
removeCardcard:Card ):Void
    
{
        var 
l:Number length;
        
        for( var 
i:Number 0li++ )
        {
            if( 
cards] == card )
            {
                
cards.splicei);
                
                
card.kill();
                
                break;
            }
        }
    }
    
    
// alle Karten aufdecken
    
function show():Void
    
{
        var 
l:Number length;
        
        for( var 
i:Number 0li++ )
        {
            
cards].show(); 
        }
    }
    
    
// alle Karten zudecken
    
function hide():Void
    
{
        var 
l:Number length;
        
        for( var 
i:Number 0li++ )
        {
            
cards].hide(); 
        }
    }
    
    
// entfernt alle Karten und loescht sie
    
function clear():Void
    
{
        var 
l:Number length;
        
        for( var 
i:Number 0li++ )
        {
            
cards].kill();
        }
        
        
cards = new Array();
    }
    
    
// Karten mischen
    
function shuffle()
    {
        var 
tmp:Array = [].concatcards );
        
        var 
rnd:Number;
        
        var 
card1:Cardcard2:Card;
        
        while( 
tmp.length )
        {
            
rnd  Math.floorMath.random() * tmp.length );
            
card1 tmp.splicernd)[0];
            
            
rnd  Math.floorMath.random() * tmp.length );
            
card2 tmp.splicernd)[0];
            
            
changeCardscard1card2 );
        }
    }
    
    function 
get length():Number
    
{
        return 
cards.length;
    }
    
    
// vertauscht cardID's
    
private function changeCardscard1:Cardcard2:Card ):Void
    
{
        var 
id:Number  card1.pairID;
        
        
card1.pairID card2.pairID;
        
card2.pairID id;
    }

__________________
ERROR: Signature is too large

Geändert von rendner[i] (11-03-2006 um 19:40 Uhr)
rendner[i] ist offline   Mit Zitat antworten
Alt 11-03-2006, 09:44   #3 (permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 923
Ja sorry, dass meine Antworten wenig konkret mit deiner Frage zu tun haben. Ich lese da gerade so ein Buch über objektorientiertes Design und wollte die Methoden mal auf ein konkretes Problem anwenden. Vielleicht mache ich besser einen eigenen Thread daraus.

mfg. h
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D
hazy fantazy ist offline   Mit Zitat antworten
Alt 11-03-2006, 10:31   #4 (permalink)
helpQLODhelp
 
Benutzerbild von bokel
 
Registriert seit: Feb 2002
Ort: Köln
Beiträge: 8.505
Hi hazy,

ich habe den Thread mal aufgeteilt, dann musst du das nicht alles neu schreiben. Hier gehts weiter: OOD Memory
bokel ist offline   Mit Zitat antworten
Alt 11-03-2006, 12:51   #5 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.587
hmmm, was mach ich jetzt?

Im prinzip will ich das Spiel auch nur als eine art oop Lernziel erstellen, somit wäre es vielleicht nicht verkehrt wenn man in dem Thread von "hazy fantazy" die Herangehensweise und Aufteilung der Klassen mal durchleuchtet und hier eventuell das ganze dann umsetzt.

Würde mich aber trotzdem freuen wenn ich hier nicht alleine da stehe...

@ hazy fantazy:
Ist das Buch in leicht verständlichen Englisch verfasst oder muss man da schon etwas tiefgreifendere Erfahrung in sachen Programmierung mitbringen?
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 11-03-2006, 15:46   #6 (permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 923
Hallo rendner[i],
ich habe ja eigentlich nur laut gedacht, wer mitdenken will, ist herzlich eingeladen. Am Ende (wenn es soweit kommt) können wir dann das Ergebnis mit dem Ergebnis aus deinem Thread hier vergleichen. Wie ein kleiner Wettstreit der Methoden, OOD vs. adhoc Programmierung. Ich denke, lernen können wir alle was dabei.

Das Buch ist, typisch amerikanisch, in ganz normaler Sprache geschrieben. Trotzdem muss man schon ein bißchen Erfahrung mitbringen, ich glaube sonst versteht man die Problemstellungen nicht.

Schöne Grüße und danke an bokel für die Aufteilung,
hazy.
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D

Geändert von hazy fantazy (11-03-2006 um 15:50 Uhr)
hazy fantazy ist offline   Mit Zitat antworten
Alt 13-03-2006, 15:17   #7 (permalink)
Nagelneuer User
 
Benutzerbild von hazy fantazy
 
Registriert seit: Dec 2005
Beiträge: 923
Zitat:
Wenn ich jetzt ein Paar aufgedeckt habe, will ich die anderen Karten "unklickbar" machen quasi die ButtonEvents abstellen.
Das hast du leider nicht drinne, wie könnte man das am besten umsetzen?
Das mit dem Listener ist auf jeden Fall ok. Eine andere Methode wäre es, den parent der Karten per enable=false zu disablen.

Zitat:
In meiner Klasse Cards (Karten), werden alle Karten in einem Array gespeichert.
Die Klasse Cards verfügt selber über einen Befehl mischen (shuffle), dieser mischt nur intern die Karten, nicht optisch.
Nun will ich aber später noch eine Klasse, keine Ahnung wie die heissen könnte, erstellen der der user eine selbst erstellte Funktion übergibt zb fürs mischen (optisch).
Dann ruft diese Klasse die mischen Methode der Klasse Karten auf und die Funktion des users, so das die Karten animiert gemischt werden.
Dies soll später auch noch für das erstellen der Spielfläche, des umdrehens einer Karte, eliminieren eines gültigen Paares,... gehen.
Was mir jetzt fehlt ist ein Ansatz oder eine Idee wie man dieses Ziel angeht.
Das eine betrifft ja nur die Daten, während das andere eine sichtbare Animation ist. Normalerweise würde ich wahrscheinlich einen Controller beide Methoden aufrufen lassen.

mfg.h
__________________
The fact that you've got "Replica" written on the side of your gun and the fact that I've got "Desert Eagle written on the side of mine ... :D
hazy fantazy ist offline   Mit Zitat antworten
Alt 13-03-2006, 15:51   #8 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.587
Zitat:
Das mit dem Listener ist auf jeden Fall ok. Eine andere Methode wäre es, den parent der Karten per enable=false zu disablen.
Das geht leider nicht.
Aber hast mich auf ne Idee gebracht, ist fast das gleiche.
Hier mal ein Bsp.:
PHP-Code:
var mc this.createEmptyMovieClip"container" );

mc.attachMovie"card" "card" );
mc.card.onPress = function(){ this._alpha 50;}

disableAllCardsmc );
enableAllCardsmc );

// Container's ButtonEvent's entfernen, so das die
// events der child objekte funktionieren
function enableAllCardsparent )
{
    
parent.enabled false;
    
delete parent.onPress;
}

// Container selber ein ButtonEvent verpassen, so das er die
// events der child objekte abfaengt
function disableAllCardsparent )
{
    
parent.enabled true;
    
parent.onPress null;
    
parent.useHandCursor false

Habe leider keine richtige Zeit das alles mal schnell umzusetzen da lernstress, aber wenn ich wieder Zeit finde werd ich das alles mal was sich bis dahin im Kopf gesammelt hat probieren umzusetzen.

Danke und nen schönen Tag noch .
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 23-11-2007, 13:18   #9 (permalink)
Neuer User
 
Registriert seit: Nov 2006
Beiträge: 3
Ich muss den Thread hier nochmal rausholen!

Ich wollte das Script als "Anleitung" nehmen für ein ähnliches Spiel mit Fotos.
Nun wollte ich aber am Ende, also wenn man alles aufgedeckt hat eine "Herzlichen Glückwunsch-Meldung" ausgeben lassen.
Ich hab schon eine Menge rumgedoktort... aber bin zu keiner Lösung gekommen.
Wollte im Endeffekt nur, dass ein weiterer Movieclip dann bei Frame 2 losläuft und die Botschaft ausgibt.

Hat von euch jmd. eine Idee wie ich das bewerkstelligen kann??

Grüße,
Basti
pgbasti ist offline   Mit Zitat antworten
Alt 23-11-2007, 13:26   #10 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.587
Du musst halt alle Karten von der Spielfläche in einem Array verwalten.
Jedesmal wenn ein Paar aufgedeckt wurde, wird dieses aus dem Array entfernt, wenn nun nach dem entfernen keine Karten mehr enthalten sind kannst du deinen mc bescheid sagen.
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 23-11-2007, 13:52   #11 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.587
Ich antworte mal hier... (Anfrage per PM bekommen)

Wenn du das zip aus Beitrag 1 nimmst, brauchst du in der Klasse Memory nur ein zusätzliches Array erstellen in dem deine Karten gespeichert werden.
Dazu packst du jede neu erstellte Karte (Methode "create") in dieses Array.
In der Methode "clearPair" musst du dann diese 2 Karten aus dem Array löschen und wenn in die if-Abfrage gegangen wird prüfst du ob noch Karten im Array sind, falls nicht beendest du einfach das Spiel und blendest halt deinen mc ein.
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 23-11-2007, 13:57   #12 (permalink)
Neuer User
 
Registriert seit: Nov 2006
Beiträge: 3
Zitat:
Zitat von rendner[i] Beitrag anzeigen
Ich antworte mal hier... (Anfrage per PM bekommen)

Wenn du das zip aus Beitrag 1 nimmst, brauchst du in der Klasse Memory nur ein zusätzliches Array erstellen in dem deine Karten gespeichert werden.
Dazu packst du jede neu erstellte Karte (Methode "create") in dieses Array.
In der Methode "clearPair" musst du dann diese 2 Karten aus dem Array löschen und wenn in die if-Abfrage gegangen wird prüfst du ob noch Karten im Array sind, falls nicht beendest du einfach das Spiel und blendest halt deinen mc ein.
Ja, so dachte ich mir das auch.
Aber wenn ich auf den Movieclip zugreifen will, dann kommt immer eine Fehlermeldung im Actionscript das Definitionen nicht zugelassen sind.
Wollte folgendermaßen vorgehen:

_root.neuerClip.gotoAndPlay(2);

und dann kommt eben genannter Fehler.
neuerClip ist der Instanzname
pgbasti ist offline   Mit Zitat antworten
Alt 23-11-2007, 14:35   #13 (permalink)
Neuer User
 
Registriert seit: Nov 2006
Beiträge: 3
Habs selber jetzt hinbekommen.
Hab ne Variable oben gesetzt die dann bei ClearPair runterzählt.

DANKEEEEEEEEEEEEEE
pgbasti 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 09:17 Uhr.

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


Copyright ©1999 – 2014 Marc Thiele