プログラミング的思考について書いたのですが、例をあげた方が伝わりやすいと思うので書いてみます。

 

オセロを例にします。人間とやる場合、大人なら「オセロをやろう」だけで説明は何もしなくてもゲームが成立するでしょう。これは相手がオセロがどういうゲームなのか知っているからです。

 

では、オセロをしたことがない子供が相手だったら?

 

  1. (オセロを出す)
  2. 「君は白、僕は黒、じゃんけんで先にどっちが置くか決めるよ」
  3. 「はじめに4つ、真ん中に四角に並べて、白と黒を斜めにね」
  4. 「縦横斜めのどれかの向きで、黒を白で挟んだら黒を白にひっくり返せるよ」
  5. 「ひっくり返せる場所にしか置けないよ、ひっくり返せる場所があれば、イヤでも置かないとダメだよ」
  6. 「どこにも置けなかったらパスで、相手の番になるよ」
  7. 「最後に多い方が勝ちだよ」

くらいで一応ゲームになるでしょうか。

こういうのを順序立てて説明できる能力も論理的思考力だと思います。

(角を取るといいとか、どうやれば強くなるかは次の段階なのでパス)

 

参考 オセロのルール

一応、上の説明で網羅できてそうです。

網羅できているから、プログラミング的思考ができているか?、そんなことはないです。

 

オセロゲームのプログラムを作るとすると?

プログラミングするつもりになって考えることを書いてみます、これが「プログラミング的思考」?。

(実際にはいちいち日本語で書かないで直接プログラムを書きますが、頭の中では下のようなことを考えながら書いています)

 

  1.  「盤面は8×8である、各マスを(1,1)~(8,8)で表現する(と決める)。石は白と黒の2色、ひっくり返すと他方の色になる」
  2.  「プレーヤーは2名、白と黒を担当する。最初の番はランダムに決める。自分の番では石を置くかパスするかいずれかの動作を行う。終了すると他方の番となる」
  3.  「(4,4)(5,5)は白、(4,5)(5,4)は黒、他は空き」
  4.  「あるマスに注目する。進み方は(-1,-1)、(-1,0)、(-1,1)、(0,-1)、(0,1)、(1,-1)、(1,0)、(1,1)の8方向、注目したマスから1回づつ進む。注目したマスから1回進んだマスから自分と違う色が連続し、その直後に自分と同じ色がある場合にひっくり返すことができる、ただし盤面を出たとき、空きマスがあった場合は調査を中止する」
  5.  「現在空いていて、ひっくり返す石がある方向が1つ以上あるマスにのみ石を置くことができる」
  6.  「置ける場所が盤面にない場合のみパスする」
  7.  「盤面すべてに石が置かれた場合、盤面上のすべての石が1色になった場合、パスが2回続いた場合にゲームは終了する。終了時に石が多い方が勝ち、石が同数の場合は引き分け」

 

正しいオセロのプログラムを書くにはこれぐらい必要です。子供に説明したときより長いです。番号順にみていきます。

 

  1. こんなことはゲーム盤と石を見れば明らかでいちいち説明しないでしょう。
  2. 「番」とは何か決めておきます。
  3. 「四角に」「斜めに」ではコンピュータは理解できません。「空き」も決めておきます。
  4. 「縦横斜め」「挟む」は定義しないと通じません。調査中止の条件も決めないと無限に調べたりします。
  5. 「現在空いていて」と限定しないと、石があるところにも石を置こうとします。
  6. これは同じ。
  7. 「最後」では分かりません、ゲーム終了を厳密に決めておかないと、コンピュータは置ける場所がないのに延々と探したりします。

 

どうでしょうか? 

面倒くさ! としか思わない人はあまりプログラミングが向いてないかもしれません。

じゃあ、●●したら▲▲ができるのでは? と思った人はプログラミング適性があります。

こんなの全部考えつかない! そりゃそうです。私もいきなり全部考えついていません。これは私がオセロプログラムを作ったことがあって、その結果から書いているのです。

 

最初にプログラムを作ったときには上の記述の一部が漏れていて変な動きをしました(バグがあると言います)。それを見て「あ、記述が漏れてた」と気づいて修正するのです。プログラムはそうやって修正しながら作っていくのが普通です。

(最後のパス2回連続なんて滅多に起こらないので、普通気づきません。でもこれを書かないと無限にパスが続いてプログラムが終了しなくなります。)