02/08/05 18:55
>>641
参考になりました。三項演算子を効果的に使うんですね。
かなり短縮できました。(ブロック崩し - B.java : 現在13行)
import java.awt.*;public class B{public static void main(String[]a){new Frame()
{int W=26,H=33,T=W*H,P=7,U=6,b=1+W,d=56,p=1+T-W*3,g,l,t,i,j,k,u,m[]=new int[T];
{Canvas c=new Canvas(){{setSize(W*U,H*U);}public void update(Graphics g){for(u=
0;u<T;g.fillRect(u%W*U,u++/W*U,U,U))g.setColor(m[u]>0?Color.BLACK:Color.WHITE);
}public boolean handleEvent(Event e){k=e.x/U;k=k<1?1:k>W-2?W-2:k;p=e.id==503?k+
T-W*3:p;g=e.id==501?l:g;return 1>0;}};for(;i<T;i++)m[i]=(j=i/W)>=H-1?4:j<1|(k=i
%W)<1|k>W-2?1:j>3&j<H/2+2&j%3>1&k>3&k<W-4&((j/3^k/2)&1)>0?2+0*++l:0;l/=2;add(c)
;pack();show();try{for(;;Thread.sleep(50)){m[b]=0;i=g>0?b+v((d+16)%64)+v(d)*W:p
-W;j=g>0?m[i]:0;if(j>0){d=m[i%W+b/W*W]>0?m[b%W+i/W*W]>0?(d+32)&63:(32-d)&63:-d&
63;if(j==2){m[i]=m[i^1]=0;g=--l<1?0:g;}if(j==3)d=(d+=b%W-p%W)<36?36:d>60?60:d;
if(j==4){d=56;g=0;}i=b;}m[b=i]=1;i=p%W-P/2;for(j=0;j<W;j++)m[j+T-W*3]=j>=i&j<i+
P?3:j<1|j>W-2?1:0;t=(t+1)%8;c.repaint();}}catch(Exception e){}}int v(int d){j=d
%32;j=j>16?32-j:j;return j*(t+1)/8>j*t/8?d<32?1:-1:0;}};}}
ただ、「g=--l<1?0:g;」のような処理はアトミックじゃないので、別スレッドから変更さ
れた場合に、やや心配ではありますが。(取り越し苦労?(^^;))
>>642
やっぱり仕様そのものが問題だったかも(^^;)
ラケットの位置により反射角度が変化ってのはオーバースペックかな?
あと、ApplicationよりAppletの方が短くできそうですね。