Python - изменение количества условий внутри оператора if в зависимости от ввода - PullRequest
0 голосов
/ 29 октября 2018

Так что для забавы я делал следующий код, который по существу принимает двух покемонов, и выводит список покемонов, который закруглит команду из трех покемонов на основе защиты. У меня есть полный рабочий код для всех 18 типов, но вот уменьшенная версия, которую я использовал для тестирования:

import numpy as np
import sys

#testing assuming input in fire
dict={}
dict["fire"]=np.array([1,-1,1]) 
dict["water"]=np.array([1,1,-1])
dict["grass"]=np.array([-1,1,1])

value={}
value[0]="fire"
value[1]="water"
value[2]="grass"

type1=input("First type? (no caps): ")
type(type1)
type2=input("Second type? (no caps): ")
type(type2)

poke=dict[type1]+dict[type2]

for t in range(len(poke)):
    if poke[t]<0:
        poke[t]=-1
    elif poke[t]>0:
        poke[t]=1
    else: continue

A=np.column_stack(([fire,water,grass]))

weak=any(poke<0)
p=np.linspace(0,0,len(poke))
if weak==True:
    for t in range(len(poke)):
        if poke[t]<0:
            p[t]=1
        else:
            p[t]=0
else:
    print("....your pokemon has no weaknesses....")

for u in range(0,len(poke)):
    for v in range(u,len(poke)):
        combo=A[:,u]+A[:,v]
        for t in range(0,len(poke)):
            if combo[t]<0:
                combo[t]=-1
            elif combo[t]>0:
                combo[t]=1
            else: continue
        if combo[1]==-poke[1]: #dep on values of p that are not 0
            if u==v:
                print(value[u])
            else:
                print(value[u],value[v])
        else: continue

Что в основном делает код, так это то, что у меня есть серия массивов, представляющих каждый тип. «1» означает, что он противостоит покемону, соответствующему этому типу, «-1» для него слаб, а «0» нейтрален В полном коде он принимает двух покемонов двойного типа, складывает их массивы, и я рассматриваю это как единое целое. В меньшем коде я беру один и ищу один. После того, как что-то добавлено вместе, я изменяю значения обратно на 1 и 0, чтобы я мог сделать правильные сравнения.

И затем фактическое сравнение выполняется с помощью этого двойного вложенного цикла for, который просматривает каждую возможную комбинацию и сравнивает ее с желаемым значением, которое я хочу, что в основном для любого значения poke [], равного -1, я хочу соответствующий комбинированный список. [] значение 1.

if combo[1]==-poke[1]:
        if u==v:
            print(value[u])
        else:
            print(value[u],value[v])
    else: continue

Проблема в том, что у меня возникают проблемы с обобщением кода, поэтому мне не нужно возвращаться и редактировать его каждый раз, когда я хочу выполнить новый "поиск".

Для этого экземпляра кода:

>>First type? (no caps): fire
    Second type? (no caps): fire
    water
    water grass
    grass 

Но, если бы я хотел это сделать, скажите тип воды:

>>First type? (no caps): water
    Second type? (no caps): water
    fire

Он должен предлагать огонь, огонь / траву, траву, но это не так, потому что оператор if больше не указывает на правильный индекс для проверки. Это то, что я редактирую каждый раз, и у меня возникают проблемы с обобщением простого ввода / вывода.

Я сделал это значение p, которое представляет собой массив из 0 и 1, где 1 - слабость, а 0 - что-нибудь еще:

 weak=any(poke<0)
    p=np.linspace(0,0,len(poke))
    if weak==True:
        for t in range(len(poke)):
            if poke[t]<0:
                p[t]=1
            else:
                p[t]=0
    else:
        print("....your pokemon has no weaknesses....")

Думаю, я мог бы найти способ проверить значения, где р = 1, но тогда возникает реальная проблема. Почти во всех случаях существует более одного недостатка, что приводит к необходимости проверки 3 или 4 четырех условий в одном и том же выражении if, например:

if combo[1]==-poke[1] && combo[5]==-poke[5] && combo[13]==-poke[13]:

И даже тогда эта комбинация иногда не существует. Я думал о том, чтобы распечатать слабые места, соответствующие р = 1, если его больше 3, и иметь какой-то пользовательский ввод того, что они хотели бы проверить, но я не могу понять, как получить количество условий в одном если заявление меняется так. Я также не уверен, как сделать так, чтобы текущий отдельный оператор указывал на индексы p так, как я хочу.

Я буду продолжать работать над этим, но я ценю любую помощь, которую я могу получить, так как я все еще довольно новый.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...