Pacman

Lelo

Neues Mitglied
Hey ich habe ein Problem mit meinem Pacman spiel was ich in meinem Studium fertig machen muss. Ich bin sehr weit gekommen aber der schlimmste Teil ist die Programierung der Geister und dass wir halt eine Library von unserem Prof schon gegeben haben (bin 1. Semester und noch nicht ganz erfahren in Java). Ich kriege es zwar hin den Geistern zu sagen dass die zu den koordinaten von Pacman sollen aber ich kriege es nicht hin denen zu sagen dass sie nicht durch wände gehen sollen... Hat einer eine Idee? Ist sehr viel verlangt jetzt sich hier erstmal einzulesen was abgeht :(.


import java.awt.*;
import java.awt.event.KeyEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import static java.awt.event.KeyEvent.*;

public record GamePacMan (FallingImage player,int width, int height,List<ImageObject> walls,List<ImageObject> point,List<ImageObject> hintergrund,List<FallingImage> geist, List<List<? extends GameObj>> goss) implements Game {

GamePacMan(){
this(new Pacman(new Vertex(0,0)),805,665,new ArrayList<>(),new ArrayList<>(),new ArrayList<>(),new ArrayList<>(),new ArrayList<>());
init();
}
static ImageObject PacWall(Vertex corner) {

return new ImageObject(corner, new Vertex(0, 0), "Pacwall.png");
}
static ImageObject Pointer(Vertex corner) {
return new ImageObject(corner, new Vertex(0, 0), "PacPoint.png");
}

@Override
public void init() {
goss.add(hintergrund());
hintergrund().add(new ImageObject("Black.jpg"));
point.clear();
goss().add(point);
walls.clear();
goss().add(walls);
geist.clear();
goss().add(geist);
readLevel();
}


@Override
public void doChecks() {
if (player().isLeftOf(0)) {
player().pos().x = width;
}
if(player().isRightOf(width)){
player().pos().x = -9;
}
checkPlayerWallCollsions();
checkEnemyTunnelCollusions();
checkPlayerEnemyCollisions();
checkEnemyWallCollusions();
PointCollecter();
checkPlayerEnemyCollisions();
chase();
}
static final int GRID_WIDTH = 35;

static String level1 = """
wwwwwwwwwwwwwwwwwwwwwww
w p w
w wwwwwww wwwwwww w
w w w w w
w w w wwwwwww w w w
w w w w w
w www wwww w wwww www w
w w
wwww ww ww ww ww wwww
........wg g gw........
wwww ww wwwwwww ww wwww
w w w
w www wwww w wwww www w
w w w w w
w w w wwwwwww w w w
w w w w w
w wwwwwww wwwwwww w
w w
wwwwwwwwwwwwwwwwwwwwwww""";

@Override
public void keyPressedReaction(KeyEvent keyEvent) {
switch (keyEvent.getKeyCode()) {
case VK_RIGHT -> {
player().stop();
player().velocity().x = +1;
}
case VK_LEFT -> {
player().stop();
player().velocity().x = -1;
}
case VK_DOWN -> {
player().stop();
player().velocity().y = +1;
}
case VK_UP -> {
player().stop();
player().velocity().y = -1;
}
}
}

private void readLevel() {
int i = 0;
var lines = level1.split("\\n");
for (String line : lines) {
int col = 0;
for (char c : line.toCharArray()) {
switch (c) {
case 'w'->walls.add(PacWall(new Vertex(col * GRID_WIDTH, i * GRID_WIDTH)));
case 'p'->player().pos().moveTo(new Vertex(col * GRID_WIDTH+4, i * GRID_WIDTH +4));
case 'g'->geist.add(new Geist(new Vertex(col * GRID_WIDTH+4, i * GRID_WIDTH +4)));
default -> point.add(Pointer(new Vertex(col * GRID_WIDTH+13, i * GRID_WIDTH+13)));
}
col++;
}
i++;
}
}

public void checkEnemyTunnelCollusions() {
for (int i = 0; i < geist.size(); i++) {
var counter = geist.get(i);

if (counter.isLeftOf(0)) {
counter.pos().x = width;
}
if(counter.isRightOf(width)){
counter.pos().x = -9;
}
}
}



public void checkEnemyWallCollusions() {
for (var wall : walls) {
for (var g: geist){
if(g.touches(wall)){
g.stop();
}
}
}
}

public void chase(){
for (int i=0;i<geist.size();i++) {
var counter = geist.get(i);
var xDif = counter.pos().x - player().pos().x;
var yDif = counter.pos().y - player().pos().y;

if(xDif > 0){
counter.pos().x -= 1;

}
else if(xDif < 0){
counter.pos().x += 1;

}

if(yDif > 0){
counter.pos().y -= 1;

}
else if(yDif < 0){
counter.pos().y += 1;
}


}
}

private void checkPlayerWallCollsions() {
for (var count : walls) {
if (player.touches(count)) {
player.stop();
}
}
}


private void checkPlayerEnemyCollisions(){
for (var count : geist){
if (player.touches(count)){
int i = 0;
var lines = level1.split("\\n");
for (String line : lines) {
int col = 0;
for (char c : line.toCharArray()) {
switch (c) {
case 'p'->player().pos().moveTo(new Vertex(col * GRID_WIDTH+4, i * GRID_WIDTH +4));
}
col++;
}
i++;
}
}
}
}

private void PointCollecter() {
ImageObject delete = null;
for (var count : point) {
if (player().touches(count)) {
delete = count;
}
}
if(delete!=null){
point.remove(delete);
}
}

@Override
public boolean won() {
return false;
}

@Override
public boolean lost() {
return false;
}

public static void main(String[] args) {
new GamePacMan().play();
}
}
 

Oneixee5

Top Contributor
Ich finde das ist der Horror. Warum ist das ein Record? In init() wird dann erst mal alles gelöscht was an den Record übergeben wird...
Ich wäre nie im leben auf die Idee gekommen, dass ein Record eine Main-Methode haben kann.
 
Zuletzt bearbeitet:

Lelo

Neues Mitglied
Ich finde das ist der Horror. Warum ist das ein Record? In init() wird dann erst mal alles gelöscht was an den Record übergeben wird...
Ich wäre nie im leben auf die Idee gekommen, dass ein Record eine Main-Methode haben kann.
Ja ich weiss auch nicht was mein Prof von mir will aber er will es in einem Record haben. Aber bis jetzt klappt ja alles nur die Geister logik schlägt sehr fehl haha
 

Ähnliche Java Themen

Neue Themen


Oben