// Q753922.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include <time.h>
#include <stdlib.h>
char * Jackname = "Jack";
char * Tomname = "Tom";
char * Royname = "Roy";
class Behavior
{
public:
virtual char Play() = 0;
virtual void Reset() = 0;
virtual char * Name() = 0;
};
class Jack : public Behavior
{
public:
char Play()
{
return 'P';
}
void Reset() { }
char * Name() { return Jackname; }
};
class Tom : public Behavior
{
private:
int state;
public:
Tom()
{
state = 0;
}
char Play()
{
if (state == 3) state = 0;
if (state++ == 0)
return 'P';
if (state == 2)
return 'R';
if (state == 3)
return 'S';
}
void Reset() { state = 0; }
char * Name() { return Tomname; }
};
class Roy : public Behavior
{
public:
char Play()
{
srand(time(NULL));
int state = rand() % 3;
if (state == 0)
return 'P';
if (state == 1)
return 'R';
if (state == 2)
return 'S';
}
void Reset() { }
char * Name() { return Royname; }
};
class Player
{
private:
Behavior *b;
public:
Player()
{
int sel = rand() % 3;
switch (sel)
{
case 0: b = new Jack(); break;
case 1: b = new Tom(); break;
case 2: b = new Roy(); break;
}
}
char Play()
{
return b->Play();
}
void Reset() { b->Reset(); }
void PrnName()
{
printf("%s", b->Name());
}
};
class Referee
{
public:
char Judge(char m, char p)
{
if (m == p) return 'T';
if ((m == 'S' && p == 'P') ||
(m == 'P' && p == 'R') ||
(m == 'R' && p == 'S'))
return 'W';
else
return 'L';
}
};
class Tournament
{
private:
Player comp(Player p1, Player p2)
{
int sco = 0;
Referee rf;
for (int i = 0; i < 5 && sco > -3 && sco < 3; i++)
{
int r = rf.Judge(p1.Play(), p2.Play());
if (r == 'W' || r == 'T') sco++; else sco--;
}
if (sco == 3) return p1; else return p2;
}
public:
Tournament()
{
srand(time(NULL));
Player players[8];
for (int i =0; i < 8; i++)
{
players[i].PrnName();
printf(" ");
}
printf("\n");
Player players1[4];
for (int i = 0; i < 4; i++)
{
players1[i] = comp(players[i * 2], players[i * 2 + 1]);
}
Player players2[2];
for (int i = 0; i < 2; i++)
{
players1[i * 2].Reset();
players1[i * 2 + 1].Reset();
players2[i] = comp(players1[i * 2], players1[i * 2 + 1]);
}
players2[0].Reset();
players2[1].Reset();
Player winner = comp(players2[0], players2[1]);
winner.PrnName();
printf("\n");
}
};
int main()
{
Tournament t;
return 0;
}
Tom Jack Tom Roy Jack Jack Jack Roy
Jack
Press any key to continue . . .
Roy Jack Tom Jack Jack Tom Roy Roy
Roy
Press any key to continue . . .