Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <iostream>
- #include <string>
- using namespace std;
- class Heap {
- private:
- int size; // размер кучи
- int max_size;
- public:
- Heap(int s,int m) : size(s),max_size(m) {}; // инициализация кучи
- int get(int n = 0) { size -= n; return(size); }; // запрос размера и выбор предметов из кучи
- int set(int n = 0) { size += n; return(size); };
- int get_max() {
- return max_size;
- }
- };
- class Gambler {
- protected:
- Heap* heap; // адрес кучи
- const int limit; // предел выборки за 1 ход
- const char* name; // имя игрока
- public:
- Gambler(Heap& h, int l) : limit(l) { heap = &h; }; // инициализация данных
- virtual int move() = 0; // чистая виртуальная функция хода
- int query(); // запрос хода
- };
- class Man : public Gambler {
- public:
- Man(Heap& h, int l, char* n) : Gambler(h, l) { name = n; };
- virtual int move(); // ход человека
- };
- class Pen : public Gambler {
- public:
- Pen(Heap& h, int l, char* n) : Gambler(h, l) { name = n; };
- virtual int move(); // ход копьютера
- };
- int Gambler::query() {
- cout << "Heap = " << heap->set() << " " << name << " > ";
- return(heap->set());
- }
- int Man::move() {
- int g;
- string str;
- getline(cin,str);
- while (true) {
- g = strtol(str.c_str(),nullptr,10);
- if (g==0) {
- cerr << "Try again..." << endl;
- getline(cin,str);
- }
- else {
- break;
- }
- }
- if((g < 1) || (g > limit))
- g = limit;
- return(heap->set(g));
- }
- int Pen::move() {
- int rest = 0; // остаток кучи
- int x = 0; // параметр выбора
- int h; // текущий размер кучи
- h = heap->set();
- int i = 1;
- while (i!=limit) {
- if ((heap->get_max()-(h+i)) % (limit + 1) == 0)
- x = i;
- i++;
- }
- if (x == 0)
- x = limit;
- heap->set(x); // добавление предметов из кучи
- cout << h + x << "\n"; // вывод хода компьютера
- return(heap->set()); // возврат текущего размера кучи
- }
- int main(int argc, char* argv[]) {
- int i = 1;
- Heap h(0,atoi(argv[1]));
- Gambler* g[] = { new Pen(h, atoi(argv[2]), "Pen"),
- new Man(h, atoi(argv[2]), "Man")
- };
- int size = h.set();
- do {
- g[i]->query();
- g[i]->move();
- size = h.set();
- if(size < h.get_max() && --i<0)
- i = 1;
- }while(size < h.get_max());
- g[i]->query();
- cout << "Winner\n";
- delete g[0];
- delete g[1];
- return(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement