教室に通って頂いている小学5年生の男子生徒ですが、毎回ご家庭でオリジナルの作品を作ってきて、わからない部分を教室で質問するする、というスタイルで学習しています。
今回頂いた質問は以下のような内容です。
4人のプレイヤーで「レースゲーム」を実施、40秒経過時高さ、つまりy座標の大きさでランキング付けをしたい、とのこと。
4人なら強引にプログラムを組むこともできるのですが、10人になったら、100人になったら、今後の汎用性も考えてランキングをさせるプログラムを作ってみました。
この仕組みの実現には「リスト」の活用が不可欠です。
ちょっと難しいかもしれませんが興味がありましたら見てくださいね!
①まずはプログラムに使う3つのリストを準備します。
- 「プレイヤー」 これは登場人物の名前を入れるリストになります。
- 「記録」 プレイヤー一人一人のデータが記録され、リスト「プレイヤー」と対になります。
- 「順位」 リスト「記録」に対し「記録」の値の大きい順にソート(並び替え)します。
②上で作成したリスト「プレイヤー」に適当な名前を入れましょう。今回のサンプルでは10件のデータで検証していますが、好きな数だけ入れてください。
③リスト「記録」に適当な数値を入れます。
1つずつ入れると大変なので、繰り返し処理と乱数を含むプログラムを組んでみました。今回は10件で行っていますが、「プレイヤー」の人数分繰返してください。
④変数を2つ準備します。いずれも「すべてのスプライト用」です。変数「記録No.」はリスト「記録」の番号を管理する変数、変数「順位No.」はリスト「順位」の番号を管理する変数となります。
⑤ここがソート(並び替え)のプログラムになります。
後で流用できるように「定義」を使っていますが、使わなくても大丈夫です。
1,先にリスト「順位」のデータをすべて削除、変数「記録No」を 1 にしてから繰り返し処理を行います。
リスト「順位」の長さ=リスト「記録」の長さ まで繰り返すつまり「記録」のデータが「順位」に全部入るまで続ける、ということですね。
ここからがリスト「順位」に1つのデータが入る処理になります。
2,変数「順位No」を1にする で、「順位」の上から「記録」の入る場所を探していきます。
3,変数「記録No.」=リスト「順位」の長さ まで繰り返す。
これは、記録が順位にセットされるまで次からの処理を続ける、という意味になります。
この内部が「記録」が「順位」のどこに入るのかを調べる処理になります。
4,「記録」の値と「順位」の値を上から比較してきて、もし今調べている「記録」の値が「順位」より大きいとき、その場所に「記録」が挿入されます。
以上の処理を行っているわけですが、理解が進まない場合は教室までお問い合わせください!
オンライン授業も含め体験授業は無料でやっているので、是非お気軽に!体験授業のお申込みは こちら から。
⑥上のプログラムを実行すると、下の図のように、リスト「記録」のデータの大きい順に、リスト「順位」に登録されます。
ついでにもう一つ処理を行ってみましょう。ここではプレイヤーの順位も並び替えてみます。
⑦先に リスト「プレイヤー順位」を作っておきます。
⑧続いてプレイヤーの順位を並び替えるプグラムです。
先ほど作って活用した2つの変数をそのまま流用します。
1,まずは準備段階として、リスト「プレイヤー順位」のデータを全部削除して、変数「順位No.」に 1 をセットしておきます。
以下の処理を「プレイヤーの長さ」回、サンプルでは10回繰り返します。
2,毎回、変数「記録No.」に1でリセットします。
「プレイヤーの順位の長さ」=変数「順位No.」まで繰り返す。
つまり「プレイヤーの順位」にデータがセットされるまで以下の処理を実行するということです。
3,リスト「順位」の値が、リスト「記録」のデータを上から参照してきて同じ値にぶつかった時、「プレイヤー順位」にその「記録」の番号と同じ番号の「プレイヤー」の値=名前をセットします。
4,これらの処理を全部埋まるまで繰り返す、というわけですね?
これもとても複雑ですが、理解してしまえばとても楽ですよ。
⑨リスト「プレイヤー順位」を参照すると、記録の大きい順に並んであるのが確認できると思います。
この作品はこちらでご参照できます。
https://scratch.mit.edu/projects/462347968
教室では実際に通って頂いての授業の他、ちょっとしたお困りごとに対するオンライン授業やオンラインサポートも行っております。お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。