GADGET RECIPE

Gadget Recipe

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

3. プログラムの作成手順を学習する

これまではコードの使い方やコーディングの方法について学んできました。

この章では、プログラミングの基本的な手順について学びます。プログラムの手順といってもエンジニアが行うような厳密なものではなく、簡単なプログラムを作成するために必要となる部分のみに絞り込んで学習します。

プログラミングは論理的思考を伸ばすことができると言われます。これはプログラムとして動作させたい機能をステップに分けてどのように実現していくかという手順を何回も繰り返すことで鍛えられます。ぜひ、プログラミング練習で論理的に考える癖を身につけましょう。

プログラミングの手順は以下のステップとなります。

  • ステップ1: 何を作るのか定義する
  • ステップ2: どのように作るか考える
  • ステップ3: 機能毎にコードを作る
  • ステップ4: 全てのコードを統合してテストする

それではサンプルのじゃんけんゲームについてどのような考え方でプログラムを作成したかをプログラミングの手順に沿って見ていきましょう。

ステップ1: 何を作るのか定義する

プログラミングの最初のステップは、何を作ろとしているのかをきちんと定義することです。作りたいプログラムにはどのような機能が必要になるのかを考えていきます。

ステップ1は要件定義と呼ばれて実はプログラミングの中でも難しいステップとなります。本来はユーザの使いやすさや、ゲームの面白さなども考慮する必要がありますが、今回は簡単なゲームのみに適用できるように簡略化して考えます。じゃんけんゲームを作成するために次の項目で何を作るかを考えてみましょう。

  • 何人で実施するゲームなのか?
  • ゲームのルールは?
  • ゲームの勝利・終了条件は?
  • ゲームに必要な機能は?

何人で実施するゲームなのか?

コンピュータとの対戦ということで、コンピュータとプレイヤーの2人で対戦することにします。3人でも4人でも構いませんが、作るプログラムが変わってしまいますのでしっかりと定義します。

  • 【定義1】コンピュータとプレイヤーの2人で対戦する

ゲームのルールは?

オリジナルゲームを作るのでなければルールの定義も難しいものではありません。全ての条件が網羅されているのか勝敗表などを作成して確認します。

表 プレイヤーから見た勝敗表

ゲームの勝利・終了条件は?

ゲームの勝敗はルールで定義した勝敗表に従います。終了条件ですが、2回の勝負が終わったら終了と定義します。引き分けでも関係なく終了とします。

  • 【定義2】ゲームの勝敗は勝敗表に従う
  • 【定義3】ゲームの終了条件は2回の勝負の完了後である

ゲームに必要な機能は?

じゃんけんゲームについて3つの定義をしました。この定義を満たしたじゃんけんゲームに必要な機能を考えます。プログラミングで最も難しいのはこの必要機能を洗い出すことです。さまざまなところでプロググラムは使われているので自動販売機を見てこの機能を実現するにはどのような機能が必要になるだろうか、ショッピングサイトを見てこのサイトにはどんな機能が詰め込まれているのだろうかなど興味のある分野で考えを巡らすことがトレーニングとなります。

じゃんけんゲームは非常にシンプルなので二人でじゃんけんを行う様子を想像しながら書き出します。

  • 【機能1】プレイヤーが手を出す
  • 【機能2】コンピュータが手を出す
  • 【機能3】両方の手を表示する
  • 【機能4】どちらが勝ったか判定して表示する
  • 【機能5】ゲームを2回繰り返す

次のようなフローチャートと呼ばれる図を書いてゲームの流れを見えるようにすることで、どのような機能が必要か洗い出すこともできます。本書ではフローチャートの作成方法は省略しますが、各機能の流れが分かるように絵を書いてみましょう。

ステップ2: どのように作るか考える

このステップは機能設計と呼ばれていて、各機能についてどのような型を使うのか、どのような処理を行うのかなどを検討します。今回は基本構文のみを使用するために作り方は一部制限しますが、本来であればユーザの使いやすさやゲームの面白さを考えてさまざまなアイデアを試したり、webサイトやChatGPTなどを用いて新しい実装方法などを見つけて試したりしていくつかの案を検討します。

【機能1】プレイヤーが手を入力する機能

入力方法についていくつかの案を考えます。

  1. カタカナでグー・チョキ・パーを入力させる
  2. グーを1、チョキを2、パーを3として入力させる
  3. 画像を用いてグー・チョキ・パーを選択させる

今回はgoogle colabを用いて基本構文のみを使用するため、1番目の「カタカナでグー・チョキ・パーを入力させる」方法を選択します。また、簡略化のためにグー・チョキ・パー以外が入力されてもチェックは行いません。

入力はinput関数を用いますが、入力時の文字列は下記とします。

入力時の文字列:
「グー、チョキ、パーを数字で選択して下さい: (0:グー, 1:チョキ, 2:パー)」

【機能2】コンピュータが手を決める機能

コンピュータの手をどのように決めるかについてもいくつかの案を考えます。まずは実現性を考えずにアイデアはたくさん出していきましょう。

  1. 同じ手を固定で持つ
  2. ランダムに手を決める
  3. AIを用いて手を決める

AIを用いてコンピュータが手を決める方法は楽しそうですが、もちろん非常に高度な知識が必要です。実現するにはAIに関する知識やライブラリの使い方など多くの時間が必要となります。

どのアイデアを採用するかは現状の知識やゲームとしての楽しさ、学習する時間などを考慮して決定します。今回は基本構文を中心とするためにゲームの楽しさは犠牲として、簡略化した1の「同じ手を固定で持つ」を採用します。ゲーム回数は2回ありますがどちらも同じ手を出すことにします。

【機能3】両方の手を表示する機能

プレイヤーの選択した手とコンピュータの手を表示させます。表示形式は次のようにします。

表示形式:
あなたの手:チョキ / コンピューターの手:グー

【機能4】どちらが勝ったか判定して表示する機能

機能1にてユーザからカタカナで手の入力を行うことにしました。このため勝敗表に基づいて比較演算子と論理演算子を組み合わせて判定します。また、入力された文字列のチェックは行わないため、グー、チョキ、パー以外は、「入力に誤りがあります。」と表示するようにします。

結果の表示は好きに決めることができます。今回はプレイヤーの視点で勝ち、負け、引き分けをprint関数にて表示するだけにします。

表示サンプル:

あなたの勝ち、あなたの負け、引き分け

【機能5】ゲームを2回繰り返す機能

ゲームの回数を2回と定義しましたのでどのように2回繰り返すかを検討します。まだ基本構文で取り扱っていないコードもありますが、基本的には次の4つのパターンがあります。

  1. for文とrange関数を用いる
  2. for文とbreak文を用いる
  3. while文を用いる
  4. while Trueとbreak文を用いる

今回は学習済みのfor文とrange文を用いて、他の方法は後ほど学習します。

機能としてはゲームを2回繰り返すことのみを定義しましたが、実際のじゃんけんゲームでは何回目のゲームであるかを表示しています。このようにゲームとしての分かりやすさもステップ2にて検討します。

それでは何回目かを表示するための方法を考えてみましょう。

  1. ゲーム数をカウントする変数game_countを用いてfor文の中でカウントアップして表示する
  2. range関数の引数をrange(1,3)としてfor文の変数iに代入して表示する

for文を用いる方が後ほどゲーム回数の変更を行う時に便利になりますが、今回は様々な使い方を学ぶために1のgame_countを用いて実装します。

ステップ3: 機能毎のコーディングとテスト

ステップ2にてどのように作るかを考えましたので設計通りにコーディングを行います。この時に機能毎に簡単なテストを組み込んで想定通りに動作しているかを確認します。

【機能1】プレイヤーが手を入力する機能

入力された内容と型を確認します。グー・チョキ・パーとそれ以外の文字列を入力して入力された文字列の表示と型がstr型となっていることを確認します。

【機能2】コンピュータが手を決める機能

変数computerに代入する文字列をグー・チョキ・パーに入れ替えて、表示が正しいかを確認します。

【機能3】両方の手を表示する機能

変数playerとcomputerに代入する文字列をグー・チョキ・パーに入れ替えて、表示が正しいかを確認します。

【機能4】どちらが勝ったか判定する機能

変数playerとcomputerに代入する文字列をグー・チョキ・パーに入れ替えて、全てのパターンの勝敗が正しいかを確認します。また、グー・チョキ・パー以外の文字列を入力して「入力に誤りがあります。」と表示されることを確認します。

【機能5】ゲームを2回繰り返す機能

本来はfor文の処理部分に機能4でコーディングしたif文の判定機能を入れますが、for文の単体機能としてゲームが2回繰り返されているかを確認します。

ステップ4: 統合テスト

最後に機能毎に作成したコードを繋ぎ合わせて最終的なプログラムへと完成させます。機能としては特に定義していませんが、ゲームの開始と終了が分かるように下記のメッセージを出力できるようにして統合します。

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

このように細かな機能に分解してそれぞれに対してテストを行うことで、統合した時に大きな問題が発生することを防ぐことができます。

統合したじゃんけんゲーム

Pythonプログラミング基礎完全マスター①で書き写していますが、今度は各機能で作成してテストした機能をコピーして統合してみましょう。

# Title: じゃんけんゲーム
# Version: 1.0.0
# Create date: 2024/01/01

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

#【機能2】コンピュータが手を決める機能
computer = "グー"

#【機能5】ゲームを2回繰り返す機能
game_count = 1
for _ in range(2):
  print(f"{game_count}回目のゲームです。")

#【機能1】プレイヤーが手を入力する機能
  player = input("グー、チョキ、パーを選択して下さい(グー, チョキ, パー) : ")

#【機能3】両方の手を表示する機能
  print(f"あなたの手: {player} / コンピュータの手: {computer}")

#【機能4】どちらが勝ったか判定する機能
  if player == computer:
    print("引き分け")
  elif player == "グー" and computer == "チョキ":
    print ("あなたの勝ち")
  elif player == "グー" and computer == "パー":
    print ("あなたの負け")
  elif player == "チョキ" and computer == "グー":
    print ("あなたの負け")
  elif player == "チョキ" and computer == "パー":
    print ("あなたの勝ち")
  elif player == "パー" and computer == "グー":
    print ("あなたの勝ち")
  elif player == "パー" and computer == "チョキ":
    print ("あなたの負け")
  else:
    print ("入力に誤りがあります。")
  game_count = game_count + 1

print ("ゲーム終了を終了します。")