00001
00002
00003
00004
00005
00006 #include "SgSystem.h"
00007 #include "GoRules.h"
00008
00009 #include <cmath>
00010 #include <limits>
00011 #include <iostream>
00012 #include "SgException.h"
00013
00014 using namespace std;
00015
00016
00017
00018 GoRules::GoRules(int handicap, const GoKomi& komi, bool japanese,
00019 bool twoPassesEndGame)
00020 : m_allowSuicide(false),
00021 m_captureDead(false),
00022 m_japaneseScoring(japanese),
00023 m_extraHandicapKomi(false),
00024 m_handicap(handicap),
00025 m_komi(komi),
00026 m_japaneseHandicap(japanese),
00027 m_twoPassesEndGame(twoPassesEndGame),
00028 m_koRule(SUPERKO)
00029 {
00030 }
00031
00032 bool GoRules::operator==(const GoRules& rules) const
00033 {
00034 return m_allowSuicide == rules.m_allowSuicide
00035 && m_captureDead == rules.m_captureDead
00036 && m_handicap == rules.m_handicap
00037 && m_komi == rules.m_komi
00038 && m_japaneseHandicap == rules.m_japaneseHandicap
00039 && m_japaneseScoring == rules.m_japaneseScoring
00040 && m_extraHandicapKomi == rules.m_extraHandicapKomi
00041 && m_twoPassesEndGame == rules.m_twoPassesEndGame
00042 && m_koRule == rules.m_koRule;
00043 }
00044
00045 void GoRules::SetNamedRules(const std::string& namedRules)
00046 {
00047 if (namedRules == "cgos")
00048 {
00049 SetAllowSuicide(false);
00050 SetJapaneseHandicap(false);
00051 SetJapaneseScoring(false);
00052 SetKoRule(POS_SUPERKO);
00053 SetCaptureDead(true);
00054 SetExtraHandicapKomi(false);
00055 }
00056 else if (namedRules == "chinese")
00057 {
00058 SetAllowSuicide(false);
00059 SetJapaneseHandicap(false);
00060 SetJapaneseScoring(false);
00061 SetKoRule(POS_SUPERKO);
00062 SetCaptureDead(false);
00063 SetExtraHandicapKomi(false);
00064 }
00065 else if (namedRules == "japanese")
00066 {
00067 SetAllowSuicide(false);
00068 SetJapaneseHandicap(true);
00069 SetJapaneseScoring(true);
00070 SetKoRule(SIMPLEKO);
00071 SetCaptureDead(false);
00072 SetExtraHandicapKomi(false);
00073 }
00074 else if (namedRules == "kgs")
00075 {
00076 SetAllowSuicide(false);
00077 SetJapaneseHandicap(false);
00078 SetJapaneseScoring(false);
00079 SetKoRule(POS_SUPERKO);
00080 SetCaptureDead(false);
00081 SetExtraHandicapKomi(true);
00082 }
00083 else
00084 throw SgException("Unknown rules: " + namedRules);
00085 }
00086
00087
00088
00089 std::ostream& operator<<(std::ostream& out, GoRules::KoRule koRule)
00090 {
00091 switch (koRule)
00092 {
00093 case GoRules::SIMPLEKO:
00094 out << "simple";
00095 break;
00096 case GoRules::SUPERKO:
00097 out << "superko";
00098 break;
00099 case GoRules::POS_SUPERKO:
00100 out << "positional_superko";
00101 break;
00102 default:
00103 SG_ASSERT(false);
00104 }
00105 return out;
00106 }
00107
00108
00109