GADGET RECIPE

Gadget Recipe

Pythonプログラミング基礎完全マスター④

4. じゃんけんゲームの改善する

じゃんけんゲームがどのように動作しているか分かるようになったでしょうか?基本コードのみで作成しているためあまりゲームとして面白いものではありませんね。しかし、プログラミングは小さな機能できちんと動作するものを作り上げてからアイデアを追加して良いものに仕上げていくものです。

そこで、いくつかの基本コードを追加することでじゃんけんゲームを少し改善したいと思います。具体的な改善案と基本コードは次のようになります。

【改善1】コンピュータの手をゲーム毎に手を変える

  • 基本コード11: リスト型

【改善2】コードをもう少し読みやすくしたい

  • 基本コード12: while文
  • 基本コード13: 累積代入演算子

【改善3】ゲーム回数を簡単に変更したい

  • 基本コード15: 定数

【改善4】プレイヤーの入力を数字へ変更する

  • 基本コード14: 型変換

基本構文11:リスト型

リストは、複数の要素を順序付けて格納するためのデータ型です。リストの各要素は、任意のデータ型(文字列、数値、他のリストなど)を持つことができます。これにより、コンピュータの手を複数設定することが可能となります。

リスト型の要素を管理するのに必要となる作成・取り出し・更新について使い方を学習します。追加や削除の使い方も学習する必要がありますが、オブジェクトメソッドを理解する必要があるため基本構文の対象外としました。コーディング演習のリンクを載せておきますので余裕のある方は合わせて学習しましょう。

プログラムではリストの要素を様々に加工して、演算をさせることが非常に多いのでリストの使い方は何回も学習して必ず習得しましょう。

基本構文12:while文

while文は、条件が真(True)の間、繰り返しブロックのコードを実行するループです。条件が偽(False)になるとループが終了します。基本構文は以下のように記述されます。

while 条件:
  実行するコード

while文もfor文と同様に繰り返し実行されるコードを記述するにはインデントが必要です。次のプログラムではcountが5より小さい場合はTrueとなって繰り返しが継続されます。5以上になると条件がFalseとなりループが終了します。

count = 0
while count < 5:
  print(count end=” ”)
  count = count + 1

出力: 0 1 2 3 4 

基本構文13:累積代入演算子

while文は、条件が真(True)の間、繰り返しブロックのコードを実行するループです。条件が偽(False)になるとループが終了します。基本構文は以下のように記述されます。

基本構文14:型変換

じゃんけんゲームではユーザからのじゃんけんの手を”グー”などの文字列で入力していましたが、プレイヤーが入力を間違えるとゲーム進行に影響を与えます。このため、プログラミングでは”グー、チョキ、パー”などの入力パターンが決まっている場合は0をグー、1をチョキ、2をパーなどの数字に置き換えてユーザの入力ミスを防止する方法がとられます。

本来はプレイヤーの入力に対してエラー処理を設けることでプレイヤーが何を間違えたのかを表示して再入力させるのが一番良い方法ですが、基本コードとしては少し高度になるため省きます。

このように決めるとinput関数でプレイヤーに入力させる文字も数字にする必要があります。

player = input("グー、チョキ、パーを選択して下さい: (グー, チョキ, パー)")

# 次のように変更します。
player = input("グー、チョキ、パーを数字で選択して下さい: (0:グー, 1:チョキ, 2:パー)")

次に入力された数値を文字列のまま比較しても良いのですが、後でグー、チョキ、パーと対応づけるために整数型で管理するのが適しています。このためにinput関数で入力された文字列を整数型に変換します。

数値に変更するにはint関数を使用します。使い方は簡単で数値の文字列をintで括るだけです。文字列型(str)から整数型(int)へ変換されます。

ここで、ひとつ注意が必要です。ユーザが誤って数字以外の文字を入力するとint関数で整数へ変換できないためエラーが発生してプログラムが強制的に終了してしまいます。

このエラーを避けるためにはtry~exceptという構文を使用する必要がありますが、基本コードでは取り扱わないため数値のみを入力する前提とします。

それではプレイヤーからのインプットを整数型に変換してみましょう。

intに変換したことが分かるように変数名をint_playerとして変換して代入します。

player = input("グー、チョキ、パーを数字で選択して下さい: (0:グー, 1:チョキ, 2:パー)")
int_player = int(player)
print(int_player)
print(type(int_player))

基本構文15:定数

基本コードの最後は定数です。定数は基本的に変数と同じですが、プログラムの中では特別に扱いたいために別の基本コードとして学習します。

定数は一度値を設定すると変更させない変数です。プログラムの中で使う固定された値を定義するために使用されます。プログラミング言語によっては定数を宣言することができますが、Pythonには「定数」としての特別なデータ型がないため値の変更を防止する方法はありません。このため暗黙の了解として変数を全て大文字で定義することで「定数」なので変更してはいけませんと宣言します。

じゃんけんゲームではwhile文の中でゲーム回数を数値の2と比較して等しければゲームを終了させています。

game_count = 1
while True:
  print(f"{game_count}回目のゲームです。")
  if game_count == 2:
    print(“ゲームを終了します。”)
    break
  game_count = game_count + 1

しかし、3回に変更したい場合は、変更する場所を探し出して3へ変更する必要があります。今回のように短いプログラムではすぐに探し出すことができますが、プログラムが大きくなっていくると探すのに時間もかかり修正ミスが起こる可能性があります。

このような時にゲーム回数を定数として定義して簡単に変更できるようにします。何回までゲームをするかということでGAME_END_COUNTとして定義します。定数は基本的にはプログラムの先頭部分で定義します。

GAME_END_COUNT = 5
game_count = 1
while True:
  print(f"{game_count}回目のゲームです。")
  if game_count == GAME_END:
    print(“ゲームを終了します。”
    break
  game_count = game_count + 1

じゃんけんゲームでもう一点定数を用いて変更する点があります。input関数から入力された手を表示させていましたが、数字の入力に変更したため数字とじゃんけんの手を関連付けて表示する必要があります。

print(f”あなたの手: {player} / コンピュータの手: {computer}”)

この問題を解決するためにじゃんけんの手をリスト型で定数として定義します。このようにするとプレイヤーが入力された数字をインデックスとして手を表示することができるようになります。

HAND = [“グー”,”チョキ”, “パー”]
computer = 0
player = input(“0,1,2のいずれかを入力して下さい”)
int_player = int(player)
print(f”あなたの手: {HAND[int_player]} / コンピュータの手: {HAND[computer]}”)

改善じゃんけんゲームの実行

それでは改善1から4までを取り込んでプログラムを変更します。変更部分にはコメントを入れて漏れがないことを確認します。

# じゃんけんゲーム
# version 1.1
# created date: 2024/01/02

# 改善3 ゲーム回数を簡単に変更したい
GAME_END_COUNT = 2
# 改善4 プレイヤーの入力を数字へ変更する
HAND = ["グー","チョキ","パー"]

print("じゃんけんゲームを開始します。2回勝負です。")

# 改善1 コンピュータの手をゲーム毎に変える
computer = [0, 2]

# ゲーム回数の初期値を設定する
game_count = 1

# 改善2 コードを読みやすくする
while True:
  print(f"{game_count}回目のゲームです。")

# 改善4 プレイヤーの入力を数字へ変更する
  player = input("グー、チョキ、パーを数字で選択して下さい: (0:グー、1:チョキ、2:パー)")
  int_player = int(player)

  # ゲーム回数に応じたcomputerの手を取り出し
  int_computer = computer[game_count-1]

# 改善4 プレイヤーの入力を数字へ変更する
  print(f"あなたの手: {HAND[int_player]} / コンピュータの手: {HAND[int_computer]}")
  if int_player == computer[game_count-1]:
    print("引き分け")
  elif int_player == 0 and int_computer == 1:
    print ("あなたの勝ち")
  elif int_player == 0 and int_computer == 2:
    print ("あなたの負け")
  elif int_player == 1 and int_computer == 0:
    print ("あなたの負け")
  elif int_player == 1 and int_computer == 2:
    print ("あなたの勝ち")
  elif int_player == 2 and int_computer == 0:
    print ("あなたの勝ち")
  elif int_player == 2 and int_computer == 1:
    print ("あなたの負け")
  else:
    print ("入力に誤りがあります。")

# 改善3 ゲーム回数を簡単に変更したい
  if game_count == GAME_END_COUNT:
    print("ゲームを終了します。")
    break

# 改善2 コードを読みやすくする
  game_count += 1

変更が完了したら、プログラムを実行しましょう。エラーなく想定通りに動作するかテストしながら確認して下さい。