http://ideone.com/7pe7Xz


#include <iostream>

#include <string>

#include <vector>


using namespace std;


enum RPS

{

    rock,

    paper,

    scissors,

    rps_count,

};


std::string rps_strings[]{ "바위", "보", "가위" };


enum PLAYER_RACE

{

    computer,

    human,

};


class PLAYER;

std::vector< PLAYER* > players;


class PLAYER

{

private:

    virtual RPS make_answer() = 0;

    std::string name;

    RPS     answer;


public:

    PLAYER( const std::string name ) : name( name )

    {

        players.emplace_back( this );

    }

    auto get_name() const

    {

        return  name;

    }

    RPS run()

    {

        return  answer = make_answer();

    }

    RPS last_answer() const

    {

        return  answer;

    }

};


class COMPUTER : PLAYER

{

private:

    static int counter;

    virtual RPS make_answer()

    {

        return  RPS( rand() % rps_count );

    }

public:

    COMPUTER() : PLAYER( std::string( "COMPUTER_" ) + std::to_string( ++counter ) ) {}

};


class HUMAN : PLAYER

{

private:

    static int counter;

    virtual RPS make_answer()

    {

        int answer;

        std::cout << get_name() << " 's turn ( 0 = 바위, 1 = 보, 2 = 가위 ) :";

        std::cin >> answer;

        return  RPS( answer );

    }

public:

    HUMAN() : PLAYER( std::string( "HUMAN_" ) + std::to_string( ++counter ) ) {}

};


int COMPUTER::counter = 0;

int HUMAN::counter = 0;


int main()

{

    int computer_count;

    cout << "How many computers? ";

    cin >> computer_count;


    int human_count;

    cout << "How many humans? ";

    cin >> human_count;


    for( int i = 0; i < computer_count; ++i )

        new COMPUTER;

    for( int i = 0; i < human_count; ++i )

        new HUMAN;


    while( players.size() > 1 )

    {

        int total[ rps_count ] { 0 };

        for( const auto player : players )

        {

            total[ player->run() ]++;

            cout << player->get_name() << " : " <<

                rps_strings[ player->last_answer() ] << endl;

        }


        if( total[ 0 ] && total[ 1 ] && total[ 2 ] )

            continue;


        for( auto it = players.begin(); it != players.end(); )

        {

            if( total[ ( (*it)->last_answer() + 1 ) % rps_count ] )

            {

                cout << (*it)->get_name() << " lose" << endl;

                delete *it;

                it = players.erase( it );

            }

            else ++it;

        }

        cout << endl;

    }

    cout << players[ 0 ]->get_name() << " win" << endl;


    delete players[ 0 ];


    return 0;

}


How many computers? 3

How many humans? 0


COMPUTER_1 : 보

COMPUTER_2 : 보

COMPUTER_3 : 바위

COMPUTER_3 lose


COMPUTER_1 : 보

COMPUTER_2 : 가위

COMPUTER_1 lose


COMPUTER_2 win