簡単じゃんけんプログラム


Python学習の一環として、PCと対戦するじゃんけんプログラムを作ってみました。
While文、if文使う基本要素が入っているので、非常に勉強になります。

環境: Google Colaboratory

条件:

じゃんけんルールに従う。
先に2勝した方が勝ち。

① 乱数を読み込む為、randomモジュールのrandint関数入れる。タイムモジュールも読み込む。

from random import randint
import time

② じゃんけんで出すそれぞれの手をhandsという変数に代入し、あいこ、負け、勝ちという3つの結果をrulesという変数に代入

hands = ['グー', 'チョキ', 'パー']
rules = ['あいこ', '負け', '勝ち']
win = 0
lose = 0
draw = 0
print('***じゃんけんゲームスタート!***')

③ ある条件が達成されるまで処理を繰り返すようにしたい為、While Trueで無限ループを作る。

while True:

④ Player側の処理を書いていきます。
Player側
0:グー 1:チョキ 2:パーの選択肢を設け、出力する。inputで入力欄設け、'あなたは何を出しますか??'に対し、数字を入力すると、入力された数字は文字列なので、数値に変換する必要があります。int型で数値に変換、pという変数に代入する。

    print('0:グー 1:チョキ 2:パー')
    p = int(input('あなたは何を出しますか??'))
    #hands変数から上のp変数を入れてあげる
    print('あなたは,' + hands[p] + 'を出す')
    #上の処理を1秒止め、対戦形式に近い形にする。
    time.sleep(1)

⑤ PC側の処理を書いていきます。
PC側
randomモジュールのrandintからランダムに('0:グー 1:チョキ 2:パー')の0~2までの値を取得し、変数mに代入する。変数pに入れた数字を使って、上記のhands変数よりじゃんけんの手を出力する。time.sleep関数を使い、1秒間を間を空ける形にする為、time.sleep(1)で対戦形式に近い形にする。

    m = randint(0,2)
    print('PCは,' + hands[m] + 'を出す')
    time.sleep(1)

⑥ 勝敗プログラム

Playerが出した数字の変数pとPCが出した数字の変数mの数を引いて、3で割った余りで判定。マイナスが出ても判定できるよう余りが出力する% 代数演算子使う。じゃんけんプログラムに於いて、ココがキモになります。
例:
p:1(チョキ)-m:2(パー)  勝ち  -1%3=余り2 elseの条件でwin
p:2(チョキ)-m:2(パー) あいこ  0%3=余り0 if条件でdraw
p:2(パー)-m:1(チョキ) 負け   1%3=余り1 elif条件でlose
p:0(グー)-m:1(チョキ) 勝ち   -1%3=余り2 elseの条件でwin
p:0(グー)-m:0(グー)  あいこ  0%3=余り0 if条件でdraw
p:1(チョキ)-m:0(グー) 負け   1%3=余り1 elif条件でlose

上記の考えを表したのが下記のコードになります。pからmを引いた数字を3で割り、余りを出力。0の場合は引き分けにて1カウント、1の場合は1カウント、elseで2の場合も1カウント

    i = (p-m) % 3
    print(rules[i])
    if i == 0:
    #drawの場合+1でカウント
        draw = draw +1
    elif i == 1:
    #loseの場合+1でカウント
        lose = lose +1
    else:
    #winの場合+1でカウント
        win = win +1
    time.sleep(1)

⑦ 出力プログラム

上記で記載した下の変数より、format文を使って文字列に置き換えるます。
win = 0
lose = 0
draw = 0
これらの変数をformat文を使って文字列に置き換えるという意味になります。
それぞれの{}は、win, lose, drawの中に入った数字がformat文で処理され、入ることになります。

 print('{}勝/{}負/{}引き分け'.format(win, lose, draw))
    #winに入った数字が2に達したら、勝ちにして、breakでWhileを抜ける。
    if win == 2:
        print('対戦結果は****???')
        time.sleep(3)
        print('「3勝で、あなたの勝ち。Yes, You are winner !」')
        break
    #loseに入った数字が2に達したら、負けにして、breakでWhileを抜ける。
    if lose == 2:
        print('対戦結果は****???')
        time.sleep(3)
        print('「3敗で、あなたの負け。Yes, You are loser !」')
        break
    time.sleep(1)

まとめ

from random import randint
import time

hands = ['グー', 'チョキ', 'パー']
rules = ['あいこ', '負け', '勝ち']
win = 0
lose = 0
draw = 0

print('***じゃんけんゲームスタート!***')

while True:
    print('0:グー 1:チョキ 2:パー')
    p = int(input('あなたは何を出しますか??'))
    print('あなたは,' + hands[p] + 'を出す')
    time.sleep(1)

    m = randint(0,2)
    print('PCは,' + hands[m] + 'を出す')
    time.sleep(1)

    i = (p-m) % 3
    print(rules[i])
    if i == 0:
        draw = draw +1
    elif i == 1:
        lose = lose +1
    else:
        win = win +1
    time.sleep(1)

    print('{}勝/{}負/{}引き分け'.format(win, lose, draw))
    if win == 2:
        print('対戦結果は****???')
        time.sleep(3)
        print('「3勝で、あなたの勝ち。Yes, You are winner !」')
        break
    if lose == 2:
        print('対戦結果は****???')
        time.sleep(3)
        print('「3敗で、あなたの負け。Yes, You are loser !」')
        break
    time.sleep(1)

出力結果

***じゃんけんゲームスタート!***
0:グー 1:チョキ 2:パー
あなたは何を出しますか??0
あなたは,グーを出す
PCは,グーを出す
あいこ
0勝/0負/1引き分け
0:グー 1:チョキ 2:パー
あなたは何を出しますか??1
あなたは,チョキを出す
PCは,パーを出す
勝ち
1勝/0負/1引き分け
0:グー 1:チョキ 2:パー
あなたは何を出しますか??1
あなたは,チョキを出す
PCは,グーを出す
負け
1勝/1負/1引き分け
0:グー 1:チョキ 2:パー
あなたは何を出しますか??2
あなたは,パーを出す
PCは,チョキを出す
負け
1勝/2負/1引き分け
対戦結果は****???
「3敗で、あなたの負け。Yes, You are loser !」

じゃんけんには負けてしまいましたが、うまくプログラムが可動しました。今回のプログラムでWhile文、if文について理解が進みました。