/************************************/
/*******    三山 くずし       *******/
/***  Copyright (C) 1991.H.Asano  ***/
/*         programming  1991.3.21   */
/************************************/

#define  locate(x,y)    printf("\x1b[%d;%dH",(x),(y))

#define  CLRLINE     "\x1b[K"
#define  CLRATLIB    "\x1b[m"
#define  CURSOLOFF   "\x1b[1v"
#define  CURSOLON    "\x1b[0v"
#define  CONTINUE    1
#define  COMWIN      2
#define  MANWIN      3
#define  STONE_POS  17

static struct {
       int su[3];                 /* 山の石の数   */
       int su_info[3] ;           /* 山の印字位置 */
       int iro[3];                /* 石の色       */
       int get;                   /* 石を取る山   */
} yama = {{0,0,0},{5,31,57},{32,33,36}};

main()
{
  int init(void);
  int getstone(int);
  void sleep(int);
  int turn;
  int kekka;

     turn=init();
     do {
       kekka=getstone(turn);
       turn=!turn;
       sleep(1200);
     } while(kekka==CONTINUE);

     locate(6,22),printf(CLRLINE);
     if(kekka == COMWIN)
	 printf("\x1b[5mやっぱり私が勝っただろう!\n");
     else
	 printf("\x1b[33m珍しいこともあるものだ。君が勝つとは!!\n");
     locate(21,1),printf(CLRATLIB),printf(CURSOLON);

}

int init(void)
{
  int get_rand(int);

  long now;
  int i,j;
  int x;
  char turn;

     printf("\x1b*\x1b[35m");
     printf("         ★★★★  不思議な  石  取  り  あ  そ  び  ★★★★\n");
     printf("                  [Ver1.0]    Copyright (C) H.Asano 1991\n\n");
     printf(CLRATLIB);
     printf("  最後の石を取った方が勝ちだよ｡多分君は私に勝てないだろうが挑戦したまえ｡\n");

     srand(time(&now));
     for(i=0;i<3;i++)
       yama.su[i] = get_rand(75)+25;

     for(i=0;i<3;i++) {
       locate(STONE_POS,yama.su_info[i]);
       printf("  %c  山  %3d個", 'A'+i, yama.su[i]);

       printf("\x1b[%dm",yama.iro[i]);
       x = STONE_POS - 2;
       locate(x,yama.su_info[i]);
       for(j=1;j<=yama.su[i];j++) {
	 printf("●");
	 if(j%10 == 0 ) locate(--x,yama.su_info[i]);
       }
       printf(CLRATLIB);
     }

   /**** 先攻 後攻を決める *****/

     do {
       locate(20,3),printf(CLRLINE);
       printf("どちらが先に石を取るかい");
       printf("\t0.私 \t1.君 ....... ?");
     } while((turn=getch()) != '0' && turn != '1');
     printf(" %c\n",turn);
     return((int)(turn-'0'));
}

/***** 石の取り合い ****/
int getstone(int turn)
{
  int com(void);
  int man(void);

     if(turn==0) return(com());
     else        return(man());

}

/**** 私が石をとります ****/
int com()
{
  void prtstone(int where,int save,int getsu);

  int save;
  int x,y;

     locate(19,1),printf(CLRLINE);
     locate(20,1),printf(CLRLINE);
     locate(19,1);
     printf("私の番だな｡");

     if(yama.su[0] > yama.su[1] )
       if(yama.su[0] > yama.su[2])  yama.get = 0;
       else                         yama.get = 2;
     else
       if(yama.su[1] > yama.su[2])  yama.get = 1;
       else                         yama.get = 2;

     save = yama.su[yama.get];

     if(!(yama.su[0] ^ yama.su[1] ^ yama.su[2]))
       yama.su[yama.get]--;
     else
       do {
	 yama.su[yama.get]--;
	 if(yama.su[yama.get] < 0) {
	   yama.su[yama.get] = save;
	   yama.get += 1;
	   if(yama.get == 3) yama.get = 0;
	   save = yama.su[yama.get];
	   continue;
	 }
       } while((yama.su[0] ^ yama.su[1] ^ yama.su[2]));

     prtstone(yama.get,save,save-yama.su[yama.get]);

    if(yama.su[0] + yama.su[1] + yama.su[2] == 0) return(COMWIN);
    else                                          return(CONTINUE);

}

/**** 人間が石を取ります ****/
int man()
{
  int save;
  int getsu;
  char ch;

     locate(19,1), printf(CLRLINE);
     locate(20,1), printf(CLRLINE);
     locate(19,1);
     printf("君の番だ｡");
     printf(CURSOLON);

     do {
       do {
	 locate(20,3),printf(CLRLINE);
	 printf("どの山から取るかい ?");
       } while(((ch=getch()) <'A' || ch > 'C') && (ch < 'a' || ch > 'c')) ;
       yama.get = ch-1 & 0x0f;
       printf(" %c\n",yama.get+'A');
       if(yama.su[yama.get] != 0) break;
     } while(1);
     do {
       locate(20,3),printf(CLRLINE);
       printf("%c 山からいくつ取るつもり (1 〜 %d)? ",
	     yama.get+'A', yama.su[yama.get]);
       scanf("%d",&getsu);
     } while(0>=getsu || getsu>yama.su[yama.get]);

     save = yama.su[yama.get];
     yama.su[yama.get] -= getsu;
     prtstone(yama.get, save, getsu);

     if(yama.su[0] + yama.su[1] + yama.su[2] == 0) return(MANWIN);
     else                                          return(CONTINUE);
}

void prtstone(int where,int save,int getsu)
{

  int i;

     locate(20,3),printf(CLRLINE),printf(CURSOLOFF);
     printf("%c 山から %d 個取るよ｡\n",
	   'A'+yama.get,getsu);

     for(i=1;i<=getsu;i++) {
       locate(STONE_POS-2-(save-1)/10, yama.su_info[where]+(save-1)%10*2);
       printf("\a　");
       locate(STONE_POS,yama.su_info[where]+9);
       printf("%3d",--save);
       sleep(350);
     }
}

void sleep(int count)
{
  int i,j;
  int a=0;

  for(i=0;i<count;i++)
    for(j=0;j<100;j++)
      a=a*a*a*a;
}

int get_rand(int max)
{
  int temp;

  do {
    temp = rand() / (32767/max);
  } while(temp > max);
  return(temp);
}
