ライフゲーム

ライフゲーム(3081bytes)

あの「ライフゲーム」です。(高速処理バージョンは[こちら]
操作方法は簡単です。最初の画面の下にあるフィールド内の数値を変化させてみて下さい。ライフゲームの舞台の数が変わります。
最低が5、最高が15までの値を入力できます。
もう少し処理速度を上げようと思ったのですが、これが限界のようでした。
スクリプトは情けないようなスクリプトで動いています。
[ライフゲームって何?]
ひとつの小さなセルを生き物として考えています。
まわりの8方向のセルによって生死が分かれます。
(1)中心のセルが生きているとき
 まわりのセルの生存数が2か3の時その中心のセルは生存し続けます。
 それ以外の場合は死にます
(2)中心のセルが死んでいるとき
 まわりのセルの生存数が3の時のみ、生き返ります
つまり ●を死、○を生と表記すると、

●●●
●○●
●●● このように回りが死んでいるときには、中心のセルは死にます
ところが、
○○●
●○●
●●●  このような場合には生存し続けます。
また
○○●
●●●
●●○ このような場合は生き返ります
このような単純な(?)ルールーに従い、セルを操作していきます。  


主要な部分のスクリプト
(ホントはもっとすっきりした書き方があるのかもしれません)
on startMovie
 global myList,tate,yoko,tateList,yokoList,tyousei,neList
 set myList=[]
 set yokoList=[]
 set tateList=[]
 set neList=[]
 set tate=7
 set yoko=7
 put tate into field"ookisa"
 set tyousei=290
 puppetSprite 1,true
 set the trails of sprite 1 to True
 repeat with m=1 to tate*yoko
  setAt(myList,m,random(2)-1)
 end repeat
 repeat with y=yoko down to 1
  setAt yokoList,y,tyousei/yoko*(y-1)+10
 end repeat
 repeat with t=tate down to 1
  setAt tateList,t,tyousei/tate*(t-1)+10
 end repeat
 set the rect of sprite 1 to rect(-100,-100,tyousei/yoko-100,tyousei/tate-100)
end
--
on neighbor
 global tate,yoko,myList,neList,tateList,yokoList
 repeat with m=1 to tate*yoko
 if m =1 then
  put getAt(myList,2)+getAt(myList,1+yoko) + getAt(myList,yoko+2) into mawari
 else if m=yoko then
  put getAt(myList,yoko-1)+ getAt(myList,yoko+yoko) + GetAt(myList,yoko+yoko-1) into mawari
 else if m=yoko*tate-yoko+1 then
  put getAt(myList,yoko*(tate-2)+1) + getAt(myList,yoko*(tate-1)+2) + getAt(myList,yoko*(tate-2)+2 ) into mawari
 else if m=yoko*tate then
  put getAt(myList,yoko*(tate-1)) + getAt(myList,yoko*tate-1)+ getAt(myList,yoko*(tate-1)-1) into mawari
  -- hidari
 else if m mod yoko = 1 then
  put getAt(myList,m-yoko) + getAt(myList,m+1) + getAt(myList,m+yoko) + getAt(myList,m-yoko+1) + getAt(myList,m+yoko+1) into mawari
  --migi
 else if m mod yoko=0 then
  put getAt(myList,m-yoko) + getAt(myList,m-1) + getAt(myList,m+yoko) + getAt(myList,m-yoko-1) + getAt(myList,m+yoko-1) into mawari
  --ue
 else if m / yoko < 1 then
  put getAt(myList,m-1) + getAt(myList,m+1) + getAt(myList,m+yoko) + getAt(myList,m+yoko-1) + getAt(myList,m+yoko+1) into mawari
  --sita
 else if m/yoko >= tate-1 then
  put getAt(myList,m-yoko) + getAt(myList,m-1) + getAt(myList,m+1) + getAt(myList,m-yoko-1) + getAt(myList,m-yoko+1) into mawari
 else
  put getAt(myList,m-1)+getAt(myList,m+1) + getAt(myList,m-yoko) +ツ getAt(mylist,m+yoko)+ getAt(myList, m-yoko-1) + getAt(myList,m-yoko+1) +ツ
getAt(myList,m+yoko-1) + getAt(myList,m+yoko+1) into mawari
 end if
  setAt neList,m,mawari
 end repeat
 repeat with a=1 to tate*yoko
  put getAt(neList,a) into N
  if getAt(myList, a)=1 then
   if N = 2 or N=3 then
    setAt myList,a,1
   else
    setAt myList,a,0
   end if
  else
   if N = 3 then
    setAt myList,a,1
   else
    setAt mylist,a,0
   end if
  end if
 end repeat
end
--
on display
 global myList,tate,yoko,yokoList,tateList
 repeat with y=1 to yoko
  put getAt(yokoList,y) into yokoH
  repeat with t=1 to tate
   set the locH of sprite 1 to yokoH
   set the locV of sprite 1 to getAt(tateList,t)
   set the foreColor of sprite 1 to 255-getAt(myList,tate*(t-1)+y)*random(20)*10
   updatestage
  end repeat
 end repeat
end
--
on stopMovie
 global tateList,yokoList
 puppetsprite 1,false
 set tateList=[]
 set yokoList=[]
end

© Akira SAno 1996
一応こんなページでも著作権は佐野彰に存在します
リンクフリーですがメールでご連絡頂けたら嬉しいです

(96/11/7更新) homeホームに戻る