☆簡易版神経衰弱☆ 2004.1.15更新
今回紹介いたしますのは、LiveMakerを使って作成した「簡易版神経衰弱」です。
動作には、LiveMaker本体が必要となります。
以下のファイルを任意の場所にダウンロード(要解凍)したのち、LiveMakerからLiveNovelを立ち上げ、先ほどのファイルを開いてください。
なお、簡易版神経衰弱のプロジェクトファイルはご自由にお使いいただいてかまいません。
ただし、LiveMaker本体の扱いは、公式HPのルールに従うようお願いいたします。
追記としまして、このHP上の画像や記事の転載はかたく禁じさせていただきます。
LiveMaker用プロジェクトファイル
簡易版神経衰弱(lzh圧縮)
※実行画面
ソフトの概要は、8枚のカード(1〜4数字カード・各2枚)をめくっていき、同じ数字がでたら「あたり」とし、全部「当てる」と終了です。
単純な構成となっていますが、規模を大きくすれば、普通の神経衰弱を作れなくもありません。
ただしわたしの力不足のため、これを参考にした場合、かなりの労力を必要といたします。
また、ランダムにカードを配るルーチンも、規模が大きくなるとこのままの流用は実用的ではないでしょう。
もし他によい方法があれば、ご教授ください。
では、チャートの解説に移りたいと思います。
細かくはご説明できませんが、そのてんはご容赦ねがいます。
※チャート内容
大きくわけて、10個のかたまりで構成されています。
1:初期設定
2:カードのシャッフル
3:カード裏表示
4:変数表示
5:カード選択
6:選択カードを開く
7:カードの比較
8:「あたり」
9:「はずれ」処理
10:ゲーム終了
これらを各まとまりごとにチャートにしたほうがわかりやすいのですが、今回はミニゲームなので一つのチャートに押し込めてみました。
また、変数もこのチャート内のみで使用するようになっています。
もし、他のチャートに「値」を移したい場合は、全体で使う変数表に変数を登録し、そちらに「値」を代入してください。
もっとも、今はまだ他のプロジェクトと合体させることができないようなので、もしこのプロジェクトを組み込みたいときは、自作しなおさなければなりません。
それでは、一つずつ見ていきましょう。
1:初期設定
ここで行われているのは、一部の「変数」を「配列変数」にすることだけです。
変数名は「既開」と「カード」で、ともに1〜8の箱を設けるために宣言がなされています。
使うカードの枚数にあわせて、配列の大きさを決定してください。普通のトランプでしたら、52個必要になります。
「配列変数をつかうよ」という宣言のしかたが、はじめはわからなくてとまどいました。
結果はプロパティで確認してください。
なお、チャート外でも設定しておかねばならないことが3つあります。
一つが変数の作成、二つ目にカードのグラフィックを描き、フォルダに格納しておくこと、最後にプロジェクト:オプションで、プライオリティを拡張しておくことです。
※変数表
※プライオリティ設定
カードのグラフィックは、「裏」が1枚、「表」が8枚の計9枚作成しました。
「表」は「1」〜「4」を赤・青各1枚ずつです。
それをプロジェクト内のグラフィックフォルダに、「カード」というフォルダを作って格納しています。
プライオリティというのは、画面に表示させるセル画(もしくはレイヤー)みたいなものではないかと(^^;
これをカード1枚に対して1つ用意してあげました。
2:カードのシャッフル
実はわたし、BASICという言語でプログラムを学んだもので――しかもMSXという太古(?)のPCで――、説明がそれっぽくなってしまいますが、ここで行われているのは、「カードの種類を基準」にループをかけて、カードをシャッフルしています。
実行画面のカードには、左から1〜8の番号をつけました。
このループのなかでは、「1の赤はn番」、「1の青はn番」、「2の赤はn番」……というようになっているのです。
その「n番」を決めるのが、変数「乱数」です。
計算ノード<乱数1〜9>――間違えてます。乱数1〜8です(><――のなかに、乱数を発生させる「関数」が入ってまして、それで「n」を決めています。
このとき、すでに「n番」のカードに他の値が入っていたら、また乱数を発生させるようになっています。空っぽのカードが見つかるまで繰り返すということです。
1番から8番までにカードが入れ終わったら、シャッフルは終了して表示に移ります。
以上のシャッフル方法は、枚数が少ない場合はよいのですが、実際のトランプと同じ枚数になりますと、後半で作業が遅くなります。偶然、空きがないかぎり、延々とループしてしまうからです。なので、52枚のカードのときは、他のシャッフル方法が必要になると思います。
※ちょっと一言
全体チャートのなかの緑色のノードには、中身がありません。
「判定文」を繋ぐためや、少しでも見やすくするために使用しています。
3:カード裏表示
これは中身を見ればわかります。
ただ「カード裏」の画像を並べているだけです。
プライオリティ1枚につきカード1枚にし、左から「cd1」「cd2」と名前を付けています。
4:変数表示
これもたんに、「マウスの座標」や「めくった回数」などを表示しているだけです。
テストプレイ時に便利だったので、そのまま残してあります。
それと、完成にはメッセージウィンドウなしでやりたかったのですが、システム変数「@Lclick(左クリックするとTRUEを返すフラグ)」がうまく働かなかったので、しかたなくこの方法をとりました。
5:カードの選択
カードシャッフルに続き、第2のポイントです。
やっていることは単純で、<座標検出>でマウスの(x,y)を変数xとyに入れ、どのカードを差しているかを<どのカード?>で計算しています。
マウスのy座標も検出はしていますが、実はここではつかっていません。
x座標のみで計算しているので、カードにカーソルを当てなくてもカードがめくれてしまいます(^^;
計算の結果、カード枚数よりも多い、「9」になるときがあるので、その場合は「8」になるよう、<xが9↑?>で補正をかけています。
カードを2段、3段と並べる場合はy座標から何段目かを計算すれば、「横n枚×縦n段+横n枚」で何枚目かがわかるでしょう。
次に<めくられてる?>に、計算したn番目のカードの情報がおくられ、もしすでにそのカードがめくられているなら、なかったことにして「4:変数表示」に戻りなさいと、命令をしています(配列変数「既開[n]」で判定。中身が1だとめくられています)。
めくられていなかったときは、中身にあった画像ファイル名を作成し、「6:選択カードを開く」処理を行います。
※閑話休題
さきほどから何度か出てきた「関数」という言葉。これはなんだろうと思うかたも多いと思います。知ってるかたは、気にせず流してください。
「関数」とは、「ある値、もしくは信号を与えたとき、設定された計算をして答えを返すもの」というかんじではないかと(いつもながら自信ありません(><)。
最近のPCの世界では、関数の意味がどんどん広くなってるような気がするので、わたしはもう単純に、こう思うようになりました。
「わたしが呼んだらツベコベ言わず処理をして、その答えを返しなさい!」
これがすべてに共通する関数の意味ではないかと……
なお、LiveMakerの「関数」は、ヘルプに一覧表があるので参考にどうぞ。
6:選択カードを開く
ここが少し面倒なところです。
<画像変更>で「n番」のカードを「ファイル名」で指定した画像に切り替えるようにしたかったのですが、「n番カード」を示す「名前」には変数が使えなかったのです。
ですから仕方なしに、カード1〜8の<画像変更>を並べ、該当する番号のところだけめくるようにしました。
行っていることは単純ですが、もし52枚のトランプとなると、かなり苦労すると思われます。
ここだけ別のチャートで作って、<チャート呼び出し>を使おうかとも思ったのですが、1チャートで作成するのをコンセプトにしていたので、このように醜い形になってしまいました。
最後の<中継>では、カードをめくった枚数によって、進む処理をわけています。
もし1枚目なら「4:変数表示」へもどり2枚目をめくらせるようにし、2枚目でしたらその2枚を比較する「7:カードの比較」へ飛ぶようにします。
余談ですが、もし<画像変更>の「名前」に変数が使えるようになれば、カードが何枚あろうと変更ノードは一つですみます。
7:カードの比較
めくられた2枚のカードを比較するために、必要な値を<文字列抜取>内で関数を使って抜き取っています。
この場合は、カードの色ではなく数字が問題となるので、配列変数「カード[n]」から左1バイトを、変数「比較用n枚目」に代入しています。右1バイトは色のデータです。1が青、2が赤になっています。
その値を<カード判定>から伸びる「→」で判定して「あたり」と「はずれ」を選別しています。
8:「あたり」
比較の結果、同じ値であれば「あたり」なので、メッセージボックスに「あたり」と表示します。
<あたり処理>のなかでは、開かれたカードの合計枚数が格納され、また1枚目からめくるように変数をセットします。
そしてまだ開かれていないカードがあれば「4:変数表示」に戻り、ぜんぶ開いていれば「10:ゲーム終了」に進みます。
9:「はずれ」処理
表にした1枚目と2枚目のカードを、<画像変更>で「裏」にしています。
そのあと<クリア>内で「表」になっていたことを表す配列変数「既開{n}」をリセットし、1枚目か2枚目かを判定する変数「何枚目」を1にもどして「4:変数表示」に帰ります。
10:ゲーム終了
メッセージを表示して、終了です。
最後に、解説枠に入っていなかった<既開受渡>ですが、ここでは1枚目に開いた番号を保存するために、変数「一枚目番号」に値を受け渡しているだけです。
ちょうどよい中継になったので、そのまま残してしまいました。
かなり駆け足で説明してきましたが、不明な点があればご連絡ください。
できるだけお答えしたいとは思っております。
ホームへ戻る