見出し画像

#47 じゃんけん2

● 問題

PCとじゃんけんします。
じゃんけんは,グー(0),チョキ(1),パー(2) と数字を入力します。
判定が間違っているようです。

勝ち負けを数式を使って判定しています。
■あいこ 
PC:グー(0),チョキ(1),パー(2)
自分:グー(0),チョキ(1),パー(2)
■自分が勝ち 
PC:グー(0),チョキ(1),パー(2)
自分:パー(2),グー(0),チョキ(1)
■自分が負け
PC:グー(0),チョキ(1),パー(2)
自分:チョキ(1),パー(2),グー(0)

どのように判定を行っているかも考えながら,エラーを探してみましょう。

import random

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

pc_select = random.randint(0,2)
my_select = input('じゃんけん:グー(0),チョキ(1),パー(2)')

if my_select in ['0','1','2']:
    if pc_select == int(my_select):
        print('あいこ')

    if pc_select == int(my_select)+1 % 3:
        print('勝ち')

    if pc_select == int(my_select)-1 % 3:
        print('負け')

    print(f'あなた:{janken[int(my_select)]} vs PC:{janken[int(pc_select)]}')
else:
    print('入力を確認してください:グー(0),チョキ(1),パー(2)')

● 解答

あいこの場合は,PCと自分の出した手が同じ,つまり,数字が同じならあいこと判定できます。これは簡単ですね。
自分が勝ちの場合はどうでしょうか。
例えば,PCがチョキ(1)のとき,自分はグー(0)で勝ち,PCがパー(2)のとき,自分はチョキ(1)で勝ちになります。
相手の手の数字=自分の手の数字+1であれば,勝ちと判断できそうです。
しかし,PCがグー(0)のとき,自分はパー(2)で勝ちなので,2+1=3で0とは等しくなりません。
そこで使うのが,わり算のあまりを求める % です。
1 % 3 = 1,2% 3 = 2,3 % 3 = 0 となるので,3つの場合すべてで勝ちを判定することができます。
このことから,(自分の手の数字+1)を3で割った余りが相手の手の数字と等しいという条件で自分の勝ちを判断できます。
同様に(自分の手の数字ー1)を3で割った余りが相手の手の数字と等しいという条件で自分の負けを判断できます。
問題では,(自分の手の数字+1)%3とするところを,自分の手の数字+1%3となっていました。
演算順序は,+よりも%のほうが高いので,場合によって誤った計算結果になり,判定間違いが起きていました。
<例>
1 + 1 % 3 = 2 , (1 + 1) % 3 = 2
2 + 1 % 3 = 3 , (2 + 1) % 3 = 0

import random

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

pc_select = random.randint(0,2)
my_select = input('じゃんけん:グー(0),チョキ(1),パー(2)')

if my_select in ['0','1','2']:
    if pc_select == int(my_select):
        print('あいこ')

    if pc_select == (int(my_select)+1) % 3# 変更
        print('勝ち')

    if pc_select == (int(my_select)-1) % 3# 変更
        print('負け')

    print(f'あなた:{janken[int(my_select)]} vs PC:{janken[int(pc_select)]}')
else:
    print('入力を確認してください:グー(0),チョキ(1),パー(2)')

わり算の余り【剰余】は,プログラミングにおいて非常に有効な考え方です。じゃんけん1と比較すると,条件分岐が非常に少なくなることがわかります。条件分岐が少なくなるということは,それだけエラーも減らすことができるのです。

# じゃんけん1:解答
import random

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

pc_select = random.randint(0,2)
my_select = input('じゃんけん:グー(0),チョキ(1),パー(2)')

if my_select in ['0','1','2']:
    if janken[pc_select] == 'グー':
        if janken[int(my_select)] == 'グー':
            print('あいこ')
        elif janken[int(my_select)] == 'チョキ':
            print('負け')
        elif janken[int(my_select)] == 'パー':
            print('勝ち')

    if janken[pc_select] == 'チョキ':
        if janken[int(my_select)] == 'チョキ':
            print('あいこ')
        elif janken[int(my_select)] == 'パー':
            print('負け')
        elif janken[int(my_select)] == 'グー':
            print('勝ち')

    if janken[pc_select] == 'パー':
        if janken[int(my_select)] == 'パー':
            print('あいこ')
        elif janken[int(my_select)] == 'グー':
            print('負け')
        elif janken[int(my_select)] == 'チョキ':
            print('勝ち')

    print(f'あなた:{janken[int(my_select)]} vs PC:{janken[int(pc_select)]}')
else# 追加
    print('入力を確認してください:グー(0),チョキ(1),パー(2)')

#Python  #プログラミング

この記事が気に入ったらサポートをしてみませんか?