Hatena::ブログ(Diary)

flashrod このページをアンテナに追加 RSSフィード

2007-04-01

flashrod2007-04-01

AS3で一画面プログラム集(其の二) 14:37  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()})}}}}

日曜の昼下がりに一画面プログラミング、いかがですか。意外と面白いですよ。