今回も引き続き特別編としてインターン生に執筆していただいたインターンシップDay2の振り返りです!
インターンシップ2日目の主な業務は、「Hit&Blow」と「○×ゲーム」の作成でした。
今回はそれぞれのプログラム作成手順について説明します。
Hit&Blow
はじめに「Hit&Blow」の作成の手順について詳しく説明します。
まず、「Hit&Blow」がどのようなゲームかご存じでしょうか?
知らない方のために、簡単にルールを紹介します。
Hit&Blowについて
「Hit&Blow」は、出題者が異なる3つの数字で構成された3桁の数字(正解)を決めます。
そして、プレイヤーがその正解を予想して3桁の数字を伝え、出題者から得られる判定結果を活用して正解を探すゲームです。
出題者は、正解と同じ数字が同じ桁にある場合の回数を「Hit」、桁は異なるが同じ数字が含まれている場合の回数を「Blow」として答えます。
これを繰り返し、「Hit」が3になった時点でゲームが終了します。
プレイヤーは、正解を当てるまでにかかった回数を競い、少ない回数で正解を当てた方が勝利となります。
プログラム概要
今回、コンピュータが出題者となり、乱数で3桁の数字を生成し、プレイヤーが数を入力して正解を探すプログラムを作成しました。
作成は以下の4つの工程で進めました。
1.異なる3つの数字で構成された3桁の数字をランダムに作成する工程
1~6行目に書かれた内容で実行しています。ライブラリから「random」を導入し、1~9の範囲でランダムに整数を生成します。同じ数字が含まれる場合は再度生成するよう、条件を設定しています。
私は「while」に続く条件文で「and」ではなく「or」が使われている理由を理解するのに苦労しました。しかし、この工程は問題無く作成できました。
2.プレイヤーが数字を入力する工程
11~13行目に書かれた内容で8行目に設定された無限ループ内で数の入力を繰り返すようにしています。
ここで、input()関数は文字列として認識されるため、整数として扱うためにはint()関数で囲む必要があることを学びました。
3.入力された数字と正解を比較し、結果を出力する工程
14~23行目に書かれた内容で実行しています。15,16行目では二重for文を用いて正解の数字と入力された数字を比較します。プログラミング初心者の私には二重for文の理解が難しかったため、print()を使って動作の流れを確認し、理解を深めました。
17~19行目では「Hit」の計測を、20~22行目では「Blow」の計測を行い、重複を避けるためにbreak文を使用しています。23行目ではフォーマット文字列を使って「Hit」と「Blow」の数を出力しています。
4.ゲームを終了する工程
24,25行目の内容で3つの「Hit」が揃った時点で8行目の無限ループを抜け、ゲームが終了するようにしています。
以上が「Hit&Blow」の作成工程です。
○×ゲーム
続いて、みなさんご存じの「○×ゲーム」の作成手順について詳しく説明します。
プログラム概要
今回、○も×も人間が入力し、○か×のどちらかが横、縦、斜めのいずれか一列に並んだ場合を勝利にするといったプログラムを作成しました。
作成手順は以下の4つの工程で進めました。
1.盤面の作成
配列を用いて盤面を作成し、表示と値の代入による盤面の変化に対応できるようにしました。
盤面はプログラミングのしやすさを考慮し、0~8の数字で構成しました。
2.プレイヤー①の入力(○)と盤面への反映
勝利条件を満たしたときゲーム終了
プレイヤーが入力した数字を○に置き換えるようにプログラムしました。盤面の範囲外の数字を入力された場合は適切な数字が入力されるまで再入力を求めるようにしました。
一度入力した数字は再入力できないようと考えていましたが、今回は範囲内の数字のみ認める形で完成としました。
また、私は変数を一つ用意し、入力がある度に変数を更新する仕組みにしたため、以前の入力が保存されないという課題が残りました。今後この課題を解決できるようにさらに精進したいと考えています。
勝利条件は全部で8通りあるため、8つの条件をorで接続しました。勝利条件を満たすと「break」が機能してゲームが終了します。
勝利条件の考案と実装には少々戸惑いましたが、問題無く進めることができました。
3.プレイヤー②の入力(×)と盤面への反映
勝利条件を満たしたときゲーム終了
プレイヤー②の操作もプレイヤー①と同様に進めます。
※コードは2.プレイヤー①の入力(○)と盤面への反映をご参照ください
4.引き分け時のゲーム終了処理
プレイヤー①のターンが回ってくるたびに「count」を1ずつ増えるようにしました。
「count」が5に達し、その時点でプレイヤー①が勝利できなかった場合は、引き分けとしゲームを終了するようにしました。
以上が「○×ゲーム」の作成工程の説明です。
インターンを通して
気付き
今回のインターンを通して感じたことは「プログラミングは楽しい」ということ。そして「プログラミングやAIの利用は意外と簡単だ」ということです。
これまではプログラミングやAIの内部構造が全く分かりませんでした。
そのため、難しいものだと決めつけ苦手意識を持っていました。
しかし、今回のインターンを通して、その考えが間違っていたことに気付かされました。
プログラミングやAIは1から作る必要は無く、既存のものをパズルのように組み立てるだけで良いと分かり、面白さと意欲が一気に高まりました。
もちろん、プログラミングに落とし込みたい事象を自分の知識に合わせて考えることは難しかったですが、それがうまくできたときの達成感や喜びは筆舌に尽くしがたいものでした。
全体の感想
Jetsonを用いたエッジAIの利用は私のAIへの認識を大きく変えました。
パソコンよりはるかに小さい装置でAIを利用でき、その操作もPythonでコードを打つだけで良いことを知り、とても驚きました。
今回のインターンシップが非常に実り多いものであったと感じています。