# Kein Weiterkommen - Pacman



## Castyll (27. Dez 2017)

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*

```
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 *

```
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 (29. Dez 2017)

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


```
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 (29. Dez 2017)

JuKu hat gesagt.:


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



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 (2. Jan 2018)

JuKu hat gesagt.:


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



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


```
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


----------



## JuKu (4. Jan 2018)

Castyll hat gesagt.:


> 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! 
Jop.



Castyll hat gesagt.:


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

```
tempX=tempX+GridSettings.getSize();
```

Ansonsten kann man die Schleife auch einfacher lösen:

```
//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);
    }
}
```


----------

