Gacha écrit en python-Implémentation dans la structure de données de base-

Contenu

Conception de données Gacha (Structure de base 1, [Structure de base 2](https://qiita.com/saib-ryo/items/ Mettre en œuvre selon c1b7837fe04022b6864d)).

Amélioration du code source ici

Gacha écrit en Python-Data design-

Liste des informations de réglage

gacha_lottery

id gacha_group item_type times rarity omake_times omake_rarity cost
A_normal_1 A 0 1 0 0 0 10
A_normal_11 A 0 10 0 1 3 100
B_fighter_2 B 0 2 0 0 0 30
A_omake_2_11 A 0 9 2 2 3 200
A_omake_fighter_6 A 2 5 0 1 3 100

Puisqu'il sera positionné comme l'ID utilisé lors de l'exécution du gacha, faites-en un ID de chaîne de caractères concret et facile à comprendre.

gacha_items

id gacha_group weight item_id
1 A 3 5101
2 A 9 4201
3 A 9 4301
4 A 9 4301
5 A 20 3201
6 A 20 3301
7 A 20 3401
8 A 40 2201
9 A 40 2301
10 A 40 2401
11 B 15 4201
12 B 30 3201
13 B 55 2201

items

id rarity item_name item_type HP
5101 5 UR_Courageux 1 1200
4201 4 SSR_guerrier 2 1000
4301 4 SSR_sorcier 3 800
4401 4 SSR_Prêtre 4 800
3201 3 SR_guerrier 2 600
3301 3 SR_sorcier 3 500
3401 3 SR_Prêtre 4 500
2201 2 R_guerrier 2 400
2301 2 R_sorcier 3 300
2401 2 R_Prêtre 4 300
3199 3 SR_Courageux 1 600

rarity

id rarity_name
5 UR
4 SSR
3 SR
2 R
1 N

Point de vue de la rénovation

Exigences fonctionnelles

En tant que mécanisme gacha qui peut être réalisé avec la structure de données de Structure de base 2, les exigences suivantes seront satisfaites.

--Définir plusieurs éléments pour gacha en tant que groupe (population) --Réduction des attributs lors de l'exécution de gacha (item_type)

Modifications de la structure des données

** Informations Gacha ** et ** éléments comme différences majeures par rapport à la structure de données de l'implémentation précédente (Gacha écrit en Python-Data design-) Les informations ** peuvent être isolées. Par conséquent, il est nécessaire de lier les informations.

la mise en oeuvre

gacha.py


import random

def gacha(lots, times: int=1) -> list:
    return random.choices(tuple(lots), weights=lots.values(), k=times)

def get_rarity_name(rarity: int) -> str:
    rarity_names = {5: "UR", 4: "SSR", 3: "SR", 2: "R", 1: "N"}
    return rarity_names[rarity]

#Dictionnaire des identifiants et des paramètres Gacha
def get_gacha_lottery_info(gacha_lottery_id: str) -> dict:
    gacha_lottery = {
        "A_normal_1":  {"gacha_group": "A", "item_type": 0, "times": 1, "rarity": 0, "omake_times": 0, "omake_rarity": 0, "cost":10},
        "A_normal_11":  {"gacha_group": "A", "item_type": 0, "times": 10, "rarity": 0, "omake_times": 1, "omake_rarity": 3, "cost":100},
        "B_fighter_2":  {"gacha_group": "B", "item_type": 0, "times": 2, "rarity": 0, "omake_times": 0, "omake_rarity": 0, "cost":30},
        "A_omake_2_11":  {"gacha_group": "A", "item_type": 0, "times": 9, "rarity": 2, "omake_times": 2, "omake_rarity": 3, "cost":200},
        "A_omake_fighter_6":  {"gacha_group": "A", "item_type": 2, "times": 5, "rarity": 0, "omake_times": 1, "omake_rarity": 3, "cost":100}
    }
    return gacha_lottery[gacha_lottery_id]

def set_gacha(items: dict, gacha_items: dict):
    #Inclure les informations d'élément requises pour les paramètres gacha dans les informations d'élément gacha
    dic_gacha_items = {}
    for gacha_item_id, info in gacha_items.items():
        info["item_info"] = items[info["item_id"]]
        dic_gacha_items[gacha_item_id] = info

    #Extraire la liste des cibles de loterie
    def get_lots(lottery_info: dict):
        lots = {}
        omake_lots = {}
        for id, info in dic_gacha_items.items():
            if lottery_info["gacha_group"] != info["gacha_group"]:
                continue
            if lottery_info["item_type"] and lottery_info["item_type"] != info["item_info"]["item_type"]:
                continue

            if not(lottery_info["rarity"]) or lottery_info["rarity"] <= info["item_info"]["rarity"]:
                lots[id] = info["weight"]

            if lottery_info["omake_times"]:
                if not(lottery_info["omake_rarity"]) or lottery_info["omake_rarity"] <= info["item_info"]["rarity"]:
                    omake_lots[id] = info["weight"]

        return lots, omake_lots

    #Exécution de Gacha
    def exec(gacha_lottery_id: str) -> list:
        lottery_info = get_gacha_lottery_info(gacha_lottery_id)
        lots, omake_lots =get_lots(lottery_info)
        ids = gacha(lots, lottery_info["times"])
        if len(omake_lots) > 0:
            ids.extend(gacha(omake_lots, lottery_info["omake_times"]))
        return ids

    return exec

def main():
    #Informations sur l'élément
    items = {
        5101: {"rarity": 5, "item_name": "UR_Courageux", "item_type": 1, "hp": 1200},
        4201: {"rarity": 4, "item_name": "SSR_guerrier", "item_type": 2, "hp": 1000},
        4301: {"rarity": 4, "item_name": "SSR_sorcier", "item_type": 3, "hp": 800},
        4401: {"rarity": 4, "item_name": "SSR_Prêtre", "item_type": 4, "hp": 800},
        3201: {"rarity": 3, "item_name": "SR_guerrier", "item_type": 2, "hp": 600},
        3301: {"rarity": 3, "item_name": "SR_sorcier", "item_type": 3, "hp": 500},
        3401: {"rarity": 3, "item_name": "SR_Prêtre", "item_type": 4, "hp": 500},
        2201: {"rarity": 2, "item_name": "R_guerrier", "item_type": 2, "hp": 400},
        2301: {"rarity": 2, "item_name": "R_sorcier", "item_type": 3, "hp": 300},
        2401: {"rarity": 2, "item_name": "R_Prêtre", "item_type": 4, "hp": 300},
        3199: {"rarity": 3, "item_name": "SR_Courageux", "item_type": 1, "hp": 600}
    }

    #Informations sur l'article Gacha
    gacha_items = {
        1:  {"gacha_group": "A", "weight": 3, "item_id": 5101},
        2:  {"gacha_group": "A", "weight": 9, "item_id": 4201},
        3:  {"gacha_group": "A", "weight": 9, "item_id": 4301},
        4:  {"gacha_group": "A", "weight": 9, "item_id": 4401},
        5:  {"gacha_group": "A", "weight": 20, "item_id": 3201},
        6:  {"gacha_group": "A", "weight": 20, "item_id": 3301},
        7:  {"gacha_group": "A", "weight": 20, "item_id": 3401},
        8:  {"gacha_group": "A", "weight": 40, "item_id": 2201},
        9:  {"gacha_group": "A", "weight": 40, "item_id": 2301},
        10: {"gacha_group": "A", "weight": 40, "item_id": 2401},
        11: {"gacha_group": "B", "weight": 15, "item_id": 4201},
        12: {"gacha_group": "B", "weight": 30, "item_id": 3201},
        13: {"gacha_group": "B", "weight": 55, "item_id": 2201}
    }

    #Gacha taple à réaliser
    gacha_lottery_ids = (
        "A_normal_1","A_normal_11","B_fighter_2","A_omake_2_11","A_omake_fighter_6"
    )

    #Définir les éléments, etc.
    func_gacha = set_gacha(items, gacha_items)

    # gacha_lottery_Exécuter gacha en définissant l'id
    for gacha_lottery_id in gacha_lottery_ids:
        print("==%s==" % gacha_lottery_id)
        ids = func_gacha(gacha_lottery_id)
        for id in ids:
            item_info = items[gacha_items[id]["item_id"]]
            print("ID:%d, %s, %s" % (id, get_rarity_name(item_info["rarity"]), item_info["item_name"]))


if __name__ == '__main__':
    main()

Résultat d'exécution

Exécutez gacha pour l'ID de ** gacha_lottery ** et vérifiez le comportement

==A_normal_1==
ID:10, R, R_Prêtre
==A_normal_11==
ID:8, R, R_guerrier
ID:10, R, R_Prêtre
ID:10, R, R_Prêtre
ID:6, SR, SR_sorcier
ID:5, SR, SR_guerrier
ID:8, R, R_guerrier
ID:5, SR, SR_guerrier
ID:8, R, R_guerrier
ID:10, R, R_Prêtre
ID:5, SR, SR_guerrier
ID:7, SR, SR_Prêtre
==B_fighter_2==
ID:13, R, R_guerrier
ID:13, R, R_guerrier
==A_omake_2_11==
ID:7, SR, SR_Prêtre
ID:10, R, R_Prêtre
ID:10, R, R_Prêtre
ID:6, SR, SR_sorcier
ID:8, R, R_guerrier
ID:7, SR, SR_Prêtre
ID:9, R, R_sorcier
ID:9, R, R_sorcier
ID:6, SR, SR_sorcier
ID:4, SSR, SSR_Prêtre
ID:1, UR, UR_Courageux
==A_omake_fighter_6==
ID:8, R, R_guerrier
ID:5, SR, SR_guerrier
ID:5, SR, SR_guerrier
ID:8, R, R_guerrier
ID:5, SR, SR_guerrier
ID:2, SSR, SSR_guerrier

Considération

Les exigences fonctionnelles ont été satisfaites. Il y a des pièces inadéquates en tant que mécanisme pouvant supporter un fonctionnement réel, Tout d'abord, cette configuration est la forme de base. À l'avenir, afin de répondre aux ** exigences fonctionnelles requises pour le fonctionnement **, nous modifierons la structure des données, comme l'ajout de nouvelles informations et la réorganisation des informations, et modifierons l'implémentation en conséquence.

Dans cette implémentation, nous n'avons introduit aucune difficulté technique. En termes simples, il s'agit simplement de ** revoir la structure des données et de modifier l'implémentation *. Sur le site de développement proprement dit, le concepteur de services est invité à revoir la composition du texte et à réécrire l'histoire ** afin d'exprimer le ** brouillon ** du planificateur (exigences fonctionnelles) ** scénariste ** Une telle capacité est requise. ( C'est important, mais il y a une réalité qui n'est pas comprise *)

Postscript

Étant donné que la quantité d'informations (maître) augmentera et que le gacha sera effectué en tenant compte de l'état de l'utilisateur, nous l'implémenterons en utilisant DB à partir de la prochaine fois.

Recommended Posts

Gacha écrit en python-Implémentation dans la structure de données de base-
Gacha écrit en python-Practice 1-
Gacha écrit en Python-Data design-
Gacha écrit en Python -BOX Gacha-
Logique gacha simple écrite en Python
Gacha écrit en python-Rareté confirmée avec bonus-
Gacha écrit en python-Practice 2 ・ Bases du step-up gacha-
Gacha écrit en python-Practice 3 ・ Ajout de fonctions gacha step-up-
Gacha écrit en python - Ajout d'une fonction de réglage de période -
Opérations de base sur les blocs de données écrites par des débutants au cours d'une semaine d'apprentissage de Python
Tri de base en Python
Échantillonnage dans des données déséquilibrées
Structure de type langage C en Python
[Tutoriel Python] Structure des données