7行はさみ将棋もどき

7行はさみ将棋。結構無理やり。言語はC。
もう少し短くなりそうな気もするけど、もう眠いよ。。。。

相変わらず大半は7行オセロのパクリなんだが、とりあえず新歓はなんとかなりそうだ。

char*h="・△▼ \n 123456789",*r="AKMW";int p,t,d,a,c,v,i,m[121],x,y,f 
;k(){for(c=i=4;c&&i--;){for(v=p;m[v+=r[i]-76]==(f?0:3-t);)if(v==x)c=0;if(m[v] 
==t)for(v=p;m[v+=r[i]-76]-t;m[v]=0);}}main(){for(i=11;i--;m[i*11+10]=3,m[i*11]= 
m[i]=4+i)t=m[i%9+12]=2,m[i%9+100]=1;for(;t=3-t;a=p=0){for(;p<110;)for(printf( 
"%c%c",h[m[p]*2],h[m[p]*2+1]),i=m[++p]==t,i*=4;i--;)a+=!m[p+r[i]-76];for(d=a;a;) 
if(scanf("%d%d%d%d",&p,&i,&x,&y),m[p+=i*11]==t)if(f=x+=y*11,k(),!c)f=a=m[p]=0,m
[p=x]=t,k();if(!d)printf("%dP win.\n",3-t),t=3;}} 

遊び方は、駒の位置(x,y)と移動先の位置(x,y)を指定して行くだけ。
△の人からスタート。

1≦x,y≦9 の範囲を超えるような入力に対する処理は作ってないのでバグります。
まぁ、このくらいいいよね。


一応、改行してあるやつも載せとく。
暇なら解読でもすればいいと思うよ。

char*h="・△▼ \n 123456789",*r="AKMW"; 
int p,t,d,a,c,v,i,m[121],x,y,f; 

k(){ 
  for(c=i=4;c&&i--;){ 
    for(v=p;m[v+=r[i]-76]==(f?0:3-t);) 
    if(v==x)c=0; 
    if(m[v]==t) 
      for(v=p;m[v+=r[i]-76]-t;m[v]=0); 
  } 
} 

main(){ 
  for(i=11;i--;m[i*11+10]=3,m[i*11]=m[i]=4+i) 
    t=m[i%9+12]=2,m[i%9+100]=1; 

  for(;t=3-t;a=p=0){ 
    for(;p<110;) 
      for(printf("%c%c",h[m[p]*2],h[m[p]*2+1]),i=m[++p]==t,i*=4;i--;) 
        a+=!m[p+r[i]-76]; 
      for(d=a;a;) 
        if(scanf("%d%d%d%d",&p,&i,&x,&y),m[p+=i*11]==t) 
      if(f=x+=y*11,k(),!c) 
        f=a=m[p]=0,m[p=x]=t,k(); 
      if(!d)printf("%dP win.\n",3-t),t=3; 
  } 
}

−−−


参考にしたのでオセロのコードも貼っとっきます。


530 :デフォルトの名無しさん:2008/12/21(日) 00:27:40
自由課題
オセロの”ベース”を作ってもらいたいです。
環境Mac
言語C++
期限12月21日


 123456
1・・・・・・
2・・・・・・
3・・○●・・
4・・●○・・
5・・・・・・
6・・・・・・
↑こんな感じです。

「(3,2)などの座標を入力すれば○と●が交互に置かれて、挟まれたら裏返る」という、ベースの段階を作ってもらいたいです。
人vs人でプレーするものが良いです。上の図のように、座標を表す数字もお願いします。
後から自分で、○と●の数をカウントしたり、どっちが勝ったか表示されるように手を加えたいと思っています。
そのため、大学ではiostreamで書いているので私が後から理解できるようにiostreamを使って欲しいです。

注文が多く時間も少なくて申し訳ないですが、どうかよろしくお願いしますm(__)m


538 :デフォルトの名無しさん:2008/12/21(日) 06:00:00
>>530 7行に収めましたのでどうぞ。
#include
char*h="・○● \n 12345678",*r="ABCKMUVW";int p,t,a,d,c,v,i,m[101],s;
void k(){for(i=!m[++p]*8;i--;){for(c=0,v=p;m[v+=r[i]-76]==3-t;)c++;if(c&&m[v]==
t){a+=c;v=p;if(d)while(m[v]=t,m[v+=r[i]-76]-t);}}}int main(){for(i=10,m[46]=m[
55]=t=2;i--;m[i*10]=3,m[i*10+1]=m[i+1]=4+i)m[45]=m[56]=s=1;for(;t=3-t;a=d=p=0){
for(;p<91;k())std::cout<

cin>>p>>i,p+=i*10;else if(s)s=0,std::cout<<"pass";else break;}return 0;}