2007-04-01
■ AS3で一画面プログラム集(其の二)

前回に引き続き、一画面(80桁×25行=2000文字)以内プログラムだ。オイラはこの大きさくらいのプログラムをいじるのが一番楽しいみたいだ。
例によって80文字で改行しているけど、実際にソースファイルにするときは改行を削除して1行にする必要がある。
あ、それとこいつらは適切にADF書けばApolloでもうごくよ。
マインスイーパ
Flashで右クリックは無理なのでCTRL+とSHIFT+にしてみた。自分でやってみて思うのだけどこれは操作に慣れるのが大変だ。
- 画面の大きさは9×9、地雷の数は10個
- クリックで一マスを開く
- CTRL+クリックで、旗を立てる/倒す
- SHIFT+クリックで、指定のマスの周り8個の旗以外を開く
- 経過時間表示をクリックするとリスタート
Mine.as (1867文字)
package{import flash.display.*;import flash.text.*;import flash.utils.*;public c lass Mine extends Sprite{var C=9,L=9,M=10,W=18,a=[],t=new TextField(),z,n;public function Mine(){for(var j=0;j<L;++j){a[j]=[];for(var i=0;i<C;++i){var g=new Tex tField();g.selectable=0;g.x=i*W;g.y=j*W+W;a[j][i]={t:g};addChild(g)}}Z();stage.a ddEventListener("click",function(e){var i=int(e.stageX/W);var j=Math.floor((e.st ageY-W)/W);if(n&&0<=i&&i<C&&0<=j&&j<L){if(e.ctrlKey){var o=a[j][i];if(!o.o){if(o .f){o.f=0;o.t.text=""}else{o.f=1;o.t.text="?"}}}else if(e.shiftKey)S(i,j);else P (i,j);R();if(!n)t.appendText("!complete!")}});addEventListener("enterFrame",func tion(e){if(n){var v=int((getTimer()-z)/1000);var m=int(v/60);var s=int(v % 60);t .text=int(m/10)+""+(m%10)+":"+int(s/10)+""+(s%10)}});t.autoSize='left';t.selecta ble=0;var b=new Sprite();b.addChild(t);b.addEventListener("click",function(e){Z( )});addChild(b)}function Z(){for(var j=0;j<L;++j)for(var i=0;i<C;++i){var o=a[j] [i];o.t.text="";o.m=o.f=o.o=0}for(var k=0;k<M;++k){i=int(Math.random()*C);j=int( Math.random()*L);a[j][i].m=1}R();n=1;z=getTimer()}function S(x,y){for(var j=-1;j <2;++j){var v=y+j;if(0<=v&&v<L)for(var i=-1;i<2;++i){var u=x+i;if(0<=u&&u<C&&!a[ v][u].f)P(u,v)}}}function P(x,y){var q=a[y][x];q.o=1;if(q.m){for(var j=0;j<L;++j )for(var i=0;i<C;++i){var o=a[j][i];if(o.m)o.t.text="X"}t.appendText("!game over !");n=0}else{var k=0;for(j=-1;j<2;++j){var v=y+j;if(0<=v&&v<L)for(i=-1;i<2;++i){ var u=x+i;if(0<=u&&u<C&&a[v][u].m)++k}}if(k)q.t.text=k+"";else for(j=-1;j<2;++j) {v=y+j;if(0<=v&&v<L)for(i=-1;i<2;++i){u=x+i;if(0<=u&&u<C&&!a[v][u].o)P(u,v)}}}}f unction R(){n=0;with(graphics){clear();for(var j=0;j<L;++j){var y=j*W+W;for(var i=0;i<C;++i){var o=a[j][i];n|=o.m||o.o?0:1;var c=o.o?0:-1;var x=i*W;lineStyle(1, c);moveTo(x,y+W-1);lineTo(x,y);lineTo(x+W-1,y);lineStyle(1,c^-1);lineTo(x+W-1,y+ W-1);lineTo(x,y+W-1)}}}}}}
ブロックくずし
- クリックでゲームスタート
- マウス位置の近くにパドルがやってくる
当たり判定に、ダイナミクスエンジンの研究で得た知識を投入してみたけど、なんだかもうひとついまいちな感じ。
Block.as (1377文字)
package{import flash.display.*;public class Block extends Sprite{var H=240,P=48, W=32,D=8,C=[0xFFFF00,0xFFFF00,0xFF00FF,0xFF00FF,0xFF00FF,0x00FFFF,0x00FFFF],a,p, q,u,v,l,m,d;public function Block(){l=W*3-P/2;m=H-16;stage.addEventListener("cli ck",function(e){a=[];for(var j=0;j<7;++j)for(var i=0;i<6;++i)a.push({x:i*W+1,y:j *D+D*3+1,w:W-2,h:D-2,c:C[j]});p=l+P/2;q=m-8;u=4;v=-8});stage.addEventListener("m ouseMove",function(e){d=l;l=e.localX-(P/2);if(l<0)l=0;if(l>W*6-P)l=W*6-P;d=l-d}) ;addEventListener("enterFrame",function(e){var x2=p+u;var y2=q+v;for each(var b in a)if(c(b,x2,y2,p,q))a.splice(a.indexOf(b),1);if(x2<0||x2>6*W)u=-u;if(y2<0)v=- v;if(c({x:l,y:m,w:P,h:8},x2,y2,p,q))u+=d;if(y2>H)v=u=0;p+=u;q+=v;with(graphics){ clear();beginFill(0);drawRect(0,0,W*6,H);for each(var b in a){beginFill(b.c);dra wRect(b.x,b.y,b.w,b.h)}beginFill(0xFFFFFF);drawCircle(p,q,4);beginFill(0xCCCCFF) ;drawRect(l,m,P,8)}})}function B(a,b,c){return b<=a&&a<c}function X(y0,x1,y1,x2, y2){return x1+(y0-y1)*(x2-x1)/(y2-y1)}function Y(x0,x1,y1,x2,y2){return y1+(x0-x 1)*(y2-y1)/(x2-x1)}function c(b,x2,y2,x1,y1){if(B(b.y,y1,y2)&&B(X(b.y,x1,y1,x2,y 2),b.x,b.x+b.w)){v=-v;return 1}if(B(b.y+b.h,y2,y1)&&B(X(b.y+b.h,x1,y1,x2,y2),b.x ,b.x+b.w)){v=-v;return 1}if(B(b.x,x1,x2)&&B(Y(b.x,x1,y1,x2,y2),b.y,b.y+b.h)){u=- u;return 1}if(B(b.x+b.w,x2,x1)&&B(Y(b.x+b.w,x1,y1,x2,y2),b.y,b.y+b.h)){u=-u;retu rn 1}return 0}}}
ハノイの塔
- クリックすると解のアニメーションを開始する
再帰で解いた手順を再現するアニメーションを表示するだけで、とくにインタラクションは無い。
Hanoi.as (960文字)
package{import flash.display.*;public class Hanoi extends Sprite{var a=[[],[],[] ],q=[],C=[0xFF0000,0xFFFF00,0x0000FF,0x00FF00],N=4,H=16,W=100,V,X,v;public funct ion Hanoi(){addEventListener("enterFrame",function(e){if(q.length>0)q.shift()()} );stage.addEventListener("click",function(e){var f=-1;var t=[];for(var i=0;i<a.l ength;++i){if(a[i].length==N)f=i;else t.push(i)}if(f>=0)s(N,f,t[Math.floor(Math. random()*2)])});for(var i=0;i<N;++i)a[0].push(i);r()}function r(){with(graphics) {clear();if(X>0){var u=20*(V+1);beginFill(C[V]);drawRect(X-u/2,0,u,H);endFill()} for(var i=0;i<a.length;++i){var l=a[i].length;for(var j=0;j<l;++j){var b=a[i][j] ;var w=20*(b+1);beginFill(C[b]);drawRect(i*W+W/2-w/2,(j+(N-l))*H+H,w,H);endFill( )}}}}function s(n,f,t){if(n>1){s(n-1,f,3-(f+t));s(1,f,t);s(n-1,3-(f+t),t)}else{q .push(function(){V=a[f].shift();X=f*W+W/2;v=(t*W+W/2-X)/10});for(var i=0;i<10;++ i)q.push(function(){X+=v;r()});q.push(function(){X=-1;a[t].unshift(V);r()})}}}}
日曜の昼下がりに一画面プログラミング、いかがですか。意外と面白いですよ。
コメントを書く





