M.Hiroi's Home Page

Java DE Puzzle

[ Home | X68000 | Tcl/Tk | xyzzy Lisp | Puzzle | Prolog]

●●● チョロアリ2 ●●●

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

Copyright (C) 2001-2003 Makoto Hiroi
All rights reserved.

[ Home | X68000 | Tcl/Tk | xyzzy Lisp | Puzzle | Prolog | このページの先頭へ ]