From 080ad0b21a340f6f729636874c2aa611cec90adf Mon Sep 17 00:00:00 2001 From: lov3b Date: Tue, 22 Mar 2022 18:31:33 +0100 Subject: [PATCH] =?UTF-8?q?Pawn=20funkar=20f=C3=B6rutom=20enpassant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/schack/Pawn.java | 66 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/src/schack/Pawn.java b/src/schack/Pawn.java index 0c62b26..aa2619e 100644 --- a/src/schack/Pawn.java +++ b/src/schack/Pawn.java @@ -6,6 +6,8 @@ import java.util.LinkedHashSet; public class Pawn extends Piece { + private boolean hasMoved = false; + public Pawn(boolean isWhite, Point startingPosition) throws IOException { super(isWhite, startingPosition); setPieceIcon("Pawn"); @@ -18,9 +20,69 @@ public class Pawn extends Piece { @Override public LinkedHashSet validMoves(Piece[][] pieces) { LinkedHashSet movable = new LinkedHashSet<>(); - - return new LinkedHashSet<>(); + // Om bonden har gått en gång, får gå 1 steg, annars 2 + final int upTo = hasMoved ? 1 : 2; + // Kolla om man kan gå rakt frak + for (int pawnX = 1; pawnX <= upTo; pawnX++) { + Point pos = new Point(this.position.x, this.position.y - pawnX); + boolean shouldBreak = checkMove(pos, movable, pieces); + if (shouldBreak) { + break; + } + } + + // Logik för att ta + for (int pawnX : new int[]{-1, 1}) { + // Position vi kollar just nu, snett upp åt höger & vänster + Point pos = new Point(this.position.x + pawnX, this.position.y - 1); + Piece p = pieces[pos.x][pos.y]; + + // Ifall det är en pjäs som står här och den inte är samma färg som oss, lägg till + if (p != null && p.isWhite != this.isWhite) { + movable.add(pos); + } + } + + return movable; + } + + @Override + protected boolean checkMove(Point pos, LinkedHashSet movable, Piece[][] pieces) { + // Instead of checking index and null, try-catch + try { + // Ifall vi kollar utanför brädet kommer detta att faila + Piece p = pieces[pos.x][pos.y]; + + // Ifall pjäsen här har samma färg som oss, break + // Ifall det inte är någon pjäs här kommer det att gå ner till + // catch(NullPointerException) och då lägger vi till detta drag i listan + // Ifall det är inte är en pjäs här, kasta ett NullPointerException + // Detta är för att vara så lik super-implementationen som möjligt + if (p == null) { + throw new NullPointerException(); + } else { + // Detta betyder att det finns en pjäs här + // Vi kan ta men inte gå längre. + return true; + } + } catch (NullPointerException npe) { + // This is an empty spot + movable.add(pos); + } catch (IndexOutOfBoundsException ioobe) { + // This means that the player is at the edge + } catch (Exception e) { + // For good meassure + } + return false; + + } + + @Override + public void move(Piece[][] pieces, Point toMove, Point selected) { + // Detta är för att veta ifall vi kan gå 2 steg eller inte + hasMoved = true; + super.move(pieces, toMove, selected); } @Override