Kein Weiterkommen - Pacman

Castyll

Aktives Mitglied
Hallo zusammen,
für meine Seminararbeit wollte ich Pacman programmieren. Natürlich wollte ich mich erst um das Oberflächliche kümmern. Ich habe meine eigene Art und Weise gefunden und es auch so umgesetzt:
Ich habe erst in der Klasse Gridsettings eine ArrayList mit String Elementen angelegt bestehend aus "x" und "o". "x" symbolisiert die ausgebaute, nicht begehbare Fläche und "o" die Spielfläche. In der Klasse Pacman Grid wird der String ausgewertet und je nachdem die Oberfläche gezeichnet.
Oberfläche wird korrekt angezeigt jedoch habe ich keine Ahnung, wie ich in dieser Implementation nun Pacman bewegen soll. Pacman muss ja prüfen, dass er noch im Gitter ist, aber wie soll ich ihn drawen? Ich kann ja nicht das erstellte Array als Location angeben. Kann ich die Implementation in die Tonne treten oder kann man daraus noch was machen?

GridSettings
Java:
package ui;

public class GridSettings {
    private static String [] grid = {"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx","xxooooooooooooxxooooooooooooxx",
            "xxoxxxxoxxxxxoxxoxxxxxoxxxxoxx","xxoxxxxoxxxxxoxxoxxxxxoxxxxoxx","xxoxxxxoxxxxxoxxoxxxxxoxxxxoxx","xxooooooooooooooooooooooooooxx",
            "xxoxxxxoxxoxxxxxxxxoxxoxxxxoxx","xxoxxxxoxxoxxxxxxxxoxxoxxxxoxx","xxooooooxxooooxxooooxxooooooxx","xxxxxxxoxxxxxoxxoxxxxxoxxxxxxx",
            "xxxxxxxoxxxxxoxxoxxxxxoxxxxxxx","xxxxxxxoxxooooooooooxxoxxxxxxx","xxxxxxxoxxooooooooooxxoxxxxxxx","xxoooooooooxxxxxxxxoooooooooxx",
            "xxxxxxxoxxoxxxxxxxxoxxoxxxxxxx","xxxxxxxoxxoxxxxxxxxoxxoxxxxxxx","xxxxxxxoxxooooooooooxxoxxxxxxx", "xxxxxxxoxxoxxxxxxxxoxxoxxxxxxx",
            "xxxxxxxoxxoxxxxxxxxoxxoxxxxxxx","xxooooooooooooxxooooooooooooxx","xxoxxxxoxxxxxoxxoxxxxxoxxxxoxx","xxoxxxxoxxxxxoxxoxxxxxoxxxxoxx",
            "xxoooxxooooooooooooooooxxoooxx","xxxxoxxoxxoxxxxxxxxoxxoxxoxxxx","xxxxoxxoxxoxxxxxxxxoxxoxxoxxxx","xxooooooxxooooxxooooxxooooooxx",
            "xxoxxxxxxxxxxoxxoxxxxxxxxxxoxx","xxoxxxxxxxxxxoxxoxxxxxxxxxxoxx","xxooooooooooooxxooooooooooooxx","xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
            "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"};
   
    private static int pixelSize = 25;
    private static int width = 800;
    private static int height = 800;
   
    public static String[] getGrid() {
        return grid;
    }
   
    public static int getWidth() {
        return width;
    }

    public static int getHeight() {
        return height;
    }
   
    public static int getSize() {
        return pixelSize;
    }
}

PacmanGrid
Code:
    package ui;
   
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.util.ArrayList;
   
    import javax.swing.JFrame;
    import javax.swing.JPanel;
   
    import game.GameInstance;
    import objects.PacmanActor;
   
    public class PacmanGrid extends JPanel{
   
        private String[] gameGrid = GridSettings.getGrid();
        //walkableLines
        private static int[][] coords;
        private GameInstance gs;
   
    public PacmanGrid() {
   
        setPreferredSize(new Dimension(800,800));
        setOpaque(true);
        setBackground(Color.DARK_GRAY);
        gs = new GameInstance();
   
       
    }
   
   
    public static int[][] getCoords(){
        return coords;
    }
   
    public void createArray(ArrayList<Integer> x, ArrayList<Integer> y) { //Compromisses the ArrayLists of x and y to one Array. Used for Movement
        coords = new int[x.size()][2]; //x.size gibt Anzahl der eben befüllten Arrayist zurück und somit Anzahl der Koordinaten.
        for(int i=0;i<coords.length;i++) {
            coords[i][0] = x.get(i);
            coords[i][1] = y.get(i);
        }
    }
    public void paint(Graphics g) { //Student
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        int temp2 = 0;
        ArrayList<Integer> xCoords = new ArrayList<Integer>();
        ArrayList<Integer> yCoords = new ArrayList<Integer>();
       
        if(gameGrid != null&&gameGrid.length>0) {
            for(int i=0;i<gameGrid.length;i++) {//y veränderung 1 zeile nach unten
                String help = gameGrid[i];
               
                int temp=0;
                for(int j=0;j<help.length();j++) {
                    //x veränderung innerhalb der Zeile
           
                    if(help.charAt(j)=='x') {
                        if(j==0) {
                            g2.setColor(Color.DARK_GRAY);
                            g2.fillRect(j, temp2, GridSettings.getSize(), GridSettings.getSize());
                            temp=temp+GridSettings.getSize();
                        }
                       
                        else {
                            g2.setColor(Color.DARK_GRAY);
                            g2.fillRect(temp, temp2, GridSettings.getSize(), GridSettings.getSize());
                            temp=temp+GridSettings.getSize();
                        }
                           
                    }
                   
                    if(help.charAt(j)=='o') {
                       
                            if(j==0) {
                                g2.setColor(Color.blue);
                                g2.fillRect(j, temp2, GridSettings.getSize(), GridSettings.getSize());
                                xCoords.add(j);
                                yCoords.add(temp2);
                               
                                temp=temp+GridSettings.getSize();
                               
                            }
                           
                            else {
                                g2.setColor(Color.BLUE);
                                g2.fillRect(temp, temp2, GridSettings.getSize(), GridSettings.getSize());
                                xCoords.add(temp);
                                yCoords.add(temp2);
                                temp=temp+GridSettings.getSize();
                            }           
                    }
                       
                }
               
                temp2+=GridSettings.getSize();
            }
        }
       
        createArray(xCoords,yCoords); //Befüllt Coords
        PacmanActor help = this.gs.getActor();
        if(help!=null) {
            gs.start();
            help.paint(g2);
        }  
    }
   
   
   
   
       
       
    }
 

JuKu

Top Contributor
Was du brauchst ist ein 2D Array.
Und die Pacman Position speicherst du einfach extra.

Code:
char fields[][] = new char[WIDTH][HEIGHT];

//pacman position
int pacX = 2;
int pacY = 2;

//check, if pacman can move right
if (fields[pacX + 1][pacY] == "o") {
     //pacman can move right
} else {
    //pacman cannot move right
}

Und bezüglich zeichnen:
Du nimmst das 2D Array, kopierst es in ein anderes temporäres Array und überschreibst einfach die Pacman Position mit deinem Pacman Char.
Und dann zeichnest du das temporäre Array.
Das wäre zwar nicht die effizienteste, aber in meinen Augen die einfachste Implementierung.
 

Castyll

Aktives Mitglied
Was du brauchst ist ein 2D Array.
Und die Pacman Position speicherst du einfach extra.

Code:
char fields[][] = new char[WIDTH][HEIGHT];

//pacman position
int pacX = 2;
int pacY = 2;

//check, if pacman can move right
if (fields[pacX + 1][pacY] == "o") {
     //pacman can move right
} else {
    //pacman cannot move right
}

Und bezüglich zeichnen:
Du nimmst das 2D Array, kopierst es in ein anderes temporäres Array und überschreibst einfach die Pacman Position mit deinem Pacman Char.
Und dann zeichnest du das temporäre Array.
Das wäre zwar nicht die effizienteste, aber in meinen Augen die einfachste Implementierung.

Danke dir, und das Array befüllt man am Anfang so wie ich es beschrieben hatte, richtig?
Also mit "o" und "x" je nachdem ob es blau oder grau sein soll?
 

Castyll

Aktives Mitglied
Was du brauchst ist ein 2D Array.
Und die Pacman Position speicherst du einfach extra.

Code:
char fields[][] = new char[WIDTH][HEIGHT];

//pacman position
int pacX = 2;
int pacY = 2;

//check, if pacman can move right
if (fields[pacX + 1][pacY] == "o") {
     //pacman can move right
} else {
    //pacman cannot move right
}

Und bezüglich zeichnen:
Du nimmst das 2D Array, kopierst es in ein anderes temporäres Array und überschreibst einfach die Pacman Position mit deinem Pacman Char.
Und dann zeichnest du das temporäre Array.
Das wäre zwar nicht die effizienteste, aber in meinen Augen die einfachste Implementierung.

@JuKu Sorry für den Doppelpost, aber ich habe es nun auf deine Art gemacht und soweit erscheint mir das alles viel sinnvoller. Jedoch stoße ich im Moment auf Probleme mit der Darstellung und wollte dich fragen, ob du weißt was das Problem hier ist:

Java:
public class PacmanGrid extends JPanel{
 
        private String[] gameGrid = GridSettings.getGrid();
        //walkableLines
        private static char[][] coords;
        private GameInstance gs;
 
    public PacmanGrid() {
 
        coords = new char[32][30];
        createCoords();
        setPreferredSize(new Dimension(800,800));
        setOpaque(true);
        setBackground(Color.DARK_GRAY);
        gs = new GameInstance();
 
     
    }
 
    public void createCoords() {  //Hinzufügen der Spielfeldvorlage in ein zweidimensionales Array
        for(int i=0;i<gameGrid.length;i++) {
            for(int j=0; j<gameGrid[i].length();j++) {
                coords[i][j] = gameGrid[i].charAt(j);
            }
        }
    }
 
 
 
 
    public static char[][] getCoords(){
        return coords;
    }
 
    public void paint(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        int tempX=0;
        int tempY=0;
     
        if(coords!=null) {
            for(int i=0;i<coords.length;i++) {
                for(int j=0;j<coords[i].length;j++) {
                    if(coords[i][j]=='o') {
                        if(j==0) {
                            g2.setColor(Color.DARK_GRAY);
                            g2.fillRect(0, 0, GridSettings.getSize(), GridSettings.getSize());
                            tempX=tempX+GridSettings.getSize();
                        }
                     
                        else {
                            g2.setColor(Color.DARK_GRAY);
                            g2.fillRect(tempX, tempY, GridSettings.getSize(), GridSettings.getSize());
                            tempX=tempX+GridSettings.getSize();
                        }
                         
                    }
                 
                    if(coords[i][j]=='x') {
                        if(j==0) {
                            g2.setColor(Color.BLUE);
                            g2.fillRect(0, 0, GridSettings.getSize(), GridSettings.getSize());
                            tempX+=GridSettings.getSize();
                        }
                     
                        else {
                            g2.setColor(Color.BLUE);
                            g2.fillRect(tempX, tempY, GridSettings.getSize(), GridSettings.getSize());
                            tempX+=GridSettings.getSize();
                        }
                    }
                }
             
                tempY+=GridSettings.getSize();
             
            }
        }

GridSettings.getSize() returned hier 5. Im Endeffekt bekomme ich das hier angezeigt (siehe Anhang).
Hilfe?

PS: Statt coords[width][height] habe ich coords[height][width] gemacht
 

Anhänge

  • Bildschirmfoto 2018-01-02 um 17.19.16.png
    Bildschirmfoto 2018-01-02 um 17.19.16.png
    14,3 KB · Aufrufe: 43

JuKu

Top Contributor
Danke dir, und das Array befüllt man am Anfang so wie ich es beschrieben hatte, richtig?
Also mit "o" und "x" je nachdem ob es blau oder grau sein soll?

Kein Problem! :D
Jop.

@JuKu
GridSettings.getSize() returned hier 5. Im Endeffekt bekomme ich das hier angezeigt (siehe Anhang).
Hilfe?

PS: Statt coords[width][height] habe ich coords[height][width] gemacht

Kommt die Klasse GridSettings von dir oder gehört die zu Swing?
Ich glaube du solltest statt getSize() lieber getWidth() und getHeight() verwenden.

Dein Fehler ist, dass du die X-Variable zwar immer erhöhst, aber nicht wieder bei jeder neuen Zeile zurücksetzt:
Java:
tempX=tempX+GridSettings.getSize();

Ansonsten kann man die Schleife auch einfacher lösen:
Java:
//full-fill this values
int gridWidth = 5;
int gridHeight = 5;

for (int y= 0; y < coords.length; y++) {
    for (int x = 0; x < corrds[0].length; x++) {
        //calculate x and y position
        int xPos = x * width;
        int yPos = y * height;

        //set color
        if (coords[y][x] == 'o') {
            g2.setColor(Color.DARK_GREY);
        } else {
            g2.setColor(Color.BLUE);
        }

        //draw rectangle
        g2.fillRect(xPos, yPos, gridWidth, gridHeight);
    }
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E JOGL kein zugriff auf manche methoden Spiele- und Multimedia-Programmierung 5
Blender3D VlCJ Windows 10 kein Zugriff auf einen im Netzwerk freigegebnen Ordner Spiele- und Multimedia-Programmierung 2
W Minecraft wie Minidumps aktivierren ? (kein Minecraft) Spiele- und Multimedia-Programmierung 0
G Sound-Sampling: Sinuston; kein Fehler, aber auch kein Ton :-( Spiele- und Multimedia-Programmierung 3
F Kein Sound bei javazoom Spiele- und Multimedia-Programmierung 2
N JMF - CaptureDeviceManager findet kein device Spiele- und Multimedia-Programmierung 2
A JMF kein ton Spiele- und Multimedia-Programmierung 4
C auf einem PC kein mp3 unter Java Spiele- und Multimedia-Programmierung 6
A Kein Bild Spiele- und Multimedia-Programmierung 3
G Kein Licht in Box-Objekt Spiele- und Multimedia-Programmierung 2
M Hintergrund ist kein Hintergrund. Spiele- und Multimedia-Programmierung 5
L Pacman Spiele- und Multimedia-Programmierung 2
R Pacman Geist Ki Spiele- und Multimedia-Programmierung 11
T PacMan - Collision Spiele- und Multimedia-Programmierung 2
K Pacman KI Spiele- und Multimedia-Programmierung 2
S Pacman Kollision von Münzen und Mauern Spiele- und Multimedia-Programmierung 11
R Konzeptfrage zu Pacman Spiele- und Multimedia-Programmierung 13
L Pacman-Clone Spiele- und Multimedia-Programmierung 77

Ähnliche Java Themen

Neue Themen


Oben