simudaru's blog

Python, Rなどのメモを残していこうと思います。  よろしくお願いいたします。

Pythonでジャンケンゲーム作る(その1)

まずは単純な形で、以下の仕様を満たすよう実装します。


 ・コンソールアプリケーション
 ・3本先取
 ・コンピュータは一人


オブジェクト指向は苦手なので、とりあえず手続き型で書いて、
後で関数化とかオブジェクト化とかしていく方向で。

# -*- coding: utf-8 -*-
import time
import random

const_max_win = 3
hand_dict = {"r":1, "s":2, "p":3}
hand_print_dict = {1:"グー", 2:"チョキ", 3:"パー"}

print "じゃんけんスタート。"
time.sleep(1.0)


# 初期化
flg_draw = False
win = [0]*2

while (max(win) < const_max_win):
    
    # コンピュータの手
    chand = random.randint(1, 3)
    
    while 1:
        # メッセージ
        if flg_draw:
            print "あい"
            time.sleep(0.5)
            print "こで"
            time.sleep(0.5)
            print "……"
        else:
            print "じゃん"
            time.sleep(0.5)
            print "けん"
            time.sleep(0.5)
            print "……"
        
        # プレイヤーの手
        phand_txt = raw_input("(何を出しますか?) (グー:r チョキ:s パー:p) > ")
        if phand_txt not in ("r", "s", "p"):
            print "不正な文字です。"
            time.sleep(1.5)
        else:
            phand = hand_dict[phand_txt]
            break
    
    # メッセージ
    if flg_draw:
        print "しょ!"
    else:
        print "ぽん!"
    time.sleep(1.0)
    
    print "あなた:%s        あいて:%s" % (hand_print_dict[phand], hand_print_dict[chand])
    time.sleep(1.0)
    
    # ジャンケン勝敗判定
    # 勝ち数カウント
    if (3 + hand_dict[phand_txt] - chand) % 3 == 2:  # 勝ち
        flg_draw = False
        win[0] += 1
        print "あなたの勝ちです。"
        time.sleep(1.5)
    elif (3 + hand_dict[phand_txt] - chand) % 3 == 1:  # 負け
        flg_draw = False
        win[1] += 1
        print "あなたの負けです。"
        time.sleep(1.5)
    else:
        flg_draw = True
        print "あいこです。"
        time.sleep(1.5)
        continue
    
    print "あなた:%s勝      あいて:%s勝" % (win[0], win[1])

# 勝敗判定
if win[0] > win[1]:
    print "%s勝%s敗であなたの勝ちです。" % (win[0], win[1])
    time.sleep(1.5)
else:
    print "%s勝%s敗であなたの負けです。" % (win[0], win[1])
    time.sleep(1.5)

print "終わりです。"
time.sleep(1.5)


ポイント
 ・time.sleepで表示時間の間隔を調整
 ・flg_drawにより、あいこの場合はメッセージを変更
 ・勝敗をmodを使って判定


次は以下のどれかを仕様に追加する予定です。
 ・GUI
 ・コンピュータの人数を複数
 ・ハイスコア機能