0150 snake

Spelet i korta drag följer. En orm växer om den äter döda kroppsdelar. Om en orm kör in i en annan orms kropp så dör den. Ormar dör i kanten av världen.

Klassen SnakeHead - version 1

Bild: symbols/smiley2.png

Delmålet är ett huvud som kan styras.

Konstruktor

scale image 25 x 25
rotate image -90

Metoden act

anropa metoden stear - se nedan
anropa metoden move - se nedan

Metoden stear

om vänster pil
  turn left 14
annars om höger pil
  turn right 14

Metoden move

move 6

Testa

Testa att huvudet flyttar i munnens riktning och kan styras.

Klassen BodyPart

Bild: symbols/button-blue.png (eller green, purple, red, yellow)

Objektvariabeln snakeHead

Objektvariabeln snakeHead innehåller en referens till ormens huvud. Referensen sätts i konstruktorn.

Konstruktor

Ormens huvud bifogas som en parameter till konstruktorn. Objektvariabeln snakeHead får detta värde.

image scale to 25 x 25

Metoden getSnakeHead

returnerar snakeHead

Metoden kill

snakeHead får värdet null

Metoden isDead

returnerar true om snakeHead är null
och annars false 

Klassen SnakeHead - version 2

Nu är delmålet att huvudet ska få en kropp. Ormen består först av bara huvudet och för varje gång den flyttar sig så läggs en extra del till tills den är 20 lång.

Objektvariabler

//föregående kroppsdels x
previousX
//föregående kroppsdels y
previousY
//föregående kroppsdels rotation
previousRotation
//ormens kroppsdelar
ArrayList<BodyPart> bodyParts 
//antal kroppsdelar som ska läggas till ormen
noBodyPartsToAdd = 20

Metoden act

previousX får x-värdet
previousY får y-värdet
previousRotation får rotationsvärdet
anropa stear
anropa move

Metoden move

move 6

för varje kroppsdel
  (flytta till framförvarande dels föregående position)
  lokal variable x = kroppsdelens x
  lokal variable y = kroppsdelens y
  kroppsdelens x och y sätts till previousX och Y
  previousX blir lokalt x
  previousY blir lokalt y

om noBodyPartsToAdd är störren än 0
  (lägg till en kroppsdel på slutet av ormen)
  lokal variabel bodyPart
  lägg nytt objekt av BodyPart i bodyPart
  bodyParts.add(bodyPart);  //java-kod
  lägg till bodyPart i koordinaten previousX och Y
  minska noBodyPartsToAdd med ett

Testa


Klassen SnakeHead - version 3

Nu är målet att lägga till datorstyrning av orm samt att göra så att olika ormar kan styras med olika tangenter. Det senare ordnar vi först.

Ändra konstruktorn

Låt konstruktorn ta två parametrar så att man kan ange vilka tangenter som styr vänster- respektive högersväng. Lägg till objektvariabler som kan hålla reda på dessa värden.

Ändra metoden stear

Ändra i metoden ´stear´ så att den tar hänsyn till vilka tangenter som ormen ska styras med.

Testa

Testa att du kan välja vilka tangenter som ormen ska styras med utan att behöva kompilera om koden.

Lägg till objektvariabeln isComputer

Låt objektvariablen isComputer få värdet false som default.

Lägg till en konstruktor

Lägg till en konstruktor som inte tar någon parameter. Gör samma initieringar som i den andra konstruktorn förutom tangenterna som man styr med.

isComputer sätt till true

Ändra metoden stear

om isComputer
  om närmare kanten än 100 pixlar
    sväng 12 åt höger
  annars
    25% chans sväng 14 åt höger
    25% chans sväng 14 åt vänster
annars
  KOD SOM REDAN FINNS

Testa

Testa att du kan göra ormar som styrs av datorn.


Klassen SnakeHead - version 4

Nu är målet att att om huvudet kolliderar med en annan orms kropp (ej huvud) så ska den dö. Då en orm dör förlorar den sitt huvud och kan ätas av andra ormar. Dessa blir då längre.

Tillägg i metoden act

lägg till sist
anropa checkCollision

Metoden checkCollision

anropa getIntersectingObjects(BodyParts.class)
spara resultatet i en lista
för varje kroppsdel k i listan
  om kroppsdelen tillhör en annan orm
  (tips: getSnakeHead())
    om den andra ormen är död ät
      om noBodyPartsToAdd är mindre än 0
        noBodyPartsToAdd är 1
      annars
       noBodyPartsToAdd ökas med ett
    annars
      (har kört in i en levande orm)
      (döda denna orm, se nedan)
      för varje kroppsdel 
        döda kroppsdel (metoden kill)
        ta bort detta objekt från världen
        return; //java-kod

Extra


Klassen Leaf

Bild: nature/leaf.png

Lägg till ett objekt 200 pixlar in från varje hörn.

En ny orm dyker upp vid ett slumpvis valt löv då en orm dör.

Ormar dör vid kanten

Ormar som kör in i kanten på världen dör.

Menyer

Klassen StartMenu

Klassen ärver från World.

Visa texten och lägg till fyra objekt av klassen NoPlayersButton.

Klassen NoPlayersButton

No är i det här fallet en förkortning för number of.

Cirklarna med nummer i bilden ovan.

Objektvariabeln numberOfPlayers

numberOfPlayers

Konstruktor

Konstruktorn tar en parameter som anger hur många spelare det är.

numberOfPlayers får parameterns värde
skriv på bilden (1, 2, 3, eller 4)

Metoden act

om musen klickats på detta objekt
  sätt värld till ny MyWorld - numberOfPlayers som parameter
  (ändra på MyWorld så att detta fungerar)

tips
mouseClicked i klassen Greenfoot
setWorld i klassen Greenfoot

Klassen PlayerInfoMenu

Kräver en hel del kod.

Arv

Med hjälp av arv kan koden göras lite tjusigare. Lämplig övning för programmering 2.