Advertisement
Mlxa

GAME VIRUS CROSSSPLATFORM-RELEASE!

Feb 3rd, 2018
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.12 KB | None | 0 0
  1. #include <cassert>
  2. #include <random>
  3. #include <cstdio>
  4. #include <iostream>
  5. #include <iomanip>
  6. #include <clocale>
  7. #ifdef _WIN32
  8.     #include <windows.h>
  9. #endif
  10. using namespace std;
  11.  
  12. const string space = ".";       /// It should be given in templates...
  13.  
  14. typedef long long ll;
  15. #define read                cin
  16. #define eol                 '\n'
  17. #define endln               cout << eol
  18. #define all(x)              begin(x), end(x)
  19. template <class A>              inline void print   (A a)           { cout << a << ' '; }
  20. template <class A>              inline void println (A a)           { cout << a << eol; }
  21. template <class A, class... B>  inline void println (A a, B... b)   { print(a); println(b...); }
  22. template <class A>              inline void err     (A a)         { cerr << a << ' '; }
  23. template <class A>              inline void errln   (A a)         { cerr << a << eol; }
  24. template <class A, class... B>  inline void errln   (A a, B... b) { err(a); errln(b...); }
  25.  
  26.  
  27.  
  28. ////////////////////////////////////////////////////////
  29. ////////////////////////////////////////////////////////
  30. ////////////////////////////////////////////////////////
  31.  
  32.  
  33.  
  34. template <
  35. ostream &out,
  36. size_t hSize = 10,
  37. size_t wSize = 10,
  38. size_t sparse = 1
  39. >
  40.  
  41. class MatrixPrinter
  42. {
  43.     private:
  44.  
  45.     string M[hSize][wSize];
  46.  
  47.     public:
  48.  
  49.     void print (size_t iS = 0, size_t iF = hSize,
  50.                 size_t jS = 0, size_t jF = wSize)
  51.     {
  52.         out << string(8*(jF - jS + 1)+1, '-') << eol;
  53.  
  54.         out << "№\t";
  55.         for (size_t j = jS; j < jF; ++ j)
  56.         if (j % sparse == 0)
  57.             out << '\t' << j;
  58.         else
  59.             out << "        ";
  60.         out << eol;
  61.         out << " \t+-------";
  62.         for (size_t j = jS + 1; j < jF; ++ j)
  63.             out << "+-------";
  64.         out << "+" << eol;
  65.  
  66.         for (size_t i = iS; i < iF; ++ i)
  67.         {
  68.             out << i << "\t|";
  69.             for (size_t j = jS; j < jF; ++ j)
  70.                 out << '\t' << M[i][j];
  71.             out << eol;
  72.         }
  73.         out << string(8*(jF - jS + 1)+1, '-') << eol;
  74.     }
  75.  
  76.     void setPoint (size_t i, size_t j, string c)
  77.     {   M[i][j] = c;    }
  78.  
  79.     string getPoint (size_t i, size_t j)
  80.     {
  81.         if (i < hSize && j < wSize)
  82.             return M[i][j];
  83.         return "";
  84.     }
  85.  
  86.     MatrixPrinter ()
  87.     {
  88.         for (size_t i = 0; i < hSize; ++ i)
  89.             for (size_t j = 0; j < wSize; ++ j)
  90.                 M[i][j] = space;
  91.     }
  92. };
  93.  
  94.  
  95.  
  96. ////////////////////////////////////////////////////////
  97. ////////////////////////////////////////////////////////
  98. ////////////////////////////////////////////////////////
  99.  
  100.  
  101.  
  102. const bool  LOG_TO_FILE     = false;
  103. const  size_t   I           = 80,   /// Field size
  104.                 J           = 50,
  105.                 K           = 3;    /// Points per turn
  106.  
  107. const string    a   =   "м",
  108.                 b   =   "ж",
  109.                 A   =   "М",
  110.                 B   =   "Ж";
  111. MatrixPrinter<cout, I, J> mp;
  112.  
  113. size_t  dView = 10,
  114.         iView = 10,
  115.         jView = 10;
  116.  
  117.  
  118. //  #define DEBUG_INFO
  119. #ifdef      DEBUG_INFO
  120.     #define addLog(...) errln("[ log ]   ", __VA_ARGS__)
  121. #else
  122.     #define addLog(...) (void(0))
  123. #endif
  124.  
  125.  
  126. bool        FIRST_PLAYER    = false;
  127. void initialize ()
  128. {
  129.     #ifdef DEBUG_INFO
  130.         if (LOG_TO_FILE)
  131.             freopen("log.txt", "w", stderr);
  132.     #endif
  133.  
  134.     println("Привет!");
  135.     println("Будете играть за првого игрока? (1 = да, 0 = нет)");
  136.     read >> FIRST_PLAYER;
  137.     println("Вы ответили:", FIRST_PLAYER);
  138.  
  139.  
  140.     mp.setPoint(0, 0, a);
  141.     mp.setPoint(I - 1, J - 1, b);
  142.     mp.print(iView - dView, iView + dView, jView - dView, jView + dView);
  143. }
  144.  
  145. struct crypto_t
  146. {
  147.     mt19937 getRand;
  148.     const ll MUL = 10;
  149.  
  150.     crypto_t (ll s) :   getRand(s)      {}
  151.     crypto_t ()     :   crypto_t(19)    {}
  152.  
  153.     inline size_t zip (size_t i, size_t j)
  154.     {
  155.         size_t result = MUL*i + j;
  156.         return result;
  157.     }
  158.     void unzip (size_t n, size_t &i, size_t &j)
  159.     {
  160.         i = n / MUL;
  161.         j = n % MUL;
  162.     }
  163. }; crypto_t crypto;
  164.  
  165.  
  166. bool checkPoint (size_t i, size_t j, string c)
  167. {
  168.     return mp.getPoint(i, j + 1) == c
  169.         || mp.getPoint(i, j - 1) == c
  170.         || mp.getPoint(i + 1, j) == c
  171.         || mp.getPoint(i - 1, j) == c;
  172. }
  173.  
  174.  
  175. bool canGo (ll i, ll j)
  176. {
  177.     if (    mp.getPoint(i, j) == a
  178.         ||  mp.getPoint(i, j) == A )
  179.     {
  180.         println("[ X ] Клетка уже принадлежит вам.");
  181.         return false;
  182.     }
  183.     if ( checkPoint(i, j, a) )
  184.     {
  185.         if ( mp.getPoint(i,j) == B )
  186.         {
  187.             println("[ X ] Там вражеская крепость (её нельзя съесть). ");
  188.             return false;
  189.         }
  190.         println("[ V ] Можно ходить.");
  191.         return true;
  192.     } else
  193.     {
  194.         if ( checkPoint(i, j, A) )
  195.         {
  196.             println("[ ? ] Проверьте 'живую связь' крепости.");
  197.             println("Крепость соединена?");
  198.             string ans; read >> ans;
  199.             return (ans == "yes" || ans == "Yes" || ans == "YES" || ans == "1");
  200.         }
  201.         println("[ X ] Эта точка не соединена с живыми вирусами.");
  202.         return false;
  203.     }
  204. }
  205.  
  206.  
  207. bool usrGo (ll i, ll j)
  208. {
  209.     if (canGo(i, j))
  210.     {
  211.         if (mp.getPoint(i,j) == space)  mp.setPoint(i, j, a);
  212.         if (mp.getPoint(i,j) == b)      mp.setPoint(i, j, A);
  213.         mp.print(   iView - dView, iView + dView,
  214.                     jView - dView, jView + dView);
  215.         return true;
  216.  
  217.     } else
  218.     {
  219.         println("Попробуйте ещё раз...");
  220.         return false;
  221.     }
  222. }
  223.  
  224.  
  225. ll usrTurn ()
  226. {
  227.     ll i, j;
  228.     do { read >> i >> j; }
  229.     while (! usrGo(i, j));
  230.     return crypto.zip(i, j);
  231. }
  232.  
  233.  
  234. void netTurn (size_t net)
  235. {
  236.     size_t i, j;
  237.     crypto.unzip(net, i, j);
  238.     i = I-1 - i;            /// reversing
  239.     j = J-1 - j;            /// reversing
  240.     println("Противник ходит", i, j);
  241.     if (mp.getPoint(i, j) == a)     mp.setPoint(i, j, B);
  242.     if (mp.getPoint(i, j) == space) mp.setPoint(i, j, b);
  243. }
  244.  
  245.  
  246. void letMove ()
  247. {
  248.     println("Если хотите сдвинуть миникарту, наберите непустую строку.");
  249.     string moving;
  250.     getline(cin, moving);
  251.     getline(cin, moving);
  252.     if (moving > "") {
  253.         println("Движение ведётся до набора 'end'.");
  254.         println("Используйте w, a, s, d и число (длину прыжка).");
  255.         size_t len;
  256.         read >> moving >> len;
  257.         while (moving != "end") {
  258.             if (moving == "w") {
  259.                 iView = max(ll(dView), ll(iView - len));
  260.             } else if (moving == "a") {
  261.                 jView = max(ll(dView), ll(jView - len));
  262.             } else if (moving == "s") {
  263.                 iView = min(ll(I-dView), ll(iView + len));
  264.             } else if (moving == "d") {
  265.                 jView = min(ll(J-dView), ll(jView + len));
  266.             }
  267.             mp.print(   iView - dView, iView + dView,
  268.                         jView - dView, jView + dView);
  269.             read >> moving >> len;
  270.         }
  271.     }
  272. }
  273. int main ()
  274. {
  275.     #ifdef _WIN32
  276.         SetConsoleCP(1251);
  277.         SetConsoleOutputCP(1251);
  278.         cout << "Кажется это Windows." << endl;
  279.     #else
  280.         setlocale(0, "");
  281.         cout << "Кажется это Linux." << endl;
  282.     #endif
  283.     initialize();
  284.  
  285.     for (ll turns = 1; turns <= 1024; )
  286.     {
  287.         if (FIRST_PLAYER) {
  288.             letMove();
  289.             println("\n\n\nХод #", turns ++);
  290.             for (ll i=K;i--;) println("\t\t\t\t\tКод этого хода:", usrTurn());
  291.         }
  292.             println("\n\n\nХод #", turns ++); ll n;
  293.             println("Ожидание хода противиника.");
  294.             letMove();
  295.             for (ll i=K;i--;) read >> n, netTurn(n);
  296.             mp.print(   iView - dView, iView + dView,
  297.                         jView - dView, jView + dView);
  298.  
  299.         if ( ! FIRST_PLAYER) {
  300.             letMove();
  301.             println("\n\n\nХод #", turns ++);
  302.             for (ll i=K;i--;) println("\t\t\t\t\tКод этого хода:", usrTurn());
  303.         }
  304.     }
  305.  
  306.     return 0;
  307. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement