Advertisement
Guest User

Untitled

a guest
Apr 26th, 2017
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.93 KB | None | 0 0
  1. #include <stdlib.h>
  2.  
  3. #include <iostream>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. class Heap {
  9.  
  10.     private:
  11.         int size; // размер кучи
  12.         int max_size;
  13.     public:
  14.         Heap(int s,int m) : size(s),max_size(m) {}; // инициализация кучи
  15.         int get(int n = 0) { size -= n; return(size); }; // запрос размера и выбор предметов из кучи
  16.         int set(int n = 0) { size += n; return(size); };
  17.         int get_max() {
  18.             return max_size;
  19.         }
  20.  
  21. };
  22.  
  23. class Gambler {
  24.  
  25.     protected:
  26.         Heap* heap; // адрес кучи
  27.         const int limit; // предел выборки за 1 ход
  28.         const char* name; // имя игрока
  29.  
  30.     public:
  31.  
  32.         Gambler(Heap& h, int l) : limit(l) { heap = &h; }; // инициализация данных
  33.         virtual int move() = 0; // чистая виртуальная функция хода
  34.         int query(); // запрос хода
  35.  
  36. };
  37.  
  38. class Man : public Gambler {
  39.  
  40.     public:
  41.         Man(Heap& h, int l, char* n) : Gambler(h, l) { name = n; };
  42.         virtual int move(); // ход человека
  43.  
  44. };
  45.  
  46. class Pen : public Gambler {
  47.  
  48.     public:
  49.         Pen(Heap& h, int l, char* n) : Gambler(h, l) { name = n; };
  50.         virtual int move(); // ход копьютера
  51.  
  52. };
  53.  
  54. int Gambler::query() {
  55.     cout << "Heap = " << heap->set() << " " << name << " > ";
  56.     return(heap->set());
  57. }
  58.  
  59.  
  60. int Man::move() {
  61.     int g;
  62.     string str;
  63.     getline(cin,str);
  64.     while (true) {
  65.         g = strtol(str.c_str(),nullptr,10);
  66.         if (g==0) {
  67.             cerr << "Try again..." << endl;
  68.             getline(cin,str);
  69.         }
  70.         else {
  71.             break;
  72.         }
  73.     }
  74.     if((g < 1) || (g > limit))
  75.         g = limit;
  76.     return(heap->set(g));
  77.  
  78. }
  79.  
  80. int Pen::move() {
  81.     int rest = 0; // остаток кучи
  82.     int x = 0; // параметр выбора
  83.     int h; // текущий размер кучи
  84.     h = heap->set();
  85.     int i = 1;
  86.     while (i!=limit) {
  87.         if ((heap->get_max()-(h+i)) % (limit + 1) == 0)
  88.             x = i;
  89.         i++;
  90.     }
  91.     if (x == 0)
  92.         x = limit;
  93.     heap->set(x); // добавление предметов из кучи
  94.     cout << h + x << "\n"; // вывод хода компьютера
  95.     return(heap->set()); // возврат текущего размера кучи
  96. }
  97.  
  98.  
  99. int main(int argc, char* argv[]) {
  100.     int i = 1;
  101.     Heap h(0,atoi(argv[1]));
  102.     Gambler* g[] = { new Pen(h, atoi(argv[2]), "Pen"),
  103.                      new Man(h, atoi(argv[2]), "Man")
  104.  
  105.     };
  106.     int size = h.set();
  107.     do {
  108.         g[i]->query();
  109.         g[i]->move();
  110.         size = h.set();
  111.         if(size < h.get_max() && --i<0)
  112.             i = 1;
  113.     }while(size < h.get_max());
  114.  
  115.     g[i]->query();
  116.     cout << "Winner\n";
  117.  
  118.  
  119.     delete g[0];
  120.     delete g[1];
  121.     return(0);
  122.  
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement