diff --git a/out/production/Tetris/Tetris/GameGui.class b/out/production/Tetris/Tetris/GameGui.class index 1aedb5f..20bd047 100644 Binary files a/out/production/Tetris/Tetris/GameGui.class and b/out/production/Tetris/Tetris/GameGui.class differ diff --git a/src/Tetris/Board.java b/src/Tetris/Board.java index 3b944d7..84db8f6 100644 --- a/src/Tetris/Board.java +++ b/src/Tetris/Board.java @@ -16,6 +16,7 @@ public class Board extends JPanel implements KeyListener private static int FPS =60; private static int delay =FPS/1000; + //Spielfeld Breite und Länge public static final int BOARD_WIDTH=11; public static final int BOARD_HEIGHT=20; public static final int BLOCK_SIZE=30; @@ -26,16 +27,17 @@ public class Board extends JPanel implements KeyListener private Stein currenStein; private Random ran; -private Color[] colors ={Color.decode("#ff00bf"),Color.decode("#0000ff"),Color.decode("#00ff80"),Color.decode("#ff8000"),Color.decode("#ffb3b3"), + // Steinfarben + private Color[] colors ={Color.decode("#ff00bf"),Color.decode("#0000ff"),Color.decode("#00ff80"),Color.decode("#ff8000"),Color.decode("#ffb3b3"), Color.decode("#8000ff"),Color.decode("#ff0040"),}; - +// Steinform public Board() { ran = new Random(); - /*steine[0]= new Stein(new int[][]{ + steine[0]= new Stein(new int[][]{ {1,1,1}, - {0,1,0} + {0,1,0}, }, this,colors[0]); steine[1]= new Stein(new int[][]{ @@ -63,7 +65,7 @@ private Color[] colors ={Color.decode("#ff00bf"),Color.decode("#0000ff"),Color.d {1,1,1,1} }, this,colors[6]); - currenStein= steine[0];*/ + currenStein= steine[0]; loop = new Timer(delay, new ActionListener() { int n = 0; @@ -71,7 +73,6 @@ private Color[] colors ={Color.decode("#ff00bf"),Color.decode("#0000ff"),Color.d @Override public void actionPerformed(ActionEvent e) { update(); - repaint(); //System.out.println(n++); } @@ -127,6 +128,7 @@ private Color[] colors ={Color.decode("#ff00bf"),Color.decode("#0000ff"),Color.d } + //Bewegen die Steine mit Taste, Taste-Space : nach unten, Taste d : nach rechts, Taste a : nach links, leider klappt nicht. @Override public void keyTyped(KeyEvent e) { // switch(e.getKeyChar()) { @@ -142,6 +144,8 @@ private Color[] colors ={Color.decode("#ff00bf"),Color.decode("#0000ff"),Color.d // } } + + //Bewegen die Steine mit Taste, Taste-Space : nach unten, Taste Enter : nach rechts, Taste Escape : nach links @Override public void keyPressed(KeyEvent e) { if(e.getKeyChar() == KeyEvent.VK_SPACE){ diff --git a/src/Tetris/Game.java b/src/Tetris/Game.java index 5bc02b5..1979150 100644 --- a/src/Tetris/Game.java +++ b/src/Tetris/Game.java @@ -1,102 +1,42 @@ package Tetris; -import java.sql.*; import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.List; public class Game { - public static void main(String[] args) { - Connection connection = null; - try - { - connection = DriverManager.getConnection("jdbc:sqlite:userhighscore.db"); - Statement statement = connection.createStatement(); - statement.setQueryTimeout(30); - Menue menue = new Menue(); - menue.getButton().addActionListener(new java.awt.event.ActionListener() { - @Override - public void actionPerformed(java.awt.event.ActionEvent evt) { - String name = JOptionPane.showInputDialog(menue.getParent(), - "What is your name?", null); - if(name == null){ - name = "anon"; - } - menue.getParent().setVisible(false); - new GameGui(name); - } - }); - String playername = menue.getName(); - ResultSet resultSet = statement.executeQuery("select * from userscore where name = "+ playername); - if(!resultSet.next()) - { - // Playername gibt es noch nicht in der Datenbank also anlegen. - // Es fehlt noch der score. - statement.executeUpdate("insert into userscore values(1," + playername + ", 123)"); + // Datenbankverbindung herstellen + PlayerDBController playerDBController = PlayerDBController.getInstance(); + playerDBController.initDBConnection(); + List playerListe = playerDBController.holeSpielerDaten(); + JFrame tetrisMenueJframe = new TetrisMenue("Tetris"); + tetrisMenueJframe.setVisible(true); + TetrisMenue tetrisMenue = (TetrisMenue) tetrisMenueJframe; + tetrisMenue.getSpielStartenButton().addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + String spielerName = tetrisMenue.getSpielerNameTextField().getText(); + new GameGui(spielerName); + PlayerDBController.getInstance().speichereSpieler(new Player(spielerName,0)); + tetrisMenueJframe.setVisible(false); } - } - catch(SQLException e) - { - // if the error message is "out of memory", - // it probably means no database file is found - System.err.println(e.getMessage()); - } - finally - { - try - { - if(connection != null) - connection.close(); - } - catch(SQLException e) - { - // connection close failed. - System.err.println(e.getMessage()); - } - } + }); +// Menue menue = new Menue(); +// final Player[] aktuellerSpieler = new Player[1]; +// menue.getButton().addActionListener(new java.awt.event.ActionListener() { +// @Override +// public void actionPerformed(java.awt.event.ActionEvent evt) { +// aktuellerSpieler[0] = new Player(menue.getTextField().getText(), 0); +// menue.getParent().setVisible(false); +// //new GameGui(name); +// playerDBController.speichereSpieler(aktuellerSpieler[0]); +// } +// }); + + //String playername = menue.getName(); + //new GameGui(playername); } - - private static void CreateSqlLiteDatabaseConnection(){ -// try -// { -// Connection connection = null; -// // create a database connection -// connection = DriverManager.getConnection("jdbc:sqlite:userhighscore.db"); -// Statement statement = connection.createStatement(); -// statement.setQueryTimeout(30); // set timeout to 30 sec. - -// statement.executeUpdate("drop table if exists userscore"); -// statement.executeUpdate("create table userscore (id integer, name string, score integer)"); -// statement.executeUpdate("insert into userscore values(1, 'leo', 123)"); -// statement.executeUpdate("insert into userscore values(2, 'yui', 456)"); -// ResultSet rs = statement.executeQuery("select * from userscore"); -// while(rs.next()) -// { -// // read the result set -// -// System.out.println("name = " + rs.getString("name")); -// System.out.println("score = " + rs.getInt("score")); -// System.out.println("id = " + rs.getInt("id")); -// } -// } -// catch(SQLException e) -// { -// // if the error message is "out of memory", -// // it probably means no database file is found -// System.err.println(e.getMessage()); -// } -// finally -// { -// try -// { -// if(connection != null) -// connection.close(); -// } -// catch(SQLException e) -// { -// // connection close failed. -// System.err.println(e.getMessage()); -// } -// } - } -} +} \ No newline at end of file diff --git a/src/Tetris/GameGui.java b/src/Tetris/GameGui.java index e1a9ec7..fa0f90f 100644 --- a/src/Tetris/GameGui.java +++ b/src/Tetris/GameGui.java @@ -1,6 +1,7 @@ package Tetris; import javax.swing.*; import java.awt.*; +import java.awt.event.ActionListener; public class GameGui { public static final int width= 550, height =650; @@ -14,18 +15,19 @@ public class GameGui { panel.setBorder(BorderFactory.createMatteBorder(500, 10, 10, 50,Color.black)); //Button - //JButton button1 = new JButton("Start"); - //button1.setPreferredSize( new Dimension(150,50)); - JButton buttonPause = new JButton("Pause"); - buttonPause.setPreferredSize( new Dimension(100,30)); - JButton buttonScore = new JButton("Score"); - buttonScore.setPreferredSize( new Dimension(100,30)); + JButton buttonStop = new JButton("Pause"); + buttonStop.setPreferredSize( new Dimension(100,30)); + JButton buttonVerlassen = new JButton("verlassen"); + buttonVerlassen.setPreferredSize( new Dimension(100,30)); + + //Button untereinander panel.setLayout(new GridLayout(0,1)); panel.setBackground(Color.YELLOW); - panel.add(buttonPause); - panel.add(buttonScore); + panel.add(buttonStop); + panel.add(buttonVerlassen); + frame.add(panel,BorderLayout.EAST); frame.setSize(width,height); @@ -36,6 +38,14 @@ public class GameGui { frame.addKeyListener(board); frame.add(board,BorderLayout.CENTER); frame.requestFocusInWindow(); + +// ActionListener al = ev -> {if(ev.getSource() == buttonVerlassen) +// { +// System.exit(0); +// } +// }; +// +// buttonStop.addActionListener(al); } } diff --git a/src/Tetris/Player.java b/src/Tetris/Player.java new file mode 100644 index 0000000..f59be9a --- /dev/null +++ b/src/Tetris/Player.java @@ -0,0 +1,36 @@ +package Tetris; + +public class Player implements Comparable { + private String name; + private int score; + + public Player(String name, int score) { + this.name = name; + this.score = score; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getScore() { + return score; + } + + public void setScore(int score) { + this.score = score; + } + + @Override + public int compareTo(Player andere) { + return andere.score-score; + } + @Override + public String toString(){ + return name +": "+ score; + } +} diff --git a/src/Tetris/PlayerDBController.java b/src/Tetris/PlayerDBController.java new file mode 100644 index 0000000..75b575d --- /dev/null +++ b/src/Tetris/PlayerDBController.java @@ -0,0 +1,171 @@ +package Tetris; + + +import java.sql.Connection; +import java.sql.Date; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +// Beispiel aus https://javabeginners.de/Datenbanken/SQLite-Datenbank.php , sieh unten +class PlayerDBController { + + private static final PlayerDBController dbcontroller = new PlayerDBController(); + private static Connection connection; + private static final String DB_PATH = "userhighscore.db"; + + static { + try { + Class.forName("org.sqlite.JDBC"); + } catch (ClassNotFoundException e) { + System.err.println("Fehler beim Laden des JDBC-Treibers"); + e.printStackTrace(); + } + } + + private PlayerDBController(){ + } + + public static PlayerDBController getInstance(){ + return dbcontroller; + } + + //Datenbankverbindung herstellen + + public void initDBConnection() { + try { + if (connection != null) + return; + System.out.println("Creating Connection to Database..."); + connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH); + if (!connection.isClosed()) + System.out.println("...Connection established"); + } catch (SQLException e) { + throw new RuntimeException(e); + } + + Runtime.getRuntime().addShutdownHook(new Thread() { + public void run() { + try { + if (!connection.isClosed() && connection != null) { + connection.close(); + if (connection.isClosed()) + System.out.println("Connection to Database closed"); + } + } catch (SQLException e) { + e.printStackTrace(); + } + } + }); + } + + // Es wird eingegebenen Spielername,Score mit 0 in der Datenbank mit insert gespeichert. + public void speichereSpieler(Player player) { + try { + Statement statement = connection.createStatement(); + statement.setQueryTimeout(30); + // Spielername gibt es noch garnicht + ResultSet resultSet = statement.executeQuery("select * from userscore where name='"+player.getName()+"'"); + if(!resultSet.next()){ + statement.executeUpdate("insert into userscore values('"+player.getName()+"',"+player.getScore()+")"); + } + else{ + // Spielername gibt es schon, update player.score wenn größer als score im Datenbank. + String query = "UPDATE userscore SET score='"+ player.getScore() +"' WHERE name='"+player.getName()+"'"; + statement.executeUpdate(query); + } + } catch (SQLException e) { + System.err.println("Couldn't handle DB-Query"); + e.printStackTrace(); + } + + } + + // SpielerDaten aus Datenbank holen, dann in einer Arraylist speicher und zurückgeben. + public List holeSpielerDaten() { + List playerList = new ArrayList(); + try { + Statement statement = connection.createStatement(); + statement.setQueryTimeout(30); +// statement.executeUpdate("create table userscore (name string, score integer)"); +// statement.executeUpdate("insert into userscore values('leo', 123)"); +// statement.executeUpdate("insert into userscore values('yui', 456)"); + System.out.println("vorRS"); + + ResultSet resultSet = statement.executeQuery("SELECT * FROM userscore;"); + System.out.println("nachRS"); + while(resultSet.next()) + { + playerList.add(new Player(resultSet.getString("name"), resultSet.getInt("score"))); + + // Playername gibt es noch nicht in der Datenbank also anlegen. + // Es fehlt noch der score. + //statement.executeUpdate("insert into userscore values(1," + playername + ", 123)"); + } + resultSet.close(); + + } catch (SQLException e) { + System.err.println("Couldn't handle DB-Query"); + e.printStackTrace(); + } + return playerList; + + } + + private void handleDB() { + try { + Statement stmt = connection.createStatement(); + stmt.executeUpdate("DROP TABLE IF EXISTS books;"); + stmt.executeUpdate("CREATE TABLE books (author, title, publication, pages, price);"); + stmt.execute("INSERT INTO books (author, title, publication, pages, price) VALUES ('Paulchen Paule', 'Paul der Penner', '2001-05-06', '1234', '5.67')"); + + PreparedStatement ps = connection + .prepareStatement("INSERT INTO books VALUES (?, ?, ?, ?, ?);"); + + ps.setString(1, "Willi Winzig"); + ps.setString(2, "Willi's Wille"); + ps.setDate(3, Date.valueOf("2011-05-16")); + ps.setInt(4, 432); + ps.setDouble(5, 32.95); + ps.addBatch(); + + ps.setString(1, "Anton Antonius"); + ps.setString(2, "Anton's Alarm"); + ps.setDate(3, Date.valueOf("2009-10-01")); + ps.setInt(4, 123); + ps.setDouble(5, 98.76); + ps.addBatch(); + + connection.setAutoCommit(false); + ps.executeBatch(); + connection.setAutoCommit(true); + + ResultSet rs = stmt.executeQuery("SELECT * FROM books;"); + while (rs.next()) { + System.out.println("Autor = " + rs.getString("author")); + System.out.println("Titel = " + rs.getString("title")); + System.out.println("Erscheinungsdatum = " + + rs.getDate("publication")); + System.out.println("Seiten = " + rs.getInt("pages")); + System.out.println("Preis = " + rs.getDouble("price")); + } + rs.close(); + connection.close(); + } catch (SQLException e) { + System.err.println("Couldn't handle DB-Query"); + e.printStackTrace(); + } + } + +// public static void main(String[] args) { +// PlayerDBController dbc = PlayerDBController.getInstance(); +// dbc.initDBConnection(); +// dbc.handleDB(); +// } + } + diff --git a/src/Tetris/Stein.java b/src/Tetris/Stein.java index feea645..6854ce7 100644 --- a/src/Tetris/Stein.java +++ b/src/Tetris/Stein.java @@ -6,16 +6,16 @@ import java.io.FileNotFoundException; import java.util.Scanner; public class Stein { - SteineTyp Block; - private int x = 4, y = -2; + //SteineTyp Block; + private int x = 4, y = 0; private int normal = 850; private int fast = 50; - private int rotation; + // private int rotation; private long beginTime; private int delayTime = normal; private int deltax = 0; private boolean collision = false; - private int size; + // private int size; public static final int BOARD_WIDTH = 11; public static final int BOARD_HEIGHT = 20; @@ -25,71 +25,12 @@ public class Stein { private Board board; private Color color; - public Stein() { - /* this.coords = coords; + public Stein(int[][] coords,Board board,Color color) { + this.coords = coords; this.board = board; - this.color = color;*/ - //Ewen Kerbs still in progress - // Hier werden die verschiedene steine auf deren typ "analysiert" und dann ausgewertet wie viel platz die aufm spielbrett benötigen - Block = SteineTyp.randomSteine(); - switch (Block) - { - case I: - size = 4; - break; - case O: - size =2; - break; - default: - size =3; - break; - } + this.color = color; } - //ewen Kerbs still in progress - public int[][][] BlockBuilder(SteineTyp type) throws FileNotFoundException { - int[][][] size; - switch(type) - { - case I: - /* 3 dimensionales array um die rotations zu erkennen + */ - size = new int[4][4][4]; - break; - case O: - size = new int[4][2][2]; - break; - default: - size = new int[4][3][3]; - break; - } - File file = new File("Steine/"+type+".txt"); - Scanner leser = new Scanner(file); - //i= 4 verschiedene stein varianten (1=0° 2=90° 3=180°4=270°) - for (int varianten = 0; varianten < 4 ; varianten++) { - for (int j = 0; j < size[0].length; j++) { - if(leser.hasNext()) - { - String[] srow = leser.next().split(""); - int[] row = new int[size[0].length]; - for (int k = 0; k delayTime) { if (!(y + 1+coords.length > BOARD_HEIGHT)) { for (int row = 0; row < coords.length; row++) { diff --git a/src/Tetris/TetrisMenue.form b/src/Tetris/TetrisMenue.form new file mode 100644 index 0000000..edbf899 --- /dev/null +++ b/src/Tetris/TetrisMenue.form @@ -0,0 +1,85 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/Tetris/TetrisMenue.java b/src/Tetris/TetrisMenue.java new file mode 100644 index 0000000..aeb3602 --- /dev/null +++ b/src/Tetris/TetrisMenue.java @@ -0,0 +1,58 @@ +package Tetris; + +import javax.imageio.ImageIO; +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; + +public class TetrisMenue extends JFrame { + private JTextField spielerNameTextField; + private JButton spielStartenButton; + private JPanel tetrisMenuePanel; + private JLabel tetrisBildLabel; + private JList list1; + + public TetrisMenue(String title) { + super(title); + + + + this.setPreferredSize(new Dimension(640,480)); + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + this.setContentPane(tetrisMenuePanel); + this.pack(); + + + } + + private void createUIComponents() { + // Bild zu JPanel hinzufügen (https://stackoverflow.com/questions/299495/how-to-add-an-image-to-a-jpanel) + try{ + BufferedImage myPicture = ImageIO.read(new File("tetris.png")); + tetrisBildLabel = new JLabel(new ImageIcon(myPicture.getScaledInstance(300,125,Image.SCALE_SMOOTH))); + //add(tetrisBildLabel); + } + catch (IOException exception) + { + System.out.println("Fehler bei laden vom Tetris Bild: " + exception.getMessage()); + } + java.util.List playerList = PlayerDBController.getInstance().holeSpielerDaten(); + Player[] players = playerList.toArray(new Player[0]); + Arrays.sort(players); + list1 = new JList(players); + } + + public JButton getSpielStartenButton() { + return spielStartenButton; + } + + public JTextField getSpielerNameTextField() { + return spielerNameTextField; + } +} diff --git a/tetris.png b/tetris.png new file mode 100644 index 0000000..f6ad9c5 Binary files /dev/null and b/tetris.png differ diff --git a/userhighscore.db b/userhighscore.db index 189dbb2..8982bc8 100644 Binary files a/userhighscore.db and b/userhighscore.db differ