From 8e75537af76a9c82f690bde5fd27ca0fe97d4fcc Mon Sep 17 00:00:00 2001 From: Fabian Fichter Date: Sat, 18 Apr 2020 14:27:54 +0200 Subject: [PATCH] Support casual rules of Janggi In casual rules, bikjang is a draw, which is enabled for variant `janggicasual`. Closes #101. --- src/parser.cpp | 2 +- src/position.cpp | 9 +++++---- src/variant.cpp | 9 ++++++++- src/variant.h | 2 +- src/variants.ini | 2 +- 5 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/parser.cpp b/src/parser.cpp index eeaf00c..cc12034 100644 --- a/src/parser.cpp +++ b/src/parser.cpp @@ -257,7 +257,7 @@ Variant* VariantParser::parse(Variant* v) { parse_attribute("checkmateValue", v->checkmateValue); parse_attribute("shogiPawnDropMateIllegal", v->shogiPawnDropMateIllegal); parse_attribute("shatarMateRule", v->shatarMateRule); - parse_attribute("bikjangRule", v->bikjangRule); + parse_attribute("bikjangValue", v->bikjangValue); parse_attribute("bareKingValue", v->bareKingValue); parse_attribute("extinctionValue", v->extinctionValue); parse_attribute("bareKingMove", v->bareKingMove); diff --git a/src/position.cpp b/src/position.cpp index c21ed7d..a9225e8 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -499,7 +499,7 @@ void Position::set_check_info(StateInfo* si) const { si->checkSquares[pt] = ksq != SQ_NONE ? attacks_bb(~sideToMove, pt, ksq, pieces()) : Bitboard(0); si->checkSquares[KING] = 0; si->shak = si->checkersBB & (byTypeBB[KNIGHT] | byTypeBB[ROOK] | byTypeBB[BERS]); - si->bikjang = var->bikjangRule && ksq != SQ_NONE ? bool(attacks_bb(sideToMove, ROOK, ksq, pieces()) & pieces(sideToMove, KING)) : false; + si->bikjang = var->bikjangValue != VALUE_NONE && ksq != SQ_NONE ? bool(attacks_bb(sideToMove, ROOK, ksq, pieces()) & pieces(sideToMove, KING)) : false; } @@ -1941,8 +1941,8 @@ bool Position::is_immediate_game_end(Value& result, int ply) const { } } // Check for bikjang rule (Janggi) - if (var->bikjangRule && st->pliesFromNull > 0 && ( (st->bikjang && st->previous->bikjang) - || (st->pass && st->previous->pass))) + if (var->bikjangValue != VALUE_NONE && st->pliesFromNull > 0 && ( (st->bikjang && st->previous->bikjang) + || (st->pass && st->previous->pass))) { // material counting auto weigth_count = [this](PieceType pt, int v){ return v * (count(WHITE, pt) - count(BLACK, pt)); }; @@ -1953,7 +1953,8 @@ bool Position::is_immediate_game_end(Value& result, int ply) const { + weigth_count(WAZIR, 3) + weigth_count(SOLDIER, 2) - 1; - result = (sideToMove == WHITE) == (materialCount > 0) ? mate_in(ply) : mated_in(ply); + bool stmUpMaterial = (sideToMove == WHITE) == (materialCount > 0); + result = convert_mate_value(stmUpMaterial ? var->bikjangValue : -var->bikjangValue, ply); return true; } // Tsume mode: Assume that side with king wins when not in check diff --git a/src/variant.cpp b/src/variant.cpp index 1202da8..c5ce97b 100644 --- a/src/variant.cpp +++ b/src/variant.cpp @@ -871,7 +871,7 @@ namespace { v->mobilityRegion[BLACK][WAZIR] = black_castle; v->soldierPromotionRank = RANK_1; v->flyingGeneral = false; - v->bikjangRule = true; + v->bikjangValue = VALUE_MATE; v->diagonalLines = make_bitboard(SQ_D1, SQ_F1, SQ_E2, SQ_D3, SQ_F3, SQ_D8, SQ_F8, SQ_E9, SQ_D10, SQ_F10); v->kingPass = true; @@ -879,6 +879,12 @@ namespace { v->perpetualCheckIllegal = true; return v; } + // Casual rules of Janggi, where bikjang is a draw + Variant* janggi_casual_variant() { + Variant* v = janggi_variant(); + v->bikjangValue = VALUE_DRAW; + return v; + } #endif } // namespace @@ -963,6 +969,7 @@ void VariantMap::init() { add("manchu", manchu_variant()); add("supply", supply_variant()); add("janggi", janggi_variant()); + add("janggicasual", janggi_casual_variant()); #endif } diff --git a/src/variant.h b/src/variant.h index a9790c1..dfcf556 100644 --- a/src/variant.h +++ b/src/variant.h @@ -103,7 +103,7 @@ struct Variant { Value checkmateValue = -VALUE_MATE; bool shogiPawnDropMateIllegal = false; bool shatarMateRule = false; - bool bikjangRule = false; + Value bikjangValue = VALUE_NONE; Value bareKingValue = VALUE_NONE; Value extinctionValue = VALUE_NONE; bool bareKingMove = false; diff --git a/src/variants.ini b/src/variants.ini index 96171bc..d65c060 100644 --- a/src/variants.ini +++ b/src/variants.ini @@ -160,7 +160,7 @@ # checkmateValue: result in case of checkmate [Value] (default: loss) # shogiPawnDropMateIllegal: prohibit checkmate via shogi pawn drops [bool] (default: false) # shatarMateRule: enable shatar mating rules [bool] (default: false) -# bikjangRule: enable Janggi bikjang rule (facing kings) [bool] (default: false) +# bikjangValue: result in case of Janggi bikjang (facing kings) for the player with more points [Value] (default: ) # bareKingValue: result when player only has a lone/bare king [Value] (default: ) # extinctionValue: result when one of extinctionPieceTypes is extinct [Value] (default: ) # bareKingMove: allow additional move by opponent after lone/bare king position [bool] (default: false) -- 1.7.0.4