Scratchで神経衰弱ゲームを作ってみます。
カードをめくって絵が合えばOKというゲームです。
単純なゲームでプログラムも短いのですが、アルゴリズムが割と難しかったです。
また、Scratchで作ることに苦戦しました。
このゲームでは「クローン」、変数「このスプライトのみ」をうまく使っていきましょう。
神経衰弱ゲーム
神経衰弱はカードをめくって2枚の絵柄を合わせていくゲームです。
今回は28枚のカードで14組の絵柄を合わせていきます。
細部は丁寧に作っていないので、注意していただきたいことがあります。
・カードは連打でめくらないでください。
1秒以上間隔をあけてください。
・すべてのカードをめくり終わったら再スタートしてください
コンプリートしてもイベントはありません。
完成プログラム
プログラムの完成形はこちらです。
少し非効率なプログラムもあります。
どうすれば効率のいいプログラムになるか考えてみてください。
(作成したあと、修正する余裕がなかったのでそのまま公開しました。)
スプライトの準備
変数作成時のお約束
変数の名前に「ローカル変数」と名前がついているものは「このスプライトのみ」で作成してください。
トランプの絵柄用意
カードの裏面絵柄を用意してください。
スクラッチのスプライトにはトランプの裏絵柄がありません。
別途用意してスプライトに追加してください。
今回は「いらすとや」の素材を使っています。
トランプの裏面のイラスト | かわいいフリー素材集 いらすとや (irasutoya.com)
このイラストを使う場合、大きさを30にするとちょうど良いです。
絵柄のスプライトを用意
トランプの表面の絵柄を用意します。
スクラッチで用意されているスプライトから適当に14種類を2個ずつ追加しましょう。
スプライトのプログラム
カード裏柄のプログラム
カード裏柄のスプライトにメインのプラグラムを作成していきます。
絵柄のスプライト
14種類、各2枚用意した28枚のスプライトに作成するするプログラムです。
基本的に同じプログラムをコピーすればよいです。
ただし、変数の値は1つずつ変更してください。
変数名に「ローカル変数」と付いているので「このスプライトのみ」で作成してください。
「ローカル変数カード番号」はすべてのスプライトで違う番号を付けてください。
28枚あるので1~28の番号を使います。
「ローカル変数種類番号」は同じ絵柄のスプライトには同じ番号を付けてください。
14種類のスプライトがあるので1~14の番号を使います。
この表のような変数の値になります
スプライト | 変数名 | 値 |
---|---|---|
ローカル変数カード番号 | 1 | |
ローカル変数種類番号 | 1 | |
ローカル変数カード番号 | 2 | |
ローカル変数種類番号 | 1 | |
ローカル変数カード番号 | 3 | |
ローカル変数種類番号 | 2 | |
・・・ | ・・・ | ・・・ |
プログラム解説
カード裏柄のプログラム
カードの裏柄に作成するプログラムを解説します。
共通で実行したいプログラムや初期処理などはこのスプライトに作成することにします。
神経衰弱の中心プログラムを作成します。
おおまかなプログラムは次のような構成になっています。
・初期化処理
・裏カードのクローン作製、配置、配置場所の決定
・絵柄のカード配置
・カードクリックしたときの処理(カードをめくり、絵柄が一致したかの判定)
プログラム開始
プログラムが開始されたときの処理です。
ブロック定義を使って、大まかにプログラムを分けています。
分けておかなと、あとでプログラムを修正するときに訳が分からなくなるためです。
まず、裏柄のカードを「隠す」にしています。
プログラムの開始時点では裏柄カードのスプライトの位置が決まっていません。
適当な場所にカードが表示されていると格好悪いので隠しています。
初期化処理
このプログラムで使う変数に初期値をセットしたり、不要な値を削除したりします。
プログラムを始めて実行するときは不要ですが、再実行をすると前回実行した時のデータが残っていたりします。
誤作動の原因になるので、プログラムの開始時には初期化をするようにしましょう。
変数の説明
変数名 | 説明 |
---|---|
X並べ Y並べ | 裏柄のスプライトをクローン機能で複製して並べるときに、何段目の何個目に配置するかをカウントするための変数です。 X方向(横)に7列、Y方向(縦)に4段のカードを並べます。 |
ローカル変数クローン番号 | 裏柄のスプライトを並べたときに、スプライトごとに番号を付けます。 どのスプライトがクリックされたかを他のすスプライトからわかるようにするためです。 「このスプライトのみ」で変数を作ります。 |
X位置 Y位置 | 裏柄スプライトをX座標、Y座標のどの位置に配置するかを設定する変数です。 |
オープン済み番号 | 1枚目にめくったカードの「ローカル変数クローン番号」を記録する変数です。 |
オープン番号 | 2枚目にめくったカードの「ローカル変数クローン番号」を記録する変数です。 (一瞬だけ1枚目にめくったクローン番号が入ってきます。) |
リスト カード位置X カード位置Y | 裏柄スプライトを配置したX軸、Y軸の座標をすべて記録します。 リストの1番目には「ローカル変数クローン番号」が1のスプライトのX軸、Y軸の座標値が入るようにします。 同じ場所に絵柄のスプライトを配置するために使います。 |
リスト カードリスト | 絵柄カードの「ローカル変数カード番号」の一覧を作成します。 絵柄カードをランダムに配置するときに使います。 |
リスト カード配置 | 絵柄カードをランダムに配置した時に、裏柄スプライトの何番のカードの下に配置したかを管理する一覧です。 |
リスト 種類配置 | 絵柄カードをランダムに配置した時に、絵柄スプライトの何番目のカードの下に何の種類の絵柄を配置したかを管理する一覧です。 |
裏柄カードの配置
裏柄カードのクローンを横7列、縦4段分並べていきます。
(ほかの手段として、裏柄のスプライトを28個作成しても構いません)
まず、画面の左下から右に7個並べます。
次に1段上に左から右に7個並べます。
7個を右に並べる作業を4回繰り返すプログラムになっています。
Y位置の計算を
-130+(85×Y並べ)
としています。
1枚目のカードを置く縦位置を-130の座標にしています。
そのあと2段目は85座標上にずらして配置します。
X位置の計算は
-200+(65×X並べ)
としています。
1枚目のカードを置く横位置を-200の座標にしています。
そのあと右に65座標ずらして配置します。
ここで使っている-130、-200、85、65という数字は裏柄カードが重ならなずきれいに並ぶように微調整して決めました。
主要な処理は「7回繰り返す」のブロックの中にあります。
まず、裏柄カードのクローンを作ります。
配置する座標のX位置、Y位置は先ほどの計算式で決定します。
その位置を「カード位置X」「カード位置Y」のリストに登録します。
1個目のクローンはリストの1番目、2個目のクローンはリストの2番目に登録するようになっています。
クローンを配置しますが、「カード位置X」「カード位置Y」から座標を取ってきます。横に
配置したクローンを「表示」します。
クローンの元になっている裏柄スプライトは初期化で「隠す」にしているので「表示する」に変更する必要があります。
後は横に7回、縦に4回の繰り返しを行うように「X並び」「Y並び」の変数を君とアップしていきます。
絵柄カードの位置決定
絵柄のカードの位置を決めるプログラムです。
裏柄カード28枚が配置済みなので、28枚のうちどのカードの下にどの絵柄カードを配置するのかを決めます。
毎回同じ場所に同じカードを配置するとゲームとして面白くないので、毎回ランダムに場所を決めることにします。
まず、絵柄カードのカード番号の一覧を作ります。
「カードリスト」変数に絵柄カードの「ローカル変数カード番号」の一覧を作ります。
今回のプログラムは少し手抜きをします。
「ローカル変数カード番号」の中には1~28までの数字が重複や欠番なくすべて入っている前提にします。
絵柄カードの「ローカル変数カード番号」に入れた値を念のためチェックしておきましょう。
「種類配置」のリストを初期化します。
今回はいったん28個のリストをすべて「0」にしておきます。
(このリストはもう少し後で使います。実は初期化処理のブロックで実行してもいいです。)
「カードリスト」からランダムに1つの値を取り出し、「カード配置」リストに追加していきます。
ランダムに取り出した順に、裏柄カードの左下からに割り当てるイメージです。
カードリストの1番目は「ローカル変数クローン番号」の1番に対応しているイメージです。
一度取り出した絵柄カードを2回以上取り出さないように「カードリスト」から削除します。
残ったカードリストから、ランダムに1つの値を取り出す処理を繰り返します。
(カードの数28回繰り返すループ処理にするか、カードリストがなくなるまで繰り返すループ処理にするか、好きな方法を考えてみてください)
カードの位置が決まったら、メッセージ「表カード配置」を発信します。
絵柄カードのスプライトにはこのメッセージを受け取ると、自分の配置先に移動するプログラムを仕込んでいます。
裏柄カードをクリックしたときの処理
裏柄のカードがクリックされたときに神経衰弱の主要なプログラムが動くようになっています。
主な機能は次のような内容です。
・カードを非表示にして絵柄スプライトが見えるようにする。
・2枚目のカードがクリックされたとき、1枚目の絵柄スプライトと同じ絵(種類番号)と同じかチェックします。
違う絵柄の場合、裏柄カードを表示して絵柄スプライトを隠します。
オープンにする裏柄カードの番号を記録する
まず、裏柄スプライトがクリックされたら、スプライトが持っている「ローカル変数クローン番号」を「オープン番号」に設定します。
「ローカル変数クローン番号」には裏柄スプライトのクローンを作成した時に、1枚ずつ異なる数字(1~28)が入っています。
「オープン番号」に設定するのは、オープンしたカードの番号を記録しておくためです。
(この時点で「オープン番号」設定するのは効率のいいプログラムではありません。効率のいいプログラムを考えてみてください。)
オープンにするカードが1枚目の場合
「もし、オープン済み番号=0なら」でめくったカードが1枚目か2枚目かを判断します。
「オープン済み番号」が0の時は1枚目がめくられたと判断します。
そして、「オープン済み番号」に「ローカル変数クローン番号」を設定します。
(オープン番号を設定しても構いません。)
オープンにする裏柄スプライトを非表示にして絵柄スプライトを見えるようにします。
(ここで非表示していますが、もっと早い段階に「隠す」処理をした方が、効率のいいプログラムになります。)
オープンにするカードが2枚目の場合
まずは、2枚目のカードも非表示します。
1枚目に開いたカードと2枚目に開いたカードの絵柄カードが一致しているかチェックします。
「オープン済み番号」と「オープン番号」に入っている値で、どこのカードがオープンされたかわかります。
「種類配置」リストには絵柄カードの種類番号が入っています。
「オープン済み番号」と「オープン番号」番目に入っている値が同じなら、同じ絵柄をオープンしたと判断できます。
一致した場合は、処理は終了です。
「オープン番号」「オープン済み番号」を初期化(0にする)して、次のペアを探す処理に移ります。
一致しなかった場合は、1秒待って裏柄カードのクローンを作って絵柄カードを隠します。
クローンを作る座標は「カード位置X」リスト、「カード位置Y」リストに入っています。
(絵柄カードを隠すためにクローンを作っていますが、もともとの裏柄スプライトを表示する方法もあります。)
絵柄カードのプログラム
絵柄スプライトのプログラムを主に2つです。
・プログラムが開始されたときに、カードの番号と種類番号をセットする。
・スプライトの場所をランダムに配置する。
絵柄スプライトには、ほとんどプログラムをつくっていません。
裏柄スプライト側に神経衰弱の主要プログラムを作っています。
プログラム開始時にスプライトの固有番号を付ける
絵柄スプライトごとに「ローカル変数カード番号」と「ローカル変数種類番号」をセットします。
セットする値は、スプライトごとに個別に設定します。
スプライト | 変数名 | 値 |
---|---|---|
ローカル変数カード番号 | 1 | |
ローカル変数種類番号 | 1 | |
ローカル変数カード番号 | 2 | |
ローカル変数種類番号 | 1 | |
ローカル変数カード番号 | 3 | |
ローカル変数種類番号 | 2 | |
・・・ | ・・・ | ・・・ |
このように、「ローカル変数カード番号」には1~28の番号を重複しないように付けます。
「ローカル変数種類番号」には同じ絵柄のスプライトには同じ番号を付けます。
スプライトをランダムに配置する
メッセージ「表カード配置」を受け取ったときの処理です。
裏柄スプライトでカードの配置場所を決めています。
裏柄スプライトで配置場所が決まったら「表カード配置」のメッセージを送ってきます。
「カード配置」リストに自分が何番の絵柄カードの場所に配置されるのか登録されています。
自分の「ローカル変数カード番号」を使って配置する番号を取得します。
配置する番号がわかったら「カード位置X」リスト、「カード位置Y」リストから座標の値を取得します。
座標位置にスプライトを移動します。
「種類配置」リストに裏柄カードの何番目の位置に、なんの種類の絵柄が配置されているかを記録します。
コメント
こんにちは! ブログランキングから来ました。
むずかそうですね~
またゆっくり訪問させていただきます。
訪問ありがとうございます。
雑なプログラムですが、楽しんでいただければ嬉しいです。