10
有坂ことり。
彼女との関係は、実に不思議なものだ。先輩と後輩、もしくは先生と生徒。もちろん年上の彼女に敬意を払ってあげるべきなのがスタンダードな関係だろう。
ただし、それができないのは彼女のフランクな雰囲気が影響している。
人懐っこくて、いつも楽しく笑って。その姿を見ていると、こちらも明るい気持ちになりそうだ。
でも、たまに見せる薄暗い雰囲気は何なのだろうか......。
いつか、その答えを知るのかもしれない。
それでも、ひとつ知っているのは、彼女が無類の甘いもの好きということだ。
「......こないだ、お母さんが6個入りのカップアイスを買ってきてくれて。
美味しかったんだよ」
明るい雰囲気のまま、プログラムを教えるための題材によく含めている。
・・・
変数とは、以前にも説明してくれたものだ。現在の値を書いたメモと、投函できる箱のイメージ。もちろん、ひとつの箱には1枚のメモしか入れられない。
アプリで表したい情報やプログラムの処理に沿って必要な分だけ変数を宣言していく。
ところで、とことり先輩は質問してきた。
「......しい君、トランプ全部の変数をひとつずつ用意するの?」
僕は目を丸くながら答えた。
「そのつもりですけど」
とは言え、この会話の展開である。彼女がより良い答えを出すのは決まっている。
僕は少し身を引いて、彼女の考えを聞くことにした。
「それでも正解じゃないよ。
ちゃんと名前を付けて間違わないようにしてもいいけどさ。
でも、こういうときは複数の箱が並んだ変数を使うんだ」
それが<配列>という仕組みだという。
例えば、次のように書くことで13個分の箱が並んだ変数として扱うことができる。その何番目かという位置を要素(インデックス)として、表現する。
*───────────────────
トランプの札[13]
────────────────────
「13個の箱があって、そこに1枚ずつトランプが差し込まれるとイメージしやすいでしょ」
ことり先輩の説明に僕は頷いた。こういう仕組みがあれば便利だと自然と感じた。
「そうだね。
この要素の数はもちろんいくつだっていいんだ。
あるマーク全体なら13になるだろうし、山札と手持ちを表したいなら48と3の配列をふたつ作ればいい」
作りたいもの次第、ということなのだろう。
「配列の利点は変数を整理できることだよ。
今みたいなトランプとか、キャラクターの名前やHP、MPとかさ。
そして、最大の利点はね......」
そう言いながら、彼女はいつもの自信に溢れた表情を見せてくれた。
「......ループする処理の中に含めることができるんだ」
彼女はここで新しいプログラムを書きだした。
*───────────────────
string[6] ice; //アイスが6個入る箱
ice[0] = "バニラ";
ice[1] = "バニラ";
ice[2] = "チョコ";
......
ice[5] = "ぶどう";
────────────────────
題材がアイスなのはご愛嬌というところなのか。
配列の番号は 0 からはじまる。
だから、0番の箱にはバニラ、1番にもバニラ、2番にはチョコが......最後の5番にはぶどうが並んだ箱に詰められる。
「こうやって箱に並べることによって、順番に何味かを画面に表示することができるわけだよ」
ことり先輩は続きの処理を書いてくれた。
*───────────────────
string[6] ice; //アイスが6個入る箱
ice[0] = "バニラ";
ice[1] = "バニラ";
ice[2] = "チョコ";
......
ice[5] = "ぶどう";
//順番に箱の中身を表示する
for(int i = 0; i < 5; i++)
Print (ice[i] + "味のアイスです");
next i
────────────────────
これ処理を実行すると、次のように表示される。
* バニラ味のアイスです
* バニラ味のアイスです
* チョコ味のアイスです
......
* ぶどう味のアイスです
なるほど。
僕は感心するように画面の中を見つめていた。
ice[i]というのは、アイスの味を表す配列のことだ。int型の変数iがひとつずつカウントされていくことによって、ice[i]という箇所が[0]、[1]、[2]......と順番に配列の箱を参照するようになる。
アイスの味が書かれた文字が順番に呼び出されて、"味のアイスです"という文字列と連結される仕組みだ。
「君が言ったように変数をたくさん用意しても良いんだけどね。
こういう便利な技を使わない手はないんだ」
配列を使うことによって、アプリの可能性が広がっていく。順番に処理をすることもできるし、好きな番号を入力して選んだって良いわけだ。
「例えば、31種類の中から君の好きなアイスを購入できる仕組みを作るとするよ。
でも、気を付ける点があって、1番から31番の入力しか入力できないようにしないといけないんだ」
どういうことだろうか?
僕は正しく操作していない雰囲気を感じてしまい、よく分からない。
「仮に、31を入力しようとして32にしちゃったことにしてみる。
誰にもそういう可能性があるってことだ。
むしろ、エラーが出るっていうことはそれを対応するきっかけになるんだよ」
そう言って彼女はにこっと笑った。
つまり、配列の箱以外の数字を入れても、範囲外なのでエラーになるということだ。マイナスなんてもっての外だ。
仮にでも、なんだか良いことをしていたということだ。少し照れくさくなった。
「こういうのは、if文やwhile文であらかじめ除外すればいい。
存在しない番号です、みたいな」
そっか、なんだかアイス屋の店員が売っていないというメッセージを出しているみたいだ。
再び範囲外の数字を入力したら"在庫切れ"というメッセージを表示したり、またすべて空白の文字だったら店じまいだったり。
まるで、アイス屋さんの仕組みを考えているようで面白かった。
・・・
あ、ごめんと急にことり先輩は声を上げた。
「アイスってさあ、3つ並んだものが2段になっているんだよねえ」
と謎の情報を引っ張り出してくるから、何の話だろうか。てっきり、6つが1列に並んだ箱を想像してしまっていた。
全く想像できないから、彼女の表情を覗き込んでみる。その雰囲気はなんだか楽しそうに笑っている。
「こういう時は、縦と横の位置を示す箱の変数を作ってあげるんだよ」
*───────────────────
アイス[2][3] //アイス3個並びが縦に2段入る箱
────────────────────
僕はつい首を傾げてしまった。
自分の気持ちもよそに、彼女はプログラムを書いてくれた。
*───────────────────
string[2][3] ice; //アイス3個が2段
ice[0][0] = "バニラ";
ice[0][1] = "バニラ";
ice[0][2] = "チョコ";
......
ice[1][2] = "ぶどう";
────────────────────
こういうイメージを図解することで、理解できるようになるという。
* 上の段[0]:0[バニラ] 1[バニラ] 2[チョコ]
* 下の段[1]:0[・・・] 1[・・・] 2[ぶどう]
つい感心するように頷いた。その姿を見てことり先輩は声をかけてくれた。
「<二次元配列>って言うんだよ。
縦と横の要素が並んでいる配列を使いたいときに使用するんだ。
私もここは理解するの大変だったけどね、ゆっくり指折り考えるみたい考えてみたら良いと思うよ」
たしかに、今すぐに理解できるかどうか難しいと思えた。頑張って考えられるようになってみたい。
彼女の話を聞いていると、縦と横のものについて考えたくなってしまう。
まず出てきたのは、学校の下駄箱だった。なぜだろう。でも、あれは縦と横に並んでいるが、名簿順だから何番の位置という管理はしないだろう。
それから教室に向けて歩くように、頭の中で廊下を進んでいく。
階段を上って僕たちの教室が見えてきた。中に入ると見えてきたのは並んでいる机だった。でも、まだ違う気がする......。
その景色の中に生徒たちが浮かんでくる。みんなは楽しそうに会話をしているようだ。もしかしたら、ランチ時間かもしれない。
僕は背中から声を掛けられて振り返った。誘ってくれた子が手に持っていたものとは......。
そして、僕はとある縦と横のものに気付いたのだ。このゲームで遊んでみたい。
「オセロみたいですね!」
ああ、確かに!と返事をくれることり先輩も嬉しそうに口角を上げた。
実のところ、二次元配列を使うとオセロを再現できるのかもしれないと彼女は言った。それは気になる話だ。
・・・
ことり先輩はいつもこうだ。
いつも楽しく授業を行って、元気いっぱいに笑っている。たまには湿った話をすることもあるようだが、授業をしている姿を見るのが自分の楽しみだと思えた。
そう思ったとき、僕はふとした感覚に気付いたのだった。
まるでブロックをひとつずつ積み上げていくように。
今まで教えてくれた授業の内容がすべて結びついていくような意識だった。
そのひらめきが僕の中できらめいて、ひとつの結晶のように眩しく見えたのだ。
僕は思いついた内容を、ことり先輩に話してみた。
「ちょっと思いついたことがあって、聞いてもらいたいのですがいいですか?」
なんだろう、彼女は楽しそうという意識を乗せてこちらに瞳を投げた。
僕はちょっとしたゲームのアイディアを思いついたのだ。
例えば、配列の箱の大きさや種類をイメージできるなら、どんなゲームのアイディアだって生まれるかもしれないだろう。
ことり先輩の言葉に乗っかって、少しゲームを考えてみたくなったのだ。
思いついたのはアプリゲームにもならないようなもので、ふたりで札を出し合って数字の多い方が勝ちというとてもシンプルなものだ。その内容を話してみると、彼女は頷いて答えてくれた。
「じゃあ、まずはプレイヤー同士のトランプを示す箱をそれぞれ作ろう。
そして、順番に出し合うというのはループで回せばいい。
どちらが大きいかというのはわかるよね、if文だよ」
彼女はこう言って、すぐに処理のイメージを書いてくれた。
*───────────────────
プレイヤー1の札[13]
プレイヤー2の札[13]
プレイヤー1の勝ち数
プレイヤー2の勝ち数
//それぞれのトランプを順番に出し合う
for(int i = 0; i < 13; i++)
if プレイヤー1の出した札の方が大きい
プレイヤー1の勝ち数に1を足す
if プレイヤー2の出した札の方が大きい
プレイヤー2の勝ち数に1を足す
next i
//勝ち数の多いプレイヤーの名前を表示する
Print("・・・");
────────────────────
「ざっとこんな感じにしてみたよ。
札を示す配列には、トランプがシャッフルして格納されているとすることにしよう」
プレイヤーそれぞれがあるマークのトランプを13枚持っているとする。その中で1枚ずつ出すゲームになるため、その中でシャッフルをしないといけないわけだ。
「配列の中をシャッフルするような、っていう処理はプログラマが書くことになるんだ。
そうだねえ、例えば前にやったような変数の交換とランダムな値を生成する<乱数>が参考になるかな」
思わず感心してしまった。自分のアイディアがことり先輩の手によって形になり、パソコンの中でゲームが遊べるような雰囲気を感じてしまう。
「そうだよ。
構文の仕組みが分かれば、あとは組み合わせ次第なんだ」
ことり先輩の説明には、ゲームを考えてみたいと思わせる夢を感じた。
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます