LoginSignup
6
7

More than 5 years have passed since last update.

Pythonでじゃんけんポイっ 初心者向け(回答と解説)

Last updated at Posted at 2016-10-23

この記事は、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がパーとなる辞書をつくってください"""


dic.JPG
ユーザにはaかbかcを入力してもらいます。
辞書のキーとなるのは、aかbかcのため、キーをa,b,cとしバリューを
グー、チョキ、パーとした辞書を作成します。

input()

input.JPG

print 文は( )内に記載した内容を表示する命令文です。

user = input('>>> ')
input() を記載した行の部分でプログラムの実行は一旦中断され、キーボードの入力を待ちます。
今回は、input()の前に2行print文がありますので、print文とinput()の()内に指定した >>>を表示した状態で中断されます。

input()関数は、キーボードから入力された内容をその変数(今回は user )に格納します。

尚、今回はユーザにちょっと親切に・・大文字をいれてきても良いように、
user = user.lower()で入力された文字を小文字に変換しています。

例外処理

ユーザが入力した内容がaかbかcではない場合、辞書にキーがないため
エラーが生じ、プログラムが中断してしまいます。

3.JPG

これでは、せっかくの楽しい(?)ゲームが台無しです。

これを回避する方法は様々ありますが、今回は例外処理を利用します。

try.JPG

変数を使った辞書のバリューの取得

user_choice = """問2:userが入力した数字からdicを使ってグーか
                        チョキかパーの文字を取得してください"""

辞書のバリューの取得方法は 辞書名[キー]  となります。
今回利用するのは、
dic.JPG
ですので、辞書名は dic となります。
キーはinput()で受け取った情報になりますので、 user です。

よって、ユーザの選択した情報から グー、チョキ、パーのいずれかのバリューを取得するには、
python
user_choice = dic[user]

と記載します。

コンピュータの手からグー、チョキ、パーを判別する

pc = """問3:import したrandomを使って、PCに数字をチョイスさせて、
        且つグーかチョキかパーの文字列を取得してください"""

6.JPG

コンピュータの手を選ぶ方法は、randomモジュールを使えば他にも方法がありますが、
今回は、python先にリストを用意していますので、random.choice()を利用します。

random.choice(choice_list) で choice_listの中からランダムに1つ要素が取り出されます。
取り出された要素は先に作成している辞書のキーに使われています。

よって・・・ dic[random.choice(choice_list)] とする事でコンピュータが選んだ手から
バリューを取得する事ができます。

if文で条件分岐

"""問4:ユーザの手とPCの手を比較して結果を取得してください
    結果はjudgeという変数を作成して上記のdraw win loseのいずれかを
    変数にいれてください。"""


if.JPG
同じ色の矢印がそれぞれの条件下です。(すみません。ちょっとわかりづらいですね。。もっとわかりやすいの作れたら更新します・・)
python
最初にあいこの判断をつけて、あとは勝敗になるので、else: 以下で詳細の判断をくだしていきます。

文字列の連結

%s %dを使った連結

9.JPG

今回は少し古いタイプの文字列の連結方法を使っています。
現在でも、様々なサイトで例として記載されておりますのと
私自身が今でもよく使うので(楽なので・・^^;)説明いたします。

"あなたが選んだのは%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ルールで作っているのですが・・
自分で色々とルールをアレンジして作ってみると良い練習になると思います。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7