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


この記事は、Django Girls Japan Python初級者向け、
「Pythonでじゃんけんゲームを作ろう」の勉強会用資料です。
尚、記載者も初心者のため、何らかの不具合などござましたら申し訳ございません。
記載者環境：Windows 10 python3.5
尚、この記事は[Pythonでじゃんけんポイッ](http://qiita.com/sandream/items/a0f69e69b561192517a2)の記事内の問題に対する回答と解説のページとなります。


# 回答コード
問題ページは[こちら](http://qiita.com/sandream/items/a0f69e69b561192517a2)

```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を入力してください。")

```
＊↑のコードはあくまでも例の１つです。　記載方法は色々あると思いますので、あくまでも方法の１つとしてご認識いただければ幸いです。

# 解説

## 辞書の作成
```python
dic = """問１：1がグー２がチョキ３がパーとなる辞書をつくってください"""
```
↓
![dic.JPG](https://qiita-image-store.s3.amazonaws.com/0/100769/017e1a84-e3ce-d9c6-29cc-83f0b6264b5f.jpeg)
ユーザにはaかbかcを入力してもらいます。
辞書のキーとなるのは、aかbかcのため、キーをa，b，cとしバリューを
グー、チョキ、パーとした辞書を作成します。


## input()

![input.JPG](https://qiita-image-store.s3.amazonaws.com/0/100769/bcf765cd-35bb-ce37-adc2-f2bbb7d016dc.jpeg)

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

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

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

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

## 例外処理

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

![3.JPG](https://qiita-image-store.s3.amazonaws.com/0/100769/6a4381fc-b5f8-d782-6deb-4d487afccc98.jpeg)

これでは、せっかくの楽しい（？）ゲームが台無しです。

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

![try.JPG](https://qiita-image-store.s3.amazonaws.com/0/100769/b72a9796-37f7-cd05-ec6b-cf42e7a66947.jpeg)

## 変数を使った辞書のバリューの取得
```python
user_choice = """問2：userが入力した数字からdicを使ってグーか
                        チョキかパーの文字を取得してください"""
```
辞書のバリューの取得方法は　辞書名[キー] 　となります。
今回利用するのは、
![dic.JPG](https://qiita-image-store.s3.amazonaws.com/0/100769/2ca0db4b-03d4-987e-407a-8869d6d60e86.jpeg)
ですので、辞書名は　dic となります。
キーはinput()で受け取った情報になりますので、 user です。

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

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

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

![6.JPG](https://qiita-image-store.s3.amazonaws.com/0/100769/b81788b2-226f-ec76-1960-b9bac25954e9.jpeg)

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

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

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

## if文で条件分岐

```python
"""問4：ユーザの手とPCの手を比較して結果を取得してください
    結果はjudgeという変数を作成して上記のdraw win loseのいずれかを
    変数にいれてください。"""
```
↓
![if.JPG](https://qiita-image-store.s3.amazonaws.com/0/100769/b18c23b9-4e0c-13f8-7150-dfa1b3eb3fc0.jpeg)
同じ色の矢印がそれぞれの条件下です。（すみません。ちょっとわかりづらいですね。。もっとわかりやすいの作れたら更新します・・）
python
最初にあいこの判断をつけて、あとは勝敗になるので、else: 以下で詳細の判断をくだしていきます。

## 文字列の連結

### %s %dを使った連結
![9.JPG](https://qiita-image-store.s3.amazonaws.com/0/100769/5b23abea-f3b3-4f08-1502-3ea1c6f4f6c4.jpeg)

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

```python
"あなたが選んだのは%s" % user_choice
```

" "で囲われた（' 'でもOK）文字列の中に、%s の記載があります。
この%sの部分に埋め込みたい文字（今回はuser_choiceの変数に入った文字列）を指定します。
指定方法は" "で囲った後 % を記載し、その後に埋め込みたい文字を記載するだけです。

では、複数の文字を埋め込みたい時はどうするかというと

```python
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の変数に入っているのが　"グー"　だとして

```python
user_choice * 3
```
とすると、

```python
"グーグーグー"
```
となります。

## formatを使った連結
さて・・場合によって同じ文字列を数か所に埋め込みたい場合もあります。

```python
"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"を二回記載しなくて良いので便利です。

埋め込みたい場所が多く、部屋番号での管理が難しい場合などは
キーワードで指定する事も可能です。

```python
"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になった時点で２勝以上している方が勝ち

```python
# -*- 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かｂかｃを入力")
    user = input('>>>  ')

    user_choice = user.lower()
    try:
        user_choice = dic[user]
    except:
        print("aかｂかｃを入力してください。")
        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))


```

↑の３回勝負もmyルールで作っているのですが・・
自分で色々とルールをアレンジして作ってみると良い練習になると思います。