In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

ライフゲーム「グライダー銃」 Game of Life「Glider gun」

ライフゲーム Game of Life
生命の誕生、進化、淘汰などのプロセスを簡易的なモデルで再現したシミュレーションゲーム
ja http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0
en http://en.wikipedia.org/wiki/Conway's_Game_of_Life

グライダー銃 Glider gun
ライフゲームのパターンのひとつで、無限にピクセル数が増え続けるパターン
ja http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%82%A4%E3%83%80%E3%83%BC%E9%8A%83
en http://en.wikipedia.org/wiki/Glider_gun

クリックすると画面上にグライダーを一つ生成します
click stage, create a glider

フルスクリーンにすると楽しいかもしれない 重くなるけど
Get Adobe Flash player
by ton 23 Jun 2010
/*
ライフゲーム Game of Life
生命の誕生、進化、淘汰などのプロセスを簡易的なモデルで再現したシミュレーションゲーム
ja http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0
en http://en.wikipedia.org/wiki/Conway's_Game_of_Life

グライダー銃 Glider gun
ライフゲームのパターンのひとつで、無限にピクセル数が増え続けるパターン
ja http://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%82%A4%E3%83%80%E3%83%BC%E9%8A%83
en http://en.wikipedia.org/wiki/Glider_gun

クリックすると画面上にグライダーを一つ生成します
click stage, create a glider

フルスクリーンにすると楽しいかもしれない 重くなるけど
*/

package {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import frocessing.color.ColorHSV;
	
	
	public class Main extends Sprite {
		private const WHITE:uint =0xffffffff;
		private const SCALE:int = 5;
		
		private var w:int;
		private var h:int;
		
		private var bmd:BitmapData;
		private var bmp:Bitmap;
		
		private var pixels1:Vector.<uint>
		private var pixels2:Vector.<uint>
		private var colors:Vector.<uint>
		
		public function Main():void {
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
			
			w = stage.stageWidth / SCALE;
			h = stage.stageHeight / SCALE;
			
			var color:ColorHSV = new ColorHSV();
			colors = new Vector.<uint>(w * h, true);
			for (var i:int = 0; i < h; i++) {
				for (var j:int = 0; j < w; j++) {
					color.h = (i + j) * 4;
					colors[w * i + j] = color.value32;
				}
			}
			
			pixels2 = new Vector.<uint>(w * h, true);
			
			bmd = new BitmapData(w, h);
			bmp = new Bitmap(bmd);
			bmp.scaleX = bmp.scaleY = SCALE;
			addChild(bmp);
			
			setPixel(24, 0);
			setPixel(22, 1);
			setPixel(24, 1);
			setPixel(12, 2);
			setPixel(13, 2);
			setPixel(20, 2);
			setPixel(21, 2);
			setPixel(34, 2);
			setPixel(35, 2);
			setPixel(11, 3);
			setPixel(15, 3);
			setPixel(20, 3);
			setPixel(21, 3);
			setPixel(34, 3);
			setPixel(35, 3);
			setPixel(0, 4);
			setPixel(1, 4);
			setPixel(10, 4);
			setPixel(16, 4);
			setPixel(20, 4);
			setPixel(21, 4);
			setPixel(0, 5);
			setPixel(1, 5);
			setPixel(10, 5);
			setPixel(14, 5);
			setPixel(16, 5);
			setPixel(17, 5);
			setPixel(22, 5);
			setPixel(24, 5);
			setPixel(10, 6);
			setPixel(16, 6);
			setPixel(24, 6);
			setPixel(11, 7);
			setPixel(15, 7);
			setPixel(12, 8);
			setPixel(13, 8);

			addEventListener(Event.ENTER_FRAME, update);
			stage.addEventListener(MouseEvent.CLICK, onClick);
		}
		
		private function setPixel(x:int, y:int):void {
			var _x:int = x;
			var _y:int = y;
			
			if (x < 0)			_x = w - 1;
			else if (x >= w)	_x = 0;
			
			if (y < 0)			_y = h - 1;
			else if (y >= h)	_y = 0;
			
			bmd.setPixel32(_x, _y, colors[w * _y + _x]);
		}
		
		private function onClick(e:MouseEvent):void {
			var _x:int = mouseX / SCALE;
			var _y:int = mouseY / SCALE;

			setPixel(_x, _y-1);
			setPixel(_x+1, _y);
			setPixel(_x-1, _y+1);
			setPixel(_x, _y+1);
			setPixel(_x + 1, _y + 1);	
		}
		
		private function update(e:Event):void {
			var n:int;
			var now:int;
			
			pixels1 = bmd.getVector(bmd.rect);
			
			for (var i:int = 0; i < h; i++) {
				for (var j:int = 0; j < w; j++) {
					now = w * i + j;
					n = checkAround(j, i);
					if (n == 3)			pixels2[now] = colors[now];
					else if (n == 2)	pixels2[now] = pixels1[now];
					else 				pixels2[now] = WHITE;
				}
			}
			
			bmd.setVector(bmd.rect, pixels2);
		}
		
		private function checkAround(x:int, y:int):int {
			var sum:int = 0;
			var _x:int;
			var _y:int;
			
			for (var i:int = -1; i <= 1; i++) {
				for (var j:int = -1; j <= 1; j++) {
					if (i == 0 && j == 0) continue;
					
					_x = x + j;
					_y = y + i;
					
					if (_x < 0)			_x = w - 1;
					else if (_x >= w)	_x = 0;
					
					if (_y < 0)			_y = h - 1;
					else if (_y >=  h)	_y = 0;
						
					sum += pixels1[w * _y + _x] != WHITE ? 1 : 0;
				}
			}
			
			return sum;
		}
	}
}