Advertisement
Mlxa

GAME Virus

Jan 25th, 2018
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.70 KB | None | 0 0
  1. #include <cassert>
  2. #include <random>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <iomanip>
  6. #include <clocale>
  7. using namespace std;
  8.  
  9. const string space = ".";       /// It should be given in templates...
  10.  
  11. typedef long long ll;
  12. #define read                cin
  13. #define eol                 '\n'
  14. #define endln               cout << eol
  15. #define all(x)              begin(x), end(x)
  16. template <class A>              inline void print   (A a)           { cout << a << ' '; }
  17. template <class A>              inline void println (A a)           { cout << a << eol; }
  18. template <class A, class... B>  inline void println (A a, B... b)   { print(a); println(b...); }
  19. template <class A>              inline void err     (A a)         { cerr << a << ' '; }
  20. template <class A>              inline void errln   (A a)         { cerr << a << eol; }
  21. template <class A, class... B>  inline void errln   (A a, B... b) { err(a); errln(b...); }
  22.  
  23.  
  24. ////////////////////////////////////////////////////////
  25. ////////////////////////////////////////////////////////
  26. ////////////////////////////////////////////////////////
  27.  
  28.  
  29. template <
  30. ostream &out,
  31. size_t hSize = 10, size_t wSize = 10,
  32. size_t sparse = 2
  33. >
  34. class MatrixPrinter
  35. {
  36.     private:
  37.  
  38.     string M[hSize][wSize];
  39.  
  40.     public:
  41.  
  42.     void print (size_t iS = 0, size_t iF = hSize,
  43.                 size_t jS = 0, size_t jF = wSize)
  44.     {
  45.         out << string(4*(jF - jS)+5, '-') << eol;
  46.  
  47.         out << "№\t";
  48.         for (size_t j = jS; j < jF; ++ j)
  49.         if (j % sparse == 0)
  50.             out << '\t' << j;
  51.         else
  52.             out << "    ";
  53.         out << eol;
  54.         out << " \t+---";
  55.         for (size_t j = jS + 1; j < jF; ++ j)
  56.             out << "+---";
  57.         out << "+" << eol;
  58.  
  59.         for (size_t i = iS; i < iF; ++ i)
  60.         {
  61.             out << i << "\t|";
  62.             for (size_t j = jS; j < jF; ++ j)
  63.                 out << '\t' << M[i][j];
  64.             out << eol;
  65.         }
  66.         out << string(4*(jF - jS)+5, '-') << eol;
  67.     }
  68.  
  69.     void setPoint (size_t i, size_t j, string c)
  70.     {   M[i][j] = c;    }
  71.  
  72.     string getPoint (size_t i, size_t j)
  73.     {
  74.         if (i < hSize && j < wSize)
  75.             return M[i][j];
  76.         return "";
  77.     }
  78.  
  79.     MatrixPrinter ()
  80.     {
  81.         for (size_t i = 0; i < hSize; ++ i)
  82.             for (size_t j = 0; j < wSize; ++ j)
  83.                 M[i][j] = space;
  84.         out << "MatrixPrinter запущен!" << eol << eol;
  85.     }
  86. };
  87.  
  88. ////////////////////////////////////////////////////////
  89. ////////////////////////////////////////////////////////
  90. ////////////////////////////////////////////////////////
  91.  
  92.  
  93. const bool  LOG_TO_FILE     = false;
  94. const  size_t   I           = 5,    /// Field size
  95.                 J           = 5,
  96.                 K           = 3;    /// Points per turn
  97.  
  98. const string    a   =   "м",
  99.                 b   =   "ж",
  100.                 A   =   "М",
  101.                 B   =   "Ж";
  102. MatrixPrinter<cout, 5, 5, 1> mp;
  103.  
  104. //  #define DEBUG_INFO
  105. #ifdef      DEBUG_INFO
  106.     #define addLog(...) errln("[ log ]   ", __VA_ARGS__)
  107. #else
  108.     #define addLog(...) (void(0))
  109. #endif
  110.  
  111.  
  112. bool        FIRST_PLAYER    = false;
  113. void initialize ()
  114. {
  115.     #ifdef DEBUG_INFO
  116.         if (LOG_TO_FILE)
  117.             freopen("log.txt", "w", stderr);
  118.     #endif
  119.  
  120.     println("Hello!");
  121.     println("Will you be a first player? (1 = yes, 0 = no)");
  122.     read >> FIRST_PLAYER;
  123.     println("Your answer:", FIRST_PLAYER);
  124.  
  125.  
  126.     mp.setPoint(0, 0, a);
  127.     mp.setPoint(I - 1, J - 1, b);
  128.     mp.print();
  129. }
  130.  
  131. struct crypto_t
  132. {
  133.     mt19937 getRand;
  134.     const ll MUL = 10;
  135.  
  136.     crypto_t (ll s) :   getRand(s)      {}
  137.     crypto_t ()     :   crypto_t(19)    {}
  138.  
  139.     inline size_t zip (size_t i, size_t j)
  140.     {
  141.         size_t result = MUL*i + j;
  142.         return result;
  143.     }
  144.     void unzip (size_t n, size_t &i, size_t &j)
  145.     {
  146.         i = n / MUL;
  147.         j = n % MUL;
  148.     }
  149. }; crypto_t crypto;
  150.  
  151.  
  152. bool checkPoint (size_t i, size_t j, string c)
  153. {
  154.     return mp.getPoint(i, j + 1) == c
  155.         || mp.getPoint(i, j - 1) == c
  156.         || mp.getPoint(i + 1, j) == c
  157.         || mp.getPoint(i - 1, j) == c;
  158. }
  159.  
  160.  
  161. bool canGo (ll i, ll j)
  162. {
  163.     if (    mp.getPoint(i, j) == a
  164.         ||  mp.getPoint(i, j) == A )
  165.     {
  166.         println("[ X ] It already belongs to you.");
  167.         return false;
  168.     }
  169.     if ( checkPoint(i, j, a) )
  170.     {
  171.         if ( mp.getPoint(i,j) == B )
  172.         {
  173.             println("[ X ] There is enemy's fortress. (You can't eat it) ");
  174.             return false;
  175.         }
  176.         println("[ V ] I think you can go there...");
  177.         return true;
  178.     } else
  179.     {
  180.         if ( checkPoint(i, j, A) )
  181.         {
  182.             println("[ ? ] Make sure, that fortress are connected and go.");
  183.             println("Is the fortress connected?");
  184.             string ans; read >> ans;
  185.             return (ans == "yes" || ans == "Yes" || ans == "YES" || ans == "1");
  186.         }
  187.         println("[ X ] This point isn't connected.");
  188.         return false;
  189.     }
  190. }
  191.  
  192.  
  193. bool usrGo (ll i, ll j)
  194. {
  195.     if (canGo(i, j))
  196.     {
  197.         if (mp.getPoint(i,j) == space)  mp.setPoint(i, j, a);
  198.         if (mp.getPoint(i,j) == b)      mp.setPoint(i, j, A);
  199.         mp.print();
  200.         return true;
  201.  
  202.     } else
  203.     {
  204.         println("Try again...");
  205.         return false;
  206.     }
  207. }
  208.  
  209.  
  210. ll usrTurn ()
  211. {
  212.     ll i, j;
  213.     do { read >> i >> j; }
  214.     while (! usrGo(i, j));
  215.     return crypto.zip(i, j);
  216. }
  217.  
  218.  
  219. void netTurn (size_t net)
  220. {
  221.     size_t i, j;
  222.     crypto.unzip(net, i, j);
  223.     i = I-1 - i;            /// reversing
  224.     j = J-1 - j;            /// reversing
  225.     println("Oponent goes to", i, j);
  226.     if (mp.getPoint(i, j) == a)     mp.setPoint(i, j, B);
  227.     if (mp.getPoint(i, j) == space) mp.setPoint(i, j, b);
  228. }
  229.  
  230.  
  231.  
  232. int main ()
  233. {
  234.     setlocale(0, "");
  235.     initialize();
  236.  
  237.     for (ll turns = 1; turns <= 1024; )
  238.     {
  239.         if (FIRST_PLAYER) {
  240.             println("\n\n\nTurn #", turns ++);
  241.             for (ll i=K;i--;) println("\t\t\t\t\tYour point", usrTurn());
  242.             mp.print();
  243.         }
  244.             println("\n\n\nTurn #", turns ++); ll n;
  245.             println("Waiting for net turns...");
  246.             for (ll i=K;i--;) read >> n, netTurn(n);
  247.             mp.print();
  248.  
  249.         if ( ! FIRST_PLAYER) {
  250.             println("\n\n\nTurn #", turns ++);
  251.             for (ll i=K;i--;) println("\t\t\t\t\tYour point", usrTurn());
  252.             mp.print();
  253.         }
  254.     }
  255.  
  256.     return 0;
  257. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement