A. K. デュードニー 著「コンピューターレクリエーション4 遊びの展開」 より、 チョロアリのグラフィック(その2)です。今度のチョロアリは、 その1よりも規則がほんの少しだけ複雑です。
黒 | 緑 | |
---|---|---|
状態 A | 緑, 左, A | 黒, 前, B |
状態 B | 緑, 右, A | 緑, 右, A |
チョロアリにはふたつの状態 A と B があり、チョロアリの動作は異なります。
たとえば、今いる位置が黒の場合、状態 A では緑に塗って左を向いて1つ進みますが、
状態 B では右を向いて1つ進みます。
画面が狭くてわかりにくいかもしれませんが、
チョロアリが作る四角形の中に螺旋状の模様が現れます。
// // チョロアリ2 // // Copyright (C) 2001 Makoto Hiroi // import java.awt.*; import java.applet.*; import java.util.*; public class Ant2 extends Applet implements Runnable { // 変数定義 final int SIZE = 100; byte plane[] = new byte[SIZE * SIZE]; int dir = 0, state = 0, x = 50, y = 50, width, height, edge; Image double_buffer; Graphics dg; Thread trig = null; // 初期化 public void init(){ int i; trig = new Thread( this ); width = getSize().width; height = getSize().height; double_buffer = createImage( width, height ); dg = double_buffer.getGraphics(); edge = width / SIZE; // 画面の初期化 dg.setColor( Color.black ); dg.fillRect( 0, 0, width, height ); // 平面の初期化 for( i = 0; i < (SIZE * SIZE); i++ ){ plane[i] = 0; } trig.start(); } public void paint( Graphics g ){ g.drawImage( double_buffer, 0, 0, null ); } public void update( Graphics g ){ paint( g ); } public void run(){ while( true ){ try { Thread.sleep( 20 ); } catch( InterruptedException e ){} doIt(); doIt(); doIt(); doIt(); repaint(); } } void doIt(){ int postion = y * SIZE + x; if( plane[postion] == 0 ){ dg.setColor( Color.green ); dg.fillRect( x * edge, y * edge, edge, edge ); plane[postion] = 1; if( state == 0 ){ dir = (dir + 1) % 4; } else { dir = (dir + 3) % 4; state = 0; } } else { if( state == 0 ){ dg.setColor( Color.black ); dg.fillRect( x * edge, y * edge, edge, edge ); plane[postion] = 0; state = 1; } else { dir = (dir + 3) % 4; state = 0; } } switch( dir ){ case 0 : x = (x <= 0 ? SIZE - 1 : x - 1); break; case 1 : y = (y <= 0 ? SIZE - 1 : y - 1); break; case 2 : x = (x >= SIZE - 1 ? 0 : x + 1); break; case 3 : y = (y >= SIZE - 1 ? 0 : y + 1); break; } } }