エンジニアの備忘録

エンジニアの備忘録

元文系出身のエンジニアが、趣味から現場レベルまで様々なIT技術を紹介します。

PythonでAIをつくろう!~練習1:じゃんけんプログラム~

前回の記事でpythonの構文の基本形について学びました。

network-engineer.hatenablog.jp

 

 

今回からは実際に簡単なプログラムを作成してみましょう。

簡単なプログラムからプログラムの作成経験を積み、AIの作成に移っていこうと思います。

今回は、じゃんけんプログラムの作成を行いましょう。

 

 

1.  要件定義をしよう

プログラムの作成を始まるにあたって、まずは要件の確認が必要です。

要件とは、プログラムを作るうえで必要になる要素のことです。

例えば、引き算をしようと思ったら「元の数字」「引く数字」「演算子(-)」といった要素が必要になります。

このように、プログラムを作る前にまずは言葉でどんなプログラムにするのかを考えていきましょう。

 

①全体の流れを考える

まず最初に、プログラムの動きを考えましょう

 

じゃんけんなので相手が必要です。

#相手を用意する

相手を用意したら、同じく自分も定義してあげましょう。

#自分を用意する

次に、自分が出す手を選択する必要があります。

#自分の手を選択する

自分の手を選択したら、自動的に相手の手が選択されます。

#相手の手が選択される

自分の手と相手の手が決まったら、勝敗の判断をする必要があります。

#勝敗の判断

以上でじゃんけんの流れは終わります。

これらをまとめると以下になります。

 

相手を定義する

自分を定義する

自分の手を用意する

相手の手を用意する

勝敗を判断する

 

全体の流れだけで見ると非常にシンプルなものができました。

次に、実際にプログラムを作るにあたって必要な要素を考えましょう。

 

②必要な要素を考える

先ほどの流れを実現するために必要な要素を考えていきます。

要素を考えるための流れは大きく分けて2通りあります。

 

1つ目は全体の流れに沿って考える方法。

2つ目は逆順に必要なものを考える方法。

作成するプログラムに応じて使い分ければいいです。

 

大きなプログラムでは流れに沿って作ることが多いですが、今回は簡単なプログラムなので逆順で考えていきましょう。

 

勝敗を判断する

判断するためには、条件を作る必要があります。

例えば、相手がパーで自分がチョキだと勝ちなどです。

しかし、文章だけでは判断をすることができません。

ですので、手に数字を割り当てることで条件を分岐させる必要があります。

グーは1でチョキは2、相手が1で自分が2の時は勝ち、などです。

#数字で条件分岐を利用する。

 

相手の手を用意する

ここでは、相手の手を考えていきます。

先ほど手と数字をリンクさせると決めました。

ですので、条件として決めてしまいます。

ここで注意する必要があるのは、プログラムにおいては「0」から始まるということです。

ですので、「グー、チョキ、パー」 = 「0、1、2」とします。

さて、次は相手の手の選択が必要になります。

毎回同じ手だとつまらないので、実行するたびにランダムで手が選択されるようにしましょう。

#「グー、チョキ、パー」 = 「0、1、2」

#相手の手はランダムに選択される

 

自分の手を用意する

続いて自分の手を選択します。

先ほど手と数字はリンクさせたので、ここでは純粋に自分の手を選択します。

手と数字をリンクさせた、つまり自分の手を数字で選択する必要があります。

ですので、説明を表示した後に任意の手を数字で入力するようにします。

#手の説明を表示、任意の数字を入力させる

 

自分を定義する

自分の定義を行います。

しかし、自分の定義はイコール自分の手になりますのでここは割愛可能です。

ですが、せっかくなので自分の名前を入力できるようにしましょう。

入力した名前が表示されるようにします。

#名前を入力して表示させる

 

相手を定義する

最後に、相手の定義です。

ここでは相手は「コンピュータ」とします。

自分で入力するのではなく、最初から定義しておきます。

#コンピュータを定義する

 

2.  設計をしよう

では、実際にコードの作成を行いましょう。

 

①要素をコード化しよう

まずは、それぞれの要素をざっくりとプログラムに落とし込んでみます。

ポイントは、実現できそうなものをとりあえず記入してみることです。

また、名前はなるべくわかりやすいものにしましょう。

 

#コンピュータを定義する

computer = 'コンピュータ'

#名前を入力して表示させる

my_name = input('名前を入力してください')

#手の説明を表示、任意の数字を入力させる

print('何を出しますか?(0: グー, 1: チョキ, 2: パー)')
my_hand = int(input('数字で入力してください:'))

#「グー、チョキ、パー」 = 「0、1、2」

hands = ['グー', 'チョキ', 'パー']

#相手の手はランダムに選択される

computer_hand = random.randint(0,2)

#数字で条件分岐を利用する。
if my_hand == computer_hand:
 return '引き分け'
elif my_hand == 0 and computer_hand == 1:
 return '勝ち'
elif my_hand == 1 and computer_hand == 2:
 return '勝ち'
elif my_hand == 2 and computer_hand == 0:
 return '勝ち'
else:
 return '負け'

 

②関数を作成しよう

続いて、関数を作成します。

実際に必要になると想定される処理を考えてみます。

例えば、じゃんけんの結果を判断する処理が必要です。

こちらは先ほどの条件分岐を関数にしてしまいましょう。

さらに、自分と相手が出した手を判断して表示する処理も必要です。

入力された結果が0~2ではない、数字ではない場合に注意を促す処理も必要です。

 

じゃんけんの結果を判断する処理

def judge():
 if my_hand == computer_hand:
 return '引き分け'
elif my_hand == 0 and computer_hand == 1:
 return '勝ち'
elif my_hand == 1 and computer_hand == 2:
 return '勝ち'
elif my_hand == 2 and computer_hand == 0:
 return '勝ち'
else:
 return '負け'

0から2までの組み合わせをもとに、じゃんけんの結果を組み合わせます。

今回は引き分けと勝ちを定義し、そのほかを負けとします。

 

自分と相手が出した手を判断して表示する処理

def print_hand(hand, name='ゲスト'):
 hands = ['グー', 'チョキ', 'パー']
 print(name + 'は' + hands[hand] + 'を出しました')

関数は()の中にあらかじめデータを入れておくと、何も入力しなかった場合に代入されます。

ですので、今回は名前が入力されなかった場合には「ゲスト」と表示されるようにします。

 

注意を促す処理

def caution(hand):
 if hand < 0 or hand > 2:
  return False
 return True

今回は0-2までの数字でじゃんけんの結果を判定します。

ですので、それ以外の数字や文字の場合は間違った結果だと知らせる必要があります。

ですので、それ以外の場合は「False」と返すようにします。

Trueは正しい値、Falseは間違った値だと覚えていれば大丈夫です。

 

③構成を確認しよう

 今回は関数とプログラムの実行データを別のファイルに分けます。

Pythonではファイルを読み込むことで実行ファイルにコードを記入していなくても利用することが可能です。

実行ファイルはなるべく簡潔にした方がいいです。

小さいプログラムではそこまで影響はないのですが、プログラムが大きくなればなるほど細かいミスが大きな影響を及ぼすようになります。

 

①関数ファイル

②実行ファイル

 

今回はこちらの構成で作成していきます。 

 

3.  ファイルを作ろう

それでは実際にファイルを作成していきましょう。

 実行のファイル名を「script.py」、関数ファイルを「utils.py」とします。

 

①utils.py

def caution(hand):
 if hand < 0 or hand > 2:
  return False
 return True

 

def print_hand(hand, name='ゲスト'):
 hands = ['グー', 'チョキ', 'パー']
 print(name + 'は' + hands[hand] + 'を出しました')

 

def judge(my_hand,player_hand):
 if my_hand == computer_hand:
 return '引き分け'
elif my_hand == 0 and computer_hand == 1:
 return '勝ち'
elif my_hand == 1 and computer_hand == 2:
 return '勝ち'
elif my_hand == 2 and computer_hand == 0:
 return '勝ち'
else:
 return '負け'

 

②script.py

import utils
import random

#importでファイルよライブラリ(便利データみたいなイメージ)を読み込みます

#pyファイルの場合は識別子の省略が可能です

print('じゃんけんをはじめます')
my_name = input('名前を入力してください:')
print('何を出しますか?(0: グー, 1: チョキ, 2: パー)')
my_hand = int(input('数字で入力してください:'))

#事前の情報を表示します

#自分の手を決めます

if utils.caution(my_hand):
 computer_hand = random.randint(0,2)
#自分の手が条件に当てはまることを確認し、ランダムにコンピュータの手を決めます。

#random.randint(x.y)で、x~yの間のランダムな数字を選びます
 if my_name == '':

 #''で空白を表すことができます
  utils.print_hand(my_hand)

  #空白の場合は「ゲスト」で入力した手になります
 else:
  utils.print_hand(my_hand, my_name)

  #入力した場合は名前と入力した手になります

 utils.print_hand(computer_hand, 'コンピューター')

  #今度はコンピューターの手を表示します

 result = utils.judge(my_hand, computer_hand)
 print('結果は' + result + 'でした')

 #今までのデータをもとに結果を判定します
else:
 print('正しい数値を入力してください')

 

4.  プログラムを作成しよう

では、実際にコードを作成していきましょう。

今回のプログラムの作成にはanacondaではなくテキストエディタAtomを利用します。

実際に2つのファイルを開いてコードを張り付けていきましょう。 

 

f:id:Network_engineer:20210211223807p:plain

 

こんな感じで作成していきます。

設計段階である程度できあがっているので、作成自体は貼り付けと微修正だけで出来るはずです。

完成したら、いよいよ実際に動かしてみましょう。

 

5.試験をしよう

 プログラムが出来上がったら実際に動かしてみましょう。

実行方法は簡単で、コマンドプロントからファイルを指定して実行するだけです。

 

コマンドプロンプトを開きます。

プログラムファイルが置いてあるフォルダに移動します。

 移動の仕方は「cd フォルダ名」で移動できます。

 例えばデスクトップに移動するのであれば「cd Desktop」です。

 最初の一文字を入力すればあとは「Tabキー」で補完が可能です。

 詳しくは機会があればLinuxの話をします。

python ファイル名」でファイルの実行が可能です。

 今回の場合はpython script」で実行できます。

 

以下が実行結果です。

f:id:Network_engineer:20210211225242p:plain



このように、毎回入力内容が変更することや結果が変わることを確認できました。

正確な試験を行うには「unittestモジュール」を利用するのがいいですが、この程度の小規模プログラムでは問題ありません。

 

いかがでしょうか。

このような流れで大まかにプログラムの作成を行っていきます。

省いている部分はありますが、構文を作ったり流れを作るのにわからない部分が出てきた場合は逐一調べるのが普通です。

全て暗記して書く人はほとんどいないです。

数をこなせばよく使う構文は自然と身についてくるので安心してください。

次回も簡単なプログラムを作成していきましょう。

 

ここまで読んでいただきありがとうございました。