この記事は、Django Girls Japan Python初級者向け、
「Pythonでじゃんけんゲームを作ろう」の勉強会用資料です。
尚、記載者も初心者のため、何らかの不具合などござましたら申し訳ございません。
記載者環境:Windows 10 python3.5
尚、この記事はPythonでじゃんけんポイッの記事内の問題に対する回答と解説のページとなります。
回答コード
問題ページはこちら
# !/usr/bin/env python
# -*- coding: utf-8 -*-
import random
dic = {"a": "グー", "b": "チョキ", "c": "パー"}
print("じゃーんけーん")
print("a=グー b=チョキ c=パー aかbかcを入力")
user = input('>>> ')
user = user.lower()
try:
user_choice = dic[user]
choice_list = ["a", "b", "c"]
pc = dic[random.choice(choice_list)]
draw = 'DRAW'
win = 'You Win!!'
lose = 'You lose!!'
if user_choice == pc:
judge = draw
else:
if user_choice == "グー":
if pc == "チョキ":
judge = win
else:
judge = lose
elif user_choice == "チョキ":
if pc == "パー":
judge = win
else:
judge = lose
else:
if pc == "グー":
judge = win
else:
judge = lose
print("あなた選んだのは %s" % user_choice)
print("コンピュータが選んだのは %s" % pc)
print("結果は%s" % judge)
except:
print("aかbかcを入力してください。")
*↑のコードはあくまでも例の1つです。 記載方法は色々あると思いますので、あくまでも方法の1つとしてご認識いただければ幸いです。
解説
辞書の作成
dic = """問1:1がグー2がチョキ3がパーとなる辞書をつくってください"""
↓
ユーザにはaかbかcを入力してもらいます。
辞書のキーとなるのは、aかbかcのため、キーをa,b,cとしバリューを
グー、チョキ、パーとした辞書を作成します。
input()
print 文は( )内に記載した内容を表示する命令文です。
user = input('>>> ')
input() を記載した行の部分でプログラムの実行は一旦中断され、キーボードの入力を待ちます。
今回は、input()の前に2行print文がありますので、print文とinput()の()内に指定した >>>を表示した状態で中断されます。
input()関数は、キーボードから入力された内容をその変数(今回は user )に格納します。
尚、今回はユーザにちょっと親切に・・大文字をいれてきても良いように、
user = user.lower()で入力された文字を小文字に変換しています。
例外処理
ユーザが入力した内容がaかbかcではない場合、辞書にキーがないため
エラーが生じ、プログラムが中断してしまいます。
これでは、せっかくの楽しい(?)ゲームが台無しです。
これを回避する方法は様々ありますが、今回は例外処理を利用します。
変数を使った辞書のバリューの取得
user_choice = """問2:userが入力した数字からdicを使ってグーか
チョキかパーの文字を取得してください"""
辞書のバリューの取得方法は 辞書名[キー] となります。
今回利用するのは、
ですので、辞書名は dic となります。
キーはinput()で受け取った情報になりますので、 user です。
よって、ユーザの選択した情報から グー、チョキ、パーのいずれかのバリューを取得するには、
user_choice = dic[user]
と記載します。
コンピュータの手からグー、チョキ、パーを判別する
pc = """問3:import したrandomを使って、PCに数字をチョイスさせて、
且つグーかチョキかパーの文字列を取得してください"""
↓
コンピュータの手を選ぶ方法は、randomモジュールを使えば他にも方法がありますが、
今回は、python先にリストを用意していますので、random.choice()を利用します。
random.choice(choice_list) で choice_listの中からランダムに1つ要素が取り出されます。
取り出された要素は先に作成している辞書のキーに使われています。
よって・・・ dic[random.choice(choice_list)] とする事でコンピュータが選んだ手から
バリューを取得する事ができます。
if文で条件分岐
"""問4:ユーザの手とPCの手を比較して結果を取得してください
結果はjudgeという変数を作成して上記のdraw win loseのいずれかを
変数にいれてください。"""
↓
同じ色の矢印がそれぞれの条件下です。(すみません。ちょっとわかりづらいですね。。もっとわかりやすいの作れたら更新します・・)
python
最初にあいこの判断をつけて、あとは勝敗になるので、else: 以下で詳細の判断をくだしていきます。
文字列の連結
%s %dを使った連結
今回は少し古いタイプの文字列の連結方法を使っています。
現在でも、様々なサイトで例として記載されておりますのと
私自身が今でもよく使うので(楽なので・・^^;)説明いたします。
"あなたが選んだのは%s" % user_choice
" "で囲われた(' 'でもOK)文字列の中に、%s の記載があります。
この%sの部分に埋め込みたい文字(今回はuser_choiceの変数に入った文字列)を指定します。
指定方法は" "で囲った後 % を記載し、その後に埋め込みたい文字を記載するだけです。
では、複数の文字を埋め込みたい時はどうするかというと
a = "women"
b = 40
"A %s does not become interesting until she is over %d" % (a, b)
→A women does not become interesting until she is over 40
- %d はint値の埋め込み
%s や%dを指定した順に、文字列あとの%の後ろに(埋め込み順にカンマ区切りで記載)で渡してあげればOKです。
**ちなみに、↑の英文の和訳は
「女は40を過ぎて始めておもしろくなる。」 です。(関係ないけど 笑)
その他の連結方法
演算子をつかった連結
文字列は演算子を利用する事もできます。
実は・・
"あなたが選んだのは" + user_choice
とするだけでも、今回の内容であれば全然問題ありません。
文字列には他にも *(掛け算)も使えます。
例えば・・user_choiceの変数に入っているのが "グー" だとして
user_choice * 3
とすると、
"グーグーグー"
となります。
formatを使った連結
さて・・場合によって同じ文字列を数か所に埋め込みたい場合もあります。
"My name is {0}. Hallo {0}!! My Name is {1}".format("Taro", "Hanako")
→ "My name is Taro. Hallo Taro!! My Name is Hanako"
{}の中の数字はformat後のタプルの部屋番号を示しています。
%s を使った方法だと、( )内は("Taro", "Taro", "Hanako") と同じものを
複数記載する必要がありますが、formatを使うと上記のように、
"Taro"を二回記載しなくて良いので便利です。
埋め込みたい場所が多く、部屋番号での管理が難しい場合などは
キーワードで指定する事も可能です。
"My name is {name1}. Hallo {name1}!! My Name is {name2}".format(name1= "Taro", name2 = "Hanako")
→ "My name is Taro. Hallo Taro!! My Name is Hanako"
formatは他にも色々指定方法がありますが、それはまた別にご紹介していきたいと思います。
お・ま・け。3回勝負とか作ってみました
・あいこの場合は勝負カウントにいれない
・ユーザとコンピュータの勝合計が3になった時点で2勝以上している方が勝ち
# -*- coding: utf-8 -*-
# !/usr/bin/env python
import random
dic = {"a": "グー", "b": "チョキ", "c": "パー"}
draw = 'DRAW'
win = 'You Win!!'
lose = 'You lose!!'
user_co = 0
pc_co = 0
judge = win
i = 1
while (user_co + pc_co) < 3:
if judge == win or judge == lose:
print(u"じゃーんけーん")
else:
print(u"あーいこーで")
print(u"a=グー b=チョキ c=パー aかbかcを入力")
user = input('>>> ')
user_choice = user.lower()
try:
user_choice = dic[user]
except:
print("aかbかcを入力してください。")
continue
pc = dic[str(random.choice("abc"))]
if user_choice == pc:
judge = draw
else:
if user_choice == "グー":
if pc == "":
judge = win
else:
judge = lose
elif user_choice == "チョキ":
if pc == "パー":
judge = win
else:
judge = lose
else:
if pc == u"グー":
judge = win
else:
judge = lose
if judge == win:
user_co += 1
elif judge == lose:
pc_co += 1
print(u"あなた選んだのは %s" % user_choice)
print(u"コンピュータが選んだのは %s" % pc)
print(u"%d戦目の結果は%s" % (i, judge))
print(u"")
i += 1
if user_co >= pc_co:
print(u"%d勝%d敗であなたの勝ちです" % (user_co, pc_co))
else:
print(u"%d勝%d敗であなたの負けです" % (user_co, pc_co))
↑の3回勝負もmyルールで作っているのですが・・
自分で色々とルールをアレンジして作ってみると良い練習になると思います。