魔術師をめざして

魔術師を目指して、相場・数学・プログラム言語を研究しています。

ヒット&ブロー in Python

Python 仲間の sin さんが、プログラムを作ったので、許可を得て公開することにした。小さなプログラムだけど、ゲームの桁数を選べるようになっている。この拡張はぼくが行った。人のふんどしで相撲を取るとはこういうことかな。

遊び方は、ヒット&ブローがどういうものか知っていれば、プログラムを実行すればメッセージを出しているのでわかると思う。暇な人がいたら、遊んでみてください。

# ------------------------------------------------------
# ヒット&ブロー プログラム(hitblow.py)
# オリジナル : sin
# アレンジ   : mazin
# ------------------------------------------------------
def makeanswer(length):
    # 異なる(length)桁の数字を作る / 返値は(length)桁の数字配列
    import random
    answer = []
    while len(answer) < length:
        m = str(random.randint(0,9))
        if m not in answer: answer.append(m)
    return answer

def checknum(n, length):
    # 入力された数字のチェック / n は数字文字列
    n = list(n)
    if len(n) != length: return "error length"
    if max([n.count(i) for i in n]) > 1: return "error overlap"
    return True

def jugement(n, answer, length):
    # 入力された数字の判定 / n は入力数字文字列、answer は正解数字配列
    n = list(n)
    hit = 0
    blow = 0
    for x in range(length):
        if n[x] == answer[x]: hit += 1
        elif n[x] in answer: blow += 1
    return [hit, blow]

# ヒット&ブロー メインプログラム
if __name__ == "__main__":

    trial = 1
    while True:
        try:    length = int(input("何桁の数字で遊びますか: "))
        except: print("エラー:不正な入力です"); continue
        if length >= 1 and length <=10: break
        print("エラー:桁数は1桁以上10桁以下です")
        continue

    answer = makeanswer(length)

    while True:
        n = str(input(str(length) + "桁の数字を入力してください " + str(trial) + "回目: "))
        if checknum(n, length) == "error length":
            print("エラー:数字は" + str(length) + "桁です")
            continue
        if checknum(n, length) == "error overlap":
            print("エラー:同じ数字は使えません")
            continue

        hit, blow = jugement(n, answer, length)
        if hit == length:
            print("大正解")
            break
        print(str(hit)+"ヒット" + " " + str(blow)+ "ブロー")

        trial += 1
    print("おめでとうございます! 入力回数は", trial, "回でした。")
# ------------------------------------------------------

(以上)