協調性の高い囚人が多そうなので…

#ifdef __cplusplus
#define UNDEF(x) int act_##x (int round, const Result& own, const Result& opposite,int who)
#define ALIAS(x,y) Prisoner<act_##x> y(#y)
#define DEF(x) UNDEF(x);ALIAS(x,x);UNDEF(x)
#define PREV (-1)
#else
#define DEF(x) int x (int round, const char* own, const char* opposite, int who )
#define PREV (round-1)
#endif

DEF(lastpoo){ /* 最後っぺ野郎 */
#ifdef ROUND /* 参照可能なら… */
if ( who == 3 ) return 0;
if ( round == ROUND-1 ) return Defect;

#else /* 同じ相手とは連続して戦うことが条件 */
static int p=0, flag=0;
if ( who == 3 ) return 0;
if ( flag < 2 || round < p ) flag++;
if ( flag < 3) p = round;
else if ( round == p ) return Defect;
#endif
/* 実はゴルゴ君 */
if ( round == FIRST_ROUND ) return Cooperate;
return own[PREV] != opposite[PREV] ? Defect: opposite[PREV];
}