事例73

発展プログラミングの構想と実践

神奈川県立相模原総合高校 大庭孝則先生

「発展プログラミング」は、言語を変えずに内容を発展させるべき

私からは、今年度本校の学校設定科目として始めた「発展プログラミング」という科目の内容と、実施状況について報告いたします。

 

この科目は、実は今年度の履修者が3名しかいません。本校は総合学科なので、少人数の選択科目がありますが、原則10名以下の科目は開講しないことになっています。しかし、本校は昨年度から神奈川県のプログラミング教育研究推進校に指定されていますので、プログラミング教育を推進するために、今年度は少人数でも開講しました。幸いなことに、来年度の受講希望者は10名弱いるそうです。

 

本校では、開校以来17年間、この科目とは別に「プログラミング」という科目を設置しています。こちらは商業科の専門科目です。プログラミングで使う言語というと、以前はVisualBasicがお決まりでしたが、最近の教科書はJavaを使うようになっているので、ここ数年はJavaによるプログラミングを学習しています。

 

この「発展プログラミング」では、「プログラミング」でJavaの基礎を学んだ生徒に対して、さらに発展的な内容を提供しようというのが最初の構想でした。これについて、私は、「発展プログラミング」では「プログラミング」でやった内容と同じようなことを、言語を変えて、例えばC#言語でやればいいではないかと考えていました。それで、本校のプログラミング教育にアドバイスをいただいている神奈川工科大学の安部惠一先生に相談したところ、駄目出しをいただきました。

 

安部先生のご意見は二つありました。一つは、プログラミング学習というのは系統性が大事なので、あれもこれもとやってしまうとつまみ食いで終わってしまうということ。そしてもう一つが、「『発展』プログラミング」というからには、やはり内容を発展させるべきであるということでした。確かにそうだということで、結局Javaを使って、「プログラミング」で行っていた内容をさらに深化させたものを行うことになりました。教科書はありませんので、授業は自主制作教材で行いました。

 

有史以来の最高の発明=コンピュータを自在に操る技術を学ぶ

さて、突然ですがここで質問です。有史以来、人間はいろいろなものを発明してきましたが、人間の発明の中で最高のものと言ったら何でしょうか。生徒にも時々この質問をします。私は、コンピュータではないかと思います。

 

そして、プログラミングというのは、ソフトウェアによってコンピュータを思い通りにコントロールする技術であると思います。ですからプログラミングというのは、人間の最高の発明品を、自分の思い通りにコントロールする技術ということで、これほど面白いことはないですよね。

 

私が以前に読んだ本に、コンピュータに触らなくてもプログラムの学習ができるということが書いてありましたが、私はそれは間違いだと思います。それでは水泳を習うのにプールに入らなくてもできますよ、と言っているようなものです。やはり水泳を上達するためには、プールに入ってどんどん泳ぐのが必要で、これと同じでプログラムの考え方を身につけるには、コンピュータの前に座ってプログラムを作ることが必要だと思います。

 

対戦ゲームのプログラミングを考える

「発展プログラミング」の内容を考えるにあたって、生徒がコンピュータをコントロールする楽しさを実感できる教材を作れないかとあれこれ考えた末に、思いついたのは囲碁や将棋のプログラムです。今年は藤井聡太4段が公式戦で29連勝して話題になりました。昨年はGoogleの人工知能「AlphaGo(アルファ碁)」が人間の名人を破って、これも話題になりましたね。このAlphaGoの最新バージョン(AlphaGo Zero)は、人間が定石を教えなくてもプログラムが勝手に自分の中で対戦して強くなって、旧バージョンのAlphaGoを百戦百勝で破ったという、まるでSF映画の世界が現実になっているようです。しかし、高校生が授業で将棋のプログラムを作るのはやはり不可能なので、もう少し簡単なものはないかということで思いついたのがこちらです。

 

1.3目並べゲーム

私が子どもの頃に、よく友達と〇×ゲーム(3目並べ)をやっていました。縦横3マスずつの9つのマスに、2人が〇と×を交互に書いていき、自分のマークを3つ揃えたほうが勝ちというゲームです。

 

今日は私が作ったプログラムを持ってきましたのでご覧ください。このプログラムは、マウスでクリックするたびに〇と×が交互に出現します。さらにもう一つの機能は、縦・横・斜めのどこかの列で同じマークが揃うと、それをキャッチして、どちらの勝ちと判定するものです。このゲームを人間対コンピュータで対戦できたら、すごいと思いませんか。

 

実は、このゲームには人工知能が入っていて、人間対コンピュータで対戦することができます。

 

コンピュータはけっこう強いので、よほど複雑なプログラムが動いているのではないか、と思われた方もいらっしゃると思います。しかし、実はそれほど難しくありません。コンピュータの思考ルーチンは、Javaでこれだけなのです。このゲームに勝つには、縦横斜めの8つの列がありますが、その8つの列のどこかを同じマークで揃えます。コンピュータが考えているのは、まずその8つの列を調べて、一つの列にもし二つ同じ駒があったらそこに打ちます。(下図:図a)。

図a
図a

そういう場所がなければ、今度は四隅を見て空いているところに打つ(図b)。

図b
図b

それもなければ、どこでもよいので空いている所に打つ(図c)という順序で考えるようになっています。授業では、生徒にこのプログラムを考えさせました。

図c
図c

授業終了後の生徒の反応です。ゲームができるプログラムを完成できたか、ということについては、3人とも完成できていました。授業の難易度については、2人が「ちょうどよい」、もう1人、ちょっとついてくるのが大変かなと思っていた生徒は、「非常に難しい」と答えました。どこが難しかったのか聞いてみたところ、1人は「2次元配列の使い方」、もう1人が「人間の思考をプログラムで再現すること」と言っています。この2人よりも手こずっていた生徒は、「とにかくパソコンを強くすることが難しかった」と言っていました。

 

思ったより反応が良かったというのが、私の正直な感想です。授業を行う前は、生徒がついて来られるかどうか少々心配でしたが、けっこう熱心に取り組んでいました。本校では、授業時間の確保のために、今年から100分授業を実施しています。彼らは毎回100分間の授業を、ずっと集中して真剣に取り組んでいましたので、少し安心して次のテーマを考えました。

 

2.棒消しゲーム

こちらは、昔からある「棒消しゲーム」とか「七五三ゲーム」と呼ばれるものです。下のほうから7つ、5つ、3つの15本の棒を書いて、対戦する二人が交互にその棒を消していき、最後の一つを消した方が負けというゲームです。一度に消せるのは、同じ段なら隣接していくつ消してもよいですが、既に消してある棒をまたいで消してはいけません。また、段を超えて一度に消すこともできません。こちらも私が夏休みに作ったプログラムです。

 

これも人間と対戦することができます。先手が赤、後手が青になります。私が先手でやってみます。スタートをクリックして、左の上を取ってみます。するとコンピュータが青で、最下段を4つ取りました。

 

 

次に私が最下段の残りの3つをとりました。すると、コンピュータが中段を1つとりました。

 

そしてどんどん取っていくと、結局私が最後の1つを取らざるを得なくなって、私の負けです。

 

 

このゲームは、先ほどの3目並べよりも作るのが難しいです。理由は二つあります。

 

一つは、マウスでなぞることで複数の棒を選択するのですが、このユーザーインターフェースが難しいです。先ほど言ったように、既に選ばれた棒を挟んで選択したり、上下段にわたって選択したりすることはできないので、このような場合はキャンセルしなければいけません。この辺りのユーザーインターフェースを作るのが難しいです。

 

ゲームをやりながら仕組みを推理させていく

もう一つは、コンピュータの思考ルーチンを考えるのがけっこう大変です。やはり人間の方がゲームで勝てる手を打てるレベルにないと、プログラムを作ることができないです。

 

授業では生徒にまず「棒消しゲームって知ってる?」と聞きました。すると、全員が知らない、やったこともない、と言うので、授業では最初に私が作ったプログラムを配ってゲームで遊ばせることから始めました。遊びながらルールを覚えて、「こうやると次はこう打ってくるんじゃないか」というコンピュータのアルゴリズムを推理させました。そして、大体の仕組みがわかったところで、実際に作らせるという流れで行いました。

 

思考ルーチンを作るのは、非常に原始的な方法で行いました。実際にゲームをやっていて、ある局面になったときに、自分はどこに着目してどう打つか。自分が実際に頭の中で考えたことを箇条書きにして、その箇条書きを元に、Javaのプログラムを書かせる、というやり方です。

 

授業中に配った教材プリントがこちらです。こういう場面のとき、どういう手を打つ、それはどこに着目したか、どう考えたかを考えさせました。

例えば、左上の1問目は2段目が三つ。下が全部埋まっているときですね。これはどうするかというと、この場合は下の段に打ってはダメで、上の段の端を1個取るのが正解です。ここを1個取れば、次にコンピュータが二つ取っても一つ取っても、こちらの取り方次第でコンピュータは最後の一つを取らざるを得なくなります。こうすれば、最終的に私の勝ち、ということになります。

 

この棒消しゲームは、自分が夏休みにプログラムを作った手順をそのまま教材にしました。先ほどお話ししたように、最初はマウスで棒を選ぶルーチンを作らせ、そのあと思考ルーチンを考えて作らせた、ということです。下図が、思考ルーチンを考えさせたときの教材です。生徒には、自分の考えをメモさせた上で、そのまとめとして、「先生だったらこう考える」ということを示しました。

 

私が最初にやったのは分析です。まず空き状況を見て、連続した部分がどこにいくつあるか、独立したコマがいくつあるか確認します。そのあと、「ここを取ったらどうなるか、あそこを取ったらどうか」ということを試行錯誤します。

 

これをまず日本語で書き、同じことをJavaで書きます。さらにこれを上段、中段、下段と順番に見ていきます。

こちらが生徒の感想です。3目並べより若干難しくなりましたが、3人とも完成したと言っていました。授業の難易度は、意外にも全員がちょうどいいという答えでした。また、受講した生徒は3人ともコンピュータ関係の専門学校に進学が決まっているので、「この単元で学習したことは将来役立つか」と聞いてみたら、2人が「役立つ」、1人は「大変役立つ」と答えてくれました。

 

大変だった点は、「大変役立つ」と答えた生徒は「アルゴリズムを考えること、自分の思考を読みとることが大変だった」、もう1人は「メソッドの働きが途中でわからなくなったこと」。要するに自分が考えていることを、そのままJavaでプログラムを書けというと、どこまで何を書いたかわからなくなってしまった、ということでした。この2人よりも苦労していた生徒は、「とにかく大変だった」と言っていました。

 

最後に、「この単元を学習して身についたもの、学習中に考えたこと」を聞きましたら、「大変役立つ」と答えた生徒は「自分で考える力が身についた」と答えてくれました。「メソッドの働きがわからなくなった」と答えた生徒は「コメントを書いたり、わかりやすく書くことが大事だと思った」ということです。いちばん大変だったと答えた生徒は「教えてもらえば理解できるが、1人でやるにはきつい」と言っていました。これはこれで正直な感想だと受け止めました。

 

思考ルーチンを作るプログラムは有効なプログラミング教材になる

次期学習指導要領では、全ての高校生がプログラミングによってコンピュータを活用できる力を身につけさせることになります。一方世間では人工知能や自動運転車に注目が集まっています。私は情報科ができて以来、ずっと情報科に携わってきましたが、これまでの情報科の学習内容を考えると、プログラミングに対する扱いがちょっと小さすぎたなと感じます。ですから、誰もがプログラム、つまりコンピュータを操る技術に取り組む時代になってきたな、と感じています

 

そうした中で、こういったコンピュータが状況を調べ、考え、判断するプログラム(人工知能とまで呼べるかどうかはわかりませんが)、こうしたものを作るのは、けっこう楽しい作業ですし、またこれを教材にすれば有効なプログラミングの教材になるのではないかと考えています。

 

今回紹介したプログラムや教材テキストは、相模原総合高校のホームページからダウンロードができるようになっています。もしご興味のある方がいらっしゃいましたら、ホームページにアクセスしていただければと思います。

http://www.sagamiharasogo-ih.pen-kanagawa.ed.jp/programbegin.html