# Towers



## DonJure (29. Sep 2004)

Habe das Kartenspiel Pyramide(oder Towers) nachgeproggt.
Ist leider noch nicht ganz fertig, aber schon spielbar.
Ich finde dass es ein wenig lahm ist . Und ich denke dass liegt daran dass die Bilder nicht vorgeladen werden.
Was meint ihr?
Hier der link dazu:
>>HIER<<

Spielregeln: Am unteren Bildschirmrand liegt ein aufgedeckter Kartenstapel. Darauf muss man eine Karten legen die entweder ein höcher oder ein niedriger ist.  Falls von den aufgedeckten Karte keine passt kann man auf dem zugedeckten Kartenstapel eine Karte ziehen.


----------



## Beni (29. Sep 2004)

Es startet leider nicht:


> Laden: Klasse Towers.class nicht gefunden
> java.lang.ClassNotFoundException: Towers.class
> at sun.applet.AppletClassLoader.findClass(Unknown Source)
> at java.lang.ClassLoader.loadClass(Unknown Source)
> ...


----------



## DonJure (29. Sep 2004)

Also bei mir schon, habs mit IE und FireFox ausprobiert.


----------



## Beni (29. Sep 2004)

Ahh, Mozilla 1.7, Java 1.5 Beta 2, sollte ich noch anmerken.


```
<applet code="Towers.class"
codebase="file:///C|/Dokumente%20und%20Einstellungen/Don/Eigene%20Dateien/My%20Webs/donjure"
height="600" width="800">
</applet>
```

Der Versuch auf _meiner_ Festplatte nach der Klasse zu suchen, muss allerdings auch scheitern... Mach doch eine JAR aus deinem Applet, (und mach eine bessere Pfadangabe), dann wird das eher funktionieren.


----------



## DonJure (29. Sep 2004)

DW hat automatisch was geändert. tut mir leid. müsste aber jetzt klappen.


----------



## Beni (29. Sep 2004)

Jup  :toll: 

Von der Graphik her super, allerdings hat das Applet extrem lange Reaktionszeiten (wenn ich auf eine Karte klicke, dauert es bis zu einer Sekunde bis was passiert).
Da würd ich mir etwas mehr Geschwindigkeit wünschen.


----------



## DonJure (29. Sep 2004)

das ist ja mein problem.
könnte das an den bildern liegen, dass die immer neu geladen werden?
oder vielleicht am algorithmus...?


----------



## stev.glasow (29. Sep 2004)

DonJure hat gesagt.:
			
		

> könnte das an den bildern liegen, dass die immer neu geladen werden?


Ja, auf jeden Fall. Wenn du damit meinst dass du die Bilder jedes mal lädst wenn du diese zeichnest.



			
				DonJure hat gesagt.:
			
		

> oder vielleicht am algorithmus...?


Sorry, aber wenn man so einen gravierenden Fehler mit den Bildern gemacht hat liegt es nahe, dass noch mehr nicht so gut programmiert ist.

[edit]
Trotzdem cooles Spiel


----------



## DonJure (29. Sep 2004)

> Sorry, aber wenn man so einen gravierenden Fehler mit den Bildern gemacht hat liegt es nahe, dass noch mehr nicht so gut programmiert ist.



Das würde ich auch niemals abstreiten. 

Ich kann ja meinen Code mal posten dann könnt ihr euch kaputt lachen  :bae:


----------



## Beni (29. Sep 2004)

Wir lachen erst über andere, wenn sie sich selbst als Code-Gurus bezeichnen und dann Mist bauen...

Keine Angst, hier wird niemand über dich (oder dein Code) lachen.


----------



## DonJure (29. Sep 2004)

Ich sehe das eher als Humor. 
Ich weiß ja was ich kann, wenns auch nicht viel ist.

Ich versuche dass mal umzuändern vielleicht gelingt es mir ja


----------



## DesertFox (29. Sep 2004)

Mhh ist echt etwas langsam, wirkt fast so, als hättest du eine verzögerung eingebaut....


----------



## DonJure (19. Okt 2004)

Hallo Jungs, da bin ich wieder....  :bloed: 

Zurück zu meinem Problem - wegen der Performenc :!: 

Um an die Postion der Karte zu gelangen - ermittle ich über den MouseListener die Position und überprüfe jede einzelne Karte, ob sie der Position entspricht. Dah dieses glaube ich sehr lange dauert (52 mal *durchlauf*) beeinträchtigt das bestimmt die Performence. Habt ihr rein zufällig eine Idee wie man das Problem auch anders lösen könnte.


```
public class Card {
int kartennr,position;
int status;   
    
    public Card(int kn,int pos,int status) {
    this.kartennr=kn;
    this.position=pos;
    this.status=status;
    }
    
    int getPos(){
    return position;
    }
    
    int getKn(){
    return kartennr;
    }
    
    int getStatus(){
    return status;
    }
    
    void setStatus(int i){
    status = i;
    }   
}
```


```
public void mouseClicked(MouseEvent e) {
        //System.out.println(e.getX()+" | "+e.getY());
        // Start
        if(check1){
            if((e.getX() > 382 && e.getX() < 422) && (e.getY() > 318 && e.getY() < 348 )){
                if(!(name.equals(""))){
                    go();
                }
            }
        }
        // Spiel
        if(go){
            for(int i=0;i<spiel.size();i++){
                Card c = (Card)spiel.elementAt(i);
                if(c.getStatus() == 1){
                    if((e.getX() > translator[c.getPos()][0] && e.getX() < translator[c.getPos()][0]+55) && (e.getY() > translator[c.getPos()][1] && e.getY() < translator[c.getPos()][1]+85)){
                        Card ca = (Card)auf_deck.lastElement();
                        if(transe[ca.getKn()] == 1 && transe[c.getKn()] == 13){
                            auf_deck.add((Card)spiel.elementAt(i));
                            spiel.removeElementAt(i);
                            check[c.getPos()] = true;
                            punkte += 500;
                            checkmeout();
                        }
                        if(transe[ca.getKn()] == 13 && transe[c.getKn()] == 1){
                            auf_deck.add((Card)spiel.elementAt(i));
                            spiel.removeElementAt(i);
                            check[c.getPos()] = true;
                            punkte += 500;
                            checkmeout();
                        }
                        if(transe[ca.getKn()] == transe[c.getKn()]+1 || transe[ca.getKn()] == transe[c.getKn()]-1){
                            auf_deck.add((Card)spiel.elementAt(i));
                            spiel.removeElementAt(i);
                            check[c.getPos()] = true;
                            punkte += 500;
                            checkmeout();
                        }
                    }
                }

            }
            if(zu_deck.size() > 0){
                if((e.getX() > 400 && e.getX() < 461) && (e.getY() > 440 && e.getY() < 531 )){
                    auf_deck.add((Card)zu_deck.lastElement());
                    zu_deck.removeElementAt(zu_deck.size()-1);
                    repaint();
                }
            }
        }
        
    }
```


----------



## 0xdeadbeef (22. Okt 2004)

Eventuell könntest Du die "Clipping Rectangles" der frei liegenden Karten in eine Liste packen und dann bei jedem Klick nur die Liste durchsuchen. Sobald eine Karte verschwindet, muß sie natürlich auch aus der Liste entfernt werden. Dadurch solltest Du immer nur ein paar Listenpositionen durchsuchen müssen.

Alternativ könntest Du einen zweidimensionalen Array als "Lookup-Table" benutzen. Der braucht ja nicht die Dimensionen der Bildschirmaufllösung zu haben, sondern bloß Auflösung durch 10 oder so (abhängig von Größe und Position der Karten). Beim Start wird der Puffer mit ungültigen Werten vorbelegt (z.B. "-1")- Bei "Aktivierung" einer Karte (also wenn sie anwählbar sein soll), schreibst Du an die entsprechenden Positionen des Puffers die Nummer der Karte. Bei "Deaktivierung" der Karte löscht Du die Nummern wieder. Je nach Auflösung des Lookup-Puffers dauert das Aktivieren/Deaktivieren dann halt etwas länger, dafür geht die Überprüfung, ob eine Karte angeklickt wurde, extrem schnell: aus der Position des Mausklicks berechnest Du die Puffer-Position (z.B. x/10, y/10), dann liest Du den Wert des Puffers: ist er -1, wurde keine aktive Karte angeklickt, ansonsten hast Du sofort die Nummer der Karte.
Wenn Du die Auflösung des Buffers möglichst klein wählen kannst, könnte dieser Ansatz recht performant sein. Speziell die Latenz beim Klicken ist hier sowieso optimal.

Nebenbei: habe mal ein bißchen gespielt (ohne die Regeln recht zu kennen), aber ich vermute mal, das ist so 'ne Art Solitaire? Jedenfalls scheint es mir so, nach ein ppar Runden die oben angewählten Karten erst entfernt werden, wenn man unten auf den Stapel klickt. Gegen Ende ist das eigentlich immer so. Kann es sein, daß Dein Suchalgorithmus dann gar nicht mehr funktioniert oder etwas anderes im Eimer ist?
Wenn z.B. unten eine 8 liegt, kann man oben die 7, 6 , 5 nacheinander klicken, aber keine der Karten verschwindet. Erst wenn man sich eine neue Karte geben läßt, werden die Karten dann auf einmal entfernt.

Es scheint auch (noch) keine Erkennung zu geben, ob man gewonnen hat, oder?


----------



## DonJure (24. Okt 2004)

Hallo danke ertmal für deine Hilfe.

Der Suchalgorithmus funktioniert, nur ist er auch beendet wenn die Zeit zu Ende ist, daher dieser Fehler. Habe leider noch nicht geschaft weiter zu arbeiten. Wollte zuerst etwas an der Performence tun.  Werde mal veruchen das oben genannte umzusetzen.....


----------



## DonJure (17. Jan 2005)

So hier nun mein fertiges Werk!

TOWERS

Habe nun den MediaTracker eingebaut... läuft nun schön rund.

Habe nun trotzdem eine Frage.

Ich möchte gerne den Highscore in einer mysql Datenbank speichern.
Wie baut man eine Connection dazwischen auf. Habt ihr vielleicht tolle Links, 
wo es gut erklärt ist?

Danke schon mal im vorraus...


----------



## Sky (17. Jan 2005)

Kompliment!
Ich kannt' auch die erste Version und muss sagen, hat sich sehr gut gemacht :applaus:


----------

