LoginSignup
0
0

More than 5 years have passed since last update.

$GREEDを作ってみた

Last updated at Posted at 2018-12-26

作ってみてどうだった?

別に難しいことはしておらず、むしろ単純なほどだったのですがバグ潰しが大変でした。
今までのコーディング経験の中で、…一番簡単だったと思います。まぁそもそも完成させたものが少ないので。

$GREEDのルールについてはプログラムと関係ないので、割愛します。

コード

import random

def game_set():
    number_of_player = ""

    while not isinstance(number_of_player,int):
        i = input("プレイヤー数:")
        if len(i)==0:
            continue
        if len(set(tuple(i)) - {"0","1","2","3","4","5","6","7","8","9"}):
            print("数字を入力してください。")           
        else:
            number_of_player = int(i)

    player_names = []
    for i in range(number_of_player):
        n = input("PL" + str(i+1) + "のプレイヤー名:")
        if n == "":
            n = "PL" + str(i+1)
        player_names.append(n)

    player_point_dates = {name:0 for name in player_names}
    return player_names,player_point_dates

def roll(number_of_dice):
    return [random.randint(1,6) for i in range(number_of_dice)]

def search_role(rolled_dice):
    #role (six of a kind,$GREeD,DDDD,$$$,GGG,RRR,EEE,eee,D,G)
    roles = [0,0,0,0,0,0,0,0,0,0]
    roll=[0,0,0,0,0,0]
    for i in rolled_dice:
        roll[i-1] += 1

    if len(set(rolled_dice)) == 1 and len(rolled_dice) == 6:
        roles[0] += 1
    elif len(set(rolled_dice)) == 6:
        roles[1] += 1
    else:
        roles[4] = roll[1]//3
        roles[9] = roll[1]%3
        roles[2] = roll[5]//4
        roles[8] = roll[5]%4
        roles[3] = roll[0]//3
        roles[5] = roll[2]//3
        roles[6] = roll[3]//3
        roles[7] = roll[4]//3
    role = sum(roles)
    return role,roles

def one_round(PL="",point = 0):
    #six of a kind
    #$GREeD

    #DDDD #$$$ #GGG #RRR #EEE #eee #D #G
    PL = PL + ":"

    name_of_role = ("six of a kind","$GREeD","DDDD","$$$","GGG","RRR","EEE","eee","D","G")
    dice_of_role = (6,6,4,3,3,3,3,3,1,1)
    point_of_role = (5000,1000,1000,600,500,400,300,300,100,50)

    dice = 6
    conv = {1:"$",2:"G",3:"R",4:"E",5:"e",6:"D"}
    vnoc = {"$":1,"G":2,"R":3,"E":4,"e":5,"D":6}
    while True:
        dice_roll = roll(dice)
        print(PL," ".join([conv[i] for i in dice_roll]))
        role,roles = search_role(dice_roll)

        if not role:#Break?
            print(PL,"GREED OUT")
            print(PL,"0")
            print(PL,"break!")
            input("=====oh!=====")
            break


        if dice == sum([i1 * i2 for i1,i2 in zip(dice_of_role,roles)]):#all?
            print(PL,"role:"," ".join([" ".join([i2]*i1) for i1,i2 in zip(roles,name_of_role)]))
            print(PL,"again!")
            point += sum([i1 * i2 for i1,i2 in zip(point_of_role,roles)])
            input(PL + " total: " + str(point)+"pt")
            print("=====")
            continue


        get = input(PL + " get:")
        if get == "all":
            point += sum([i1 * i2 for i1,i2 in zip(point_of_role,roles)])
            dice -= sum([i1 * i2 for i1,i2 in zip(dice_of_role,roles)])
            input(PL + " total: " + str(point)+"pt")
            print("=====")
        else:
            get = [vnoc[i] for i in get if i in ("$","G","R","E","e","D")][:7]
            get_ = []
            for i in get:
                if i in dice_roll:
                    dice_roll.remove(i)
                    get_.append(i)
            role,roles = search_role(get_)
            if role:
                point += sum([i1 * i2 for i1,i2 in zip(point_of_role,roles)])
                dice -= sum([i1 * i2 for i1,i2 in zip(dice_of_role,roles)])
            input(PL + " total:" + str(point)+"pt")
            print("=====")


        while True:
            again = input(str(PL) + " roll dice again?(y/n):")
            if again in ["y","n"]:
                break
            else:
                print(PL,"write \"n\" or \"y\".")
        print("-----")
        if again == "n":
            break

    return point

def main():
    PLname,PLpoint = game_set()
    BREAK = None
    while True:
        for i in PLname:
            if i == BREAK:
                return PLname,PLpoint
            PLpoint[i] = one_round(i,PLpoint[i])

            print("==== player points ====")
            print(" ".join([":".join([str(i) for i in i]) for i in tuple(PLpoint.items())]))
            print("=======================")

            BREAK = ([i for i in tuple(PLpoint.keys()) if PLpoint[i] > 5000]+[None])[0]
    return PLpoint
main()

main()関数は何のため?

自分でもわかりません…

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0