Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

II. labor Lépések kezelése. Új metódus a Square osztályba public static int letterToFileIndex(char letter) throws NumberFormatException { int i = 0; for.

Hasonló előadás


Az előadások a következő témára: "II. labor Lépések kezelése. Új metódus a Square osztályba public static int letterToFileIndex(char letter) throws NumberFormatException { int i = 0; for."— Előadás másolata:

1 II. labor Lépések kezelése

2 Új metódus a Square osztályba public static int letterToFileIndex(char letter) throws NumberFormatException { int i = 0; for (; i < fileLetters.length; i++) { if (fileLetters[i] == letter) { break; } if (i == fileLetters.length) { throw new NumberFormatException(); } return i; }

3 ConsoleController.mainLoop if (s.equals("exit")) { break; } int fromRank, fromFile, toRank, toFile; try { fromFile = Square.letterToFileIndex(s.charAt(0)); fromRank = Character.getNumericValue(s.charAt(1)) - 1; toFile = Square.letterToFileIndex(s.charAt(2)); toRank = Character.getNumericValue(s.charAt(3)) - 1; } catch (Exception e) { view.printMessage("Bad command!!"); continue; } System.out.println( "move from: " + new Square(fromFile, fromRank) + " to: " + new Square(toFile, toRank)); } // alt+shift+f, hogy a tabulálás a helyére kerüljön

4 Futtatás, próba

5 Játékállapot figura megfogva alap grabPiece true false dropPiece true false isPieceGrabbed() == true isPieceGrabbed() == false cancelMove finishMove

6 Új mezők a Chessboard -ba public class Chessboard { protected Piece[][] pieceArray = new Piece[8][8]; protected boolean whiteOnTurn = true; protected Square moveStartSquare = null; protected Piece grabbedPiece = null; // milyen játékállapotban vagyunk public boolean isPieceGrabbed() {return grabbedPiece != null; } boolean getWhiteOnTurn() { return whiteOnTurn; } public void reset() { whiteOnTurn = true; moveStartSquare = null; grabbedPiece = null; // reset korábban megírt részei itt }

7 új: Chessboard.grabPiece public boolean grabPiece(Square fromSquare) { if (isPieceGrabbed()) return false; if (fromSquare.file 7) return false; if (fromSquare.rank 7) return false; grabbedPiece = getPiece(fromSquare); if (grabbedPiece == null || grabbedPiece.white != whiteOnTurn) { grabbedPiece = null; return false; } moveStartSquare = fromSquare; return true; }

8 új: Chessboard.cancelMove private void cancelMove() { grabbedPiece = null; moveStartSquare = null; }

9 új: Chessboard.finishMove protected boolean finishMove(Square toSquare) { // felrakjuk a figurát a célhelyre pieceArray[toSquare.file][toSquare.rank] = grabbedPiece; grabbedPiece = null;// alapállapotba vissza moveStartSquare = null; return true; }

10 új: Chessboard.dropPiece import java.util.LinkedList; // ez a file elejére public class Chessboard { // többi metódus public boolean dropPiece(Square toSquare) { if (!isPieceGrabbed()) return false; if (toSquare.file 7) { cancelMove(); return false; } if (toSquare.rank 7) { cancelMove(); return false; }// folyt.

11 Chessboard.dropPiece folyt. LinkedList passedSquares = new LinkedList (); MoveResult result = grabbedPiece.canMove( moveStartSquare, toSquare, passedSquares); Piece takenPiece = getPiece(toSquare);// ütött figura if (result == MoveResult.IFATTACKING && takenPiece != null) result = MoveResult.OK;// ütés gyaloggal if (result == MoveResult.IFNOTATTACKING && takenPiece == null) result = MoveResult.OK;// nem ütés gyaloggal if (takenPiece != null && whiteOnTurn == takenPiece.white) result = MoveResult.BAD;// saját figura ütése lenne if (result != MoveResult.OK) {// szabálytalan lépés cancelMove();// vissza alapállapotba return false; } // ez még nem a dropPiece metódus vége

12 Chessboard.dropPiece vége for (Square s : passedSquares) { if (getPiece(s) != null) { cancelMove(); return false; } whiteOnTurn = !whiteOnTurn;// másik játékos jön grabbedPiece.moved = true;// ez a figura már lépett pieceArray[moveStartSquare.file][moveStartSquare.rank] = null;// levesszük a régiről finishMove(toSquare);// felrakjuk az új helyre return true; }

13 új metódus: Chessboard.move public boolean move(Square fromSquare, Square toSquare) { if (grabPiece(fromSquare)) { if (dropPiece(toSquare)) { return true; } return false; }

14 ConsoleController.mainLoop System.out.println("move from: " + new Square(fromFile, fromRank) + " to: " + new Square(toFile, toRank)); boolean valid = board.move( new Square(fromFile, fromRank), new Square(toFile, toRank)); if(!valid) { view.printMessage("Invalid move!"); }

15 Próbafuttatás tudunk lépni csak a világos, illetve sötét figurákkal, felváltva ellenséges figurát le tudunk ütni, saját figurát nem de egyébként bárhonnan bárhova

16 King.canMove MoveResult canMove(Square fromSquare, Square toSquare, LinkedList passedSquares) { if (fromSquare.file == toSquare.file && fromSquare.rank == toSquare.rank) { return MoveResult.BAD; } if (Math.abs(fromSquare.file - toSquare.file) <= 1 && Math.abs(fromSquare.rank - toSquare.rank) <= 1) { return MoveResult.OK; } return MoveResult.BAD; }

17 Pawn.canMove MoveResult canMove(Square fromSquare, Square toSquare, LinkedList passedSquares){ if (fromSquare.file == toSquare.file && fromSquare.rank == toSquare.rank) { return MoveResult.BAD; } int di = Math.abs(fromSquare.file - toSquare.file); int dj = toSquare.rank - fromSquare.rank; int dir = white ? 1 : -1; if (!moved && dj == 2 * dir && di == 0) // kettőt előre { passedSquares.add(new Square(fromSquare.file, fromSquare.rank + dir)); return MoveResult.IFNOTATTACKING; }

18 Pawn.canMove folyt. if (dj == dir)// egyet előre { if (di == 1)// egyet oldalt (csak ha ütés) { return MoveResult.IFATTACKING; } if (di == 0)// így nem tud ütni, csak lépni { return MoveResult.IFNOTATTACKING; } return MoveResult.BAD; }

19 Knight.canMove MoveResult canMove(Square fromSquare, Square toSquare, LinkedList passedSquares) { if (fromSquare.file == toSquare.file && fromSquare.rank == toSquare.rank) { return MoveResult.BAD; } int di = Math.abs(fromSquare.file - toSquare.file); int dj = Math.abs(fromSquare.rank - toSquare.rank); if (di + dj == 3 && di * dj != 0) { return MoveResult.OK; } return MoveResult.BAD; }

20 Queen.canMove MoveResult canMove(Square fromSquare, Square toSquare, LinkedList passedSquares) { if (fromSquare.file == toSquare.file && fromSquare.rank == toSquare.rank) return MoveResult.BAD; int di = Math.abs(toSquare.file - fromSquare.file); int dj = Math.abs(toSquare.rank - fromSquare.rank); if (di == 0 || dj == 0 || di == dj) { int steps = Math.max(di, dj); di = (int) Math.signum( toSquare.file - fromSquare.file); dj = (int) Math.signum( toSquare.rank - fromSquare.rank); for (int i = 1; i < steps; i++) passedSquares.add( new Square(fromSquare.file + i * di, fromSquare.rank + i * dj)); return MoveResult.OK; } return MoveResult.BAD; }

21 Önálló feladat A Queen.canMove alapján megírni a bástya és a futó lépéseit – teljesen ugyanaz, csak a if (di == 0 || dj == 0 || di == dj) sorból kell kivenni a szükségtelen eseteket 2 perc

22 Próbafuttatás szabályos lépéseket lehet tenni alaphelyzetből a gyalog kettőt léphet nem vizsgáljuk a sakkot, mattot a király is üthető nincs sánc és en passant nincs gyalogátváltozás

23 Önálló feladat legyen gyalogátváltozás (csak vezérré) – a Chessboard.finishMove -ban, amikor a figurát letesszük az új helyre, vizsgáljuk ha gyalog és világos a 8. soron vagy sötét az 1. soron – figyeljünk a 0 bázisú indexelésre akkor az új helyre egy vezért teszünk – pieceArray[toSquare.file][toSquare.rank] = new Queen( ) – a régi figurát majd kidobja a szemétgyűjtő 8 perc

24 Önálló feladat ne négykarakteres parancsot olvassunk be, hanem csak egy kétkaraktereset – ha nincs figura megfogva (!isPieceGrabbed), próbáljunk egyet megfogni (grabPiece) írjuk ki, hogy sikerült/nem sikerült – ha van megfogott figura, lépjünk vele a begépelt mezőre írjuk ki, hogy sikerült/nem sikerült 8 perc

25 II. labor vége – szorgalmi feladat extra szabályok megvalósítása – sánc e1g1 vagy e1c1 (világossal) ha sem a király sem a bástya nem mozdult még (Piece.moved) ha nincs köztük semmi mindkettőt át kell rakni (Chessboard.dropPiece-ben érdemes kezelni az egészet) – en passant fantomgyalog nyilvántartása a Chessboardban ezt ütő gyaloglépés OK, az igazi gyalogot kell levenni


Letölteni ppt "II. labor Lépések kezelése. Új metódus a Square osztályba public static int letterToFileIndex(char letter) throws NumberFormatException { int i = 0; for."

Hasonló előadás


Google Hirdetések