ゲームでアルゴリズムを学べる?「アルゴロジック」を体験してみた!

f:id:Nuohman:20161114223352j:plain

アルゴリズム(algorithm)
ある特定の問題を解いたり、課題を解決したりするための計算手順や処理手順のこと。
これを図式化したものがフローチャートであり、コンピューターで処理するための具体的な手順を記述したものがプログラムである。
デジタル大辞泉より参考

NHKの番組ピタゴラスイッチより「アルゴリズム体操」でこのアルゴリズムという名前を知ってる方も多いと思われます。
ですが、具体的に意味を理解している方は少ないと思います。僕もその一人です。

大学の講義でアルゴリズムの教科を取っているのですがいまいち理解が出来ずにいたのですが、ゲームを使ってそれを学べるというサイトを知りました。
今回はこのアルゴリズムとアルゴロジックについて記事を書きたいと思います!

アルゴリズムとは何でしょか?

こちらの宇野毅明様が書かれた「アルゴリズムってなんでしょか」が分かりやすかったです。

「輪切りにされた星形のにんじん」を作るにはどのやり方があるか、また最適な手順は何かを基に説明されています。

星形のにんじんの作り方でアルゴリズム

※一本のにんじんから30個の輪切り★にんじんを作ると考えています。

手順1
こちらは最初に輪切りにし、その後★型にするやり方。

まず最初に一本のにんじんを全て輪切りにしてしまう。
30個の輪切りを作るには29回包丁で切り、更に端を切り落とすので2回、合計31回切る必要がある。

次に●→★にするため余分な部分を切り落とす。
f:id:Nuohman:20161114195509p:plain
ピンクグリーンの線の箇所を切る事で★として角ばった部分を作れる。
これを切るのに2回×5箇所で計10回となる。
これを30個分全てに行うと30×10で300回となる。

最後に輪切りにするための31回と、●→★にするための300回を足して合計331回包丁を入れるのが手順1です。

手順2
最初に星形にし、その後輪切りにするやり方。

まずにんじんを星形にするので上記より10回切り込みを入れる。
次ににんじんを輪切りにするので上記より31回切る。

合計41回包丁を入れるだけで星形の輪切りが完成する。

手順1と2比べると290回も差があるので、効率や時間配分が全然違うのがわかります。
こういった行う方法を考え、より良い手順を閃くことが良いとされています。

  • アルゴリズムは課題を解決するための計算手順や処理手順の事
  • どうせならその手順を最適で最善で行うのがベスト

と宇野毅明様は述べられてます。
これは一般の方向けに書かれた記事だそうで、IT関連ではソートとか使った色々な説明の仕方があるそうですが、今回書こうと思う記事ではこの2択を理解してもらえれば大丈夫です。

アルゴロジックでアルゴリズム体験!

  • 何かをするための手順
  • 最適で最善の手順を考える

というのがアルゴリズムだと何となく理解してもらったところで、これをゲームで体験できるサイトがあったので紹介したいと思います!
今回僕が紹介しますのはこちらの「アルゴロジック2」です。
※ブラウザによっては起動しない場合があるそうです(Chromeは出来ました)

サイトに飛んでもらうとタイトルが出るので「START」を押す。
すると4×6の24個の問題が出てきます。

次に、「右に曲がる」の問題を基にやり方の説明と、使うコマンドの説明をしたいと思います。

アルゴロジックのやり方

ゲーム画面
f:id:Nuohman:20161114202252p:plain

全体像
f:id:Nuohman:20161114201200p:plain

このゲームの目的は、ロボに命令を与えて旗を全て回収しよう!というものです。
どこら辺がアルゴリズムなのかというと、このロボに与える命令の回数を最小回数で行うところです。

ゲーム画面については上記の説明通りです。
注意すべきは「旗を取るには、旗のあるマス目にちゃんと止まらなくてはならない」という事です。

命令の与え方ですが、こちらは全体像より「コマンドブロック」と「コマンドエリア」を使います。

コマンドブロックとは、ロボの動作になります。
コマンドエリアとは、ロボへの命令内容になります。
このブロックをエリアに置き、プレビューボタンを押してあげることでロボは動きだします。

では、実際にロボットに命令を与え、旗を取ってみたいと思います!

f:id:Nuohman:20161114204123g:plain

とまぁ、こんな感じでロボを動かし、旗を全て回収できればクリアです!

このコマンドを間違え、壁に激突してしまうとロボは死にます。

f:id:Nuohman:20161114225505g:plain

※こちら解答になります。

次に、アルゴロジックで使うコマンドについて説明していきます。

コマンドブロックの使い方!

f:id:Nuohman:20161114205553p:plain

コマンドブロックは全部で5種類あります!その説明をしていきます!

前進ブロック

ロボを前進させたい時このブロックを使います。
ブロック一つで進めるマスは1~4マスで、移動距離は数字をクリックすれば変わります。

回転ブロック

ロボの移動方向を変えたい時に使います。
向きは上下左右の4方向となっています。

繰り返しブロック

こちらは二つのブロックで一つの役割となっています。
繰り返しということで、同じ動作を繰り返したい場合に使います。

例えばこちら。
f:id:Nuohman:20161114210751g:plain

前進→右回転→前進→左回転
を行ったのですが、どうやらこれを繰り返せば旗まで行けそうですよね?
ということでこの動作を繰り返しブロックで囲ってしまいます。

f:id:Nuohman:20161114211122g:plain

この[]で囲んだ中の内容が繰り替えしになると覚えておいてください。
ちなみにループは1~4+∞の中から繰り返す回数を選べます。

もし~ならば

こちらも二つのブロックで一つの役割となっています。
これはもし~ならば…をしなさいとう命令を与えます。
つまり、「もし~ならば」という状況にならなければ発動しない行動となります。

f:id:Nuohman:20161114212022p:plain

例えばこちらの画像を参考に考えてみます。

前進ブロックは1個なのに8マス分進まないといけない。
回転ブロックも1個なのに3回使わないといけない。
どう考えても足りないよ…あ!ループがある!これを使おう!
ダメだ…前進ブロックも回転ブロックもループを使わないといけないのに、このままだと壁にぶつかって死んじゃうよ…

となります。
そうした時にこの「もし~ならばブロック」を使います。

ループすべき行動は「前進」と「回転」でありますが、この回転は『もし進むべきマスが壁であったならば』行えば良い行動なので、この回転を囲ってあげます。

f:id:Nuohman:20161114214353p:plain

これで壁が前にあったら回転という命令ができました。
あとはこのままだと発動が1回だけになってしまうので繰り返しで囲ってあげ、前進ブロックも繰り返しに入れてあげます。

f:id:Nuohman:20161114214707g:plain

そうでなければ~

こちらはelseと書かれたブロックの事で、「もし~ならば」ブロックの間に置き、三つで一つの役割として使います。
要は「もし~ならば●●●をする、そうでなければ★★★をする」の★部分を作りたい時にこのelseを使います。

アルゴロジックで僕と対決!

こちらのアルゴロジックですが、クリアすると画面におめでとう!と出てきます。
ですが、そのおめでとう!コメントが2種類あります。

f:id:Nuohman:20161114221606p:plain

  • That’s great!
  • one more challenge!

これは、コマンドブロックの仕様数を最小回数にしてクリアすれば「That's great!」。
それ以外は「one more challenge!」になります。
そしてそれは問題選択画面でも確認ができ、

  • That’s great! → ◎
  • one more challenge! → ○

となります。

f:id:Nuohman:20161114222205p:plain

アルゴロジックに興味をお持ちになった方はぜひ僕の成績と勝負してみてください!
結果お待ちしていますლ(´ڡ`ლ)

あと○になってるところ、もし◎にできた方、教えてぇぇぇええええ!!

※今回のアルゴリズムの記事ですが、書いてる本人もまだ勉強を始めたばかりのド素人なので、もし間違えている部分がありましたら申し訳ございません。