Commit d804d524 authored by Anya Helene Bagge's avatar Anya Helene Bagge 🦆

forelesning 17

parent 379c55f4
......@@ -5,14 +5,19 @@ import inf101.grid.IPosition;
import inf101.grid.Position;
public abstract class Dyr {
double masse;
IPosition pos;
Direction dir;
private double masse;
IPosition pos;
Direction dir;
public Dyr(double m) {
masse = m;
pos = Position.make(0, 0);
dir = Direction.NORTH;
// problem: hvis checkState er overstyr i subklasser, så blir
// subklassens checkState kalt *før* subklassens konstruktør er
// ferdig med å lage et gyldig objekt
checkState();
}
public double getMass() {
......@@ -25,6 +30,8 @@ public abstract class Dyr {
public void move() {
pos = pos.go(dir);
checkState();
}
public void hei() {
......@@ -35,23 +42,65 @@ public abstract class Dyr {
return "dyr";
}
/**
* Må være >= 0, og >= {@link #getMinMat()}
*
* @return Maksimal mengde vekt man kan gi til {@link #spis(double)}
*/
public double getMaxMat() {
return 0.5*getMass();
}
/**
* Må være >= 0, og <= {@link #getMaxMat()}
* @return Minste mengde vekt man kan gi til {@link #spis(double)}
*/
public double getMinMat() {
return 1;
}
/**
* Dyret spiser litt, og blir større
*
* @param vekt Mengde mat dyret skal spise
*
* Forkrav: vekt må være mindre enn 0.5*getMass()
* Forkrav: vekt må være positiv, større enn getMinMat(), og mindre enn getMaxMat()
*
* Garanterer at getMass() øker med 0.05*vekt
*/
public void spis(double vekt) {
if(vekt > 0.5*getMass())
if(vekt < getMinMat() || vekt > getMaxMat())
throw new IllegalArgumentException("For mye mat!");
System.out.println("Jeg spiser som et dyr!");
this.masse += vekt/10;
checkState();
}
public abstract Dyr kopi();
/**
* Sjekk datainvariant
*
* @throws IllegalStateException hvis objektet har ulovlig tilstand
*/
public void checkState() {
if(masse <= 0.0 || Double.isNaN(masse) || Double.isInfinite(masse))
throw new IllegalStateException();
if(pos == null)
throw new IllegalStateException();
if(dir == null)
throw new IllegalStateException();
}
protected void setMasse(double newMasse) {
if(newMasse <= 0.0)
throw new IllegalArgumentException();
masse = newMasse;
// checkState();
}
}
......@@ -3,9 +3,13 @@ package inf101.dyr;
import inf101.grid.Direction;
public class Kanin extends Dyr {
private double tannLengde;
public Kanin() {
super(3500.0);
tannLengde = 10.0;
checkState();
}
@Override
......@@ -16,31 +20,48 @@ public class Kanin extends Dyr {
@Override
public void move() {
pos = pos.go(Direction.EAST);
checkState();
}
public void spis(double vekt) {
System.out.println("Jeg spiser som en kanin!");
if(vekt < getMinMat())
throw new IllegalArgumentException("For lite mat");
// vi har et løsere forkrav, aksepterer opptil 1.0* massen
if(vekt > getMass())
throw new IllegalArgumentException("For stor porsjon!");
double oldMasse = masse;
double oldMasse = getMass();
// vi er mer effektive, legger på oss like mye som vi spiser
masse = masse + vekt;
setMasse(getMass() + vekt);
// dette var minstekravet
assert masse >= 1.05*oldMasse;
assert getMass() >= 1.05*oldMasse;
checkState();
}
@Override
public Kanin kopi() {
Kanin kopi = new Kanin();
kopi.dir = dir;
kopi.masse = masse;
kopi.setMasse(getMass());
kopi.pos = pos;
kopi.checkState();
return kopi;
}
public void checkState() {
System.out.println("Kanins checkState");
super.checkState();
if(tannLengde <= 0.0)
throw new IllegalStateException();
}
}
......@@ -53,6 +53,10 @@ public class MainDyr {
Dyr kopi2 = dk.kopi();
if(kopi2 instanceof Kanin) // alltid sant her...
;
//u.spis(-50000);
k.spis(-50000);
}
......
package inf101.dyr;
public class Ulv extends Dyr {
public Ulv() {
super(30000.0);
}
......@@ -27,19 +27,23 @@ public class Ulv extends Dyr {
// bryter også prinsippet, her øker vi massen for lite
// i forhold til parameteret.
masse = masse + vekt * 0.01;
setMasse(getMass() + vekt * 0.01);
// dette var minstekravet
assert masse >= 1.05*oldMasse;
assert getMass() >= 1.05*oldMasse;
checkState();
}
@Override
public Ulv kopi() {
Ulv ulv = new Ulv();
ulv.dir = dir;
ulv.masse = masse;
ulv.setMasse(getMass());
ulv.pos = pos;
ulv.checkState();
return ulv;
}
}
......@@ -41,7 +41,7 @@ public abstract class AbstractWalker implements ISimActor, IWalker {
* @return
*/
protected boolean isLegalStep(IPosition pos) {
return RulesChecker.check(this, pos, game);
return getRules().check(this, pos, game);
}
/**
......
......@@ -13,7 +13,7 @@ public interface IWalker extends ISimActor {
* This method is called (by the game), for every time step, so that the
* actor can act its turn.
*
* The object must be moved according to the game rules in RulesChecker (new
* The object must be moved according to the game rules in {@link #getRules()} (new
* position must be immediately east/west/south/north of old position, not
* occupied, not outside board)
*
......@@ -21,5 +21,9 @@ public interface IWalker extends ISimActor {
* A count of the number of steps since the game started
*/
void step(int time);
default RulesChecker getRules() {
return new RulesChecker();
}
}
......@@ -76,5 +76,4 @@ public class PathFinder implements ISimActor, IWalker {
public String getIdString() {
return "w";
}
}
......@@ -14,7 +14,7 @@ public class RulesChecker {
* @param game The current game
* @return True if the move is legal
*/
public static boolean check(IWalker walker, IPosition nextMove, ISimGame game) {
public boolean check(IWalker walker, IPosition nextMove, ISimGame game) {
// TODO: implementer denne
return false;
......
......@@ -18,7 +18,7 @@ public class WalkerHelper {
public static boolean isLegalStep(IWalker walker, IPosition pos, ISimGame game) {
// denne metoden er overflødig – RulesChecker er allerede en hjelpklasse
// med denne funksjonaliteten
return RulesChecker.check(walker, pos, game);
return walker.getRules().check(walker, pos, game);
}
/**
......
......@@ -19,4 +19,10 @@ public class Zombie extends AbstractWalker implements ISimActor, IWalker {
return "z";
}
// Dette er reglene *denne* walkeren bruker
@Override
public RulesChecker getRules() {
return new RulesChecker();
}
}
......@@ -100,7 +100,7 @@ public class SimGameTest {
// its
// original
// position
assertTrue(RulesChecker.check(walker, nextPos, game));
assertTrue(walker.getRules().check(walker, nextPos, game));
game.moveObject(walker, nextPos); // redo the
// move
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment