kanjiPrint.cc
Go to the documentation of this file.
00001 #include "osl/record/kanjiPrint.h"
00002 #include "osl/record/kanjiCode.h"
00003 #include "osl/ptype.h"
00004 #include "osl/pieceStand.h"
00005 #include "osl/move.h"
00006 #include "osl/misc/carray.h"
00007 #ifndef _WIN32
00008 #include "osl/misc/iconvConvert.h"
00009 #else
00010 #include "osl/misc/characterEncodingConvertWin32.h"
00011 #endif
00012 #include <boost/foreach.hpp>
00013 #include <iostream>
00014 #include <string>
00015 #include <algorithm>
00016 #include <cctype>
00017 
00018 bool caseInsentiveCharCompare(char a, char b)
00019 {
00020   return toupper(a) == toupper(b);
00021 }
00022 
00023 bool caseInsentiveCompare(const std::string& s1, const std::string& s2)
00024 {
00025   return s1.size() == s2.size() &&
00026          equal(s1.begin(), s1.end(), s2.begin(), caseInsentiveCharCompare);
00027 }
00028 
00029 const osl::record::Color osl::record::Color::NONE        ("", "NONE", false);
00030 const osl::record::Color osl::record::Color::Black       ("0;30", "BLACK");
00031 const osl::record::Color osl::record::Color::Red         ("0;31", "RED");
00032 const osl::record::Color osl::record::Color::Green       ("0;32", "GREEN");
00033 const osl::record::Color osl::record::Color::Brown       ("0;33", "BROWN");
00034 const osl::record::Color osl::record::Color::Blue        ("0;34", "BLUE");
00035 const osl::record::Color osl::record::Color::Purple      ("0;35", "PURPLE");
00036 const osl::record::Color osl::record::Color::Cyan        ("0;36", "CYAN");
00037 const osl::record::Color osl::record::Color::LightGray   ("0;37", "LIGHTGRAY");
00038 const osl::record::Color osl::record::Color::DarkGray    ("1;30", "DARKGRAY");
00039 const osl::record::Color osl::record::Color::LightRed    ("1;31", "LIGHTRED");
00040 const osl::record::Color osl::record::Color::LightGreen  ("1;32", "LIGHTGREEN");
00041 const osl::record::Color osl::record::Color::Yellow      ("1;33", "YELLOW");
00042 const osl::record::Color osl::record::Color::LightBlue   ("1;34", "LIGHTBLUE");
00043 const osl::record::Color osl::record::Color::LightPurple ("1;35", "LIGHTPURPLE");
00044 const osl::record::Color osl::record::Color::LightCyan   ("1;36", "LIGHTCYAN");
00045 const osl::record::Color osl::record::Color::White       ("1;37", "WHITE");
00046 
00047 const osl::record::Color osl::record::
00048 Color::colorFor(const std::string& str)
00049 {
00050   static const CArray<const osl::record::Color,17> colors = {{
00051     osl::record::Color::NONE,
00052     osl::record::Color::Black, osl::record::Color::Red, 
00053     osl::record::Color::Green, osl::record::Color::Brown, 
00054     osl::record::Color::Blue, osl::record::Color::Purple, 
00055     osl::record::Color::Cyan, osl::record::Color::LightGray, 
00056     osl::record::Color::DarkGray, osl::record::Color::LightRed,
00057     osl::record::Color::LightGreen, osl::record::Color::Yellow, 
00058     osl::record::Color::LightBlue, osl::record::Color::LightPurple, 
00059     osl::record::Color::LightCyan, osl::record::Color::White}};
00060 
00061   BOOST_FOREACH(const record::Color& c, colors)
00062   {
00063     if (caseInsentiveCompare(str, c.getName()))
00064       return c;
00065   }
00066   return osl::record::Color::NONE;
00067 }
00068 
00069 osl::record::Color::Color(const std::string& value, const std::string& name, const bool valid)
00070   : value(value), name(name), valid(valid) 
00071 {
00072 }
00073 osl::record::Color::~Color()
00074 {
00075 }
00076 
00077 std::string osl::record::
00078 kanjiNumber(const int n)
00079 {
00080   assert((1 <= n) && (n <= 18));
00081   switch(n) {
00082     case 1: return K_K1;
00083     case 2: return K_K2;
00084     case 3: return K_K3;
00085     case 4: return K_K4;
00086     case 5: return K_K5;
00087     case 6: return K_K6;
00088     case 7: return K_K7;
00089     case 8: return K_K8;
00090     case 9: return K_K9;
00091     case 10: return K_K10;
00092     case 11: return K_K11;
00093     case 12: return K_K12;
00094     case 13: return K_K13;
00095     case 14: return K_K14;
00096     case 15: return K_K15;
00097     case 16: return K_K16;
00098     case 17: return K_K17;
00099     case 18: return K_K18;
00100   }
00101   assert(false);
00102   return "";
00103 }
00104 
00105 osl::record::Characters::~Characters()
00106 {
00107 }
00108 
00109 const osl::misc::CArray<std::string,32> osl::record::Characters::stand = 
00110   {{// WHITE
00111     K_NAKAGURO, "+E",
00112     K_PPAWN, K_PLANCE, K_PKNIGHT, K_PSILVER, K_PBISHOP, K_PROOK,  K_KING, 
00113     K_GOLD,  K_PAWN,   K_LANCE,   K_KNIGHT,  K_SILVER,  K_BISHOP, K_ROOK, 
00114     // BLACK
00115     K_NAKAGURO, "+E",
00116     K_PPAWN, K_PLANCE, K_PKNIGHT, K_PSILVER, K_PBISHOP, K_PROOK,  K_KING, 
00117     K_GOLD,  K_PAWN,   K_LANCE,   K_KNIGHT,  K_SILVER,  K_BISHOP, K_ROOK
00118   }};
00119 
00120 const osl::misc::CArray<std::string,10> osl::record::StandardCharacters::dan = 
00121   {{"", K_K1, K_K2, K_K3, K_K4, K_K5, K_K6, K_K7, K_K8, K_K9}};
00122 const osl::misc::CArray<std::string,10> osl::record::StandardCharacters::suji = 
00123   {{"", K_R1, K_R2, K_R3, K_R4, K_R5, K_R6, K_R7, K_R8, K_R9}};
00124 const osl::misc::CArray<std::string,32> osl::record::StandardCharacters::pieces = 
00125   {{// WHITE
00126     K_NAKAGURO, "+E",
00127     K_PPAWN, K_PLANCE, K_PKNIGHT, K_PSILVER, K_PBISHOP, K_PROOK,  K_KING, 
00128     K_GOLD,  K_PAWN,   K_LANCE,   K_KNIGHT,  K_SILVER,  K_BISHOP, K_ROOK, 
00129     // BLACK
00130     K_NAKAGURO, "+E",
00131     K_PPAWN, K_PLANCE, K_PKNIGHT, K_PSILVER, K_PBISHOP, K_PROOK,  K_KING, 
00132     K_GOLD,  K_PAWN,   K_LANCE,   K_KNIGHT,  K_SILVER,  K_BISHOP, K_ROOK
00133   }};
00134 
00135 const osl::misc::CArray<std::string,10> osl::record::RussianCharacters::dan = osl::record::StandardCharacters::dan;
00136 const osl::misc::CArray<std::string,10> osl::record::RussianCharacters::suji = osl::record::StandardCharacters::suji;
00137 const osl::misc::CArray<std::string,32> osl::record::RussianCharacters::pieces = 
00138   {{// WHITE
00139     K_NAKAGURO, "+E",
00140     K_PPAWN_R, K_PLANCE_R, K_PKNIGHT_R, K_PSILVER_R, K_PBISHOP_R, K_PROOK_R,  K_KING_R,
00141     K_GOLD_R,  K_PAWN_R,   K_LANCE_R,   K_KNIGHT_R,  K_SILVER_R,  K_BISHOP_R, K_ROOK_R, 
00142     // BLACK
00143     K_NAKAGURO, "+E",
00144     K_PPAWN, K_PLANCE, K_PKNIGHT, K_PSILVER, K_PBISHOP, K_PROOK,  K_KING, 
00145     K_GOLD,  K_PAWN,   K_LANCE,   K_KNIGHT,  K_SILVER,  K_BISHOP, K_ROOK
00146   }};
00147 
00148 const osl::misc::CArray<std::string,10> osl::record::KIFCharacters::dan = 
00149   osl::record::StandardCharacters::dan;
00150 const osl::misc::CArray<std::string,10> osl::record::KIFCharacters::suji = 
00151   {{"", " " K_R1, " " K_R2, " " K_R3, " " K_R4, " " K_R5, " " K_R6, " " K_R7, " " K_R8, " " K_R9}};
00152 const osl::misc::CArray<std::string,32> osl::record::KIFCharacters::pieces = 
00153   {{// WHITE
00154     " " K_NAKAGURO, "+E",
00155     "v" K_PPAWN, "v" K_PLANCE, "v" K_PKNIGHT, "v" K_PSILVER, "v" K_PBISHOP, "v" K_PROOK,  "v" K_KING, 
00156     "v" K_GOLD,  "v" K_PAWN,   "v" K_LANCE,   "v" K_KNIGHT,  "v" K_SILVER,  "v" K_BISHOP, "v" K_ROOK,
00157     // BLACK
00158     " " K_NAKAGURO, "+E",
00159     " " K_PPAWN, " " K_PLANCE, " " K_PKNIGHT, " " K_PSILVER, " " K_PBISHOP, " " K_PROOK,  " " K_KING, 
00160     " " K_GOLD,  " " K_PAWN,   " " K_LANCE,   " " K_KNIGHT,  " " K_SILVER,  " " K_BISHOP, " " K_ROOK
00161   }};
00162 
00163 
00164 std::ostream& osl::record::
00165 operator<<(std::ostream& os, const Color& c)
00166 {
00167   return os << c.value;
00168 }
00169 
00170 void osl::record::ChangeShellColor::
00171 escColSet() const
00172 {
00173    if (!color.isValid()) return;
00174    os << "\033[" << color << "m"; //文字の属性をセットする
00175 }
00176 
00177 void osl::record::ChangeShellColor::
00178 escColReSet() const
00179 {
00180    if (!color.isValid()) return;
00181    os << "\033[0m";
00182 }
00183 
00184 void osl::record::KanjiPrint::
00185 print(const osl::state::SimpleState& state, 
00186       const osl::Move *last_move) const
00187 {
00188   os <<
00189 #ifndef _WIN32
00190     IconvConvert::
00191 #endif
00192     eucToLang(K_WHITE_STAND) << " ";
00193   BOOST_FOREACH(Ptype ptype, PieceStand::order)
00194   {
00195     const int count = state.countPiecesOnStand(WHITE, ptype);
00196     if (count)
00197       os <<
00198 #ifndef _WIN32
00199         IconvConvert::
00200 #endif
00201         eucToLang(pieces->stand_kanji(newPtypeO(BLACK, ptype)))
00202          << count << " ";
00203   }
00204   os << std::endl;  
00205 
00206   os << " ";
00207   for(int x=9;x>0;x--)
00208   {
00209     os <<
00210 #ifndef _WIN32
00211       IconvConvert::
00212 #endif
00213       eucToLang(pieces->getSuji(x));
00214   }
00215   os << std::endl;  
00216 
00217   os << "+";
00218   for(int x=9*pieces->getSuji(1).size();x>0;x--)
00219   {
00220     os << "-";
00221   }
00222   os << "+" << std::endl;
00223 
00224   for(int y=1;y<=9;y++)
00225   {
00226     os << '|';  
00227     for(int x=9;x>0;x--)
00228     {
00229       const PtypeO ptypeo = state.pieceOnBoard(Square(x,y)).ptypeO();
00230       const std::string piece =
00231 #ifndef _WIN32
00232         IconvConvert::
00233 #endif
00234         eucToLang(pieces->kanji(ptypeo));
00235       if (last_move && 
00236           !last_move->isInvalid() && 
00237           last_move->to() == Square(x,y))
00238       {
00239         ChangeShellColor csc(os, last_move_color);
00240         os << piece;
00241       } // csc destroyed
00242       else if (isPiece(ptypeo)) {
00243         Player owner = getOwner(ptypeo);
00244         osl::record::Color color; 
00245         if (owner == BLACK)
00246           color = black_color;
00247         else
00248           color = white_color;
00249         ChangeShellColor csc(os, color);
00250         os << piece;
00251       } // csc destroyed
00252       else
00253       { // empty space
00254         os << piece;
00255       }
00256     }
00257     os << '|';  
00258     os <<
00259 #ifndef _WIN32
00260       IconvConvert::
00261 #endif
00262       eucToLang(pieces->getDan(y));
00263 
00264     os << std::endl;
00265   }
00266 
00267   os << "+";
00268   for(int x=9*pieces->getSuji(1).size();x>0;x--)
00269   {
00270     os << "-";
00271   }
00272   os << "+" << std::endl;
00273 
00274   // 持ち駒の表示
00275   os <<
00276 #ifndef _WIN32
00277     IconvConvert::
00278 #endif
00279     eucToLang(K_BLACK_STAND) << " ";
00280   BOOST_FOREACH(Ptype ptype, PieceStand::order)
00281   {
00282     const int count = state.countPiecesOnStand(BLACK, ptype);
00283     if (count)
00284       os <<
00285 #ifndef _WIN32
00286         IconvConvert::
00287 #endif
00288         eucToLang(pieces->stand_kanji(newPtypeO(BLACK, ptype)))
00289          << count << " ";
00290   }
00291   os << std::endl;  
00292   os << state.turn() << std::endl;
00293 }
00294 
00295 /* ------------------------------------------------------------------------- */
00296 // ;;; Local Variables:
00297 // ;;; mode:c++
00298 // ;;; c-basic-offset:2
00299 // ;;; End:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines