ビット演算版。不正入力は聞きなおし。gets()の不正な利用もなし。
#include <stdio.h>
long a,b,c,i,k=2,w=73,x=4161,y=262657;W(long p){return!!(p-(c&p));}P(){return c
=(a>>i&3)<<2-k,c+=(b>>i&3)<<k,printf(" \0●\0○\0▲\0△"+(c-c/3-c/5*2)*3),(i+=
3)<27?printf(i%9?"┃":"\n━╋━╋━\n"),P():puts("");}main(){for(P();c=b|b/2,W(
w)&W(w<<9)&W(w<<18)&W(x)&W(x*8)&W(x*64)&W(y)&W(x*4033);c=a,a=b,b=c){c=w*y;a-=(a
|a/2)&c;do printf("? "),scanf("%ld",&c),c-=4+c/10*7,c=c>8|c<0?0:3<<c*3;while(!c
||c&a||c&b);a+=c;i=0;P();k^=2;}return puts("\n○Won!\0\n△Won!"+k*4)&0;}