Facebook
From heap, 3 Years ago, written in C++.
Embed
Download Paste or View Raw
Hits: 71
  1. #include <iostream>
  2. #include <stdlib.h>
  3. using namespace std;
  4.  
  5. class Heap//класс куча
  6. {
  7. private:
  8.   int size;//размер кучи
  9. public:
  10.   Heap(int s): size(s){};//конструктор инициализации
  11.   int get(int n=0){ size -=n; return size;};//возврат текущего размера кучи
  12. };
  13.  
  14. class Gambler
  15. {
  16. protected:
  17.   Heap* heap;//указатель на кучу
  18.   const int limit;//максимальное количесво предметов, которые можно взять
  19.   const char* name;//имя игрока
  20. public:
  21.   Gambler(Heap& h, int l) : limit(l) {heap = &h;};//конструктор инициализации
  22.   int query();//функция запроса хода
  23.   virtual int move() = 0;
  24.   virtual ~Gambler(){};//виртуальный деструктор
  25. };
  26.  
  27. int Gambler::query()
  28. {
  29.   cout « " Heap = " « heap->get() « " " « name « " > ";
  30.   return heap->get();
  31. }
  32.  
  33. class Man : public Gambler//класс игрока
  34. {
  35. public:
  36.   Man (Heap &h, int l, const char* n) : Gambler(h,l) { name=n; };//конструктор инициализации
  37.   virtual int move();
  38. };
  39.  
  40. class Pen : public Gambler//класс компьютера
  41. {
  42. public:
  43.   Pen (Heap &h, int l, const char* n) : Gambler(h,l) { name=n; };//конструктор инициализации
  44.   virtual int move();
  45. };
  46.  
  47. int Man::move()
  48. {
  49.   int g;
  50.   cin » g;//количество предметов, которое берет из кучи игрок
  51.   if ((g < 1) || (g > (heap->get())) || ( g > limit))//если введенное количество предметов из кучи достать нельзя
  52.   {
  53.     g = 1;
  54.   }
  55.   return heap->get(g);
  56. }
  57.  
  58. int Pen::move()
  59. {
  60.   int rest = 0;//остаток кучи,который должен остаться после хода компьютера
  61.   int x = 0;//величина выигрышной стратегии
  62.   int h = 0;//текущий остаток кучи
  63.  
  64.   if ( (h=(heap->get())) == 1 )
  65.   {
  66.     h = heap->get(1);
  67.   }
  68.   while ((rest = (x*limit + x +1)) <= h )//находим нужный остаток кучи
  69.   {
  70.     x++;
  71.   }
  72.   if ((rest>h) || (rest==h))//если остаток привышает количество кучи, то возвращаемся на оидн ход назад
  73.   {
  74.     rest = (x-1)*limit + x;
  75.   }
  76.   heap->get(h-rest);//уменьшаем кучу на разность между текущим остатком кучи и желаемым остатком
  77.   cout << h-rest << endl;
  78.   return (heap->get());
  79. }
  80.  
  81. int main(int argc, char* argv[])
  82. {
  83.   int i=0;//отслеживание ходов игрока и компьютера, для определения очередности ходов
  84.   Heap h(atoi(argv[1]));//создаем кучу
  85.   Gambler* g[] = { new Pen(h,atoi(argv[2]), "Pen"), new Man(h,atoi(argv[2]), "Man") };//указатели на объекты игроков
  86.   while ( g[i]->query() != 0 )
  87.   {
  88.     g[i]->move();//сам ход
  89.     if (++i > 1)//смена хода
  90.     i = 0;
  91.  
  92.   }
  93.   cout << "Winner\n";
  94.   delete g[0];
  95.   delete g[1];
  96.   return 0;
  97. }
  98.