【ITニュース解説】Rock 🗿 Paper 🗞️ Scissors ✂️
2025年09月15日に「Dev.to」が公開したITニュース「Rock 🗿 Paper 🗞️ Scissors ✂️」について初心者にもわかりやすく解説しています。
ITニュース概要
じゃんけんゲームをPythonで実装する記事。複数ラウンドで対戦でき、スコアを記録しながら、好きな時にゲームを終了できる機能を備える。初心者でも基本的なゲームのロジックやプログラミングの仕組みをコードから学べる。
ITニュース解説
この解説では、じゃんけんゲームをPythonというプログラミング言語でどのように実装するか、そしてそのコードからシステムエンジニアを目指す初心者が何を学べるかについて掘り下げる。じゃんけんゲームは、コンピュータプログラムの基本的な要素が詰まっており、プログラミング学習の非常に良い教材となる。
まず、じゃんけんゲームの基本ルールを確認する。グー(Rock)はチョキ(Scissors)に勝ち、チョキはパー(Paper)に勝ち、パーはグーに勝つという三すくみの関係だ。このプログラムは、この古典的なゲームを拡張し、複数ラウンドのプレイ、スコアの記録、そしてユーザーが好きな時にゲームを終了できる機能を備えている。
プログラムはまず、import randomという記述から始まる。これは、Pythonに標準で備わっている「random」モジュールを使うための宣言である。モジュールとは、特定の機能を提供する部品のようなもので、randomモジュールは名前の通り、乱数(ランダムな数や選択)を生成する機能を持っている。今回のじゃんけんゲームでは、コンピューターの手をランダムに決定するためにこの機能を利用する。
次に、choices = ["rock", "paper", "scissors"]という行で、じゃんけんで選択可能な手をリストとして定義している。リストは複数のデータを順序付けて管理するための構造で、プログラム内で「rock」「paper」「scissors」という文字列をひとまとめにして扱えるようにする。
プログラムの主要な部分の一つが、determine_winnerという名前の「関数」である。関数とは、特定の処理をひとまとまりにしたもので、同じ処理を何度も繰り返す場合にコードの重複を避けたり、プログラム全体を分かりやすく整理したりするために使う。このdetermine_winner関数は、ユーザーが選んだ手とコンピューターが選んだ手の二つを受け取り、どちらが勝ったか(または引き分けか)を判定して返す役割を持つ。関数の中では、if-elif-elseという条件分岐の構文が使われている。これは「もしAならばX、そうでなくてもしBならばY、それ以外ならばZ」といった具合に、条件に応じて異なる処理を実行するためのものだ。
具体的には、まずuser_choice == computer_choiceという条件で両者の手が同じかどうかをチェックし、同じであれば「tie」(引き分け)を返す。次に、elifを使ってユーザーが勝つ条件を定義している。例えば、(user_choice == "rock" and computer_choice == "scissors")は、「ユーザーがグーを選び、かつコンピューターがチョキを選んだ場合」という二つの条件が同時に満たされたときに真となる。このような複数の条件をand(かつ)やor(または)で組み合わせることで、複雑な状況をプログラミングで表現できる。ユーザーが勝つ三つのパターン(グーがチョキに、チョキがパーに、パーがグーに勝つ)がorで結ばれており、いずれかが真であれば「user」を返す。これら全ての条件に当てはまらない場合、つまりユーザーが負けるパターンであればelseブロックが実行され、「computer」を返す。このように、関数を用いることで勝敗判定という複雑なロジックを独立した部品として管理できる。
そして、ゲーム全体の流れを制御するのがplay_game関数である。この関数が実行されると、まずuser_score、computer_score、round_numberという三つの変数が初期値(0または1)で設定される。変数は、プログラムの中で値を一時的に記憶しておくための箱のようなもので、ゲームの進行に合わせてスコアやラウンド数を更新していく。
ゲームはwhile True:という無限ループの中で進行する。whileループは、指定された条件が真である限り、その中の処理を繰り返し実行する構文だ。ここではTrueが常に真なので、ユーザーが明示的にゲームを終了しない限り、このループは永遠に繰り返されることになる。
ループの中では、まず現在のラウンド数が表示され、次にinput()関数を使ってユーザーに手を入力するように促す。入力された文字列は.lower()メソッドによってすべて小文字に変換される。これは、ユーザーが大文字で入力しても「rock」として認識させるためだ。
もしユーザーが「quit」と入力したら、break文が実行され、whileループから抜け出してゲームが終了する。これは、ユーザーがゲームを制御する重要な機能である。
また、ユーザーが無効な選択肢(「rock」「paper」「scissors」「quit」以外の文字列)を入力した場合の処理も含まれている。user_choice not in choicesという条件でチェックし、無効な入力であれば「Invalid choice. Try again.」と表示し、continue文を実行する。continue文は、ループの現在の反復処理を中断し、次の反復処理を開始させる。これにより、無効な入力がされた場合に、そのラウンドをやり直させることができる。
ユーザーの入力が正しかった場合、random.choice(choices)を使ってコンピューターの手をランダムに決定し、表示する。その後、先に解説したdetermine_winner関数が呼び出され、勝者が判定される。その結果に応じて、「You win this round!」などのメッセージが表示され、対応するスコアが増加する。
各ラウンドの終わりには、現在のユーザーとコンピューターのスコアが表示され、round_numberが一つ増やされて次のラウンドへ進む準備が整う。
whileループがbreak文によって終了すると、ゲームは終了メッセージを表示し、最終的なスコアと全体での勝者(ユーザー、コンピューター、または引き分け)を宣言してプログラムを終える。
このじゃんけんゲームのコードは、システム開発における基礎的な概念を多く含んでいる。例えば、データの入力と出力、条件に基づいて処理を分岐させるロジック、同じ処理を繰り返すためのループ、特定の機能をまとめる関数、そして外部のライブラリ(モジュール)を利用する方法などだ。これらは、どのような種類のシステムを開発するにしても、共通して必要となるプログラミングの基本要素である。システムエンジニアを目指す上で、このようなシンプルなゲームを通じて、コードがどのように動作し、ユーザーの操作に応じてどのように反応するかを理解することは、非常に貴重な経験となるだろう。