見出し画像

共通テスト【情報】プログラミング対策講座/情報関係基礎過去問解説~令和2年(2020年)第3問擬似言語 宝探しゲーム開発/高校情報Ⅰ授業

【高校情報】大学入学共通テスト 情報関係基礎過去問解説~令和2年(2020年)第3問擬似言語(プログラミング対策)

【資料ダウンロード】

PDFの他、パワーポイント、学習指導案 等の原本も無料提供しています。

情報教育の底上げが目的なので、資料を修正して、学校・塾(営利目的含む)の授業等で利用して頂いて問題ありません。私への連絡不要ですが、利用する際には、YouTubeチャンネル・情報Ⅰ動画教科書・IT用語動画辞典を紹介してもらえると嬉しいです。

■独自解説パワーポイント
https://toppakou.com/info1/download/98_大学入学共通テスト/02_R02/情報大学入学共通テスト対策【情報関係基礎_令和2年大問3】.pptx

■問題
大学入試センター 情報関係基礎過去問ダウンロード(情報処理学会 情報入試委員会)
https://drive.google.com/drive/folders/140pQJOKWzYH2-NvzPCyQdqFPHcZhCSOa


【文字おこし】

大学入学共通テスト 情報対策講座 情報関係基礎 令和2年(2020年)大問3 擬似言語を使った宝探しゲームの解説をしていきます。

まずは図1のゲーム画面の内容を説明していきます。

前提として吉野さんはロボットを操作して宝探しをするゲームを作成しています。
ゲーム画面のゲームボードのマスの数について左上を1マス目とすると横軸をxとすると最大のマス目数は具体的な数値は定数YOKOに格納されています。
縦軸をyとすると横軸と同じく最大のマス目数は定数TATEに格納されています。

ゲームボードにはロボットが存在します。そして複数の罠が存在します。
そして1つの宝が存在します。
宝箱や罠は隠れていて、ゲーム開始時は見ることができません。
実際には見えないですが、今回は理解のためにすこし色を薄くしてすこし見えるようにしておきます。

ゲーム画面にはロボットを操作するための上下左右のボタンが表示されています。
そして、移動と罠探知ボタンがあります。
指定した方向に移動したい場合は、方向指定ボタンをのいずれかを選んだあとに移動ボタンを押すと移動します。
行く先に罠が無いかを先に探知したい場合は、進みたい方向の方向指定ボタンを選んだあとに行動指定ボタンを押すと罠を探知できます。
その場合は、メッセージ欄に「罠を発見した!」と表示されます。
メッセージはmessage変数に格納されています。
ゲーム画面の下には宝までの最小歩数が表示されます。
この図の場合、よこを8、たてを5とした場合 見えない罠を無視して横に3、縦に2 合計5動けば最小歩数で宝に行き着きます。
最小歩数は変数hosuuに格納されています。

移動や罠探知は操作回数が決まっています。決められた操作回数以内に宝マスに入れることがルールで残り操作回数は画面に表示されます。
残り操作回数は変数nokoriに格納されています。
罠に3回引っかかるとゲームオーバになります。
罠にかかった回数も画面に表示され、変数missに格納されています。


では、問1の解説をしていきます。

先ほど少し説明したようにロボットの位置はマスの座標(x、y)で表します
そしてロボットのx座標は変数robo_x y座標は変数robo_yに格納されます。

宝の位置もx、y座標がありx座標は変数takara_x 、y座標はtakara_yに格納されます。

そして方向指定ボタンで方向を指定すると、指定した方向にロボットを移動させるための変数d_x,d_yに適切な値が代入されるとあります。

たとえば今いる場所から下方向に移動する場合で考えていきましょう。
今いる場所が xの座標が5 yの座標が3だとした場合で考えていきましょう。
下に移動したい場合は、方向指定ボタンの下を押して、行動指定ボタンの移動を押せばロボットが一つ下に移動します。
このときは、x座標は5のまま変わりません。 ですのでこの時d_xにはxの移動はなしということで0が代入され、d_yはプラス方向に1つ移動ということで1が代入されます。

ここで空欄 ア、イを見ていきましょう。
右方向を指定した場合のd_xおよびd_yの設定値を問われています。
右方向なのでx座標が+1となるので アは1が入ります。
そしてy方向の移動はないので、イは0が入ります。

図2の移動ボタンが押された時の手続きの擬似言語を見ていきましょう。

1行目は、ボードをはみ出さないようにするための判定処理で、移動後のマスがボード内にあるかを判定し、ボード内なら移動を実施しています。

まず横のX軸方向の判定でrobo_x + d_x>0は 左端をはみ出していないかという判定になります。たとえば、今のx座標が1で一つ左に移動すると1-1で0になりはみ出しますが、この時の判定は0>0ではFalseになり移動は実施されません。
今のx座標が2の場合で1つ左に移動する場合は2-1で1となり1>0はTrueになり移動することができます。
さらに右側もはみ出してはいけないので、もう一つの空欄ウはその右端のはみ出しを判定しています。注意すべきなのは不等号にイコールが入っているので、以下ということになります。例えば右端の定数YOKOの値が8だとした場合、移動後のx座標が8以下なら移動できるということになります。
たとえば現在の位置が8で1つ右に移動したら9となります。判定はFalseになり移動処理は実行されません
今の位置が7の場合は1つ右に移動したら8となります。判定はTrueとなり移動処理が実行されます。
つまり、移動後のx座標 robo_x + d_x が 定数YOKO以下ならということで、 空欄ウには③のYOKOが入ります。

次に縦のY軸方向を見ていきましょう。
Y軸方向の判定でrobo_y + d_y>0は ボードの上側をはみ出していないかという判定になります。たとえば、今のy座標が1で一つ上に移動すると1-1で0になりはみ出しますが、このときは 0>0となりFalseになり移動は実施されません。
今のy座標が2の場合で1つ上に移動する場合は2-1で1となり1>0はTrueになり移動することができます。
さらに一番下側もはみ出してはいけないので、もう一つの空欄エはその下端のはみ出しを判定しています。横の判定と同じく注意すべきなのは不等号にイコールが入っているので、以下ということになります。例えば定数TATEの値が5だとした場合、移動後のy座標が5以下なら移動できるということになります。 
たとえば現在の位置が5で1つ下に移動したら6となります。判定はFalseになり移動処理は実行されません
今の位置が4の場合は1つ下に移動したら5となります。判定はTrueとなり移動処理が実行されます。
つまり、移動後のy座標 robo_y + d_y が 定数TATE以下ならということで、 空欄エには④のTATEが入ります。

2行目は robo_x+d_xでX軸の移動後の値をrobo_xに代入する処理
3行目は robo_y+d_yでY軸の移動後の値をrobo_yに代入する処理になります。

5行目は 残り回数を1減らす処理になります。

6行目は宝のX座標とロボットのX座標および宝のY座標とロボットのY座標が一致するかを判定しています、
つまり、このようにロボットと宝が重なっていることになります。
一致する場合は7行目でmessage変数に「宝を見つけた!宝探し成功!と格納します。

次に 図3の宝までの最小歩数の計算の手続き を見ていきます。

たとえば、ロボットのX座標を5 Y座標を3 
宝のX座標を2 Y座標を5
とするとX座標の距離の差分は3 Y座標の距離の差分は2
となり、最小距離はその二つを足し合わせた5となります。

これを擬似言語にしたものが図3になります。

1行目は
X軸の宝とロボットの距離を takara_x – robo_x で求めて sa_xに代入しています。
Y軸の宝とロボットの距離を takara_y – robo_y で求めて sa_yに代入しています。

ただ 宝のX軸が1 ロボットが5 とした場合 1-5 でー4と負の数となってしまいます。
Y軸も同じように負の数になる場合があります。

2行目、3行目はそのように負の数の場合はー1をかけて正の数にしています。

はじめから正の数の場合はー1を掛けたら負の数になってしまうので、負の数の時だけ実行する必要があります。

つまり、空欄オはXの負の数の判定なので 選択肢⑤ のsa_x <0 となります。
空欄カはY軸の負の数の判定なので 選択肢⑦ の sa_y<0 となります。

次に問2の説明をしていきます。
問2は罠に関する問題になります。
ゲーム開始時にボードに隠されている罠の個数は定数 WANASUUに格納します。
この図の場合はWANASUUは3になります。
そして、ロボットが罠に3回引っかかると、宝さがし失敗となります。

罠もロボットや宝と同じようにマスのX,Y座標を保持しています。
複数個あるので配列変数使います。

X座標は 配列変数Wana_x
Y座標は 配列変数Wana_yに格納します。

たとえば一つ目の罠のX座標を3 、Y座標を2とした場合
配列Wana_xの1番目に3
配列Wana_yの1番目に2 を格納します。

2つ目の罠のX座標を4 、Y座標を3とした場合
配列Wana_xの2番目に4
配列Wana_yの2番目に3 を格納します。

3つ目の罠のX座標を7 、Y座標を5とした場合
配列Wana_xの3番目に7
配列Wana_yの3番目に5 を格納します。


WANASUU分、ゲームが始まる前に設定しておきます。

2つめの罠の座標を取り出したい場合は
X座標はWana_x[2] Y座標はWana_y[2]と指定します。

この取り出した値とロボットのいる座標とが一致したら罠に引っかかったことになります。
罠に引っかかった回数は変数missで管理します。

今話した内容をベースとして1行目から擬似言語を説明していきます。
1行目は 6行目までの処理の繰り返し処理の条件になります
 変数iを1ずつ 空欄キの値になるまで繰り返すとあります。
iは 先ほど説明したWana_x およびWana_yの配列番号の指定に使われています。
どの罠に引っかかったをロボットの位置と突き合わせるために
すべての罠の位置の数分突き合わせる必要があります。

つまり罠の数が格納されている 定数WANASUU 分繰り返す必要があります。解答群の選択肢は③が該当します。

罠の位置と一致した場合の処理が3行目と4行目になります。
まず3行目でmessage変数に「罠にかかった!ダメージを受けた!」を格納します。
空欄クは 本文中にある、罠に引っかかった回数を記録する処理つまり変数missの更新処理がないのでその処理だと予想がつきます。
変数missは1ずつカウントアップしていくので miss+1した値をmissに代入しなおす、miss←miss+1の選択肢の④が該当します。

7行目は何かが3ならば 8行目のmessage変数に 「3回目だ ついに壊れて宝さがし失敗 」を代入する処理に移ります。
メッセージ文言の通り罠に引っかかったのが3回だと予想がつくので、罠に引っかかった回数が記録されている 変数missが空欄クの答えになり選択肢では④が該当します。


つぎは罠探知に関する機能の説明になります。

初めに説明したように罠は初期状態では表示されていませんが、
プレイヤーは罠探知をすることで罠の有無を確認できます。
調べたい方向の矢印ボタンを押した後に、罠探知ボタンを押した場合、その指定方向のマスに罠があるかを調べ、罠があればその罠を表示状態に切り替えます。
ただ、1回の罠探知で残り操作回数が1回減ってしまいます。


罠の非表示と表示を管理する配列Wana_hyojiを準備します。
先ほどのWana_xとWana_yの配列に対応していて、i番目の罠が非表示なら0、表示なら1とします。
初期は全て非表示の0となります。

では具体的に図5の罠探知ボタンの処理を見ていきましょう
1行目から10行目までは先ほど説明した、方向ボタンが押された後の移動ボタンが押されたときの処理になります。

11行目以降が罠探知ボタンの処理になります。
12行目は先ほど説明したWANASUU分 17行目までの処理を繰り返します。
13行目は今から進もうとしている座標と罠の座標が一致するかを比較し、罠がある場合は14行目から16行目の処理を行います。
14行目で「罠を発見した!」という文言をmessage変数に代入します。

先ほど説明したように罠の表示処理が必要なので空欄コは罠の表示処理ということが予想がつきます。
罠の表示有無はwana_hyouzi配列に格納されていて i番目の罠が該当するので
wana_hyouzi[i]←1で 表示状態に更新します。

18行目は空欄サの部分になります。
ここは罠数分のループを抜けて、かつ罠探知ボタンの条件文の中になります。
未だ実行していない処理が何かを本文中から探すと 1回の操作で残り操作回数が1回減るというのが該当します。
よって選択肢⑦のnokori←nokori-1 が該当します。

―――
問3は問1問2の内容も含めた総合問題になります。

図6の 宝探しゲームの手続きを見ていきましょう

zyoutai変数はゲームの状態でプレイ中なら0が格納されます。
ゲーム継続中は7行目から42行目までの処理が繰り返されます。
宝さがし成功なら1、宝探し失敗ならー1が処理のどこかで設定されループを抜けます。
まず、空欄シで宝探し成功時に 変数zyoutaiを1に変更する処理を追加する箇所を問われています。図6は今までの図3や図5などの処理が省略されているのでそれも含めてみないといけません。
宝探し成功時の処理は、図2が該当します。
そのなかで成功したかの判定は6行目で行っているので、その中の処理にzyoutai に1を設定する処理を追加するのが妥当です。
解答群の選択肢でいうと①の図2の7行目と8行目の間が該当します。

次に空欄スについては罠に3回引っかかった時に適切にゲームを終了させるために zyouta を-1にする処理の挿入箇所が問われています。
罠に3回引っかかったときに実行される処理を追うと、図4の7行目で判定しているのでその条件に当てはまった場合に実行される部分になります。
つまり選択肢でいうと④の図4の8行目と9行目の間に挿入するというのが答えになります。

次に図7の残りの操作回数の判定処理になります。
1行目でnokori回数が0かを判定し
2行目でmessage変数に「動きすぎて壊れた。宝探し失敗!」を代入しています。
空欄セの部分について
zyoutai 変数の更新処理が無いので、 ここで更新する必要があると予想がつきます。
宝さがし失敗時は―1なので
選択肢としては②のzyoutaiにー1を代入する処理になります。


いま説明した図7の処理を図6の罠マスの判定手続き直後に挿入した時に生じた問題を答えるのが空欄ソになります。

これは、宝探し成功の場合は、先ほど説明した図2の処理でzyoutai変数に1が設定されます。
図2の中でnokori回数もー1にしています。

ここでループを抜けるのではなく、図6の29行目以降の処理も行われます。
つまり、成功した場合でも残り回数が0回の場合は、
zyoutaiに1の成功が設定されているにもかかわらず、
失敗の処理にも入ってしまい、成功のメッセージの後に「動きすぎて壊れた。宝探し失敗!」のメッセージも表示されてしまいます。

よって空欄ソの問題点としては、②の宝のマスに入ったのに、「宝探し失敗」になる場合がある になります。

それを防ぐには、宝探し成功時にはこの失敗の処理に入らないようにする必要があります。
nokori変数が0で かつ、状態が0の時にだけ実行するすべきなので
選択肢としては ⓪のかつzyoutai=0 になります。

以上で解説は終わりです。
最後までご視聴ありがとうございました。

【参考サイト・参考文献】

大学入試センター 情報関係基礎過去問ダウンロード(情報処理学会 情報入試委員会)
https://drive.google.com/drive/folders/140pQJOKWzYH2-NvzPCyQdqFPHcZhCSOa

tkmium note 難関進学校の情報科教諭が作成
【解説】 情報関係基礎 令和2年度 センター試験 2020 | tkmium-note

E.V.ジュニア note 難関進学校の数学科・情報科教諭が作成~当問題をPythonで再現


【YouTubeチャンネル】

【IT用語動画辞典】
https://toppakou.com/ITWORD/

【解説重要用語】
擬似言語、変数、配列

★私の目標
「とある男が授業をしてみた」 の葉一さん
https://www.youtube.com/user/toaruotokohaichi
※Google社に招待頂いた、「YouTube教育クリエイターサミット2020」で
 葉一さんと文部科学省・Google役員の対談セッションに感銘を受けて、高校情報講座スタートしています。

#情報関係基礎 #大学入学共通テスト #大学入試センター


この記事が気に入ったらサポートをしてみませんか?