0180 Pacman

En förenklad version av Pacman kommer att implementeras.

Banan kommer att läsas in från fil.

Nu till lösningen steg för steg.

Lägg till klasser enligt figuren ovan.

Klassen Food

Konstruktor

ny bild med storleken 4 x 4
sätt färg till vit
fyll en cirkel med diametern 4
anropa setImage

Klassen Wall

Konstrukor

/**
* A blue rectangle.
* @param width, the width counted in number of cells
* @param height, the height counted in number of cells
* @param cellSize, the size of a cell
*/

// ny bild med storleken width * cellSize o height * cellSize
// sätt färg till RGB(0, 0, 140)
// fyll bild med denna färg
// anropa setImage

Pacman

Kopiera de tre bilderna på pacman från Itslearning.

Välj lämplig bild. Mer instruktioner följer längre ner.

Textfilen levelOne.txt

Kopiera filen levelOne.txt från Itslearning till din projektmapp.

Eller ...

Skapa en fil som heter levelOne.txt Fyll den med följande innehåll:

xxxxxxxxxxxxxxxxxxxxxxxxxxxx
x............xx............x
x.xxxx.xxxxx.xx.xxxxx.xxxx.x
x.xeex.xeeex.xx.xeeex.xeex.x
x.xxxx.xxxxx.xx.xxxxx.xxxx.x
x..........................x
x.xxxx.xx.xxxxxxxx.xx.xxxx.x
x.xxxx.xx.xxxxxxxx.xx.xxxx.x
x......xx....xx....xx......x
xxxxxx.xxxxx.xx.xxxxx.xxxxxx
eeeeex.xxxxx.xx.xxxxx.x    
eeeeex.xx..........xx.x    
eeeeex.xx.xxx  xxx.xx.x    
xxxxxx.xx.xeeeeeex.xx.xxxxxx
teeeee....xeegeeex....eeeeet
xxxxxx.xx.xeeeeeex.xx.xxxxxx
eeeeex.xx.xxxxxxxx.xx.x    
eeeeex.xx..........xx.x
eeeeex.xx.xxxxxxxx.xx.x
xxxxxx.xx.xxxxxxxx.xx.xxxxxx
x............xx............x
x.xxxx.xxxxx.xx.xxxxx.xxxx.x
x.xxxx.xxxxx.xx.xxxxx.xxxx.x
x...xx........p.......xx...x
xxx.xx.xx.xxxxxxxx.xx.xx.xxx
xxx.xx.xx.xxxxxxxx.xx.xx.xxx
x......xx....xx....xx......x
x.xxxxxxxxxx.xx.xxxxxxxxxx.x
x.xxxxxxxxxx.xx.xxxxxxxxxx.x
x..........................x
xxxxxxxxxxxxxxxxxxxxxxxxxxxx

Ta bort eventuella inledande blanksteg på varje rad.

Klassen MyWorld

Lägg till följande metod.

/**
* Läs från fil.
* namnge fil att läsa från
*/
public void readFromFile(String file)
{
  //Det kan uppstå fel vid läsning från fil.
  //Försöker göra koden i try-blocket nedan. Om något går fel i 
  //try-blocket körs koden
  //i catch-blocket som följer direkt efter try-blocket nedan
  try
  {
    //Skapa ett objekt av klassen FileReader, med filnamnet 
    //som parameter.
    //Genom detta objekt ges möjlighet att skapa en ström av 
    //tecken från filen fil.
    //Om filen redan finns i samma mapp som programmet öppnas 
    //en kanal till den. 
    //Om filen inte finns genereras ett fel som måste hanteras. 
    //Detta görs nedan i ett catch-block
    FileReader fr = new FileReader(file);

    //För att effektivisera läsningen från filen skapas en 
    //buffert. Kan då läsa från 
    //filen med jämna mellanrum istället för att läsa tecken 
    //för tecken.
    BufferedReader inFile = new BufferedReader(fr);

    //läs in texten från filen rad för rad och skriv ut den 
    //till terminalfönstret
    String row = inFile.readLine();
    int x = 0;
    int y = 0;
    while(row != null)
    {
      x = 0;
      //row.trim();//ta bort blanksteg
      if (row.length() != 0)//gör inget om det är blankrad
      {
        //System.out.println(row);
        char [] charsInRow = row.toCharArray();
        for(char c : charsInRow)
        {
          // Skriv din kod här

          // om c är lika med 'x'
            addObject(new Wall(1, 1, CELL_SIZE), x, y);
          // annars om c är 'p'
            // lägg till ny pacman på x, y
          // annars om c är '.'
            // lägg till ny mat på x, y

          x = x + 1;
        }
      }
      row = inFile.readLine();
      y = y + 1;
    }
  //stäng strömmen av data från filen
  inFile.close();
  }
  //fånga felet: filen hittas ej
  catch(FileNotFoundException nfe)
  {
  System.out.println("File not found");
  }
  //fånga övriga fel
  catch(IOException ioe)
  {
  System.out.println("error; "+ ioe);
  }
}

Konstruktor

Implementera nedanstående.

super(28, 33, 16);
//gör bakgrundsbilden svart genom att
//hämta bakgrundsbild
//sätt färg till svart
//fyll bakgrundsbilden

// anropa readFromFile med "levelOne.txt" som parameter

Testa att din värld ser ut ungefär som världen ovan.

Klassen Pacman igen

Objektvariabler

nextDirection är ett heltal
score är ett heltal

Konstruktor

anropa setRotation - för att peka vänster
nextDirektion blir 180
score blir 0

Metoden act

anropa move
anropa eat
anropa animate

Metoden move

om pil upp
  nextDirection = 270
om pil ner
  nextDirection = 90
om pil vänster
  nextDirection = 180
om pil höger
  nextDirection = 0

om canMove nextDirection
  setRotation nextDirection
  move 1
annars om canMove getRotation
  move 1

Metoden canMove

/*
 * @param direction 0, 90, 180 or 270
 */
public boolean canMove(int direction)
{
  // -1, 0, eller 1
  int deltaX = (int)(Math.cos(Math.toRadians(direction)));

  // - 1, 0 eller 1
  int deltaY = (int)(Math.sin(Math.toRadians(direction)));

  om vägg finns vid offset deltaX, deltaY 
    returnera false
  annars
    returnera true
}

Metoden eat

om vidrör mat
  ta bort mat
  öka poäng med 10
  visa ny poäng

Metoden animate

Lägg till en objektvariabel time. Låt den vara 0 från start.

Implementera följande.

om time är 0
  visa bild 0
  öka time med 1
annars om time är 1
  visa bild 1
  öka time med 1
annars om time är 2
  visa bild 2
  sätt time till 0

Lägg till mer

Lägg till mer efter eget huvud.

Gå över skärmkant

Gå ut till vänster och kom in till höger och vise versa.

Spöken

Körsbär