Pacman-Clone

linuxjava

Mitglied
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Serializable;
import java.util.Properties;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

// Hier stehen die zu den im Feldarry auftauchenden Nummern zugehörigen Objekte:
// 0...Leer
// 1...Mauer
// 2...Pacman
// 3...Monster
public class GameFrame extends JFrame implements KeyListener{
    public static final String VERSION = "0.01 alpha";
    public static final String NAME = "Pacman";
    public static String FILE_SEPERATOR;
    public static int feld[][] = new int[40][30];
    private Graphics g;
    public GameFrame() {
        super(NAME+" "+VERSION);
        openLevelFile(loadLevelFile());
        setSize(1300,1000);
        JPanel JP = new JPanel() {
            @Override
            protected void paintComponent(Graphics gC) {
                super.paintComponent(gC);
                
                g = gC;
                newpaint(0);
            }
        };       
        add(JP);
        addKeyListener(this);
        setVisible(true);
    
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        FILE_SEPERATOR = System.getProperty("file.separator","\\");
        GameFrame GF = new GameFrame();
    }
 
    private String loadLevelFile(){
        // muss noch überschrieben werden (mit Load-Frame)
        return "."+FILE_SEPERATOR+"Level"+FILE_SEPERATOR+"Example.properties";
    }
    private void openLevelFile(String file){
        Properties p = new Properties();
        try {
            p.load(new FileReader(new File(file)));

            for(int i=0;i<40;i++){
                for(int a=0;a<30;a++){
                    feld[i][a] = new Integer(p.getProperty(i+"|"+a, "0"));
                }
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }
    }

    public void newpaint(int commando){
        //commando:
        // 0... alles neuzeichnen
    	// 1... nur Pacman neuzeichnen
        for(int i=0;i<40;i++){
            for(int a=0;a<30;a++){
                if(commando == 0){
                    if(feld[i][a] == 0){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                    }
                    if(feld[i][a] == 1){
                        g.setColor(Color.BLACK);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                    }
                    if(feld[i][a] == 2){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                        g.setColor(Color.YELLOW);
                        g.fillOval(i*30+20, a*30+50, 30, 30);
                    }
                    if(feld[i][a] == 3){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                        g.setColor(Color.RED);
                        g.fillOval(i*30+20, a*30+50, 30, 30);
                    }
                }
                if(commando == 1){
                    if(feld[i][a] == 0){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                    }
                    if(feld[i][a] == 2){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+50, 30, 30);
                        g.setColor(Color.YELLOW);
                        g.fillOval(i*30+20, a*30+50, 30, 30);
                    }
                }
            }
        }
    }
    
    public void keyPressed(KeyEvent e) {
    	// TODO Auto-generated method stub
    	System.out.println("Hi");
    	int key = e.getKeyCode();
    	int x=0;
    	int y=0;
    	for(int i=0;i<40;i++){
    		for(int a=0;a<30;a++){
    			if(feld[i][a] == 2){
    				x=i;
    				y=a;
    			}
    		}
    	}
    	int oldx=x;
    	int oldy=y;
    	// bewege Pac-man nach oben,unten,links oder rechts
	   	if(key == e.VK_UP){
	   		y--;
	   		if(y<0){
	   			y++;
	   		}
	   		System.out.println("Hi2");
	   	}
	   	if(key == e.VK_DOWN){
	   		y++;
	   		if(y>29){
	   			y--;
	   		}
	   	}
	   	if(key == e.VK_LEFT){
	   		x--;
	   		if(x<0){
	   			x++;
	   		}
	   	}
	   	if(key == e.VK_RIGHT){
	   		x++;
	   		if(y>39){
	   			x--;
	    	}
	    }   	
	   	feld[oldx][oldy] = 0;
	   	feld[x][y]=2;
	   	newpaint(1);
    }   
    public void keyReleased(KeyEvent e) {
    	// TODO Auto-generated method stub
    	
    }
    public void keyTyped(KeyEvent e) {
    	// TODO Auto-generated method stub
    	
    }

}
bedeutet das, dass ich das JPanel in eine neue Klasse schreiben soll?
EDIT: wobei, wenn ichs mir recht überlege, das erste mal newpaint() ausführen funzt ja auch
 
Zuletzt bearbeitet:

eRaaaa

Top Contributor
Sorry für das OT, aber meinst du nicht, dass es jetzt langsam mal Zeit wäre ein Tutorial zum Thema "Zeichnen in Swing" zu lesen? Z.B. dieses oder dieses ? Nicht böse gemeint, aber du gehst hier auf die meisten Sachen die man dir sagt entweder gar nicht ein oder nur halb!

p.s.: mache das JPanel JP (übrigens klein schreiben) zu einer Instanzvariable und rufe dann auf ihr repaint() auf wenn das Panel neu gezeichnet werden soll!
 
Zuletzt bearbeitet:

linuxjava

Mitglied
dh. , ich habe jp (jetzt klein geschrieben) instanziert und in newpaint() am ende jp.repaint(); hingeschrieben. Wenn ich mir das Tutorial durchlese kommt das mir gar nicht mehr so richtig vor (da steht, ich solle nur über paint() zeichnen,
aber ich zeichne doch auch in newpaint() ???:L)
 

linuxjava

Mitglied
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Serializable;
import java.util.Properties;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

// Hier stehen die zu den im Feldarry auftauchenden Nummern zugehörigen Objekte:
// 0...Leer
// 1...Mauer
// 2...Pacman
// 3...Monster
public class GameFrame extends JFrame implements KeyListener{
    public static final String VERSION = "0.01 alpha";
    public static final String NAME = "Pacman";
    public static String FILE_SEPERATOR;
    public static int feld[][] = new int[40][30];
    private JPanel jp;
    private Graphics g;
    public GameFrame() {
        super(NAME+" "+VERSION);
        openLevelFile(loadLevelFile());
        setSize(1300,1000);
        jp = new JPanel() {
            @Override
            protected void paintComponent(Graphics gC) {
                super.paintComponent(gC);
                
                g = gC;
                newpaint(0);
            }
        };       
        add(jp);
        addKeyListener(this);
        setVisible(true);
    
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        FILE_SEPERATOR = System.getProperty("file.separator","\\");
        GameFrame GF = new GameFrame();
    }
 
    private String loadLevelFile(){
        // muss noch überschrieben werden (mit Load-Frame)
        return "."+FILE_SEPERATOR+"Level"+FILE_SEPERATOR+"Example.properties";
    }
    private void openLevelFile(String file){
        Properties p = new Properties();
        try {
            p.load(new FileReader(new File(file)));

            for(int i=0;i<40;i++){
                for(int a=0;a<30;a++){
                    feld[i][a] = new Integer(p.getProperty(i+"|"+a, "0"));
                }
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }
    }

    public void newpaint(int commando){
        //commando:
        // 0... alles neuzeichnen
    	// 1... nur Pacman neuzeichnen
        for(int i=0;i<40;i++){
            for(int a=0;a<30;a++){
                if(commando == 0){
                    if(feld[i][a] == 0){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+30, 30, 30);
                    }
                    if(feld[i][a] == 1){
                        g.setColor(Color.BLACK);
                        g.fillRect(i*30+20, a*30+30, 30, 30);
                    }
                    if(feld[i][a] == 2){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+30, 30, 30);
                        g.setColor(Color.YELLOW);
                        g.fillOval(i*30+20, a*30+30, 30, 30);
                    }
                    if(feld[i][a] == 3){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+30, 30, 30);
                        g.setColor(Color.RED);
                        g.fillOval(i*30+20, a*30+30, 30, 30);
                    }
                }
                if(commando == 1){
                    if(feld[i][a] == 0){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+30, 30, 30);
                    }
                    if(feld[i][a] == 2){
                        g.setColor(Color.WHITE);
                        g.fillRect(i*30+20, a*30+30, 30, 30);
                        g.setColor(Color.YELLOW);
                        g.fillOval(i*30+20, a*30+30, 30, 30);
                    }
                }
            }
        }
        jp.repaint();
    }
    
    public void keyPressed(KeyEvent e) {
    	// TODO Auto-generated method stub
    	System.out.println("Hi");
    	int key = e.getKeyCode();
    	int x=0;
    	int y=0;
    	for(int i=0;i<40;i++){
    		for(int a=0;a<30;a++){
    			if(feld[i][a] == 2){
    				x=i;
    				y=a;
    			}
    		}
    	}
    	int oldx=x;
    	int oldy=y;
    	// bewege Pac-man nach oben,unten,links oder rechts
	   	if(key == e.VK_UP){
	   		y--;
	   		if(y<0 | feld[x][y] == 1){
	   			y++;
	   		}
	   		System.out.println("Hi2");
	   	}
	   	if(key == e.VK_DOWN){
	   		y++;
	   		if(y>29 | feld[x][y] == 1){
	   			y--;
	   		}
	   	}
	   	if(key == e.VK_LEFT){
	   		x--;
	   		if(x<0 | feld[x][y] == 1){
	   			x++;
	   		}
	   	}
	   	if(key == e.VK_RIGHT){
	   		x++;
	   		if(y>39 | feld[x][y] == 1){
	   			x--;
	    	}
	    }   	
	   	feld[oldx][oldy] = 0;
	   	feld[x][y]=2;
	   	newpaint(1);
    }   
    public void keyReleased(KeyEvent e) {
    	// TODO Auto-generated method stub
    	
    }
    public void keyTyped(KeyEvent e) {
    	// TODO Auto-generated method stub
    	
    }

}
 

linuxjava

Mitglied
Unter Sourceforge: jacman heist das Project
dort könnt ihr euch die aktuellsten runterladen. Wenn was wichtiges kommt, werde ich es auch hier posten
 

linuxjava

Mitglied
hab jetzt das ganze ein bisschen überarbeitet.
Ich poste euch mal hier die Klasse GameFrame:
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.Properties;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;

// Hier stehen die zu den im Feldarry auftauchenden Nummern zugehörigen Objekte:
// 0...Leer
// 1...Mauer
// 2...Pacman
// 3...Monster
public class GameFrame extends JFrame implements KeyListener{
    public static final String VERSION = "0.01 alpha";
    public static final String NAME = "Pacman";
    public static String FILE_SEPERATOR;
    public static int xfelds = 40;
    public static int yfelds = 30;
    public static int aktuellx = 0;
    public static int aktuelly = 0;
    public static String feld[][] = new String[xfelds][yfelds];
    private JPanel jp;
    public static Graphics g;
    public GameFrame() {
        super(NAME+" "+VERSION);
        openLevelFile(loadLevelFile());
        setSize(1300,1000);
        jp = new JPanel() {
            @Override
            protected void paintComponent(Graphics gC) {
                super.paintComponent(gC);

                g = gC;
                g.setColor(Color.BLACK);
                g.fillRect(0, 0, 1300, 1000);
                for(int i=0;i<xfelds;i++){
                	for(int a =0;a<yfelds;a++){
                        aktuellx = i;
                        aktuelly = a;
                        try {
							Class c = Class.forName(feld[i][a]);
							try {
								Object o = c.newInstance();
							} catch (InstantiationException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							} catch (IllegalAccessException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						} catch (ClassNotFoundException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						
							
							
						
                    }
                }



            }
        };
        add(jp);
        addKeyListener(this);
        setVisible(true);

        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        FILE_SEPERATOR = System.getProperty("file.separator","\\");
        GameFrame GF = new GameFrame();
    }

    private String loadLevelFile(){
        // muss noch überschrieben werden (mit Load-Frame)
        return "."+FILE_SEPERATOR+"Level"+FILE_SEPERATOR+"Example.properties";
    }
    private void openLevelFile(String file){
        Properties p = new Properties();
        try {
            p.load(new FileReader(new File(file)));

            for(int i=0;i<xfelds;i++){
                for(int a=0;a<yfelds;a++){              
						feld[i][a] = p.getProperty(i+"|"+a, "Leer");
                }
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
        } catch (IOException e) {
            // TODO Auto-generated catch block
        }
    }




    public void keyPressed(KeyEvent e) {
    	// TODO Auto-generated method stub

    }
    public void keyReleased(KeyEvent e) {
    	// TODO Auto-generated method stub

    }
    public void keyTyped(KeyEvent e) {
    	// TODO Auto-generated method stub

    }

}
 

eRaaaa

Top Contributor
Java:
 try {
                            Class c = Class.forName(feld[i][a]);
                            try {
                                Object o = c.newInstance();
                            } catch (InstantiationException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            } catch (IllegalAccessException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        } catch (ClassNotFoundException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

Hä?
Dir ist klar dass Class.forName(null) eine NPE wirft ?
Was soll das überhaupt generell werden? Selbst wenn es an der Stelle
Code:
Object o = c.newInstance();
wirklich zu einer Instanz kommen würde, was bringe dir dieses leere String-Objekt? :autsch: Und mit o machst du ja dann sowieso nichts...
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 3.10 Arrays
 
Zuletzt bearbeitet:

The_S

Top Contributor
Sorry für das OT, aber meinst du nicht, dass es jetzt langsam mal Zeit wäre ein Tutorial zum Thema "Zeichnen in Swing" zu lesen? Z.B. dieses oder dieses ? Nicht böse gemeint, aber du gehst hier auf die meisten Sachen die man dir sagt entweder gar nicht ein oder nur halb!

Ich schließe mich hier mal an und werfe noch das Tutorial von Quaxli in den Raum: http://www.ralf-bauer.org/java/tutorial/Tutorial.zip. Und bitte nicht gefühlte 20.000 Beiträge untereinander, man kann auch mal editieren. Es sagt niemand etwas dagegen, wenn einem nach 6 Stunden oder so noch etwas einfällt und man dann noch einen Post drunter setzt. Aber ständig neue unnötige Posts ... naja, muss nicht sein.
 

Quaxli

Top Contributor
Sorry für das OT, aber meinst du nicht, dass es jetzt langsam mal Zeit wäre ein Tutorial zum Thema "Zeichnen in Swing" zu lesen?

:D:D:D Ich les' jetzt schon die 3. Seite quer und hab' mich schon gefragt wie lange es noch dauert, daß das jemand mal vorschlägt. :D:D:D
Schließe mich daher dem Antrag von eRaaa und The_S an. :rtfm::rtfm::rtfm:
 

linuxjava

Mitglied
Dir ist klar dass Class.forName(null) eine NPE wirft ?
Kanns gar nicht, da ich zuvor in openLevelFile das Array feld vollständig mit Strings befülle:
Java:
           for(int i=0;i<xfelds;i++){
                for(int a=0;a<yfelds;a++){              
                        feld[i][a] = p.getProperty(i+"|"+a, "Leer");
                }
            }
Was soll das überhaupt generell werden? Selbst wenn es an der Stelle Object o = c.newInstance(); wirklich zu einer Instanz kommen würde, was bringe dir dieses leere String-Objekt? Und mit o machst du ja dann sowieso nichts...
Hast du dir mal die anderen Klassen in Sourceforge mal angeschaut? Mit o.newInstance() ruft er eine Klasse auf, die dann das jeweilige Spielelement zeichnet oder sonstwas damit tut.
EDIT:Vielleciht sei noch zu erwähnen, dass dann logischerweise die Datei ./Level/Example.properties so aussehen muss:
Code:
0|0=Wall
0|1=Wall
0|2=Pacman
 
Zuletzt bearbeitet:

eRaaaa

Top Contributor
Kanns gar nicht, da ich zuvor in openLevelFile das Array feld vollständig mit Strings befülle:

Hast du dir mal die anderen Klassen in Sourceforge mal angeschaut? Mit o.newInstance() ruft er eine Klasse auf, die dann das jeweilige Spielelement zeichnet oder sonstwas damit tut.

Okay Tatsache, hast gewonnen! Den Sinn dahinter verstehe ich allerdings dennoch nicht...
(vor allem jedes mal neue Instanzen zu erzeugen in der paintComponent :autsch: )
 
Zuletzt bearbeitet:

linuxjava

Mitglied
Den Sinn dahinter verstehe ich allerdings dennoch nicht...
Nun, meiner Meinung nach wirds übersichtlicher. Zudem war das mit diesen If-schleifen doch etwas "unobjektorientiert", oder?

Bei GameFrame kommt noch folgendes hinzu:
Java:
   public void keyPressed(KeyEvent e) {
        // TODO Auto-generated method stub
        int key = e.getKeyCode();
        int x=0;
        int y=0;
        for(int i=0;i<40;i++){
            for(int a=0;a<30;a++){
                if(feld[i][a].equals("Pacman")){
                    x=i;
                    y=a;
                }
            }
        }
        int oldx=x;
        int oldy=y;
        // bewege Pac-man nach oben,unten,links oder rechts
        if(key == e.VK_UP){
            y--;
            if(y<0 | feld[x][y].equals("Wall")){
                y++;
            }
        }
        if(key == e.VK_DOWN){
            y++;
            if(y>yfelds-1 | feld[x][y].equals("Wall")){
                y--;
            }
        }
        if(key == e.VK_LEFT){
            x--;
            if(x<0 | feld[x][y].equals("Wall")){
                x++;
            }
        }
        if(key == e.VK_RIGHT){
            x++;
            if(y>xfelds-1 | feld[x][y].equals("Wall")){
                x--;
            }
        }       
        feld[oldx][oldy] = "Leer";
        feld[x][y]="Pacman";
        jp.repaint();
    

    }
 

linuxjava

Mitglied
Es gibt keine if-Schleifen, sondern nur if-Abfragen!
Ok, dann halt if-Abfragen ... Hahahaha
EDIT: hab grade Datein hochgeladen, es gibt nun Punkte und Powerpillen
EDIT: übrigens sinnvolle Seite
EDIT: Ok, ich glaub langsam sollte ich mich mal um die küstliche Intilligenz der Monster bearbeiten.
kennt dafür jemand ein gutes Tutorial?
 
Zuletzt bearbeitet:
G

Gast2

Gast
Auf der ersten Seiten wurde doch das Pacman Dossier gepostet, da steht doch schon einiges zur KI der Monster.
 
G

Gast2

Gast
Für den Anfang kannst du ja erstmal mit einer gaaanz simplen KI anfangen.
Die Monster laufen solange gradeaus bis sie auf eine Verzweigung treffen, dort wählen sie dann per Zufallszahl aus in welche richtung sie weiterlaufen.
Das kannst du dann wenn das spiel steht stück für stück verbessern.
 

Geeeee

Bekanntes Mitglied
Das kannst du dann wenn das spiel steht stück für stück verbessern.
z.B. 1. in Richtung Pacman bei ner Abzweigung und später dann immer in Richtung Pacman. (glaube mich entsinnen zu können, dass sie sich auch Umdrehen, wenn sie mitten auf der Gerade sind)
 
ähm, Linuxerjava. Ich will dir nun nicht zu nahe treten, aber vielleicht solltetst du erst mal mit etwas
"leichteren" als GUI-Programmierung anfangen? (zb. könntest du einfach ein paar nützliche Klassen für Files zusammenstellen (egal ob sowas schon exestiert)).
Oder google mal im Web (ich weiß, das klingt blöd) und schau nach einer Seite, in der sie Project ideen
hosten.
 

Ähnliche Java Themen


Oben