diff --git a/src/dev/kske/chess/uci/UCIHandle.java b/src/dev/kske/chess/uci/UCIHandle.java index a2b8f53..777d769 100644 --- a/src/dev/kske/chess/uci/UCIHandle.java +++ b/src/dev/kske/chess/uci/UCIHandle.java @@ -103,13 +103,84 @@ public class UCIHandle { public void positionMoves(List moves) { StringJoiner joiner = new StringJoiner(" "); moves.forEach(m -> joiner.add(m.toLAN())); - out.println("position moves " + joiner.toString()); + out.println("position moves " + joiner); } - // TODO: go with parameters - + /** + * Starts calculating on the current position. + */ public void go() { out.println("go"); } + /** + * Starts calculating on the current position. + * This command has multiple optional parameters which will only be included in + * the call if they are not {@code null}, greater than zero or {@code true} for + * {@code searchMoves}, all integer parameters and all boolean parameters + * respectively. + * + * @param searchMoves restrict the search to these moves only + * @param ponder start the search in ponder mode + * @param wTime the amount of milliseconds left on white's clock + * @param bTime the amount of milliseconds left on black's clocks + * @param wInc white's increment per move in milliseconds + * @param bInc black's increment per move in milliseconds + * @param movesToGo the number of moves left until the next time control + * @param depth the maximal amount of plies to search + * @param nodes the maximal amount of nodes to search + * @param mate the amount of moves in which to search for a mate + * @param moveTime the exact search time + * @param infinite search until the {@code stop} command + */ + public void go(List searchMoves, boolean ponder, int wTime, int bTime, int wInc, int bInc, int movesToGo, int depth, int nodes, int mate, + int moveTime, boolean infinite) { + StringJoiner joiner = new StringJoiner(" "); + joiner.add("go"); + + if (searchMoves != null && !searchMoves.isEmpty()) { + joiner.add("searchmoves"); + searchMoves.forEach(m -> joiner.add(m.toLAN())); + } + if (ponder) joiner.add("ponder"); + if (wTime > 0) { + joiner.add("wtime"); + joiner.add(String.valueOf(wTime)); + } + if (bTime > 0) { + joiner.add("btime"); + joiner.add(String.valueOf(bTime)); + } + if (wInc > 0) { + joiner.add("winc"); + joiner.add(String.valueOf(wInc)); + } + if (bInc > 0) { + joiner.add("bind"); + joiner.add(String.valueOf(bInc)); + } + if (movesToGo > 0) { + joiner.add("movestogo"); + joiner.add(String.valueOf(movesToGo)); + } + if (depth > 0) { + joiner.add("depth"); + joiner.add(String.valueOf(depth)); + } + if (nodes > 0) { + joiner.add("nodes"); + joiner.add(String.valueOf(nodes)); + } + if (mate > 0) { + joiner.add("mate"); + joiner.add(String.valueOf(mate)); + } + if (moveTime > 0) { + joiner.add("movetime"); + joiner.add(String.valueOf(moveTime)); + } + if (infinite) joiner.add("infinite"); + out.println(joiner); + } + /** * Stops calculation as soon as possible. */