Advertisement
Mlxa

GAME Virus-Alpha

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