# 2d shooter mit highscore in datenbank



## Gregor89 (6. Jul 2015)

Hallo und Guten Tag ich Plage mich nun schon seit über einer Woche mit diesem Projekt und weis im Moment nicht
	
 mehr weiter darum habe ich mich entschlossen hier mal nachzufragen. Wie der Titel schon sagt, versuche ich momentan ein einfachen 2d arcade  shooter zu schreiben, einfach gehalten man selbst ist ein blauer Würfel und soll Rote Würfel abschießen, und dann ein highscore system mit den 10 besten Spielern, speichern will ich in einer Sql datenbank. Nun zu meinem Problem
	
. Wie kann ich es schaffen maximal
	
 10 zu speichern, und die Platzierung automatisch 1-10 zu zuweisen. Hier mal mein datenbank code für den highscore.
[SIZE=+1]
[/SIZE]
	
	
	
	





```
package main.highscore;



import[URL="http://www.java-forum.org/#2902958"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].sql.Connection;
import[URL="http://www.java-forum.org/#33666929"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].sql.DatabaseMetaData;
import[URL="http://www.java-forum.org/#4187164"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].sql.DriverManager;
import[URL="http://www.java-forum.org/#4924945"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].sql.PreparedStatement;
import[URL="http://www.java-forum.org/#67715218"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].sql.ResultSet;
import[URL="http://www.java-forum.org/#31610600"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].sql.SQLException;
import[URL="http://www.java-forum.org/#40246790"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].sql.Statement;
import[URL="http://www.java-forum.org/#54571414"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].util.ArrayList;
import[URL="http://www.java-forum.org/#81936381"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].util.List;




public class Highscore {
   
    public static void createTableHighScoure() {
          Connection con = getConncetion();
          Statement stm = null;


          try {
                 DatabaseMetaData meta = con.getMetaData();


                 String createString = "CREATE TABLE HIGH_SCORE"
                               + "(ID INT NOT NULL GENERATED ALWAYS AS IDENTITY, "
                               + "NAME VARCHAR(32) NOT NULL, " + "PUNKTE INT NOT NULL)";


                 stm = con.createStatement();
                 stm.executeUpdate(createString);
          } catch (SQLException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
          } finally {


                 if (stm != null) {
                        try {
                               stm.close();
                        } catch (SQLException e) {
                               // TODO Auto-generated catch block
                               e.printStackTrace();
                        }


                 }
          }


    }


    private static Connection getConncetion() {
          Connection con = null;
          String[URL="http://www.java-forum.org/#47626008"] driver[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL] = "com.mysql.jdbc[URL="http://www.java-forum.org/#63929228"] Driver[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL]"; // bsp
                                                                                                         // connectstring
                                                                                                         // org.apache.derby.jdbc.ClientDriver
          // String[URL="http://www.java-forum.org/#36385946"] driver[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL] = "org.apache.derby.jdbc.ClientDriver";
          String dbName = "Highscore";
          String connectionURL = "jdbc:mysql:" + dbName + ";create=true";
          try {
                 Class.forName[URL="http://www.java-forum.org/#29976254"] driver[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL]);
                 // DriverManager.setLogStream(System.out);
                 con = DriverManager.getConnection("jdbc:mysql://localhost/highscore", "root", "6232"); // Fabrik Muster
          } catch (Exception e) {
                 e.printStackTrace();
          }
          return con;
    }


    public static  List<SpielerPunkte> findAll() {
                 List<SpielerPunkte> list =new ArrayList<SpielerPunkte>();
                 
                 
                 Connection con = getConncetion();
                 PreparedStatement stm = null;
                 ResultSet rs = null;
                 try {
                        stm = con
                                     .prepareStatement("SELECT * from score ORDER BY PUNKTE DESC");
                        
                        rs = stm.executeQuery();
                        while (rs.next()) {
                            // System.out.println(rs.getInt(1)+" "+rs.getString(2) +" "+ rs.getInt(3));
//                               System.out.println(rs.getString(2));
//                               System.out.println(rs.getInt(3));
                               SpielerPunkte sp = new SpielerPunkte(rs.getInt(1), rs.getString(2),rs.getInt(3));
                               list.add(sp);
                               System.out.println(sp);
                               
                        }
                 } catch (SQLException e) {
                        e.printStackTrace();
                 } finally {
                       [URL="http://www.java-forum.org/#90455321"] cleanUp[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL](stm, rs);
                 }


                 return list;
          }


    public static boolean insert(SpielerPunkte sp) {
          Connection con = getConncetion();
          PreparedStatement stm = null;
          boolean ok = false;
          try {
                 stm = con
                               .prepareStatement("insert into score(ID,NAME,PUNKTE) values (?, ? , ?)");
                 // String insertString =
                 // "insert into WISH_LIST(WISH_ITEM) values ('"+ wList.getItem()
                 // +"')"; // prepared stamtents !!!
                 stm.setInt(1, sp.getId());
                 stm.setString(2, sp.getName());
                 stm.setInt(3, sp.getPunkte());


                 int anzahlDSgeändert = stm.executeUpdate();
                 ok = anzahlDSgeändert == 1;
          } catch (SQLException e) {
                 e.printStackTrace();
          } finally {
                 try {
                        if (stm != null)
                               stm.close();
                 } catch (SQLException e) {
                        e.printStackTrace();
                 }
          }
          return ok;
    }
    public static void[URL="http://www.java-forum.org/#5533362"] cleanUp[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL](Statement stm, ResultSet rs) {
          try {
                 if (rs != null) {
                        rs.close();
                 }
          } catch (SQLException e) {
                 e.printStackTrace();
          } finally {
                 try {
                        if(stm != null){
                               stm.close();
                        }
                 } catch (SQLException e) {
                        e.printStackTrace();
                 }
          }
    }
    
    
    public static void main(String[] args) {
         
          //createTableHighScoure();
//          insert(new SpielerPunkte(0, "A Spieler", 70));
//          insert(new SpielerPunkte(0, "B Spieler", 10));
//          insert(new SpielerPunkte(0, "V Spieler", 50));
        
          List<SpielerPunkte> list = findAll();
          System.out.println(list.size());
         


    }



}[SIZE=+1] 
[/SIZE]
```


----------



## Tom299 (6. Jul 2015)

Willst du nur 10 Einträge abspeichern oder willst du die Top 10 auslesen und nicht alle Einträge?

Wenn du nur 10 Einträge willst, geht das mit "limit 10"


----------



## Gregor89 (6. Jul 2015)

ich möchte eig. nur die ersten 10 auslesen denn wenn man nicht
	
 unter den top 10
	
 ist will ich garnicht zulassen dass man sich eintragen kann.
ok das hat schonmal funktioniert.

Fehlt mir jetzt eig. nur noch wie ich die Platzierung gleich von 1-10 nummeriere


----------



## Tom299 (6. Jul 2015)

Du hast doch schon absteigend nach Punkten sortiert, dann brauchst du doch nur fortlaufend die Plätze zu vergeben, also von 1 - 10, wo ist da das Problem?


----------



## Gregor89 (6. Jul 2015)

Naja mein problem ist das ich im moment nicht genau weis wie ich den code am besten ändere um eben diese durch zu nimmerieren


----------



## Tom299 (6. Jul 2015)

Du könntest deiner Klasse "SpielerPunkte" z.b. noch ein Feld "Rang" geben.


----------



## Gregor89 (6. Jul 2015)

die hat sie ja mit der id welche als Platzierung ausgegeben wird

```
package main.highscore;

public class SpielerPunkte {
    private int id;
    private String name;
    private int punkte;


    public SpielerPunkte(int id, String name, int punkte) {
          super();
          this.id = id;
          this.name = name;
          this.punkte = punkte;
    }


   
    public int getId() {
          return id;
    }




    public void setId(int id) {
          this.id = id;
    }




    public String getName() {
          return name;
    }




    public void setName(String name) {
          this.name = name;
    }




    public int getPunkte() {
          return punkte;
    }




    public void setPunkte(int punkte) {
          this.punkte = punkte;
    }




    @Override
    public String toString() {
          return "SpielerPunkte Platzierung= " + id + " name= " + name + " punkte: "
                        + punkte + "\n";
    }
}
```


----------



## Tom299 (6. Jul 2015)

Na wenn die ID deine Platzierung ist, dann hast du doch deine Nummerierung, verstehe dann nicht, was dir noch fehlt?

Allerdings würde ich unter ID eher die Datenbank-ID verstehen, die man auch braucht, wenn man ein UPDATE macht usw. Da würde ich lieber noch ein zusätzliches Feld für den Rang nehmen.


----------



## Gregor89 (6. Jul 2015)

naja mein problem ist das wenn ich das programm ausführe ist eben bei der id 0 bei allen 10 anstatt eben 1. 2. 3. usw.
verstehst jetzt mein problem ?


----------



## Tom299 (6. Jul 2015)

Wenn du die DB-Einträge so gemacht hast

```
//          insert(new SpielerPunkte(0, "A Spieler", 70));
//          insert(new SpielerPunkte(0, "B Spieler", 10));
//          insert(new SpielerPunkte(0, "V Spieler", 50));
```

ist ja klar, daß ID immer 0 ist. Vielleicht solltest du dir mal deine Daten in der DB anschauen, was da wirklich drin steht. Der Code im Programm sollte eigentlich funktionieren.

Solltest du aber für die DB-ID auch die ID von SpielerPunkte verwenden, hast du ein Problem ;-)


----------



## Gregor89 (6. Jul 2015)

Mhh warum sollte ich dann ein Problem haben ? und wie sollte es gehen wenn ich bei SpielerPunkte einen rang hinzufüge?


----------



## Tom299 (6. Jul 2015)

Weil normalerweise die ID der Primärschlüssel in einer ordentlichen Datenbank ist, du hast aber beim insert 3x die ID 0 vergeben. Als ID nimmt man in der Regel ein AutoIncrement oder die UUID, damit jeder Datensatz der Tabelle eindeutig ist.

Den Rang würde ich gar nicht abspeichern, wenn ich mir das so recht überlege. Der ergibt sich durch die Sortierung der Einträge. Also würde ich die Tabelle z.B. so anlegen:

ID     Name     Punkte
1       Spieler A    70
2       Spieler B    50
3       Spieler C    95
usw.

Wenn du jetzt nach Punkten umgekehrt sortierst, hast du deine Rangfolge, beginnend bei 1 und das kannst du dann beim Erzeugen deines SpielerPunkte-Objekts als Rang angeben.


----------



## Gregor89 (6. Jul 2015)

Die Sortierung passt ja und echt blöde gefragt wie sollte ich das schreiben mit der fortlaufenden Nummer? weil steh bei dem echt an.


----------



## Tom299 (6. Jul 2015)

Meinst du jetzt mit fortlaufende Nummer den Rang?


```
try {
                        stm = con
                                     .prepareStatement("SELECT * from score ORDER BY PUNKTE DESC");
                        
                        rs = stm.executeQuery();
                        int rang = 0;
                        while (rs.next()) {
                               rang++;
                            // System.out.println(rs.getInt(1)+" "+rs.getString(2) +" "+ rs.getInt(3));
//                               System.out.println(rs.getString(2));
//                               System.out.println(rs.getInt(3));
                               SpielerPunkte sp = new SpielerPunkte(rs.getInt(1), rs.getString(2),rs.getInt(3));
                               list.add(sp);
                               System.out.println(sp);
                               
                        }
                 } catch (SQLException e) {
                        e.printStackTrace();
                 } finally {
                        cleanUp(stm, rs);
                 }
```

Du hast doch deine Schleife und da fügst du einen Zähler hinzu und erhöhst ihn einfach immer um 1.


----------



## Gregor89 (6. Jul 2015)

Ok Danke Jetzt
	
 habe ich es. Jetzt kommt erst der lustige Part, sehe mich jetzt schon verzweifelnXD


----------



## Gregor89 (6. Jul 2015)

So nun muss ich nochmal Lästig sein, da ich ja ein spiel schreibe habe ich ein sehr sehr großes Problem
	
 entdeckt, ich weis nicht warum und ich weis nicht wieso, aber ich bekomme die int variable score nur auf den bildschirm, und wenn ich meine checkscore methode bei der customupdate  einsetze ist das auch äußerst kontraproduktive.

```
package main.scene;

import[URL="http://www.java-forum.org/#68064999"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].sql.Array;
import[URL="http://www.java-forum.org/#69214778"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].sql.ResultSet;
import[URL="http://www.java-forum.org/#29687499"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].sql.SQLException;
import[URL="http://www.java-forum.org/#57155555"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].text.NumberFormat;
import[URL="http://www.java-forum.org/#10044607"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].util.Iterator;
import[URL="http://www.java-forum.org/#42206906"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].util.LinkedList;
import[URL="http://www.java-forum.org/#71874600"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].util.List;
import[URL="http://www.java-forum.org/#90349248"] java[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL].util.Random;


import javax.swing.JOptionPane;
import javax.swing.text.html.HTMLDocument.HTMLReader.SpecialAction;


import org.newdawn.slick.*;
import org.newdawn.slick.geom.Vector2f;


import main.highscore.Highscore;
import main.highscore.SpielerPunkte;
import main.objects.*;


/*
 * The actuall game Scene
 * Here we implement all the game logics
 */
public class MiniGame extends Scene {
    // The player
    private Player p;
    
    
    


    // a list with enemys
    private LinkedList<Enemy> enemys;


    // a random to make the game ... yea random =D
    private Random r;


    // This will decide how often enemys spanw
    private float SPAWN_CHANCE = 8;


    // Some variables for the players progress
    public int score ;
    private float multi = 1.0f;
    private long time = 0;
    public int tester;








    
    
    
    protected void CustomRender(GameContainer gc, Graphics g)
            throws SlickException {
        // We clear the screan manually with a transparent black to get this
        // cool look
        
        
        
        
        
        
        
        g.setColor(new Color(0, 0, 0, 50));
        g.fillRect(0, 0, 1280, 720);
        
        // Render everything
        p.render(gc, g);
        for (Enemy e : enemys) {
            e.render(gc, g);
        }


        // Get the multiplicator and the time with only two numbers behind the .
        // for example : 2.14 instead of 2.14212312
        NumberFormat nf = NumberFormat.getInstance();
        nf.setMinimumFractionDigits(2);
        nf.setMaximumFractionDigits(2);


        // Display the players progress
        g.setColor(Color.white);
        g.drawString("Score : " + score, 10, 5);
        g.drawString("Multiplicator : " + nf.format(multi), 600, 5);
        g.drawString("Time : " + nf.format((double) time / 1000), 1080, 5);
        
    }


    protected void CustomUpdate(GameContainer gc, int t) throws SlickException {
        //[URL="http://www.java-forum.org/#26791724"] Update[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL] everything
        p[URL="http://www.java-forum.org/#67340302"] update[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL](gc, t);
        Iterator<Enemy> i = enemys.iterator();
        while (i.hasNext()) {
            Enemy e = i.next();
            e[URL="http://www.java-forum.org/#49155750"] update[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL](gc, t);
            
            // remove enemys that are dead or at the player position
            // the player position is necessary because the enemys continue
            // spawning even if the player is dead
            // -> there would be unlimited without
            if (!e.isAlive()) {
                score += 10 * multi;
                i.remove();
                
                
            } else if (e.getPos().copy().sub(p.getPos()).lengthSquared() < 5) {
                i.remove();
                
                
                
                
                
                
            }
            p.checkBulletCollision(e.getBullets());
            e.checkBulletCollision(p.getBullets());
        }


        // Set a maximum spawn chance ( lower = faster spawn );
        if (SPAWN_CHANCE < 1)
            SPAWN_CHANCE = 1;


        // Should we spawn an enemy ?
        if (r.nextInt((int) (SPAWN_CHANCE * t)) == 0) {
            // Jep, so we just spawn one at a random position
            Enemy e = new Enemy(new Vector2f(r.nextInt(1280), r.nextInt(720)),
                    p);
            e.init(gc);
            enemys.add(e);
        }


        // Make the game harder with every[URL="http://www.java-forum.org/#77101893"] update[IMG]http://cdncache-a.akamaihd.net/items/it/img/arrow-10x10.png[/IMG][/URL] call if we are dead -> the
        // nice end effect
        if (!p.isAlive()) {
            SPAWN_CHANCE -= 0.1;
            return;
        } else {
            // add some progress if the player survives
            time += t;
            multi += (float) t / 5000;
        }


    }


    


    public void init(GameContainer gc) throws SlickException {
        // Init all our objects
        p = new Player(new Vector2f(200, 200));
        p.init(gc);
        r = new Random();


        enemys = new LinkedList<Enemy>();


        // We want to clear the screen our self for the cool effect
        gc.setClearEachFrame(false);
    }


    
    // The name of the game Scene
    public String toString() {
        return "game";
    }
    public void checkscore(){
        Highscore betterscore= new Highscore();
        int rang=0;
        //String input=JOptionPane.showInputDialog(null);
        String name="hans";
        int punkte=zwischenspeicher();
        System.out.println(punkte);
        
                
        SpielerPunkte sp = new SpielerPunkte(rang, name, punkte);
        betterscore.insert(sp);
    }
    
    
}
```


----------

