ファイブボックス 一分間スクラッチ講座 | #004 リストを大きい順に並べる方法
今回は、Scratchでリストの中に入っている数字を、大きい順に並べる方法を紹介します。
たとえば、ゲームのスコアを記録しておいて、
1位
2位
3位
のように、点数が高い順に表示したいときに使える考え方です。
Scratchには、リストを自動で並び替える専用ブロックはありません。
そのため今回は、
元のリストから数字を1つずつ取り出して、別のリストに大きい順で入れていく
という方法で並び替えを行います。
1.今回使うリストと変数
今回は、あらかじめ10個のスコアが入ったリストを用意しておきます。
使うリストは2つです。
リスト
スコア
並び替える前の点数を入れておくリスト
順位
大きい順に並び替えた結果を入れるリスト
たとえば、リスト「スコア」に次のような数字が入っているとします。

これを並び替えると、リスト「順位」には次のように入ります。

このように、元のリスト「スコア」はそのまま残しておき、
並び替えた結果だけをリスト「順位」に入れていきます。
なお、1から100までのかぶらない数字を順不同で配列:スコアに格納するサンプルは、以下のプログラムです。

2.使う変数
今回使う変数は2つです。
スコアNo.
リスト「スコア」の何番目を調べているかを表す変数
順位No.
リスト「順位」の何番目と比べているかを表す変数

3.並び替えの考え方
今回の並び替えは、次のような流れで行います。
リスト「順位」を空にする
リスト「スコア」の1番目から順番に確認する
確認中のスコアを、リスト「順位」の中の数字と比べる
自分より小さい数字を見つけたら、その場所に挿入する
これをすべてのスコアで繰り返す
ポイントは、
順位リストにただ追加するのではなく、正しい場所に挿入する
というところです。

4.まず「順位」をリセットする
スペースキーが押されたときに、並び替えを開始するようにします。
最初に行うことは、リスト「順位」を空にすることです。
前回の結果が残ったままだと、正しく並び替えができません。
そのため、最初に
順位のすべてを削除する

という処理を入れておきます。
5.スコアNo.を1にする
次に、変数「スコアNo.」を1にします。

これは、リスト「スコア」の1番目から順番に確認していくためです。
たとえば、
スコアNo. が 1 → スコアの1番目を見る
スコアNo. が 2 → スコアの2番目を見る
スコアNo. が 3 → スコアの3番目を見る
というように使います。
6.スコアの数だけ繰り返す
今回は、リスト「スコア」に10個のデータが入っている想定なので、
処理を10回繰り返します。

繰り返しの中では、リスト「スコア」の中身を1つずつ取り出して、
リスト「順位」の正しい場所に入れていきます。
7.順位No.を1にする
1つのスコアを確認するたびに、変数「順位No.」を1にします。
これは、リスト「順位」の1番目から順番に比較していくためです。

たとえば、今チェックしているスコアが「75」だったとします。
順位リストの中に、
100
80
60
40と入っていた場合、
75 と 100 を比べる
75 と 80 を比べる
75 と 60 を比べる
というように、上から順番に見ていきます。
75は60より大きいので、60の前に入れます。
結果は、
100
80
75
60
40となります。
8.大きい場所を見つけたら挿入する
今回の重要なポイントは、ここです。
チェック中のスコアが、
リスト「順位」の中にある数字より大きかった場合、
その場所にチェック中のスコアを挿入します。
つまり、
今見ているスコア > 順位リストの中の数字
になったところで、その場所に入れるということです。

たとえば、
チェック中のスコアが「90」で、
順位リストが次のようになっていたとします。
100
80
50この場合、
90 は 100 より小さい
90 は 80 より大きい
なので、80の前に90を入れます。
結果は、
100
90
80
50となります。
9.最後まで見ても入れる場所がない場合
もし、チェック中のスコアが一番小さい場合は、
順位リストの最後まで見ても、自分より小さい数字が見つかりません。
その場合は、リスト「順位」の最後に追加します。
たとえば、チェック中のスコアが「20」で、
順位リストが次のようになっていた場合です。
100
80
50
3020はどの数字よりも小さいので、最後に追加します。
100
80
50
30
20この処理を入れておくことで、すべてのスコアを正しく並べることができます。
10.処理全体の流れ
処理全体を文章でまとめると、次のようになります。
スペースキーが押されたら開始
リスト「順位」を空にする
スコアNo. を 1 にする
スコアの数だけ繰り返す
順位No. を 1 にする
順位リストの上から順番に比較する
チェック中のスコアの方が大きければ、その場所に挿入する
入れる場所がなければ、最後に追加する
スコアNo. を 1 ずつ増やす
すべてのスコアを確認したら完成
この流れで、リスト「順位」に大きい順でスコアが入っていきます。
11.この方法でできること
この並び替えの考え方は、スコア以外にも使えます。
たとえば、
点数を高い順に並べる
タイムを速い順に並べる
数字の大きい順にランキングを作る
ゲームのハイスコア一覧を作る
といった場面で使うことができます。
特に、Scratchでランキング機能を作りたいときには、とても便利です。
まとめ
今回は、Scratchでリストの数字を大きい順に並べる方法を紹介しました。
Scratchにはリストを自動で並び替えるブロックはありませんが、
別のリストに、正しい順番で挿入していくことで、並び替えを作ることができます。
今回のポイントは次の3つです。
元のリスト「スコア」と、並び替え後のリスト「順位」を分ける
スコアを1つずつ取り出して確認する
大きい数字が上に来るように、正しい場所へ挿入する
最初は少し難しく感じるかもしれませんが、
ランキングやハイスコア表示を作るときにとても役立つ考え方です。
サンプルはこちらでも確認できます。
https://scratch.mit.edu/projects/1067683770

ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。
ご興味のある方は当サイト、オンラインレッスンから、無料体験授業へお問い合わせ下さい。
いいなと思ったら応援しよう!
よろしければ応援お願いします! いただいたチップはクリエイターとしての活動費に使わせていただきます!