Hallo,
für ein Projekt in der Schule müssen wir ein Spiel programmieren. Das Projekt ist schon sehr weit, doch wie befürchtet ist es sehr langsam und hängt oft.
Es ist ein Multiplayer Spiel, bei dem zwei Schlangen gegeneinander antreten. Es ist ein Gitter aus Quadraten. Das Quadrat, auf dem die Schlange sich befindet ist farbig. Pro Zeiteinheit, soll die Schlange sich nach vorne bewegen, dabei aber ihre anfangsposition nicht verändern (wird also immer länger). Wer zuerst die Wand/die andere Schlange berührt hat verloren.
Der komplette Quellcode:
Wir werden den Quellcode noch aufteilen in verschiedene Klassen, Fehler beheben aber wollen eben auch, dass es spielbar ist.
Wir haben leider keinen anderen Weg gefunden, als den Array grid in der Build() Methode jedes mal neu aufzubauen und das Gitter neu zu generieren. Dadurch, dass der Array set_grid pro Spielzug genau 2x länger wird und in der langen for-Schleife dann pro Spielzug auf 2 Abfragen mehr stattfinden, läuft es etwa 5 Sekunden flüssig und wird dann immer langsamer.
Meine Frage ist jetzt: Wie können wir evtl. das aufbauen des Gitters verändern bzw. das Gameplay flüssiger gestalten?
Grüße,
Witschi
für ein Projekt in der Schule müssen wir ein Spiel programmieren. Das Projekt ist schon sehr weit, doch wie befürchtet ist es sehr langsam und hängt oft.
Es ist ein Multiplayer Spiel, bei dem zwei Schlangen gegeneinander antreten. Es ist ein Gitter aus Quadraten. Das Quadrat, auf dem die Schlange sich befindet ist farbig. Pro Zeiteinheit, soll die Schlange sich nach vorne bewegen, dabei aber ihre anfangsposition nicht verändern (wird also immer länger). Wer zuerst die Wand/die andere Schlange berührt hat verloren.
Der komplette Quellcode:
Java:
import javax.swing.Timer;
import java.awt.event.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
public class SPIEL extends JFrame implements KeyListener {
protected int width = 51;
protected int height = 30;
private ImageIcon empty_square = new ImageIcon(System.getProperty("user.dir")+"\\square.png");
private ImageIcon red_square = new ImageIcon(System.getProperty("user.dir")+"\\square_red.png");
private ImageIcon blue_square = new ImageIcon(System.getProperty("user.dir")+"\\square_blue.png");
private ImageIcon bonus_square = new ImageIcon(System.getProperty("user.dir")+"\\square_bonus.png");
private JPanel test;
protected ImageIcon grid[][] = new ImageIcon[height][width];
protected ImageIcon set_grid[][] = new ImageIcon[height][width];
private String pos_1;
private String pos_2;
String pos_3;
private String dir_1 = "l";
private String dir_2 = "r";
Timer timer;
public SPIEL()
{
timer = new Timer(100, new ActionListener() {
public void actionPerformed(ActionEvent e) {
move();
}
});
test = new JPanel();
test.setBackground(Color.black);
test.setBounds(0,0,width*20+width*5,height*20+height*5);
test.setVisible(true);
build(3,3, blue_square);
build(47,26, red_square);
build(random(grid[0].length), random(grid.length), bonus_square);
build(random(grid[0].length), random(grid.length), bonus_square);
build(random(grid[0].length), random(grid.length), bonus_square);
test.revalidate();
JFrame frame = new JFrame("Schlangenspiel");
frame.setLayout(null);
frame.setExtendedState(Frame.MAXIMIZED_BOTH);
frame.getContentPane().setBackground(Color.black);
frame.setVisible(true);
frame.addKeyListener(this);
frame.add(test, 0);
}
// Erstellen des Rasters und das Einfärben ausgwählter Zellen mit ausgewählter Farbe und übernimmt teilweise die Gewinnkontrolle
public void build(int x_pos, int y_pos, ImageIcon i)
{
if(x_pos >= grid[0].length || y_pos >= grid.length || x_pos < 0 || y_pos < 0)
{
timer.stop();
return;
}
if(set_grid[y_pos][x_pos] != null && set_grid[y_pos][x_pos] != bonus_square)
{
timer.stop();
} else {
if(set_grid[y_pos][x_pos] == bonus_square)
{
set_grid[y_pos][x_pos] = i;
build(random(grid[0].length), random(grid.length), bonus_square);
Bonus();
}
set_grid[y_pos][x_pos] = i;
}
for(int x = 0; x < grid.length; x++)
{
for(int y = 0; y < grid[0].length; y++)
{
grid[x][y] = empty_square;
if(set_grid[x][y] != null)
{
grid[x][y] = set_grid[x][y];
if(i == blue_square)
{
pos_1 = String.valueOf(x_pos) + ";" + String.valueOf(y_pos);
} else {
if(i == red_square)
{ pos_2 = String.valueOf(x_pos) + ";" + String.valueOf(y_pos);
}
}
}
test.add(new JLabel(grid[x][y]), 0);
}
}
test.revalidate();
}
// Erstellt eine Zufallszwischen zwischen 1 und max-1
private int random(int max)
{
int random = (int) (Math.random()*max);
return random;
}
/**
* Tastensteuerung der Schlangen
*/
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
switch( keyCode ) {
case KeyEvent.VK_UP:
dir_1 = "u";
break;
case KeyEvent.VK_DOWN:
dir_1 = "d";
break;
case KeyEvent.VK_LEFT:
dir_1 = "l";
break;
case KeyEvent.VK_RIGHT :
dir_1= "r";
break;
case KeyEvent.VK_W:
dir_2= "u";
break;
case KeyEvent.VK_S:
dir_2= "d";
break;
case KeyEvent.VK_A:
dir_2= "l";
break;
case KeyEvent.VK_D :
dir_2= "r";
break;
case KeyEvent.VK_SPACE :
timer.start();
break;
}
}
public void keyTyped(KeyEvent e){}
public void keyReleased (KeyEvent e){
}
public int getWidth()
{
return width;
}
public int getHeight()
{
return height;
}
private void move() {
String[] move_1 = pos_1.split(";");
String[] move_2 = pos_2.split(";");
if(dir_1.equals("r"))
{
build(Integer.parseInt(move_1[0]) - 1, Integer.parseInt(move_1[1]), blue_square);
}
if(dir_1.equals("l"))
{
build(Integer.parseInt(move_1[0]) + 1, Integer.parseInt(move_1[1]), blue_square);
}
if(dir_1.equals("u"))
{
build(Integer.parseInt(move_1[0]), Integer.parseInt(move_1[1]) + 1, blue_square);
}
if(dir_1.equals("d"))
{
build(Integer.parseInt(move_1[0]), Integer.parseInt(move_1[1]) - 1, blue_square);
}
if(dir_2.equals("r"))
{
build(Integer.parseInt(move_2[0]) - 1, Integer.parseInt(move_2[1]), red_square);
}
if(dir_2.equals("l"))
{
build(Integer.parseInt(move_2[0]) + 1, Integer.parseInt(move_2[1]), red_square);
}
if(dir_2.equals("u"))
{
build(Integer.parseInt(move_2[0]), Integer.parseInt(move_2[1]) + 1, red_square);
}
if(dir_2.equals("d"))
{
build(Integer.parseInt(move_2[0]), Integer.parseInt(move_2[1]) - 1, red_square);
}
}
private void Bonus() {
}
}
Wir werden den Quellcode noch aufteilen in verschiedene Klassen, Fehler beheben aber wollen eben auch, dass es spielbar ist.
Wir haben leider keinen anderen Weg gefunden, als den Array grid in der Build() Methode jedes mal neu aufzubauen und das Gitter neu zu generieren. Dadurch, dass der Array set_grid pro Spielzug genau 2x länger wird und in der langen for-Schleife dann pro Spielzug auf 2 Abfragen mehr stattfinden, läuft es etwa 5 Sekunden flüssig und wird dann immer langsamer.
Meine Frage ist jetzt: Wie können wir evtl. das aufbauen des Gitters verändern bzw. das Gameplay flüssiger gestalten?
Grüße,
Witschi