Так что для забавы я делал следующий код, который по существу принимает двух покемонов, и выводит список покемонов, который закруглит команду из трех покемонов на основе защиты. У меня есть полный рабочий код для всех 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 так, как я хочу.
Я буду продолжать работать над этим, но я ценю любую помощь, которую я могу получить, так как я все еще довольно новый.
Спасибо!