ライフゲーム

アドイン版 Casio Basic 用サンプルプログラム
<トップページ>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します

動画・説明追加 2015/11/15
更新 2016/05/02

[2015/11/16] プリセットした初期パターンを選べるようにバージョンアップ
[2015/11/17] 記事を大幅に追加して更新
[2015/11/20] C.Basic Ver 0.73 へのバージョンアップを反映した更新
[2016/02/11] C.Basic 最新版は アドイン Casio Basic - トップページ の最新バージョンから
[2016/05/02] ライフゲーム Ver 0.74 へバージョンアップ (C.Basic Ver 0.99m への対応) 



カシオ fx-9860GII の Casio Basic でライフゲームができました。

...とは言っても、純正 Casio Basic では無理なので、アドイン版 Casio Basic : C.Basic で作りました。

最初に作ったもので遊んでみると意外に面白いので、色々とネット検索してライフゲームについて調べたり、プリセットパターンを選べるように機能追加したりして、ハマってしまいました。

実際の動作画面の動画は、下に掲載していますので、その動作速度を見ていただき、C.Basic の能力の高さを実感していただけると思います。

 
ライフゲームのルール

ライフゲームは人工生命シミュレーションと言えるもので、1970年に Conway が発表したのが始まりです。そこで、Conway's Game of Life と呼ばれます。

画面の1ピクセルを1個の生命体(細胞、Cell)と見立てて、誕生、生存、死滅を繰り返す生命体の集団の変化(世代変化)を画面上で再現して、眺めて楽しみます。
ピクセル1個は細胞1個で、 (On:生きている) (Off:死んでいる) のどちらかの状態になります。そして以下の単純な3つの条件だけで次の世代の細胞の生死、つまりピクセルの On / Off  が決定されます。

<誕生>
周りに生きている細胞が3個あれば、次の世代でその場所に新たな細胞が生まれます。
つまり、 あるピクセルが Off の時、周りの8 個のピクセルのうち3個が On の場合、
Birth 
そのピクセルは次の世代で On になります。

<生存>
生きている細胞の周りに生きている細胞が2個あるいは3個あれは、その細胞は次の世代でも生き残ります。
つまり、あるピクセルが On の時、周りの8個のピクセルのうち2個か3個が On の場合、
Live1 LIVE_2 
そのピクセルは次の世代では On のままになります。

<死滅>
上以外の場合、細胞は次の世代で死にます。
つまり、あるピクセルが On の時、周りの8 個のピクセルが1個以下(過疎)、
Death6  Death7 
あるいは4個以上(過密)の場合、
Death1  Death2  Death3  Death4  Death5 
そのピクセルは次の世代で Off になります。

これを画面全てのピクセルについて計算して結果を表示すると、1世代進みます。次々に世代が進むと複雑なパターンに変化してゆきます。


ピクセル一個が極めて単純なルールに従うだけなのに、実際に動かしてみると予想もしない複雑なパターンが次々に現れるのが、ライフゲームの面白いところです。

ライフゲームを知らなかった方や知っていた方も、以下のサイトにある動画を是非ご覧ください。私が探した範囲で最高に分かり易く、面白いと思います;

 ライフゲームの世界, 人口知能に関する断創録

これをプログラム電卓で作るのは無理だと思っていましたが、C.Basic を使えば十分楽しめるスピードで実現できたのはチョット驚きです。

上の動画で紹介されている簡単なパターンは、以下で紹介するプログラム電卓用ライフゲーム LIFE074 で実際に試すことができます。また有名なパターンはプリセットパターンとして選択して使えるようにしています。

ソースコードを公開しているので、プリセットパターンを追加したり、改造したり自由にお使いください。




プログラム電卓でライフゲーム

fx-9860GII の 純正Casio Basic で、液晶全体をピクセル単位でグラフィックス描画するには非常に時間がかかります。一瞬でグラフィックス画面全体を更新・表示することは無理、という仕様になっています。それでも作ってみようとして、最も安易なアプローチとして、画面全体のビットマップ処理を2次元配列(行列)を使って行うのが、楽で分かりやすいのですが 画面全体のピクセルを扱うには行列の要素数が足らない仕様でもあります。そんなわけで、fx-9860GII の Casio Basic ではライフゲームは作れないと思っていました。

アドイン版 Casio Basic インタープリタ : C.Basic の開発が動き出し、テスト版を触っていると、動作は速いし、画面全体のピットマップを2次元配列で高速に処理できるようになり、C.Basic のベンチマークの目的も含めて、面白そうなので作ってみました。純正Casio Basic にはない C.Basic で独自拡張したビットマップ処理コマンドも使ってみました(これを使わないと無理です)。

多くのライフゲームは十分に広い世界を用意していて、無限大の広さが前提になることが殆どです。今回のプログラムは、127×63 ピクセルに限定された狭い世界でのライフゲームです。この狭い世界は、ライフゲームのルールと、高速化のロジックのため、2ピクセルの見えない壁で囲まれていることになり、123×59 ピクセルの領域から外へ出ようとすると、通常のライフゲームとは異なる結果が起こり得ます。

今回作ったライフゲームは、アドイン版 Casio Basic: C.Basic の能力を調べることも大きな目的で、C.Basic Ver 0.66 で作り始め、C.Basic Ver 0.73 で仕上げて、それ以降の最新バージョンで動作確認しています。C.Basic 最新版 (Ver 0.99m) 以降に合わせて ライフゲームを Ver 0.74 にバージョンアップしました。 

このライフゲーム・プログラムを含めて、以下の3セットのプログラムをダウンロードして fx-9860GII に導入すれば、快適にライフゲームが楽しめます。


 アドイン版 Casio Basic: C.Basic

※ 最新バージョンのダウンロード: アドイン Casio Basic - トップページ
  • ZIPファイルで提供
  • ソースファイル(C言語)を公開
  • ZIPファイル内にある CBASIC.G1A がアドインプログラム
C.Basic は、まだテスト版で、バグフィックスとバージョンアップが頻繁に行われています。


◆ オーバークロックツール(アドイン): Ftune2

より高速でスムーズな動きを楽しむには、オーバークロックツールの使用を勧めます。

※ 使い方とダウンロード: fx-9860GII の高速化 - Ftune2 の導入



 サンプルプログラム: ライフゲーム

ダウンロード:
  ライフゲーム Ver 0.74 (C.Basic Ver 0.63 以降に対応) [2016/05/02 バージョンアップ]
  • Ftune2 でオーバークロック (236MHz 以上) を推奨
  • 初期パターンは手入力かプリセットした15個の初期パターンから選択
  • ライフゲームについて:  興味深いサイトを以下に紹介しています。
  • 使い方: 起動画面に説明あり(読みにくくてスミマセン)
  • パターンが変化する様子は、見ていて面白くて飽きません。作ってみるまでは fx-9860GII でライフゲーム遊びが出来るとは、思いもしませんでした。
  • プリセットパターンに手書きでちょい足しもできます。
  • パターン更新中あるいは一旦停止中に [EXIT] を押すと0世代からの実質処理時間を表示してプログラム終了
   プリセット初期パターン

   <パターン1>
   pt1 
   174世代目で安定状態になる。

   <パターン2>
   pt2 
   こんなに小さい5ピクセルから、大きく広がりながらグライダーを5機発射する。
   6機目のグライダーは途中で消滅。一般にはかなり長寿命だが、 LIFE073 の狭い世界では
   652世代目で安定状態になる。

   <パターン3>
   pt3 
   たまたま見つけた面白いパターン。
   大きく広がらないのに、安定状態になるまで517世代と長寿命なのが特徴。
   
   このように、十分な実用的な速度で実行できる(オーバークロック236MHz)。

変化がなくなる517世代までの時間: [時間(相対速度)]

C.Basic Ver0.74C.Basic Ver 0.99m
ノーマルクロック (29MHz)796秒 (0.4)330 (1.0)
オーバークロック (236MHz)115秒 (3.0)52秒 (6.4)
オーバークロック (280MHz)95秒 (3.5)44秒 (7.6)
C.Basic の Ver 0.74 に比べて、最近のバージョンでは機能追加しているにもかかわらず、ほぼ倍の速度を維持している!

   <パターン4>
   pt4 
   たまたま見つけたパターン。横に広がり218世代目で安定状態になる。

   <パターン5>
   pt5 
   たまたま見つけた面白いパターン。
   途中から、画面全体のピクセルで計算と描画を行い負荷が最大になるので、
   プログラムのスピード評価に使える。
   グライダーを6機発射し、そのうち2機は途中で消滅。
   飛び去るグライダーを別にすれば、495世代目で安定状態になる。

   <パターン6>
   pt6 
   たまたま見つけた寿命の長いパターン(658世代)。
   但し、狭い画面よりも広がろうとするので、境界での特異現象あり。

   <パターン7>
   pt7 
   固定パターン(ブリンカー)の1つ。床屋さんのサインのようだ。

   <パターン8>
   pt8
   グライダーが反射を続けて往復移動する様子が面白い。

   <パターン9>
   pt9 
   グライダー: 回転しながら斜めに移動してゆく。

   <パターン10>
   pt10 
   小さい宇宙船と大きい宇宙船: 横に直進する。
   小さい宇宙船は壁に当たるとグライダーに変身する(画面端での特異ケース)。

   <パターン11>
   pt11 
   左右に往復運動するパターン(シャトル)。

   <パターン12>
   pt12 
   往復移動するパターン(シャトル)の1つ。
   壊れて消えそうで、消えずに往復運動するのが面白い。

   <パターン13>
   pt13 
   グライダー銃: MITのゴスペラーが最初に見つけた無限増殖するパターン。
   次々にグライダーが発射される。
   
   <パターン14>
   pt14 
   シュッシュポッポ列車 (Puffer Train): 煙(スパイク)を残しながら移動する。

   <パターン15>
   pt15 
   移動するパターン。ゴミ(スパイク)を残さないのが面白い。




ライフゲームに関するサイト

実際に作ってみると興味が出てきたので、色々と調べてみました。

ライフゲームの説明
人口知能に関する断創録 - ライフゲームの世界  一押し!ライフゲーム歴史と面白さが分かる
人口知能に関する断創録 - ライフゲーム
文系の人にこそ伝えたい!ハッカーを魅了してきたライフゲームの魅力
数字の難民 - ライフゲームを知っていますか?《機械仕掛けの生物》
・ ウィキペディア - ライフゲーム


ライフゲームを見てみる
ライフゲーム入門 (Introduction The Game of Life)
続・ライフゲーム入門 (Game of Life Demo)


fx-5800P でライフゲームを作った人が居た!
nimu.akhの日記: 関数電卓でライフゲーム


ライフゲームの数学的側面

ウィキペディア - ライフゲームの物体一覧
ウィキペディア - セル・オートマトン
ウィキペディア - チューリングマシン


ライフゲームの奥深さ [2016/02/11 追記]

C.Basic でライフゲームを作り始めた時は、ゲームのルールくらいしか知らず、今回 fx-9860GII + C.Basic で作ったのが初めてでした。その動きの複雑さや面白さは、実際に動かしてみないと分からないものです。ルールは単純なのでプログラム自体はそれほど難しくなく、ポイントは処理速度と画面の広さです。

fx-9860GII + C.Basic では、処理速度と画面の広さはスグに限界にきてしまいますが、ライフゲームの面白さを知るには十分です。上で紹介した色々なサイト、特に「一押し」と紹介したサイトにある動画を見て、その奥深さ知りました。

チューリングマシンについてちょっと調べてみると、コンピュータを作るための基本的な概念なんだと知りました。そしてチューリングマシンでチューリングマシンを作ることができる、完全チューリングマシンがあるというのも驚きです。ライフゲームで完全チューリングマシンを作れる、つまりライフゲームでライフゲームが作れることも、上の一押しの動画で紹介されています。

また、0と1だけの世界が、生命の成り立ちに迫ることをフォンノイマンが第二次世界大戦直後、今ほどライフサイエンスが進んでいなかった時代に既に考えていて、原理を証明していたことを知って、その先進性に驚きました。

生命は最初は1個の受精卵から始まり、そこからヒトのような複雑な生命システムができあがるわけですが、それが単に4つの塩基の並び方だけで記録されていて、細胞の分裂と分化に伴ってヒトの生命体としての機能を実現するという事実に迫るために、コンピュータ上の複雑系の研究が進んでいるのも、興味深いところです。

DNAに乗っている情報は、体の設計図だけでなく、タンパクや酵素の製造装置の設計図までも含んでいて、分子レベルでの全ての制御・調節機構を支配しています。生命を単に複製するのに必要な設計図を全てDNAに記録しているだけでなく、細胞分化に多様性を与えるための設計図まで含んでいる凄さも、ライフゲームで遊んでみて改めて実感します。

ライフゲームを実際に作って遊んでみると、複雑なパターンや機能が発現できる初期の単純なセルパターンを探すと、それなりに出てくるのを経験すると、一見単純なものを階層化して組み立てることで、自己複製までできてしまうことに納得します。プログラム電卓で作るライフゲームは、最も単純なウィルスレベルにも及ばないかも知れませんが、想像力をかきたててくれるには十分ですね。




ソースリスト

見やすくなると思ってソースを載せたら、意外に長かった...

ライフゲームの肝心な部分は、下のソースで;
 ・ '== Calc Next Map ==
 ・ '== Update Map ===
の部分で、大した量ではありません。
初期パターンを描いたり、使いやすくしたり、操作説明を入れたりで増えてしまっています(^^;

このプログラムでは1つだけ工夫しています。結構な量の配列計算を出来るだけ少なくするために、パターンの周りの最低限必要なビットマップ領域だけの配列計算をするようにしています。ビットマップ領域の拡大に伴ってフレキシブルに計算領域を拡大しているので、領域が広がるにつれて処理時間がかかるようになります。

fx-9860GII で C.Basic 内蔵のエディタを使ってゼロから作ったプログラムなので、実はこうやってプログラムソースを眺めるのは初めてです。このエディタは 純正Casio Basic の上位互換で、なかなか使いやすくなっていて、特に以下のようにソースを眺めなくてもプログラムが書けてしまいます。Casio Basic が構造化言語なのでブロック構造の分かりやすいプログラムが作れること、そしてエディタが使いやすいことは大きいと思います。


C.Basic 内蔵エディタの宣伝(^^;

そうか! C.Basic 内蔵エディタの使いやすさをアピールする良い機会かも知れません。
純正Casio Basic と同等の文字列検索機能だけでなく、このエディタには、変数や配列/行列の参照・編集機能があって、なかなか使えます。C.Basic Ver 0.99 以降は、ACBreak コマンドで強制終了させたり、ステップデバッグが可能で、コードや変数チェック後、動作復帰するなど、便利なデバッグ機能も搭載していて、とても便利です。


ファイル名: LIFE074.g1m (2472 byte)
'== LIFE Ver 0.74 ==
'        (c)Krtyski
'         e-Gadget
'
'Sample Program
'for CBasic Ver0.99m
'
'Flexible area
' Expanding model
'+Step Mode Option
'+Capture Enabled
'+Int Mode
'+Time Measurement
'+Support New DotP
'+Preset Pattern
'==

'== Execute Mode
'#CBint

'== Graphics Setting
ClrGraph
GridOff
AxesOff
LabelOff
ViewWindow 1,127,0,63,1,0

'== Initial Setting
'= Initialze Matrix
ClrMat B:ClrMat C
{127,63}→Dim Mat B.b
{127,63}→Dim Mat C.b
'Initial Area
'setting temporaly
'as a center dot 
64→L:64→R:32→T:32→B
'= Initialze Gen
0→G
'Step mode flag
1→f:0→s:0→S

0→Z:Prog "LMAP1"

'== Disp Instruction
'Skip Instruction
Z≠0⇒Goto 0

Cls
Text 1,1,"== INSTRUCTION - LIFE Ver0.74"
Text 7,1,"▶DRAW BY REPEAT 2 And 3"
Text 13,15,"1-[EXE]"
Text 13,60,":Start Drawing"
Text 19,15,"2-→/↑/←/↓"
Text 19,60,":Move Cursor"
Text 25,15,"3-[EXE]"
Text 25,60,":Put Dot"Text 31,1,"#E69BRUN"
Text 31,28,"4-[DEL]"
Text 31,60,":Start Running!"
Text 37,28," [(-)]"
Text 37,60,":Step by Step Run"
Text 43,28," [EXE]"
Text 43,60,":Continuous Run"
Text 49,1,"▶Stop"
Text 49,28,"5-[EXIT]"
Text 49,60,":Stop Running"
Text 55,28,"6-[SHIFT][7] :Capture"
Text 59,1,"[F1]"
While Getkey
WhileEnd
Do
LpWhile Getkey≠79
Cls

Lbl 0

'== Draw Pattern ==
CoordOn
Text 2,3,"EXE/→/↑/←/↓: Make Pattern"
Text 8,3,"DEL: Go!"
If Z=0:Then 
64→X:32→Y:IfEnd

0→C
While 1
While Getkey
WhileEnd
Do
Getkey→K
Text 8,3,"DEL: Go!"
LpWhile K=0
K=44⇒Break
If K=31:Then 
Text 8,3,"    "
Plot X,Y◢
'= Flexible Map Area
' Initialze Area,
' starting w/ a dot
If C=0:Then 
If Z=0:Then 
X→L:X→R:Y→T:Y→B
IfEnd
Isz C:IfEnd
1→Mat B[X,Y]
1→Mat C[X,Y]
X≦L⇒X-1→L
X≧R⇒X+1→R
Y≦T⇒Y-1→T
Y≧B⇒Y+1→B
IfEnd
WhileEnd
CoordOff
'Expand Map Area
L→l:R→r:T→t:B→b
'Disp Operation Note
Text 2,3,"[EXIT]:Stop         "
Text 8,3,"[(-)]/[EXE]"

'== Timer Start
%s

'1st Loop
While 1

'== Calc Next Map ==
For T→Y To B
For L→X To R
0→C
CellSum(Mat B[X,Y])→C
If Mat B[X,Y]:Then 
If C≦1 Or C≧4:Then 
0→Mat C[X,Y]
IfEnd
Else 
If C=3:Then 
1→Mat C[X,Y]
IfEnd
IfEnd
'Expand Map Area
If C:Then 
If l≦2:Then 2→l
Else X≦l⇒Dsz l:IfEnd
If r≧126:Then 126→r
Else X≧r⇒Isz r:IfEnd
If t≦2:Then 2→t
Else Y≦t⇒Dsz t:IfEnd
If b≧62:Then 62→b
Else Y≧b⇒Isz b:IfEnd
IfEnd
Next:Next
l→L:r→R:t→T:b→B

'== Update Map ==
Mat C→Mat B
DotPut(Mat C[L,T],L,T,R,B)
'Update Generation
Isz G
Text 2,105,G

'== Key Operation ==
f⇒Goto K
Getkey→K
K=0⇒Goto Z:Goto K

Lbl K
'[(-)]→Pause
If K=41 Or f:Then 
(%-s)+S→S
While Getkey
WhileEnd
Do
Getkey→K
'[EXIT]→Finish up
K=47⇒Break
'[EXE]→Continue
If K=31:Then 0→f
%z:Break:IfEnd
If K=41:Then 1→f
%s:Break:IfEnd
LpWhile 1
IfEnd

'[EXIT]→Finish up
K=47⇒Break

Lbl Z
'[EXIT]→Finish up
K=47⇒Break
WhileEnd
'1st Loop end

'== Finish up ==
(%-s)+S→S
ClrMat B
ClrMat C
ClrText

'#CBasic
Locate 1,1,"Generation"
Locate 12,1,G%
S%÷128→s
Locate 1,3,"Time(s)"
Locate 13,3,S
Int (S÷60)→M
If M:Then 
S-60M→S
Int (log M)→D
Locate 1,4,"Time(m:s)"
Locate 11,4,M
Locate 12+D,4,":"
Locate 13+D,4,S
IfEnd
Locate 1,6,"[SHIFT][F6]"
Locate 8,7,"⇒Graphic Disp"

=====

赤文字は、C.Baisc 独自拡張機能である、ビットマップ関数配列小文字変数変数の型指定タイマーに関するもので、高速化を目指しました。C.Basic は 純正Casio Basic の上位互換なので、このような独自機能を使うと純正Casio Basic では動作しません。

C.Basic の独自拡張機能や簡単な使い方については、ダウンロードした C.Basic の圧縮ファイル内にある readme_J.txt に書かれているので、そこで確認してください。


あっ、サブルーチンの LMAP1.g1m も有った...これは 6520 byte もあります。ここでやっていることは極めて単純で、プリセットパターンを配列データとして作り、それをビットマップとして表示し、矢印キーを押すと別のパターンで同じことを行う...これを15パターン分似たような記述を繰り返しているだけで、その分長くなっています。

コーディングにはメインルーチンと同様にゼロから C.Basic のエディタを使い、コピー&ペーストを使ったので、実際の入力はかなり省略でき、気がついたら長くなっていました。

上と同様に、C.Basic の独自拡張機能を赤文字で示しておきます。

ファイル名: LMAP1.g1m (6524 byte)
'== LMAP Ver0.7x ==
'Bitmap I/O Function
' for LIFE Ver0.7
'==

Cls
While Getkey
WhileEnd

'== Menu
Text 1,1,"===== Set Initial Pattern ====="
Text 9,30,"For LIFE Ver0.7x"
Text 15,30,"-----------------"
Text 25,18,"[F1] Draw New Pattern"
Text 37,18,"[F6] Select Pattern"
Text 59,1,"[F1]"
Text 59,114,"[F6]"

Do
0→K:Getkey1→K
64→X:32→Y

If K=79:Then
'= Manual Draw
0→Z:Cls:Return

Else If K=29:Then
'= Select Pattern
'Preset Pattern#
15→Z
'Crrent Pattern#
1→z

Do
Cls
Text 1,1,"[↓]/[↑]:Select"
Text 1,110,"[ ]"
Text 1,113,z
Text 59,1,"[F1] Enter"

If z=1:Then
64→X:32→Y:0→Mat B
X-2→L:X+2→R
Y-2→T:Y+2→B
0→Mat B[X-1,Y-1]
1→Mat B[X,Y-1]
1→Mat B[X-1,Y]
1→Mat B[X,Y]
1→Mat B[X+1,Y]
1→Mat B[X-1,Y+1]
1→Mat B[X+1,Y+1]
X→X:Y-1→Y
DotPut(Mat B[L,T],L,T,R,B)

Else If z=2:Then
64→X:32→Y:0→Mat B
X-2→L:X+2→R
Y-2→T:Y+2→B
1→Mat B[X,Y-1]
1→Mat B[X+1,Y-1]
1→Mat B[X-1,Y]
1→Mat B[X,Y]
1→Mat B[X,Y+1]
X→X:Y-1→Y
DotPut(Mat B[L,T],L,T,R,B)

Else If z=3:Then
64→X:32→Y:0→Mat B
X-1→L:X+11→R
Y-2→T:Y+2→B
1→Mat B[X,Y-1]
1→Mat B[X+9,Y-1]
1→Mat B[X,Y]
1→Mat B[X+1,Y]
1→Mat B[X+2,Y]
1→Mat B[X+3,Y]
1→Mat B[X+4,Y]
1→Mat B[X+5,Y]
1→Mat B[X+6,Y]
1→Mat B[X+7,Y]
1→Mat B[X+8,Y]
1→Mat B[X+9,Y]
1→Mat B[X,Y+1]
1→Mat B[X+9,Y+1]
X→X:Y→Y
DotPut(Mat B[L,T],L,T,R,B)

Else If z=4:Then
64→X:32→Y:0→Mat B
X-2→L:X+2→R
Y-7→T:Y+7→B
1→Mat B[X-1,Y-6]
1→Mat B[X,Y-6]
1→Mat B[X+1,Y-6]
1→Mat B[X,Y-5]
1→Mat B[X,Y-4]
1→Mat B[X,Y-3]
1→Mat B[X,Y-2]
1→Mat B[X-1,Y-1]
1→Mat B[X,Y-1]
1→Mat B[X+1,Y-1]
1→Mat B[X-1,Y+6]
1→Mat B[X,Y+6]
1→Mat B[X+1,Y+6]
1→Mat B[X,Y+5]
1→Mat B[X,Y+4]
1→Mat B[X,Y+3]
1→Mat B[X,Y+2]
1→Mat B[X-1,Y+1]
1→Mat B[X,Y+1]
1→Mat B[X+1,Y+1]
X→X:Y+1→Y
DotPut(Mat B[L,T],L,T,R,B)

Else If z=5:Then
64→X:32→Y:0→Mat B
X-9→L:X+9→R
Y-11→T:Y+11→B
1→Mat B[X,Y-10]
1→Mat B[X-1,Y-9]
1→Mat B[X,Y-9]
1→Mat B[X+1,Y-9]
1→Mat B[X-1,Y-8]
1→Mat B[X+1,Y-8]
1→Mat B[X-7,Y+8]
1→Mat B[X-8,Y+9]
1→Mat B[X-7,Y+9]
1→Mat B[X-6,Y+9]
1→Mat B[X-8,Y+10]
1→Mat B[X-6,Y+10]
1→Mat B[X+7,Y+8]
1→Mat B[X+6,Y+9]
1→Mat B[X+7,Y+9]
1→Mat B[X+8,Y+9]
1→Mat B[X+6,Y+10]
1→Mat B[X+8,Y+10]
X+8→X:Y+10→Y
DotPut(Mat B[L,T],L,T,R,B)

Else If z=6:Then
64→X:40→Y:0→Mat B
X-4→L:X+5→R
Y-2→T:Y+2→B
1→Mat B[X-3,Y-1]
1→Mat B[X-3,Y]
1→Mat B[X-2,Y]
1→Mat B[X-1,Y]
1→Mat B[X,Y-1]
1→Mat B[X,Y]
1→Mat B[X,Y+1]
1→Mat B[X+1,Y]
1→Mat B[X+2,Y]
1→Mat B[X+3,Y]
1→Mat B[X+4,Y]
1→Mat B[X+4,Y+1]
X→X:Y+1→Y
DotPut(Mat B[L,T],L,T,R,B)

Else If z=7:Then
64→X:32→Y:0→Mat B
X-7→L:X+7→R
Y-7→T:Y+7→B
1→Mat B[X+5,Y-6]
1→Mat B[X+6,Y-6]
1→Mat B[X+6,Y-5]
1→Mat B[X+3,Y-4]
1→Mat B[X+5,Y-4]
1→Mat B[X+1,Y-2]
1→Mat B[X+3,Y-2]
1→Mat B[X-1,Y]
1→Mat B[X+1,Y]
1→Mat B[X-1,Y+2]
1→Mat B[X-3,Y+2]
1→Mat B[X-3,Y+4]
1→Mat B[X-3,Y+4]
1→Mat B[X-5,Y+4]
1→Mat B[X-6,Y+5]
1→Mat B[X-6,Y+6]
1→Mat B[X-5,Y+6]
X+1→X:Y→Y
DotPut(Mat B[L,T],L,T,R,B)

Else If z=8:Then
64→X:32→Y:0→Mat B
X-22→L:X+20→R
Y-5→T:Y+5→B
1→Mat B[X-21,Y+2]
1→Mat B[X-20,Y+2]
1→Mat B[X-19,Y+3]
1→Mat B[X-19,Y+2]
1→Mat B[X-19,Y+1]
1→Mat B[X-16,Y+3]
1→Mat B[X-16,Y+2]
1→Mat B[X-16,Y+1]
1→Mat B[X-15,Y+2]
1→Mat B[X-14,Y+2]
1→Mat B[X-13,Y+2]
1→Mat B[X-12,Y+2]
1→Mat B[X-11,Y+3]
1→Mat B[X-11,Y+2]
1→Mat B[X-11,Y+1]
1→Mat B[X-8,Y+3]
1→Mat B[X-8,Y+2]
1→Mat B[X-8,Y+1]
1→Mat B[X-7,Y+2]
1→Mat B[X-6,Y+2]
1→Mat B[X-4,Y+4]
1→Mat B[X-4,Y+3]
1→Mat B[X-3,Y+4]
1→Mat B[X-3,Y+2]
1→Mat B[X-2,Y+4]
1→Mat B[X+4,Y-2]
1→Mat B[X+5,Y-2]
1→Mat B[X+6,Y-1]
1→Mat B[X+6,Y-2]
1→Mat B[X+6,Y-3]
1→Mat B[X+9,Y-1]
1→Mat B[X+9,Y-2]
1→Mat B[X+9,Y-3]
1→Mat B[X+10,Y-2]
1→Mat B[X+11,Y-2]
1→Mat B[X+9,Y-2]
1→Mat B[X+12,Y-2]
1→Mat B[X+13,Y-2]
1→Mat B[X+14,Y-1]
1→Mat B[X+14,Y-2]
1→Mat B[X+14,Y-3]
1→Mat B[X+17,Y-1]
1→Mat B[X+17,Y-2]
1→Mat B[X+17,Y-3]
1→Mat B[X+18,Y-2]
1→Mat B[X+19,Y-2]
X-8→X:Y+3→Y
DotPut(Mat B[L,T],L,T,R,B)

Else If z=9:Then
64→X:10→Y:0→Mat B
X-2→L:X+2→R
Y-2→T:Y+2→B
1→Mat B[X-1,Y+1]
1→Mat B[X,Y-1]
1→Mat B[X,Y+1]
1→Mat B[X+1,Y]
1→Mat B[X+1,Y+1]
X+1→X:Y+1→Y
DotPut(Mat B[L,T],L,T,R,B)

Else If z=10:Then
5→X:32→Y:0→Mat B
X-3→L:X+5→R
Y-7→T:Y+7→B
1→Mat B[X-2,Y-4]
1→Mat B[X-2,Y+5]
1→Mat B[X-1,Y-3]
1→Mat B[X-1,Y+6]
1→Mat B[X,Y-3]
1→Mat B[X,Y+6]
1→Mat B[X+1,Y-3]
1→Mat B[X+1,Y-6]
1→Mat B[X+1,Y+6]
1→Mat B[X+2,Y-3]
1→Mat B[X+2,Y-4]
1→Mat B[X+2,Y-5]
1→Mat B[X+2,Y+6]
1→Mat B[X+3,Y+3]
1→Mat B[X+3,Y+6]
1→Mat B[X+4,Y+4]
1→Mat B[X+4,Y+5]
1→Mat B[X+4,Y+6]
X+4→X:Y+6→Y
DotPut(Mat B[L,T],L,T,R,B)

Else If z=11:Then
64→X:32→Y:0→Mat B
X-7→L:X+17→R
Y-4→T:Y+4→B
1→Mat B[X-6,Y]
1→Mat B[X-6,Y+1]
1→Mat B[X-5,Y]
1→Mat B[X-5,Y+1]
1→Mat B[X-2,Y-1]
1→Mat B[X-2,Y]
1→Mat B[X-2,Y+1]
1→Mat B[X-1,Y-1]
1→Mat B[X-1,Y]
1→Mat B[X-1,Y+1]
1→Mat B[X+3,Y-3]
1→Mat B[X+3,Y-2]
1→Mat B[X+3,Y+2]
1→Mat B[X+3,Y+3]
1→Mat B[X+4,Y-2]
1→Mat B[X+4,Y-1]
1→Mat B[X+4,Y]
1→Mat B[X+4,Y+1]
1→Mat B[X+4,Y+2]
1→Mat B[X+5,Y-1]
1→Mat B[X+5,Y]
1→Mat B[X+5,Y+1]
1→Mat B[X+6,Y]
1→Mat B[X+14,Y]
1→Mat B[X+14,Y+1]
1→Mat B[X+15,Y]
1→Mat B[X+15,Y+1]
X+6→X:Y→Y
DotPut(Mat B[L,T],L,T,R,B)

Else If z=12:Then
64→X:32→Y:0→Mat B
X-15→L:X+15→R
Y-6→T:Y+6→B
1→Mat B[X-14,Y-4]
1→Mat B[X-14,Y-3]
1→Mat B[X-14,Y+3]
1→Mat B[X-14,Y+4]
1→Mat B[X-13,Y-4]
1→Mat B[X-13,Y-3]
1→Mat B[X-13,Y+3]
1→Mat B[X-13,Y+4]
1→Mat B[X-1,Y-2]
1→Mat B[X-1,Y+2]
1→Mat B[X,Y-2]
1→Mat B[X,Y+2]
1→Mat B[X+3,Y-5]
1→Mat B[X+3,Y-4]
1→Mat B[X+3,Y-2]
1→Mat B[X+3,Y+2]
1→Mat B[X+3,Y+4]
1→Mat B[X+3,Y+5]
1→Mat B[X+4,Y-4]
1→Mat B[X+4,Y-3]
1→Mat B[X+4,Y-2]
1→Mat B[X+4,Y+2]
1→Mat B[X+4,Y+3]
1→Mat B[X+4,Y+4]
1→Mat B[X+5,Y-3]
1→Mat B[X+5,Y+3]
1→Mat B[X+13,Y-4]
1→Mat B[X+13,Y-3]
1→Mat B[X+13,Y+3]
1→Mat B[X+13,Y+4]
1→Mat B[X+14,Y-4]
1→Mat B[X+14,Y-3]
1→Mat B[X+14,Y+3]
1→Mat B[X+14,Y+4]
X→X:Y-2→Y
DotPut(Mat B[L,T],L,T,R,B)

Else If z=13:Then
64→X:32→Y:0→Mat B
X-19→L:X+18→R
Y-5→T:Y+5→B
1→Mat B[X-18,Y]
1→Mat B[X-18,Y+1]
1→Mat B[X-17,Y]
1→Mat B[X-17,Y+1]
1→Mat B[X-7,Y]
1→Mat B[X-7,Y+1]
1→Mat B[X-7,Y+2]
1→Mat B[X-6,Y-1]
1→Mat B[X-6,Y+3]
1→Mat B[X-5,Y-2]
1→Mat B[X-5,Y+4]
1→Mat B[X-4,Y-1]
1→Mat B[X-4,Y+3]
1→Mat B[X-3,Y]
1→Mat B[X-3,Y+1]
1→Mat B[X-3,Y+2]
1→Mat B[X-2,Y]
1→Mat B[X-2,Y+1]
1→Mat B[X-2,Y+2]
1→Mat B[X+3,Y-2]
1→Mat B[X+3,Y-1]
1→Mat B[X+3,Y]
1→Mat B[X+4,Y-3]
1→Mat B[X+4,Y-2]
1→Mat B[X+4,Y]
1→Mat B[X+4,Y+1]
1→Mat B[X+5,Y-3]
1→Mat B[X+5,Y-2]
1→Mat B[X+5,Y]
1→Mat B[X+5,Y+1]
1→Mat B[X+6,Y-3]
1→Mat B[X+6,Y-2]
1→Mat B[X+6,Y-1]
1→Mat B[X+6,Y]
1→Mat B[X+6,Y+1]
1→Mat B[X+7,Y-4]
1→Mat B[X+7,Y-3]
1→Mat B[X+7,Y+1]
1→Mat B[X+7,Y+2]
1→Mat B[X+12,Y]
1→Mat B[X+12,Y+1]
1→Mat B[X+16,Y-2]
1→Mat B[X+16,Y-1]
1→Mat B[X+17,Y-2]
1→Mat B[X+17,Y-1]
X+17→X:Y-1→Y
DotPut(Mat B[L,T],L,T,R,B)

Else If z=14:Then
40→X:38→Y:0→Mat B
X-4→L:X+3→R
Y-9→T:Y+10→B
1→Mat B[X-3,Y-6]
1→Mat B[X-3,Y-1]
1→Mat B[X-3,Y+8]
1→Mat B[X-2,Y-5]
1→Mat B[X-2,Y]
1→Mat B[X-2,Y+3]
1→Mat B[X-2,Y+9]
1→Mat B[X-1,Y-5]
1→Mat B[X-1,Y]
1→Mat B[X-1,Y+1]
1→Mat B[X-1,Y+2]
1→Mat B[X-1,Y+9]
1→Mat B[X,Y-8]
1→Mat B[X,Y-5]
1→Mat B[X,Y+6]
1→Mat B[X,Y+9]
1→Mat B[X+1,Y-7]
1→Mat B[X+1,Y-6]
1→Mat B[X+1,Y-5]
1→Mat B[X+1,Y+7]
1→Mat B[X+1,Y+8]
1→Mat B[X+1,Y+9]
X-1→X:Y→Y
DotPut(Mat B[L,T],L,T,R,B)

Else If z=15:Then
40→X:32→Y:0→Mat B
X-5→L:X+5→R
Y-5→T:Y+5→B
1→Mat B[X-4,Y-1]
1→Mat B[X-4,Y]
1→Mat B[X-4,Y+1]
1→Mat B[X-3,Y-1]
1→Mat B[X-3,Y]
1→Mat B[X-3,Y+1]
1→Mat B[X-2,Y]
1→Mat B[X,Y-3]
1→Mat B[X,Y-1]
1→Mat B[X,Y+1]
1→Mat B[X,Y+3]
1→Mat B[X+1,Y-4]
1→Mat B[X+1,Y+4]
1→Mat B[X+2,Y-4]
1→Mat B[X+2,Y+4]
1→Mat B[X+3,Y-4]
1→Mat B[X+3,Y-1]
1→Mat B[X+3,Y+1]
1→Mat B[X+3,Y+4]
1→Mat B[X+4,Y-4]
1→Mat B[X+4,Y-3]
1→Mat B[X+4,Y-2]
1→Mat B[X+4,Y+2]
1→Mat B[X+4,Y+3]
1→Mat B[X+4,Y+4]
X-2→X:Y→Y
DotPut(Mat B[L,T],L,T,R,B)

IfEnd:IfEnd:IfEnd
IfEnd:IfEnd:IfEnd
IfEnd:IfEnd:IfEnd
IfEnd:IfEnd:IfEnd
IfEnd:IfEnd:IfEnd

Getkey1→K
K=79⇒Break
K=37⇒z+1→z:z=Z+1⇒1→z
K=28⇒z-1→z:z=0⇒Z→z
LpWhile 1

Cls
Mat B→Mat C
DotPut(Mat B[L,T],L,T,R,B)
Return
IfEnd:IfEnd
LpWhile 1


=====






応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ







keywords: fx-9860GIICasioBasic、プログラミング入門グラフィックスプログラム関数電卓

リンク集 | ブログ内マップ


関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

コメントの投稿

非公開コメント

Re:C.Basic のバージョン履歴

管理人様、こんにちは!

>修正しました。
>ついでに、Ver 0.73 もダウンロードできるようにしました。

確認できました(^^)

Ver 0.73は最新版のVer.0.99mだけで動かなくなってしまいましたけど、Ver.0.74であれば従来のバージョンでも問題なく動作するので早く仕様変更しておくべきでした(^^;

行列をMat表記抜きの配列仕様で書き直せばさらにC.Basicっぽさが出るかもしれませんね(^^)


>これまでに e-Gadget で公開されたバージョンの一覧を作ってみました。
http://egadget2.web.fc2.com/archives/fx-9860GII/Addin/CBasic.html
>覚えている範囲で、互換性を切るような大きめの仕様変更ごとに改行してみました。
>こうしてみると、ここまで来たものだ...とチョット感慨にふけってしまいます。

最初の0.10から互換性アップと独自拡張での変わり具合を見ていくと、
ここまでバージョンアップ出来たのも、管理人様やガノー様の貴重なアドバイスのおかげですね。
本当にありがたく思います(^^)

C.Basic のバージョン履歴

sentaro様

これまでに e-Gadget で公開されたバージョンの一覧を作ってみました。

http://egadget2.web.fc2.com/archives/fx-9860GII/Addin/CBasic.html

覚えている範囲で、互換性を切るような大きめの仕様変更ごとに改行してみました。

こうしてみると、ここまで来たものだ...とチョット感慨にふけってしまいます。

Re: ver.0.74のリンク先が…

sentaro様

> C.Basicの行列仕様変更に早速に対応していただきまして感謝です(^^)
>
> ver.0.74のダウンロードのリンク先がHIT&BLOWになってますです…(^^;

修正しました。
ついでに、Ver 0.73 もダウンロードできるようにしました。


ver.0.74のリンク先が…

管理人様、こんにちは!

C.Basicの行列仕様変更に早速に対応していただきまして感謝です(^^)

ver.0.74のダウンロードのリンク先がHIT&BLOWになってますです…(^^;
最新記事
最新コメント
カテゴリ
C# (3)
検索フォーム
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム電卓は、プログラムを使ってナンボ!

実際に触って気づいたこと、自作プログラム、電卓プログラミングについて書いています

おもしろい・役に立つならクリックしてください。励みになります。
にほんブログ村 IT技術ブログ 開発言語へ
にほんブログ村


人気ブログランキングへ


FC2ブログランキングへ


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

RSSリンクの表示
最新トラックバック
ブロとも申請フォーム

この人とブロともになる

QRコード
QR