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;
}
}
}