Towers

Status
Nicht offen für weitere Antworten.

DonJure

Bekanntes Mitglied
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.
 
B

Beni

Gast
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)
at sun.applet.AppletClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.applet.AppletClassLoader.loadCode(Unknown Source)
at sun.applet.AppletPanel.createApplet(Unknown Source)
at sun.plugin.AppletViewer.createApplet(Unknown Source)
at sun.applet.AppletPanel.runLoader(Unknown Source)
at sun.applet.AppletPanel.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.FileNotFoundException: C:\Dokumente und Einstellungen\Don\Eigene Dateien\My Webs\donjure\Towers\class.class (The system cannot find the path specified)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
at sun.applet.AppletClassLoader.getBytes(Unknown Source)
at sun.applet.AppletClassLoader.access$100(Unknown Source)
at sun.applet.AppletClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
... 10 more
 
B

Beni

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

Code:
<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.
 
B

Beni

Gast
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

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

stev.glasow

Gast
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 :D
 

DonJure

Bekanntes Mitglied
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:
 
B

Beni

Gast
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

Bekanntes Mitglied
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 :)
 

DonJure

Bekanntes Mitglied
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.

Code:
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;
    }   
}

Code:
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

Top Contributor
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

Bekanntes Mitglied
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

Bekanntes Mitglied
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

Top Contributor
Kompliment!
Ich kannt' auch die erste Version und muss sagen, hat sich sehr gut gemacht :applaus:
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben