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.