From 00fb936641b16f39c86a10acd517989fb1c16912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Tue, 14 Oct 2025 20:53:02 +0200 Subject: [PATCH 1/9] Implement moveable --- src/main/java/Character.java | 10 ++-------- src/main/java/Entity.java | 14 ++++++++++++++ src/main/java/Movable.java | 3 +++ src/main/java/Player.java | 6 +++--- src/test/java/PlayerTest.java | 3 +-- 5 files changed, 23 insertions(+), 13 deletions(-) create mode 100644 src/main/java/Entity.java create mode 100644 src/main/java/Movable.java diff --git a/src/main/java/Character.java b/src/main/java/Character.java index 17ca63e..bca6c68 100644 --- a/src/main/java/Character.java +++ b/src/main/java/Character.java @@ -1,21 +1,16 @@ -public abstract class Character { +public abstract class Character extends Entity { protected String name; protected int health; protected int level; - protected Position position; public Character(String name) { + super(new Position(0, 0)); this.name = name; this.health = 10; this.level = 1; } - public Character(String name, int level) { - this.name = name; - this.level = level; - } - public void setHealth(int i) { this.health = i; } @@ -24,5 +19,4 @@ public abstract class Character { return health > 0; } - public abstract void spawn(int x, int y); } diff --git a/src/main/java/Entity.java b/src/main/java/Entity.java new file mode 100644 index 0000000..84093a9 --- /dev/null +++ b/src/main/java/Entity.java @@ -0,0 +1,14 @@ +public class Entity { + private Position position; + public Entity(Position position) { + this.position = position; + } + + public Position getPosition() { + return position; + } + + public void setPosition(Position position) { + this.position = position; + } +} diff --git a/src/main/java/Movable.java b/src/main/java/Movable.java new file mode 100644 index 0000000..8b3279c --- /dev/null +++ b/src/main/java/Movable.java @@ -0,0 +1,3 @@ +public interface Movable { + void move(Position position); +} diff --git a/src/main/java/Player.java b/src/main/java/Player.java index 907f225..71daeab 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -1,4 +1,4 @@ -public class Player extends Character { +public class Player extends Character implements Movable { public Player(String name) { @@ -7,7 +7,7 @@ public class Player extends Character { @Override - public void spawn(int x, int y) { - + public void move(Position position) { + setPosition(position); } } diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index 22b1140..25d3137 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -18,8 +18,7 @@ class PlayerTest { @Test public void can_change_position() { var p = defaultPlayer(); - assertEquals(new Position(0,0), p.getPosition()); - p.moveTo(new Position(1,1)); + p.move(new Position(1,1)); assertEquals(new Position(1,1), p.getPosition()); } -- 2.39.5 From 141dff8af1d693decc998edb154de4e0477f23f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Tue, 14 Oct 2025 20:53:02 +0200 Subject: [PATCH 2/9] Implement moveable --- src/main/java/Character.java | 10 ++-------- src/main/java/Entity.java | 14 ++++++++++++++ src/main/java/Movable.java | 3 +++ src/main/java/Player.java | 6 +++--- src/test/java/PlayerTest.java | 1 - 5 files changed, 22 insertions(+), 12 deletions(-) create mode 100644 src/main/java/Entity.java create mode 100644 src/main/java/Movable.java diff --git a/src/main/java/Character.java b/src/main/java/Character.java index 17ca63e..bca6c68 100644 --- a/src/main/java/Character.java +++ b/src/main/java/Character.java @@ -1,21 +1,16 @@ -public abstract class Character { +public abstract class Character extends Entity { protected String name; protected int health; protected int level; - protected Position position; public Character(String name) { + super(new Position(0, 0)); this.name = name; this.health = 10; this.level = 1; } - public Character(String name, int level) { - this.name = name; - this.level = level; - } - public void setHealth(int i) { this.health = i; } @@ -24,5 +19,4 @@ public abstract class Character { return health > 0; } - public abstract void spawn(int x, int y); } diff --git a/src/main/java/Entity.java b/src/main/java/Entity.java new file mode 100644 index 0000000..84093a9 --- /dev/null +++ b/src/main/java/Entity.java @@ -0,0 +1,14 @@ +public class Entity { + private Position position; + public Entity(Position position) { + this.position = position; + } + + public Position getPosition() { + return position; + } + + public void setPosition(Position position) { + this.position = position; + } +} diff --git a/src/main/java/Movable.java b/src/main/java/Movable.java new file mode 100644 index 0000000..8e2d448 --- /dev/null +++ b/src/main/java/Movable.java @@ -0,0 +1,3 @@ +public interface Movable { + void moveTo(Position position); +} diff --git a/src/main/java/Player.java b/src/main/java/Player.java index 907f225..71daeab 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -1,4 +1,4 @@ -public class Player extends Character { +public class Player extends Character implements Movable { public Player(String name) { @@ -7,7 +7,7 @@ public class Player extends Character { @Override - public void spawn(int x, int y) { - + public void move(Position position) { + setPosition(position); } } diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index 22b1140..49f646f 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -18,7 +18,6 @@ class PlayerTest { @Test public void can_change_position() { var p = defaultPlayer(); - assertEquals(new Position(0,0), p.getPosition()); p.moveTo(new Position(1,1)); assertEquals(new Position(1,1), p.getPosition()); } -- 2.39.5 From c40b5a0c846a6c7329165bc3aa471cd76e7ee192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Thu, 16 Oct 2025 10:06:59 +0200 Subject: [PATCH 3/9] Player can change job Steps 1 and 2 TDD. Written a test and made it pass. This is most definitely not the best solution. I would like to know how to handle cases where I think Job should be abstract further down the line. How is this handled in TDD? --- src/main/java/Job/Job.java | 26 ++++++++++++++++++++++++++ src/main/java/Player.java | 17 ++++++++++++++++- src/test/java/PlayerTest.java | 12 ++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 src/main/java/Job/Job.java diff --git a/src/main/java/Job/Job.java b/src/main/java/Job/Job.java new file mode 100644 index 0000000..cc10be8 --- /dev/null +++ b/src/main/java/Job/Job.java @@ -0,0 +1,26 @@ +package Job; + +public class Job { + protected String name; + public Job(String name) { + this.name = name; + } + + public static Job Miner() { + return new Job("Miner"); + } + + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Job job = (Job) o; + return name.equals(job.name); + } + + @Override + public int hashCode() { + return name.hashCode(); + } +} diff --git a/src/main/java/Player.java b/src/main/java/Player.java index 71daeab..0678bbf 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -1,5 +1,12 @@ +import Job.Job; + public class Player extends Character implements Movable { + protected Job job; + public Player(String name, Job job) { + super(name); + this.job = job; + } public Player(String name) { super(name); @@ -7,7 +14,15 @@ public class Player extends Character implements Movable { @Override - public void move(Position position) { + public void moveTo(Position position) { setPosition(position); } + + public void learnJob(Job job) { + this.job = job; + } + + public Job getJob() { + return job; + } } diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index 49f646f..4ff209d 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -1,3 +1,4 @@ +import Job.Job; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -22,4 +23,15 @@ class PlayerTest { assertEquals(new Position(1,1), p.getPosition()); } + @Test + public void can_change_job() { + var p = defaultPlayer(); + var job = Job.Miner(); + assertNull(p.getJob()); + p.learnJob(job); + assertEquals(Job.Miner(), p.getJob()); + } + + + } \ No newline at end of file -- 2.39.5 From 6e7f435e85b87c337072b139df3a0f6c7bff4abd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Thu, 16 Oct 2025 11:05:31 +0200 Subject: [PATCH 4/9] Add notes to gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5ff6309..ec87178 100644 --- a/.gitignore +++ b/.gitignore @@ -35,4 +35,7 @@ build/ .vscode/ ### Mac OS ### -.DS_Store \ No newline at end of file +.DS_Store + +## Personal notes +notes.md -- 2.39.5 From b98392813b2edc7d62dd2ff92c4b0c29bd077f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Thu, 16 Oct 2025 11:06:06 +0200 Subject: [PATCH 5/9] Refactor job into Interface --- src/main/java/Job/Job.java | 25 ++----------------------- src/main/java/Job/Miner.java | 30 ++++++++++++++++++++++++++++++ src/test/java/PlayerTest.java | 7 ++++--- 3 files changed, 36 insertions(+), 26 deletions(-) create mode 100644 src/main/java/Job/Miner.java diff --git a/src/main/java/Job/Job.java b/src/main/java/Job/Job.java index cc10be8..74fd11d 100644 --- a/src/main/java/Job/Job.java +++ b/src/main/java/Job/Job.java @@ -1,26 +1,5 @@ package Job; -public class Job { - protected String name; - public Job(String name) { - this.name = name; - } - - public static Job Miner() { - return new Job("Miner"); - } - - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Job job = (Job) o; - return name.equals(job.name); - } - - @Override - public int hashCode() { - return name.hashCode(); - } +public interface Job { + void performJobAction(); } diff --git a/src/main/java/Job/Miner.java b/src/main/java/Job/Miner.java new file mode 100644 index 0000000..ec18df1 --- /dev/null +++ b/src/main/java/Job/Miner.java @@ -0,0 +1,30 @@ +package Job; + +import java.util.Objects; + +public class Miner implements Job { + private final String jobName = "Miner"; + + public Miner() {} + + @Override + public void performJobAction() { + System.out.println("Dig..."); + } + + @Override + public String toString() { + return "Miner"; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + return o != null && getClass() == o.getClass(); + } + + @Override + public int hashCode() { + return Objects.hash(jobName); + } +} diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index 4ff209d..509f27e 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -1,4 +1,4 @@ -import Job.Job; +import Job.Miner; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -26,10 +26,11 @@ class PlayerTest { @Test public void can_change_job() { var p = defaultPlayer(); - var job = Job.Miner(); assertNull(p.getJob()); + + var job = new Miner(); p.learnJob(job); - assertEquals(Job.Miner(), p.getJob()); + assertEquals(new Miner(), p.getJob()); } -- 2.39.5 From 4df1e1e292d614254f86afd606d205635816bcc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Thu, 16 Oct 2025 12:41:51 +0200 Subject: [PATCH 6/9] Code cleanup --- src/test/java/PlayerTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/test/java/PlayerTest.java b/src/test/java/PlayerTest.java index 509f27e..a246e22 100644 --- a/src/test/java/PlayerTest.java +++ b/src/test/java/PlayerTest.java @@ -4,7 +4,6 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class PlayerTest { - private Player defaultPlayer() { return new Player("abc"); } @@ -32,7 +31,4 @@ class PlayerTest { p.learnJob(job); assertEquals(new Miner(), p.getJob()); } - - - } \ No newline at end of file -- 2.39.5 From b0438755e5533219c67b4ec309f3b163da961136 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Thu, 16 Oct 2025 12:44:44 +0200 Subject: [PATCH 7/9] Code cleanup --- src/main/java/Player.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/Player.java b/src/main/java/Player.java index 0678bbf..bf829d4 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -1,7 +1,6 @@ import Job.Job; public class Player extends Character implements Movable { - protected Job job; public Player(String name, Job job) { super(name); @@ -12,7 +11,6 @@ public class Player extends Character implements Movable { super(name); } - @Override public void moveTo(Position position) { setPosition(position); -- 2.39.5 From 72b357d8174793050ffc9e8ea2488803b35b0298 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Fri, 17 Oct 2025 00:00:58 +0200 Subject: [PATCH 8/9] Level up miner --- src/main/java/Action/Action.java | 5 +++++ src/main/java/Action/Dig.java | 5 +++++ src/main/java/Job/Job.java | 20 ++++++++++++++++++-- src/main/java/Job/Miner.java | 2 +- src/main/java/Player.java | 14 ++++++++++++++ src/test/java/MinerTest.java | 29 +++++++++++++++++++++++++++++ 6 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 src/main/java/Action/Action.java create mode 100644 src/main/java/Action/Dig.java create mode 100644 src/test/java/MinerTest.java diff --git a/src/main/java/Action/Action.java b/src/main/java/Action/Action.java new file mode 100644 index 0000000..51397fc --- /dev/null +++ b/src/main/java/Action/Action.java @@ -0,0 +1,5 @@ +package Action; + +public abstract class Action { + public static Dig Dig = new Dig(); +} diff --git a/src/main/java/Action/Dig.java b/src/main/java/Action/Dig.java new file mode 100644 index 0000000..4234101 --- /dev/null +++ b/src/main/java/Action/Dig.java @@ -0,0 +1,5 @@ +package Action; + +public class Dig extends Action { + +} diff --git a/src/main/java/Job/Job.java b/src/main/java/Job/Job.java index 74fd11d..7eecaa7 100644 --- a/src/main/java/Job/Job.java +++ b/src/main/java/Job/Job.java @@ -1,5 +1,21 @@ package Job; -public interface Job { - void performJobAction(); +public abstract class Job { + private int level; + abstract void performJobAction(); + + Job() { + this.level = 1; + } + Job(int level) { + this.level = level; + } + + public double getLevel() { + return level; + }; + + public void levelUp() { + level++; + } } diff --git a/src/main/java/Job/Miner.java b/src/main/java/Job/Miner.java index ec18df1..5e223fe 100644 --- a/src/main/java/Job/Miner.java +++ b/src/main/java/Job/Miner.java @@ -2,7 +2,7 @@ package Job; import java.util.Objects; -public class Miner implements Job { +public class Miner extends Job { private final String jobName = "Miner"; public Miner() {} diff --git a/src/main/java/Player.java b/src/main/java/Player.java index bf829d4..dfa73cf 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -1,7 +1,13 @@ +import Action.Dig; import Job.Job; +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; + public class Player extends Character implements Movable { protected Job job; + protected List items = new LinkedList<>(); public Player(String name, Job job) { super(name); this.job = job; @@ -23,4 +29,12 @@ public class Player extends Character implements Movable { public Job getJob() { return job; } + + public void performAction(Dig dig) { + items.add("Stone"); + } + + public List getInventory() { + return items; + } } diff --git a/src/test/java/MinerTest.java b/src/test/java/MinerTest.java new file mode 100644 index 0000000..9657d4c --- /dev/null +++ b/src/test/java/MinerTest.java @@ -0,0 +1,29 @@ +import Action.Action; +import Job.Miner; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class MinerTest { + @Test + void miner_can_dig() { + var p = new Player("Steve"); + var job = new Miner(); + p.learnJob(job); + p.performAction(Action.Dig); + assertTrue(p.getInventory().contains("Stone")); + } + + @Test + void miner_can_level_up() { + var p = new Player("Steve"); + var job = new Miner(); + assertEquals(1, job.getLevel()); + job.levelUp(); + assertEquals(2, job.getLevel()); + } + +} + + -- 2.39.5 From f730cee3a37e965aabbf44866d88a4199e3a47c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erik=20N=C3=A4slund?= Date: Fri, 17 Oct 2025 10:02:56 +0200 Subject: [PATCH 9/9] Refactor job into interfaces --- src/main/java/Action/Action.java | 4 +-- src/main/java/Action/Actor.java | 8 ++++++ src/main/java/Action/Dig.java | 7 +++-- src/main/java/Character/HasInventory.java | 7 +++++ src/main/java/Job/HasJob.java | 5 ++++ src/main/java/Job/Job.java | 35 +++++++++++++++++------ src/main/java/Job/Miner.java | 30 ++++++------------- src/main/java/Player.java | 17 +++++++---- src/test/java/MinerTest.java | 6 ++-- 9 files changed, 77 insertions(+), 42 deletions(-) create mode 100644 src/main/java/Action/Actor.java create mode 100644 src/main/java/Character/HasInventory.java create mode 100644 src/main/java/Job/HasJob.java diff --git a/src/main/java/Action/Action.java b/src/main/java/Action/Action.java index 51397fc..e1bf012 100644 --- a/src/main/java/Action/Action.java +++ b/src/main/java/Action/Action.java @@ -1,5 +1,5 @@ package Action; -public abstract class Action { - public static Dig Dig = new Dig(); +public interface Action { + void exectue(Actor player); } diff --git a/src/main/java/Action/Actor.java b/src/main/java/Action/Actor.java new file mode 100644 index 0000000..040075a --- /dev/null +++ b/src/main/java/Action/Actor.java @@ -0,0 +1,8 @@ +package Action; + +import Job.Job; + +public interface Actor { + Job getJob(); + void performAction(Action action); +} diff --git a/src/main/java/Action/Dig.java b/src/main/java/Action/Dig.java index 4234101..d6f9e38 100644 --- a/src/main/java/Action/Dig.java +++ b/src/main/java/Action/Dig.java @@ -1,5 +1,8 @@ package Action; -public class Dig extends Action { - +public class Dig implements Action { + @Override + public void exectue(Actor actor) { + actor.performAction(this); + } } diff --git a/src/main/java/Character/HasInventory.java b/src/main/java/Character/HasInventory.java new file mode 100644 index 0000000..598ccc8 --- /dev/null +++ b/src/main/java/Character/HasInventory.java @@ -0,0 +1,7 @@ +package Character; + +import java.util.List; + +public interface HasInventory { + List getInventory(); +} diff --git a/src/main/java/Job/HasJob.java b/src/main/java/Job/HasJob.java new file mode 100644 index 0000000..1187f9f --- /dev/null +++ b/src/main/java/Job/HasJob.java @@ -0,0 +1,5 @@ +package Job; + +public interface HasJob { + Job getJob(); +} diff --git a/src/main/java/Job/Job.java b/src/main/java/Job/Job.java index 7eecaa7..39d9bc5 100644 --- a/src/main/java/Job/Job.java +++ b/src/main/java/Job/Job.java @@ -1,21 +1,40 @@ package Job; -public abstract class Job { - private int level; - abstract void performJobAction(); +import Action.Actor; - Job() { +import java.util.Objects; + +public abstract class Job { + protected int level; + protected String name; + + Job(String name) { + this.name = name; this.level = 1; } - Job(int level) { - this.level = level; - } public double getLevel() { return level; - }; + } public void levelUp() { level++; } + + @Override + public String toString() { + return String.format("Job: %s. Level: %d", name, level); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + return o != null && getClass() == o.getClass(); + } + + @Override + public int hashCode() { + return Objects.hash(name); + } + } diff --git a/src/main/java/Job/Miner.java b/src/main/java/Job/Miner.java index 5e223fe..58dd987 100644 --- a/src/main/java/Job/Miner.java +++ b/src/main/java/Job/Miner.java @@ -1,30 +1,18 @@ package Job; -import java.util.Objects; +import Action.Actor; +import Character.HasInventory; public class Miner extends Job { - private final String jobName = "Miner"; + public Miner() { + super("Miner"); + } - public Miner() {} @Override - public void performJobAction() { - System.out.println("Dig..."); - } - - @Override - public String toString() { - return "Miner"; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - return o != null && getClass() == o.getClass(); - } - - @Override - public int hashCode() { - return Objects.hash(jobName); + void performJobAction(Actor actor) { + if(actor instanceof HasInventory a) { + a.getInventory().add("Rock"); + } } } diff --git a/src/main/java/Player.java b/src/main/java/Player.java index dfa73cf..d765b47 100644 --- a/src/main/java/Player.java +++ b/src/main/java/Player.java @@ -1,11 +1,14 @@ +import Action.Action; +import Action.Actor; import Action.Dig; import Job.Job; +import Job.HasJob; +import Character.HasInventory; -import java.util.Collection; import java.util.LinkedList; import java.util.List; -public class Player extends Character implements Movable { +public class Player extends Character implements Movable, Actor, HasInventory, HasJob { protected Job job; protected List items = new LinkedList<>(); public Player(String name, Job job) { @@ -30,11 +33,13 @@ public class Player extends Character implements Movable { return job; } - public void performAction(Dig dig) { - items.add("Stone"); - } - public List getInventory() { return items; } + + @Override + public void performAction(Action action) { + action.exectue(this); + } + } diff --git a/src/test/java/MinerTest.java b/src/test/java/MinerTest.java index 9657d4c..8a8b38a 100644 --- a/src/test/java/MinerTest.java +++ b/src/test/java/MinerTest.java @@ -1,23 +1,23 @@ -import Action.Action; import Job.Miner; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import Action.Dig; + public class MinerTest { @Test void miner_can_dig() { var p = new Player("Steve"); var job = new Miner(); p.learnJob(job); - p.performAction(Action.Dig); + p.performAction(new Dig()); assertTrue(p.getInventory().contains("Stone")); } @Test void miner_can_level_up() { - var p = new Player("Steve"); var job = new Miner(); assertEquals(1, job.getLevel()); job.levelUp(); -- 2.39.5