рдкрд╛рдпрдерди рдореЗрдВ рдЖрдиреБрд╡рд╛рдВрд╢рд┐рдХреА / рд╡рд┐рдХрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдЦреЗрд▓ рдлрд╛рд░рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рдЪреБрдирдирд╛

рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдЧреЗрдо рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрдкрдХрд░рдг рдХреИрд╕реЗ рдЪреБрдиреЗрдВ? рдмреЗрд╢рдХ, рдЖрдк рдЕрдкрдиреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдпреЛрдЬрдиреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Warcraft рдХреА рджреБрдирд┐рдпрд╛ рд╕реЗ рдбрд╛рдХреВ рдХреЗ рд▓рд┐рдП) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЬрд╛рджреВ рдпрд╛ рдорд╢реАрди рдХреА рд╕реАрдЦ рдХреЗред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рди рдХрд┐ "рд╣реЗрдб рдСрди", рдмрд▓реНрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдпреЛрдЬрди рдкрд░ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдП рдмрд┐рдирд╛, рдЬреЗрдиреЗрдЯрд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рдорджрдж рд╕реЗ? рдпрд╣ рдЬрд╛рдирдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдбрд╛рдХреВ рдирд╕реНрд▓ рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ? рдЬрд╛рдУред

рдЫрд╡рд┐

рдпрд╣ рд▓реЗрдЦ рдкрд┐рдЫрд▓реЗ рд╡рд┐рд╖рдп рдХрд╛ рдПрдХ рдЧрд╣рд░рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ , рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЪрд░рд┐рддреНрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╡рд┐рд╡рд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рдЙрджреНрджреЗрд╢реНрдп: рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреИрд╕реЗ рдЕрдкрдиреЗ рджрдо рдкрд░ рдЧреЗрдо рдПрдЬреЗрдВрдЯреЛрдВ рдХреА рдПрдХ рдЖрднрд╛рд╕реА рдЖрдмрд╛рджреА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдзрдХреНрдХрд╛ рджреЗрдВ, рдПрдХ рд╕рд░рд▓ рдЖрдиреБрд╡рдВрд╢рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо (рдореНрдпреВрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде) рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдФрд░ HTML, CSS рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рд╕рдм рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред

рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП:

1. рдкрд╛рдпрдерди 3 + matplotlib рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ ; IDE (рдореЗрд░реЗ рдкрд╛рд╕ Pyharm рд╣реИ);
2. рдпрджрд┐ рдЖрдк рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд░рд┐рдкреЛрд░реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ HTML, рд╕реАрдПрд╕рдПрд╕, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ (jQuery) рдХреА рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рд╕рдордЭред

рдЪрд░рдг 1 - рдПрдХ рд▓рдХреНрд╖реНрдп рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ, рдУрдУрдкреА рд╕реЗ рдирд┐рдкрдЯреЗрдВ


рддреЛ, рд╣рдорд╛рд░реЗ рдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЕрдВрддрд┐рдо рд▓рдХреНрд╖реНрдп рдЖрдиреБрд╡рд╛рдВрд╢рд┐рдХреА / рд╡рд┐рдХрд╛рд╕ / рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЪрдпрди рдХреЗ рдЕрдиреБрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдВрдЧрдарди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ ред рдФрд░ рдЗрд╕ рдкрде рдХреЛ рдиреЗрддреНрд░рд╣реАрди рд░реВрдк рд╕реЗ рдЯреНрд░реЗрд╕ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рд╣рдо рдЕрдкрдиреЗ рд▓рдХреНрд╖реНрдп рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ:

  1. рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реНрддрд░ рдкрд░ рдЖрдиреБрд╡рд╛рдВрд╢рд┐рдХ рддрдВрддреНрд░ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдФрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЛрдЪрдиреЗ рдХреЗ рд▓рд┐рдП (рдбрд╛рдХреВ рдХреЗ "рдЬреАрди" рдХреЛ рд╕реАрдзреЗ рдЙрдкрдХрд░рдг рдХреА рдкрд╕рдВрдж рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП)
  2. рд╡рдВрд╢рд╛рдиреБрдХреНрд░рдо рдХреЗ рдЬрдиреНрдо рдХреЗ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛, рдЙрдирдХреЗ рд▓рд┐рдП рдЬреАрди рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг, рд╕рд╛рде рд╣реА рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рдореВрд▓реА рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди, рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓рддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕рд░реНрд╡реЛрддреНрддрдо рдЦреЛрдЬрдиреЗ рдХреА рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред
  3. рдЖрдиреБрд╡рд╛рдВрд╢рд┐рдХ "рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛" рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреАрди рдХрд╛ рдЪрдпрди (рдЕрдкрдиреЗ рд╡рд╛рд╣рдХ рдХреЛ рдПрдХ рд╕рд╛рде рдзрдХреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рддрд╛рдХрд┐ рдЯрдХреНрдХрд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо "рдмреБрд░реЗ" рдЬреАрди рдХреЛ рдЙрдЦрд╛рдбрд╝ рдлреЗрдВрдХреЗ рдФрд░ "рдЕрдЪреНрдЫреЗ" рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрдард╛ рд▓реЗ)
  4. рдПрдХ рд╕реБрд╕рдВрдЧрдд рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рд╕рдм рдХреБрдЫ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд▓реБрдЯреЗрд░реЗ рдЖрджрд░реНрд╢ рд╕реЗрдирд╛рдирд┐рдпреЛрдВ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ
  5. рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдирд╛ рдФрд░ рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рддрд╛рдХрд┐ рдкреНрд░рд╢рдВрд╕рд╛ рдХрд░рдирд╛ рдХреБрдЫ рд╣реЛ (рдЕрдиреНрдпрдерд╛ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ!)
  6. рдЗрди рдЧрддрд┐рд╡рд┐рдзрд┐рдпреЛрдВ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░реЗрдВ

рдпрд╣рд╛рдВ OOP рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛, рд╣рдо 4 рдореВрд▓рднреВрдд рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдПрдВрдЧреЗ:

рдЫрд╡рд┐

рдЪрд░рдг 2 - рдкреНрд░рдЬрдирди рдХреЗ рд▓рд┐рдП рджреБрд╖реНрдЯ рд╡рд░реНрдЧ рдХреЛ рддреЗрдЬ рдХрд░рдирд╛


рдХрд┐рдирд╛рд░реЗ рдкрд░ рд╢рд░реНрддреЛрдВ рдкрд░ рд╕рд╣рдордд рд╣реЛрдВ


рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ "рдЬреАрди" (рдХреЛрдб - рдЬреАрди ) рдФрд░ "рдЬреАрдиреЛрдЯрд╛рдЗрдк" (рдХреЛрдб - рдЬреАрдиреЛрдЯрд╛рдЗрдк ) рд╢рдмреНрджреЛрдВ рдХреЗ рд╕рд╛рде рднрд╛рдЧ рд▓реВрдВрдЧрд╛ ред рдЗрд╕рдореЗрдВ "рдореНрдпреВрдЯреЗрд╢рди" (рдХреЛрдб - рдореНрдпреВрдЯ , рдореНрдпреВрдЯреЗрд╢рди ) рднреА рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рдЙрдирдХреЗ рдЕрд░реНрде рдХреЗ рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдЬреАрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░рдЬрдирди рдХреЗрд╡рд▓ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд╡рдВрд╢рдЬ "рдирд╡реЛрджрд┐рдд" рджреНрд╡рд╛рд░рд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдХреЛрдИ рдХреНрд░реЙрд╕рд┐рдВрдЧ рдУрд╡рд░ рдФрд░ рдЕрдиреНрдп рд╕рдорд╛рди рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рдирд╣реАрдВ рд╣реЛрдЧреАред рдбрд╛рдХреВ рдХрд╛ рдЬреАрдиреЛрдЯрд╛рдЗрдк 7 рдирдВрдмрд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬреЛ рдЙрд╕рдХреЗ рдЬреАрди рд╣реИрдВ:

рдЫрд╡рд┐

рддреЛ, рджреБрд╖реНрдЯ рд╡рд░реНрдЧ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдмрдврд╝ рд░рд╣рд╛ рд╣реИред

1редрдбрд╛рдХреВ рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЬреАрди рдорд┐рд▓рддрд╛ рд╣реИ (рдкрд╣рд▓реЗ рджрд┐рди рд╣реА рдЙрддреНрдкрдиреНрди рд╣реБрдЖ рдерд╛ рдпрд╛ "рдорд╛рддрд╛-рдкрд┐рддрд╛" рд╕реЗ рдпрд╛ рдмрд┐рдирд╛ рдореНрдпреВрдЯреЗрд╢рди рдХреЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдерд╛)ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬреЛ рд╡рд┐рдзрд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рд╣реБрдИ рд╣реИрдВ , рдЙрдирдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ : mutate_genes , mutate_genes , mutate_gene

рдХреЛрдб рдЬреАрди рдмрдирд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ
    #     ():
    def generate_random_genes(self):
        dbg = DBG_rogue_generate_random_genes

        self.my_genes[0] = randrange(0, len(RIGHT_HANDS))    # <--   :
        self.my_genes[1] = randrange(0, len(LEFT_HANDS))     # <--   :
        self.my_genes[2] = randrange(0, len(GLOVES))         # <--  :
        self.my_genes[3] = randrange(0, len(HEADS))          # <--  :
        self.my_genes[4] = randrange(0, len(CHESTS))         # <--  :
        self.my_genes[5] = randrange(0, len(PANTS))          # <--  :
        self.my_genes[6] = randrange(0, len(BOOTS))          # <--  :

        if dbg:  #  :
            print('\nf "generate_random_genes":' + '\n\tgenes generated:\n\t', end='')
            print(self.my_genes)


    #      :
    def mutate_genes(self, parent_genes):
        dbg = DBG_rogue_mutate_genes

        #     :
        self.my_genes = parent_genes.copy()

        #    :
        event_mutation = randint(1, 10)

        #     ,    :
        if event_mutation == 10:
            if dbg:  #  :
                print('\nf "mutate_genes"   :' + '\n\t  \n\told genes: ', end='')
                print(parent_genes)
                print('\tnew genes: ', end='')
                print(self.my_genes)
            return 0

        #    :
        else:
            #  ""  =  ,   :
            mutation_volume = randint(0, 30)
            mutation_iters = 1
            if 22 <= mutation_volume <= 28:
                mutation_iters = 2
            elif 29 <= mutation_volume <= 30:
                mutation_iters = 3

            if dbg:  #  :
                print('\nf "mutate_genes" :' + '\n\t : ' + str(mutation_iters))

            #  ,   :
            genes_available = [0, 1, 2, 3, 4, 5, 6]

            #   :
            genes_mutated = []

            current_iter = 0
            while current_iter < mutation_iters:
                if dbg:  #  :
                    print('\tw1')

                #     :
                gene_with_forced_mutation = choice(genes_available)

                #      :
                if gene_with_forced_mutation not in genes_mutated:
                    self.mutate_gene(gene_with_forced_mutation)
                    genes_mutated.append(gene_with_forced_mutation)
                    current_iter += 1
                    if dbg:  #  :
                        print('\tcurrent_iter =', current_iter)
                else:
                    if dbg:  #  :
                        print('\telse, because ' + str(gene_with_forced_mutation) + ' already in genes_mutated')

        if dbg:  #  :
            genes_mutated_str = ''
            if len(genes_mutated) > 1:
                for x in genes_mutated:
                    genes_mutated_str += str(x) + ', '
            else:
                genes_mutated_str = str(genes_mutated[0])
            print('\nf "mutate_genes" :' + '\n\told genes: ', end='')
            print(parent_genes)
            print('\tgenes_mutated: ' + genes_mutated_str)
            print('\tnew genes: ', end='')
            print(self.my_genes)


    #     ,      :
    def mutate_gene(self, gene_id):
        dbg = DBG_rogue_mutate_gene

        current_value = self.my_genes[gene_id]
        new_value = current_value

        if dbg:  #  :
            print('\nf "mutate_gene":' + '\n\tgene_id: ' + str(gene_id) + '\n\told gene value: ' + str(current_value))

        tries = 0
        while new_value == current_value:
            if dbg and tries > 0:  #  :
                print('\tw2, because ' + str(new_value) + ' = ' + str(current_value) )
            new_value = randrange(0, len(LINKS_TO_EQUIP_DICTS[gene_id]))
            self.my_genes[gene_id] = new_value
            tries += 1

        if dbg:  #  :
            print('\tnew gene value: ' + str(new_value) + '\n\ttries: ' + str(tries))


2. рдЬреАрди (рдЬреАрдиреЛрдЯрд╛рдЗрдк) рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдЧрд┐рдпрд░ рд▓реБрдЯреЗрд░рд╛ рдкрд╣рдирддреЗ рд╣реИрдВ (рддреБрд░рдВрдд рдЬрдиреНрдо рдХреЗ рдЖрд░рдореНрднрд┐рдХ рд╡рд╕реНрддреБ рдкрд░)ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, apply_genes рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ :

apply_genes
    # ""  ()     :
    def apply_genes(self):
        dbg = DBG_rogue_apply_genes

        pointer = 0
        for item_id in self.my_genes:
            self.wear_item(pointer, item_id, LINKS_TO_EQUIP_DICTS[pointer])
            pointer += 1

        if dbg:  #  :
            print('\nf "apply_genes":' + '\n\t.')
            print(self)


3. рдЙрдкрдХрд░рдг рдбрд╛рдХреВ рдХреЗ "рд░реЗрдЯрд┐рдВрдЧ" рдХреЗ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧрдгрдирд╛_ рд╡рд┐рдзрд┐ рдХреЛ рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ , рдЬреЛ рдХреНрд╖рддрд┐ рдХреА рдЧрдгрд┐рддреАрдп рдЕрдкреЗрдХреНрд╖рд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ:

calculate_rate
    #     :
    def calculate_rate(self):
        dbg = DBG_rogue_calculate_rate

        #   :
        p_hit = self.stat_hit / 100

        #      :
        p_glancing = self.stat_glancing_percent / 100
        not_p_glancing = 1 - self.stat_glancing_percent / 100

        #      :
        p_crit = self.stat_crit / 100
        not_p_crit = 1 - self.stat_crit / 100

        #   :
        expectation_modificator = p_hit * (p_glancing * 0.7 + not_p_glancing * (p_crit * 2 + not_p_crit))

        #      :
        expectation_damage = expectation_modificator * self.stat_attackpower
        expectation_damage = round(expectation_damage, 3)

        if dbg:
            print('\t  =', expectation_modificator)
            print('\t  =', expectation_damage)

        return expectation_damage


4. рдбрд╛рдХреВ рдХреА рд░реЗрдЯрд┐рдВрдЧ рдкреНрд░рдЬрдирди рдпрд╛ рд╢рд░реНрдордирд╛рдХ рдореМрдд рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рдгреА рдХрд╛рд░рдХ рд╣реЛрдЧреАред рдЗрд╕рдХреЗ рд▓рд┐рдП, "рдЬреАрдд" ( embody_win рдкрджреНрдзрддрд┐ ) рдФрд░ "рд╣рд╛рд░" ( embody_defeat рдкрджреНрдзрддрд┐ ) рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

embody_win рдФрд░ embody_defeat
    #    :
    def embody_win(self):
        dbg = DBG_rogue_embody_win

        self.my_wins += 1
        stats.genes_add_win(self.my_genes)

        #    :
        if self.my_wins % population.wins_to_reproduce == 0:

            #    :
            total_borns = choice(population.possible_birth_quantities)
            if dbg:
                print('  ' + str(total_borns))

            for x in range(0, total_borns):
                if dbg:
                    print(self.name + '  ...')

                #  -:
                new_rogue = Rogue(self.my_genes, self.my_generation, from_parent=True)
                ROGUES_LIST.append(new_rogue)

            Population.day_of_last_changes = current_day

        #         :
        if self.my_wins > Population.record_max_wins:
            Population.record_max_wins = self.my_wins
            Population.max_winner_name = self.name
            Population.max_winner_genes = self.my_genes


    #    :
    def embody_defeat(self):
        dbg = DBG_rogue_embody_defeat

        self.my_defeats += 1

        #    :
        if self.my_defeats == population.defeats_to_die:
            self.alive = False
            Population.how_many_rogues_alive -= 1
            Population.day_of_last_changes = current_day

            if dbg:
                print(self.name + ' ...')


рдЦреИрд░, рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ "рдЬреАрди - рдЙрдкрдХрд░рдг - рд░реЗрдЯрд┐рдВрдЧ" рдХрд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирдпрд╛ рд░реВрдк рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рджреБрд╖реНрдЯ рд╡рд░реНрдЧ рдирд┐рд░реНрдорд╛рддрд╛
    def __init__(self, genes_list_inherited, parent_generation, from_parent=True, genes_can_mutate=True):

        #    ,    id  :
        # 0 -  , 1 -  , 2 - , 3 - , 4 - , 5 - , 6 - 
        self.equipment_slots = [0] * 7

        #    ,      :
        self.equipment_names = [''] * 7

        #    ( -     ):
        self.basic_stat_agility = 50
        self.basic_stat_power = 40
        self.basic_stat_hit = 80
        self.basic_stat_crit = 20
        self.basic_stat_mastery = 0

        #     :
        self.set_stats_without_equip()

        #  :
        Population.how_many_rogues += 1
        Population.how_many_rogues_alive += 1

        #  :
        self.my_generation = parent_generation + 1
        if self.my_generation > Population.generations:
            Population.generations = self.my_generation

        # "" :
        self.name = '"' + str(Population.how_many_rogues) + '-,   ' + str(parent_generation + 1) + '"'

        #  :
        self.alive = True

        #    :
        self.my_wins = 0
        self.my_defeats = 0

        #   :
        self.my_genes = [0] * 7

        if genes_can_mutate:
            #      ,     :
            if from_parent:
                self.mutate_genes(genes_list_inherited)
            else:
                self.generate_random_genes()
        else:
            self.my_genes = genes_list_inherited

        #     :
        stats.genes_add_presence(self.my_genes, self.my_generation)

        #     :
        self.apply_genes()


рдПрдХ рддрд╕реНрд╡реАрд░ рдХреЗ рд╕рд╛рде рдЗрд╕ рд╡рд░реНрдЧ рддрд░реНрдХ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

рдЫрд╡рд┐

рдЪрд░рдг 3 - рдЬрдирд╕рдВрдЦреНрдпрд╛, рдЖрдБрдХрдбрд╝реЗ рдФрд░ рдЪреБрдиреМрддреА рд╡рд░реНрдЧ


рдЬрдирд╕рдВрдЦреНрдпрд╛ рд╡рд░реНрдЧ рдХреЛ рдХреЗрд╡рд▓ рддреАрди рдЪреАрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  1. рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЬреАрдиреЛрдВ рдФрд░ рдЬреИрд╡рд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд▓реБрдЯреЗрд░реЛрдВ рдХреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдПрдХ рдЖрдмрд╛рджреА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдЬреЛ рд╣рдореЗрд╢рд╛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧрд╛ ( win_to_reproduce - рдПрдХ рд▓реБрдЯреЗрд░рд╛ рдХреЛ рдкреНрд░рдЬрдирди рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреА рдЬреАрдд рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдкрд░рд╛рдЬрдп_to_die - рдХрд┐рддрдиреЗ рдкрд░рд╛рдЬрдп рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдорд░рдирд╛ рд╣реЛрдЧрд╛);
  2. рдЖрдмрд╛рджреА рдХрд╛ "рд░реАрд╕реЗрдЯ", рдЕрд░реНрдерд╛рдд рдЬрдм рд╡рд░реНрддрдорд╛рди рдЪрд░рдг рдХрд╛ рдЕрдВрддрд┐рдо рджрд┐рди рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рднреА рд▓реБрдЯреЗрд░реЗ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдЬреАрдиреЛрдЯрд╛рдЗрдк рд╡рд╛рд▓реЗ рд▓реБрдЯреЗрд░реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ ( рдкреБрдирдГ рд▓реЛрдб рджреЗрдЦреЗрдВ );
  3. рдЖрдБрдХрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬрдирд╕рдВрдЦреНрдпрд╛ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ред

рд╡рд░реНрдЧ рдХреА рдЖрдмрд╛рджреА
class Population():
    """     ."""

    how_many_rogues = 0 # <--   
    how_many_rogues_alive = 0 # <--   
    how_many_battles = 0 # <--  
    how_many_ties = 0 # <--  
    generations = 0 # <--  
    day_of_last_changes = 0  # <--       
    max_days_without_changes = 0  # <--    

    #        ,      :
    record_max_wins = 0
    max_winner_name = 'none'
    max_winner_genes = 'none'


    #       :
    def __init__(self, total, possible_birth_quantities, wins_to_reproduce, defeats_to_die):

        #   :
        self.initial_size = total

        #   ,        :
        self.wins_to_reproduce = wins_to_reproduce
        self.defeats_to_die = defeats_to_die
        self.possible_birth_quantities = possible_birth_quantities

        while total > 0:

            #   ,  " "    ,     :
            new_rogue = Rogue('', 0, from_parent=False)

            #   :
            ROGUES_LIST.append(new_rogue)

            total -= 1


    #     :
    def __str__(self):
        text = ':\n'
        text += ': ' + str(Population.generations) + '\n'
        text += ' : ' + str(Population.how_many_rogues) + '\n'
        text += ' : ' + str(Population.how_many_rogues_alive) + '\n'
        text += ' : ' + str(Population.record_max_wins) + '\n'
        text += ' : ' + str(Population.max_winner_name) + '\n'
        text += ' : ' + str(Population.max_winner_genes) + '\n'
        return text


    #  ,    how_many_to_save     :
    def reload(self, how_many_to_save):

        #  - :
        Population.how_many_rogues_alive = 0

        # ""   :
        for x in ROGUES_LIST:
            x.alive = False

        #        :
        list_genotypes_top = stats.get_ordered_list_from_dict(LIST_FOR_DICTS_GENOTYPES[current_stage], inner_index=2)

        #      :
        for x in range(0, how_many_to_save):

            #      :
            genotype_in_str = list_genotypes_top[x][0]
            genotype_in_list = []
            for char in genotype_in_str:
                if char != '-':
                    genotype_in_list.append( int(char) )

            #   ,      ,     :
            new_rogue = Rogue(genotype_in_list, 0, from_parent=True, genes_can_mutate=False)

            #   :
            ROGUES_LIST.append(new_rogue)


рдЖрдБрдХрдбрд╝реЗ рд╡рд░реНрдЧ рджреЛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:

  1. рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рджрд┐рди рдХреЗ рд╕рдВрдХреЗрддрдХ: рдЬреАрд╡рд┐рдд рд▓реБрдЯреЗрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдЕрджреНрд╡рд┐рддреАрдп рдЬреАрдиреЛрдЯрд╛рдЗрдк рдХреА рд╕рдВрдЦреНрдпрд╛, рдЖрджрд┐)
  2. ( matplotlib, HTML-, ).

рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдореИрдВ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд░рд┐рдкреЛрд░реНрдЯ рдХреИрд╕реА рджрд┐рдЦреЗрдЧреА:

рдЫрд╡рд┐

рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд▓рд┐рдП HTML рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛрдб рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

рд╕реНрдЯреИрдЯреНрд╕ рдХреНрд▓рд╛рд╕ рдХреЛ рдЧрд┐рддреБрдм рдкрд░ рднреА рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЕрдиреНрдпрдерд╛ рдпрд╣ рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╕рд╛рд░реА рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЪреЛрдЯ рдкрд╣реБрдВрдЪрд╛рдПрдЧрд╛)ред рдЪреИрд▓реЗрдВрдЬрд░

рд╡рд░реНрдЧ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдЪрдпрдирд┐рдд рд▓реБрдЯреЗрд░реЛрдВ рдХреЗ рдмреАрдЪ рдЯрдХрд░рд╛рд╡ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рд╣рд░ рджрд┐рди, рд╡рд┐рдзрд┐ рдХреЛ perform_battles рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ , рдЬреЛ рдЬреАрд╡рд┐рдд рд▓реБрдЯреЗрд░реЛрдВ рд╕реЗ рдмрдирддреА рд╣реИ , рдЬреЛ рдЬреЛрдбрд╝реЗ рдХреЛ рджреНрд╡рдВрджреНрд╡рдпреБрджреНрдз рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ method perform_battle рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ , рдФрд░ рдЕрдВрддрддрдГ рд╣рд░ рдбрд╛рдХреВ рдХреЗ рд▓рд┐рдП рдпрд╛ рддреЛ рд╡рд┐рдзрд┐ embody_win , рдХрд┐рд╕реА рднреА рд╡рд┐рдзрд┐ embody_ffeat рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдЕрдЧрд░ рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдбреНрд░реЙ рд╣реБрдЖ рд╣реИ (рдЬреАрдиреЛрдЯрд╛рдЗрдк, рдФрд░ рдЗрд╕рд▓рд┐рдП рд▓реБрдЯреЗрд░реЛрдВ рдХреА рд░реЗрдЯрд┐рдВрдЧ рд╕рдорд╛рди рд╣реИ), рддреЛ рд╡реЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд┐рдирд╛ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ:

рд╡рд░реНрдЧ рдЪреБрдиреМрддреА рджреЗрдиреЗ рд╡рд╛рд▓рд╛
class Challenger():
    """      ."""

    #   :
    def perform_battles(self):
        dbg = DBG_challenger_perform_battles

        #    :
        rogues_alive = []
        for x in ROGUES_LIST:
            if x.alive:
                rogues_alive.append(x)

        #  :
        shuffle(rogues_alive)

        #       :
        pairs_total = int(len(rogues_alive) // 2)

        if dbg:
            print('pairs_total =', pairs_total)

        #       :
        counter = 0
        pointer = 0
        while counter < pairs_total:
            a_1 = rogues_alive[pointer]
            a_2 = rogues_alive[pointer + 1]
            self.perform_battle(a_1, a_2)
            counter += 1
            pointer += 2


    #     :
    def perform_battle(self, rogue_1, rogue_2):
        dbg = DBG_challenger_perform_battle

        if dbg:
            print('\n  :', rogue_1.name, '', rogue_2.name)

        #     (        ):
        rating_1 = rogue_1.calculate_rate()
        rating_2 = rogue_2.calculate_rate()

        #  :
        Population.how_many_battles += 1

        if dbg:
            print('\t :', rating_1, '', rating_2, '.')

        #      :
        if rating_1 > rating_2:
            rogue_1.embody_win()
            rogue_2.embody_defeat()
        elif rating_1 < rating_2:
            rogue_1.embody_defeat()
            rogue_2.embody_win()
        else:
            Population.how_many_ties += 1
            if dbg:
                print('\t !  !')


рдЦреИрд░, рдЕрдм рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд╢рд░реАрд░ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдХреЛрдб рдХреЗ рд╕рднреА рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рднрд╛рдЧреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЖрддреЗ рд╣реИрдВ рдЬреЛ рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЗ рдкреНрд░рдореБрдЦ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдЪрд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдПрдХ рдЪрд░рдг рдореЗрдВ рджрд┐рди, рдПрдХ рдЖрдмрд╛рджреА рдореЗрдВ рд▓реБрдЯреЗрд░реЛрдВ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрдЦреНрдпрд╛, рдЖрджрд┐ред рдлрд┐рд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рд╣рд╛рдпрдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЖрддрд╛ рд╣реИред рдФрд░ рдЪреБрдиреМрддрд┐рдпрд╛рдВ рдЦреБрдж:

рд╕рд┐рдореБрд▓реЗрд╢рди рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб
# :
MAX_STAGES = 8 # <--      
MAX_DAYS_AT_STAGE = 20 # <--        
SLIDING_FREQUENCY = 10 # <--     HTML-    (1 =   , 10 =   10 )
ROGUES_AT_BEGIN = 10 # <--    (  )
WINS_TO_REPRODUCE = 2 # <--     ,  
DEFEATS_TO_DIE = 2 # <--      
POSSIBLE_BIRTH_QUANTITIES = [1] # <--   ,       , :
# [1, 2] ,   50%-    1,  1 
# [1, 1, 2] ,   66%-   1 

HTML_GSQUARE_SIDE = 10 # <--   ,     
HTML_GSQUARE_MARGIN = 3 # <--   ,     

#     :
LINKS_TO_EQUIP_DICTS = [RIGHT_HANDS, LEFT_HANDS, GLOVES, HEADS, CHESTS, PANTS, BOOTS]

#         (    ):
LIST_FOR_DICTS_GENOTYPES = [{}] * MAX_STAGES

#        :
DICT_UNIQUE_GENOTYPES = {}

#      :
DICT_DAYS = {}

# ,       -  :
ROGUES_LIST = list()

#       (     )
current_stage = 0

#     "" (    /):
DBG_rogue_mutate_genes = False
DBG_rogue_generate_random_genes = False
DBG_rogue_apply_genes = False
DBG_rogue_calculate_rate = False
DBG_rogue_mutate_gene = False
DBG_rogue_embody_win = False
DBG_rogue_embody_defeat = False
DBG_rogue_wear_item = False
DBG_challenger_perform_battles = False
DBG_challenger_perform_battle = False
DBG_days_report = False  # <--     



# :
if __name__ == '__main__':

    #  :
    time_begin = time()

    #        :
    max_days_for_current_stage = 0
    current_day = 1
    while current_stage < MAX_STAGES:

        #    :
        if current_stage == 0:

            #   :
            stats = Stats()

            #          ,      :
            population = Population(ROGUES_AT_BEGIN, POSSIBLE_BIRTH_QUANTITIES, wins_to_reproduce=WINS_TO_REPRODUCE, defeats_to_die=DEFEATS_TO_DIE)

            #     :
            challenger = Challenger()

            # "" :
            print(population)

        #        :
        max_days_for_current_stage += MAX_DAYS_AT_STAGE

        # /      (1  = 1    (*) )
        # * -     -    , -           
        while current_day <= max_days_for_current_stage:
            print('st ' + str(current_stage) + ', day ' + str(current_day))
            if DBG_days_report:
                print('\n\n/DAY', current_day)

            #   :
            challenger.perform_battles()

            if DBG_days_report:
                print('\n', current_day, '.')
                print(population)

            #    :
            stats.add_new_day(current_day)

            #        :
            if current_day - Population.day_of_last_changes > Population.max_days_without_changes:
                Population.max_days_without_changes = current_day - Population.day_of_last_changes

            #    SLIDING_FREQUENCY  (     )     :
            if current_day % SLIDING_FREQUENCY == 0 or current_day == 1 or current_day == MAX_DAYS_AT_STAGE * MAX_STAGES:
                stats.draw_genes_distribution(current_day)

            #    SLIDING_FREQUENCY  (     )     :
            if current_day % SLIDING_FREQUENCY == 0 or current_day == 1 or current_day == MAX_DAYS_AT_STAGE * MAX_STAGES:
                stats.draw_genes_wins(current_day)

            current_day += 1

        #      ,  ,     -  :
        if current_stage < MAX_STAGES - 1:
            population.reload(ROGUES_AT_BEGIN)

        current_stage += 1


    #      ,      LIST_FOR_DICTS_GENOTYPES:
    current_stage -= 1

    #   :
    print('\n:')
    print(DICT_DAYS)

    #       :
    stats.draw_and_put_line_chart_to_file(DICT_DAYS, 1, ' ', '', '', 'charts/chart_population_demography.png')

    #       -  :
    stats.draw_and_put_line_chart_to_file(DICT_DAYS, 0, ' ', '', '', 'charts/chart_population_total.png')

    #      :
    stats.draw_and_put_line_chart_to_file(DICT_DAYS, 2, ' ', '', ' ', 'charts/chart_genotypes_variety.png')

    #      (=   ):
    stats.draw_and_put_line_chart_to_file(DICT_DAYS, 3, ' ', '', '', 'charts/chart_genotypes_ties.png')

    #   HTML   :
    stats.create_index_html()

    #   :
    time_session = time() - time_begin
    duration_info = '  : ' + str(round(time_session, 2)) + ' .'
    print('\n' + duration_info)

else:
    print('__name__ is not "__main__".')


рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдо рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╛рдо "рд░рд┐рдкреЛрд░реНрдЯ 2020-04-25_10-33-54.html" рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд▓реЗрдЦ рдХреЗ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВред

рдЪрд░рдг 4 - рдбреЗрдЯрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ


рдЖрдЧреЗ рдХреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдореИрдВ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдЗрд╕ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛:

evolution_equipment_obvious_strong.py
#       .
#    ,     :
# 0 - , 1 - , 2 - , 3 - , 4 - , 5 - , 6 - 

EQUIPMENT_COLLECTION = 'obvious_strong'

RIGHT_HANDS = dict()
RIGHT_HANDS[1] = (' ', 5000, 0, 0, 0, 0, 0)
RIGHT_HANDS[2] = (' ', 800, 0, 0, 0, 0, 0)
RIGHT_HANDS[3] = (' ', 20, 0, 0, 0, 0, 0)

LEFT_HANDS = dict()
LEFT_HANDS[1] = (' ', 4000, 0, 0, 0, 0, 0)
LEFT_HANDS[2] = (' ', 10, 0, 0, 0, 0, 0)

GLOVES = dict()
GLOVES[1] = (' ', 300, 0, 0, 0, 0, 0)
GLOVES[2] = (' ', 1, 0, 0, 0, 0, 0)

HEADS = dict()
HEADS[1] = (' ', 300, 0, 0, 0, 0, 0)
HEADS[2] = (' ', 1, 0, 0, 0, 0, 0)

CHESTS = dict()
CHESTS[1] = (' ', 300, 0, 0, 0, 0, 0)
CHESTS[2] = (' ', 1, 0, 0, 0, 0, 0)

PANTS = dict()
PANTS[1] = (' ', 300, 0, 0, 0, 0, 0)
PANTS[2] = (' ', 1, 0, 0, 0, 0, 0)

BOOTS = dict()
BOOTS[1] = (' ', 300, 0, 0, 0, 0, 0)
BOOTS[2] = (' ', 1, 0, 0, 0, 0, 0)


рдпрд╣рд╛рдВ 192 рд╕реЗрдЯ (3 * 2 * 2 * 2 * 2 * 2 * 2) рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдпреЛрдЬрди рджрд┐рдП рдЧрдП рд╣реИрдВ ред рддрджрдиреБрд╕рд╛рд░, 192 рд╕рдВрднрд╛рд╡рд┐рдд рдЬреАрдиреЛрдЯрд╛рдЗрдк рд╣реЛрдВрдЧреЗ ред

рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ : рдПрдХ рдЖрдпрддрд╛рдХрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдЬреАрдиреЛрдЯрд╛рдЗрдк рдХреЗ рдкреВрд░реЗ рд╕реНрдерд╛рди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЧ рдПрдХ рдЕрд▓рдЧ рдЬреАрдиреЛрдЯрд╛рдЗрдк рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ 192 рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рджреЛ рдордзреНрдпрдо рд╡рд┐рднрд╛рдЬрдХ рдкрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдпреЗ 16 рдФрд░ 12 рд╣реИрдВ:

рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдердо рдХрд╛ рдХреЛрдб рд╕реНрдЯреИрдЯреНрд╕ рдХреНрд▓рд╛рд╕ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗ рд╣реИ
        #      - :
        list_divisors = list()
        current_number = int(self.genotypes_total // 2)
        while current_number >= 2:
            if self.genotypes_total % current_number == 0:
                list_divisors.append(current_number)
            current_number -= 1
        print('list_divisors:', list_divisors)

        #        :
        somewhere_in_the_middle = len(list_divisors) // 2

        #     :
        side_1 = list_divisors[somewhere_in_the_middle]
        side_2 = self.genotypes_total / side_1

        # ,   ,     ""  :
        self.side_x = int(side_1 if side_1 >= side_2 else side_2)
        self.side_y = int(self.genotypes_total / self.side_x)
        print('side_x =', self.side_x, 'side_y =', self.side_y)


рд╣рдореЗрдВ рдПрдХ 16x12 рдХреНрд╖реЗрддреНрд░ рдорд┐рд▓рддрд╛ рд╣реИ:

рдЫрд╡рд┐

рдЗрд╕ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдЬреАрдиреЛрдЯрд╛рдЗрдк рдХреА рдПрдХ рд╕реВрдЪреА рддреИрдпрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ:

        #    :
        self.list_of_possible_genotypes = list()

        #      :
        for g1 in RIGHT_HANDS:
            #      :
            for g2 in LEFT_HANDS:
                #   :
                for g3 in GLOVES:
                    #   :
                    for g4 in HEADS:
                        #   :
                        for g5 in CHESTS:
                            #   :
                            for g6 in PANTS:
                                #   :
                                for g7 in BOOTS:
                                    current_genotype = str(g1-1)+'-'+str(g2-1)+'-'+str(g3-1)+'-'+str(g4-1)+'-'+str(g5-1)+'-'+str(g6-1)+'-'+str(g7-1)
                                    self.list_of_possible_genotypes.append(current_genotype)

рдЗрд╕рд▓рд┐рдП, рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╡рд░реНрдЧ рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рдЬреАрдиреЛрдЯрд╛рдЗрдкреНрд╕ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдордЬрдмреВрдд рддрд▓рд╡рд╛рд░ рдЬреАрди" ( рдиреАрд▓рд╛ рдХреЛрдиреЗ) рд╡рд╛рд▓реЗ рдЬреАрдиреЛрдЯрд╛рдЗрдкреНрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдКрдкрд░реА рднрд╛рдЧ рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЗрдирдореЗрдВ "рдордЬрдмреВрдд рдбреИрдЧрд░ рдЬреАрди" рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВред ( рдмреНрд▓реВ рдХреЙрд░реНрдирд░) - рдПрдХ рднреА рдЙрдЪреНрдЪ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдХрдмреНрдЬрд╛:

рдЫрд╡рд┐

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╕рдмрд╕реЗ рдордЬрдмреВрдд рдЬреАрдиреЛрдЯрд╛рдЗрдк ( 0-0-0-0-0-0-0-0-0 ) рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдХрдордЬреЛрд░ ( 2-1-1-1-) 1-1-1 ) - рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЗрдВред рдпрд╣ рд╕реНрдерд┐рддрд┐ рдХреА рдЧрддрд┐рд╢реАрд▓рддрд╛ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЬрд╛рдиреЗрдВрдЧреЗ рдХрд┐ рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЗ рджреМрд░рд╛рди "рдкреНрд░рдореБрдЦ рдЬреАрди рдкреВрд▓" рдХреЛ рдореИрджрд╛рди рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

рдЫрд╡рд┐

рдЕрдм рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдореБрд▓реЗрд╢рди рдЪрд▓рд╛рдПрдВ:

MAX_STAGES = 5
MAX_DAYS_AT_STAGE = 40
SLIDING_FREQUENCY = 1
ROGUES_AT_BEGIN = 8
WINS_TO_REPRODUCE = 2
DEFEATS_TO_DIE = 2
POSSIBLE_BIRTH_QUANTITIES = [1]

HTML_GSQUARE_SIDE = 16
HTML_GSQUARE_MARGIN = 3

рдпрд╣реА рд╣реИ, рд╢реБрд░реБрдЖрдд рдореЗрдВ 8 рдЪреЛрд░, <div> -containers with рдлрд╝реАрд▓реНрдб (рдмрд╛рдж рдореЗрдВ рд╕реНрд▓рд╛рдЗрдб рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд ) рдкреНрд░рддреНрдпреЗрдХ рджрд┐рди, 40 рджрд┐рдиреЛрдВ рдХреЗ 5 рдЪрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, рд╣рдореЗрдВ 200 рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рджреЛ рд╕реЗрдЯ рдорд┐рд▓рддреЗ рд╣реИрдВ: " рдЬреАрдиреЛрдЯрд╛рдЗрдкреНрд╕ рдХрд╛ рдкреНрд░рдЪрд▓рди " (рдиреАрд▓рд╛-рд╣рд░рд╛ рд░рдВрдЧ) рдФрд░ " рдЬреАрдиреЛрдЯрд╛рдЗрдк рдХреА рдЬреАрдд " (рд▓рд╛рд▓ рдФрд░ рд╣рд░реЗ рд░рдВрдЧ)ред рд╡рд░реНрдЧреЛрдВ рдХрд╛ рд░рдВрдЧ рд╕рдВрддреГрдкреНрддрд┐ рдореВрд▓реНрдпреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред

рд╣рдо рдЙрддреНрдкрдиреНрди HTML рд░рд┐рдкреЛрд░реНрдЯ рдЦреЛрд▓рддреЗ рд╣реИрдВ рдФрд░ 1 рдФрд░ 10 рд╡реЗрдВ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЪрд┐рддреНрд░ рджреЗрдЦрддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

рдЗрд╕рд▓рд┐рдП, рдкрд╣рд▓реЗ рджрд┐рди, 8 рд▓реБрдЯреЗрд░реЗ рдЙрддреНрдкрдиреНрди рд╣реБрдП рдереЗ, рдЙрдирдХреЗ рд╡рд░реНрдЧ рдЕрдиреБрдХрд╛рд░ рдХреЗ рдЕрдВрдд рддрдХ рдПрдХ рдЫрд╛рдпрд╛ рдбрд╛рд▓реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рд▓рдбрд╝рдиреЗ рд▓рдЧреЗ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкрд╣рд▓реА рдЬреАрдд рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреНрд░рдЬрдирди рд╣реЛрддрд╛ рд╣реИред рдЙрдЪреНрдЪ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдЬрдирди рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдзрд┐рдХ рд░рдВрдЧреАрди рд╡рд░реНрдЧ рд╣реИрдВред

рдЕрдЧрд▓реЗ рджрд┐рдиреЛрдВ рдореЗрдВ рджреЗрдЦ рд▓реЗрдВред 44 рд╡реЗрдВ рджрд┐рди, рдЬреАрдиреЛрдЯрд╛рдЗрдк " 0-0-0-0-0-0-0-0-0 " рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ (рдиреАрд▓реЗ рддреАрд░ рдХреЗ рдкреАрдЫреЗ рджреЗрдЦреЗрдВ)ред 59 рд╡реЗрдВ рджрд┐рди, рд╡рд╣ рдкрд╣рд▓реЗ рд╣реА рдЬреАрдд рдкрд░ рдЖрдЧреЗ рдмрдврд╝рд╛ (рд▓рд╛рд▓ рддреАрд░ рдХреЗ рдкреАрдЫреЗ рджреЗрдЦреЗрдВ)ред

рдЫрд╡рд┐

137 рд╡реЗрдВ рджрд┐рди, рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ " 0-0-0-0-0-0-0-0-0 " рдЖрдмрд╛рджреА рдореЗрдВ рджрд┐рдЦрд╛рд╡реЗ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдиреАрд▓реЗ рддреАрд░ рдХреЗ рдкреАрдЫреЗ рджреЗрдЦреЗрдВ) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдиреЗрддрд╛ рдмрди рдЧрдпрд╛ рд╣реИред рдФрд░ рдЖрдЦрд┐рд░реА рджрд┐рди рдХреА рд╕реНрд▓рд╛рдЗрдб рдореЗрдВ рдЙрдирдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реБрдирд╣рд░рд╛ рд╕рд╛рдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЬреАрдд рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкрд╣рд▓рд╛ рд╕реНрдерд╛рди рд╣рд╛рд╕рд┐рд▓ рдХрд┐рдпрд╛ рдерд╛ред

рдЫрд╡рд┐

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЪрдпрди рдЖрдмрд╛рджреА рдХреЗ "рдЬреАрди рдкреВрд▓" рдХреЛ рдмрд╛рдпреАрдВ рдФрд░ рдКрдкрд░ рддрдХ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдордЬрдмреВрдд рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдУрд░ред " рдирд┐рдЪрд▓реЗ-рджрд╛рдПрдВ " рдЬреАрдиреЛрдЯрд╛рдЗрдк " рдКрдкрд░реА рдмрд╛рдПрдВ " рд╡рд╛рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдордЬреЛрд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЬреИрд╕реЗ рд╣реА рд╡реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ (рд▓рд╛рд▓ рдХреЛрдИ рдЬреАрдд рдирд╣реАрдВ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ) рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВредрдпрд╣ рдмреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИрдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░:

рдЫрд╡рд┐

рдареАрдХ рд╣реИ, рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдлреИрд╕рд▓рд╛ рд╕рд╣реА рд╣реИ: рдЬреАрддрдиреЗ рд╡рд╛рд▓рд╛ рдЬреАрдиреЛрдЯрд╛рдЗрдк 0-0-0-0-0-0-0-0-0 рд╣реИ : рдореИрдЯрдкреНрд▓реЛрдЯрд▓рд┐рдм рдХреЗ

рдЫрд╡рд┐

рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдЧреНрд░рд╛рдл рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЗрд╕рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛:

1. " рд▓рд╛рдЗрд╡ рдЬрдирд╕рдВрдЦреНрдпрд╛ " рдЧреНрд░рд╛рдл рдбрд╛рдпрдирд╛рдорд┐рдХреНрд╕ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдПрдХ рд╕рд╛рде рд░рд╣рдиреЗ рд╡рд╛рд▓реЗ рд▓реБрдЯреЗрд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди;
2. " рд╕рднреА рдХрд╛ рдЬрдиреНрдо " рдХрд╛ рдЧреНрд░рд╛рдл рдЬреНрдпрд╛рджрд╛рддрд░ рдПрдХ рд╕реАрдзреА рд░реЗрдЦрд╛ рдХреЗ рдХрд░реАрдм рд╣реИ, рдпрджрд┐ рдЖрдк рдЬрдирд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ:

рдЫрд╡рд┐

3. " рдЬреАрдиреЛрдЯрд╛рдЗрдкреНрд╕ рдХреА рд╡рд┐рд╡рд┐рдзрддрд╛ " рдХрд╛ рдЧреНрд░рд╛рдл - рдЖрдорддреМрд░ рдкрд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рддреЗрдЬреА рд╕реЗ рд╡рд┐рдХрд╛рд╕ рд╣реЛрддрд╛ рд╣реИ, рдлрд┐рд░ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдзреАрд░реЗ-рдзреАрд░реЗ рдЕрдзрд┐рдХрддрдо рдЖ рд░рд╣рд╛ рд╣реИ;
4. рдЕрдиреБрд╕реВрдЪреА " рдЧрддрд┐рдХреА рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВ"- рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╕рдордп рдХреЗ рд╕рд╛рде рдбреНрд░реЙ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреИрд╕реЗ рдмрджрд▓ рдЬрд╛рддреА рд╣реИ (рдпреЗ рддрдм рд▓рдбрд╝рддреЗ рд╣реИрдВ рдЬрдм рджреЛ рд╕рдорд╛рди рдЬреАрдиреЛрдЯрд╛рдЗрдк рдПрдХ рдирд┐рд░рд░реНрдердХ рд▓рдбрд╝рд╛рдИ рдореЗрдВ рдЯрдХрд░рд╛рддреЗ рд╣реИрдВ):

рдЫрд╡рд┐

рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдПрдХ рд╣реА рдЬреАрдиреЛрдЯрд╛рдЗрдк рд╡рд╛рд▓реЗ рд▓реБрдЯреЗрд░реЗ рдЗрд╕рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ рддреЛ" рдЧрддрд┐рд░реЛрдз "рд╣реЛрддрд╛ рд╣реИ (рдЧреНрд░рд╛рдлрд╝рд┐рдХреНрд╕ рд╢реЛ: рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рддреАрд╡реНрд░ рд╡реГрджреНрдзрд┐ рдЖрдХрд░реНрд╖рд┐рдд, рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ (рдЬрдирд╕рдВрдЦреНрдпрд╛ рдХреА рджреГрд╖реНрдЯрд┐ рд╕реЗ рдФрд░ рдЕрджреНрд╡рд┐рддреАрдп рдЬреАрдиреЛрдЯрд╛рдЗрдк рдХреА рд╕рдВрдЦреНрдпрд╛)

рдЬрдирд╕рдВрдЦреНрдпрд╛ рдХреЗ рдард╣рд░рд╛рд╡ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдард╣рд░рд╛рд╡ рдХреА рдЕрд╡рдзрд┐ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдгрдирд╛ рдФрд░ рдбреНрд░рд╛рдЗрдВрдЧ рд╕реНрд▓рд╛рдЗрдб рд╡реНрдпрд░реНрде рдореЗрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ MAX_DDS_AT_STAGE рд╕реНрдерд┐рд░ рдорд╛рди рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдФрд░ рдпрд╣ рджреЗрдЦрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рднреАрдбрд╝ рдХрдо рд╣реЛ рдЧрдИ рд╣реИ, рдФрд░ рдХреБрдЫ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЧрдИ рд╣реИ:

рдЫрд╡рд┐

рдЪрд░рдг 5 - рдмрдбрд╝реЗ рдЬреАрдиреЛрдЯрд╛рдЗрдк рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░реЗрдВ


рдЕрдм рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдХреНрд░рдорд┐рдХ рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЙрдкрдХрд░рдг_рд░реВрдкреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рдореБрд▓реЗрд╢рди рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ ред рдпрд╣рд╛рдВ, рдорд╛рди POSSIBLE_BIRTH_QUANTITIES = [1, 2] рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ 50% рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдЬрдирди рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде, 1 рдпрд╛ 2 рд╡рдВрд╢рдЬ рдкреИрджрд╛ рд╣реЛрдВрдЧреЗ ред рдпрд╣ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХреА рдЧрддрд┐рд╢реАрд▓рддрд╛ рдХреЛ рдмрдврд╝рд╛рдПрдЧрд╛:

MAX_STAGES = 20
MAX_DAYS_AT_STAGE = 50
SLIDING_FREQUENCY = 10
ROGUES_AT_BEGIN = 8 
WINS_TO_REPRODUCE = 2
DEFEATS_TO_DIE = 2
POSSIBLE_BIRTH_QUANTITIES = [1, 2]

HTML_GSQUARE_SIDE = 10
HTML_GSQUARE_MARGIN = 3

рдпрд╣рд╛рдВ рд╕реНрд▓рд╛рдЗрдбреНрд╕ рдкрд░ рдЬреАрдиреЛрдЯрд╛рдЗрдкреНрд╕ рдХреЗ рд╡рд┐рддрд░рдг рдХрд╛ рдкреИрдЯрд░реНрди рдЕрд▓рдЧ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕рдордЧреНрд░ рдкрд░рд┐рдгрд╛рдо ("рдорд╛рд╕реНрдЯрд░ рдХреА рддрд▓рд╡рд╛рд░") рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЙрдкрдХрд░рдг рдЕрдм "рдЕрдиреНрдп рд╕реНрдерд╛рдиреЛрдВ" рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдЗрд╕ рд╕реЗрдЯ рдХреЗ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ "рдмрд┐рдЬрд▓реА рдХреА foci" рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рд╢рдХреНрддрд┐ рдкрдбрд╝реЛрд╕реА "рдХреНрд╖реЗрддреНрд░реЛрдВ" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИред

рдЫрд╡рд┐

рд╡реИрд╕реЗ, рдЗрд╕ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдиреЗ рдЙрдкрдХрд░рдг рдХреЗ рд╢реАрд░реНрд╖ рд╕реЗрдЯ ( 3-3-0-0-0-0-0-1 ) рдХреЛ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреЗ рдХреЙрдореНрдмреАрдиреЗрдЯрд░рд┐рдпрд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдПрдХ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ :

рдЫрд╡рд┐

рдФрд░, рдЖрдЦрд┐рд░рдХрд╛рд░, рдореИрдВрдиреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдпрд╛ , рдЬреЛ рджреЗрддрд╛ рд╣реИ 18432 рд╕рдВрдпреЛрдЬрди:

рдЗрд╕ рддрд░рд╣ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде
MAX_STAGES = 30
MAX_DAYS_AT_STAGE = 50
SLIDING_FREQUENCY = 100
ROGUES_AT_BEGIN = 20
WINS_TO_REPRODUCE = 2
DEFEATS_TO_DIE = 2
POSSIBLE_BIRTH_QUANTITIES = [1, 2]

HTML_GSQUARE_SIDE = 4
HTML_GSQUARE_MARGIN = 1


рдЫрд╡рд┐

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдЦреБрд╢ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рд╡реГрддреНрддрд┐ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддреА рд╣реИ: рд╕рд┐рдореБрд▓реЗрд╢рди рдХреЗ рджреМрд░рд╛рди, рдЬреАрдиреЛрдЯрд╛рдЗрдк рдЬрд▓реНрджреА рд╕реЗ рдЗрди "рд╢рдХреНрддрд┐ рдХреЗрдВрджреНрд░реЛрдВ" рдореЗрдВ рдЬрдорд╛ рд╣реЛрдиреЗ рд▓рдЧрддреЗ рд╣реИрдВред рдФрд░ рдкреНрд░рдореБрдЦ рдЬреАрдиреЛрдЯрд╛рдЗрдк рдПрдХ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг "foci" рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

рдЪрд░рдг 6 - рдХреНрдпрд╛ рдпрд╣ рд╕рдм рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ?


рдпрджрд┐ рд╣рдо рдЕрдм рдкреНрд░рд╢реНрди рдХреЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрдХреНрд╖ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЖрдиреБрд╡рд╛рдВрд╢рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╕рднреА рдЬреАрдиреЛрдЯрд╛рдЗрдк рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░рд┐рдпрд▓ рдЦреЛрдЬ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рдЭрдЧрдбрд╝реЗ рдХреА рдХреАрдордд рдкрд░ рд╕рд╣реА рдЙрддреНрддрд░ рдЦреЛрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИред рдЙрддреНрддрд░: рд╣рд╛рдБ, рд╕рдХреНрд╖рдо рд╣реИ ред рдХрдЯ рдХреЗ рддрд╣рдд рд╕рдмреВрдд:

рдЖрдиреБрд╡рдВрд╢рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреА рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдХрд╛ рдкреНрд░рдорд╛рдг
1728 .

, .. 1728 .

, 1728 . ┬л┬╗ тАФ 2 ( ). , , 1728 / 2 = 864. .

:

MAX_STAGES = 8
MAX_DAYS_AT_STAGE = 20
SLIDING_FREQUENCY = 10
ROGUES_AT_BEGIN = 10
WINS_TO_REPRODUCE = 2
DEFEATS_TO_DIE = 2
POSSIBLE_BIRTH_QUANTITIES = [1]

HTML_GSQUARE_SIDE = 10
HTML_GSQUARE_MARGIN = 3

, 3-3-0-0-0-0-1:

image

:

image

, 3-3-0-0-0-0-1 547 . 87 (), 16% .

.

PS ROGUES_AT_BEGIN = 2 рдФрд░ POSSIBLE_BIRTH_QUANTITIES = [1] рдХреЗ рд╕рд╛рде рднреА рд╕рд╣реА рдЙрддреНрддрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ ред рдпрд╣ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдмрд╛рджреА рдХрднреА рднреА 2 рд▓реБрдЯреЗрд░реЛрдВ рд╕реЗ рдКрдкрд░ рдирд╣реАрдВ рдЙрдарддреАред рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рд╣рд╛рд░ рдЬрд╛рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдЬреАрдд рдЬрд╛рддрд╛ рд╣реИ, рдкрд╣рд▓рд╛ рдорд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рдПрдХ рд╡рдВрд╢рдЬ рдХреЛ рдЬрдиреНрдо рджреЗрддрд╛ рд╣реИред рдФрд░ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдЗрд╕ рд╡рдВрд╢ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзрд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддреЗ рд╣реИрдВред рд╡рдВрд╢рдЬ рдпрд╛ рддреЛ рдордЬрдмреВрдд рдпрд╛ рдХрдордЬреЛрд░ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдирд┐рд░реНрджрдпреА рдЪрдпрди рдкрд╣рд┐рдпрд╛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдФрд░ рдЙрд╕рдХреЗ рд╡рдВрд╢рдЬ рдХреЗ рдмреАрдЪ рддрдм рддрдХ рдЪрд▓рддрд╛ рд░рд╣рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рдПрдХ рдмреЗрд╣рддрд░ рдмрд┐рдВрджреБ рдкрд░ рдирд╣реАрдВ рдЖ рдЬрд╛рддрд╛ (рдЬреЛ рдХрд┐ рд╡рд╣ рдЖрд╡рдВрдЯрд┐рдд рд╕рдордп рдореЗрдВ рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдореЗрд╢рд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ)ред

рд╕рд╛рд░рд╛рдВрд╢


  1. рдЖрдиреБрд╡рдВрд╢рд┐рдХ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  2. ┬л┬╗ .
  3. , , ( calculate_rate Rogue, ).
  4. рдмреЗрд╢рдХ, рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдкрд░ рдЖрдк рдЕрднреА рднреА рдкреНрд░рдпреЛрдЧ рдФрд░ рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рджрдХреНрд╖рддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, "рдкреНрд░рддрд┐рдмрдВрдз" рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬреАрдиреЛрдЯрд╛рдЗрдк рдЦреЛрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ , рдЕрдкрдиреЗ рдорд╛рд▓рд┐рдХреЛрдВ рдХреЛ рд▓рдбрд╝рдиреЗ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рди рджреЗрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, "рдиреЗрддрд╛рдУрдВ" рдХреА рдлрд╝рдирд▓ рд╕рдВрдХреАрд░реНрдг рд╣реЛ рдЬрд╛рдПрдЧреА, рдЬрд╣рд╛рдБ рдЙрдиреНрд╣реЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрд╕ рдореЗрдВ "рд╕рдмрд╕реЗ рдордЬрдмреВрдд" рдХреМрди рд╣реИред

рдореИрдВрдиреЗ рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рдХреЛ github рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ ред

рдкреНрд░рд┐рдп рд╕рдореБрджрд╛рдп, рдореБрдЭреЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

All Articles