2016-05-27 3 views
0

Это для текстовой карточной игры.Задайте переменную случайному элементу из массива, а не значение элемента. --- python ---

Я пытался заставить python случайным образом выбрать переменную из массива и сохранить имя переменной в Fa. Однако он сохраняет только значение переменной Fa, а не имя переменной.

Мой код:

import random 

k='King' 
q='Queen' 
j='Jack' 
t='Ten' 
n='Nine' 
e='Eight' 
s='Seven' 
i='Six' 
f='Five' 
u='Four' 
h='Three' 
w='two' 
a='ace' 
c='of clubs' 
d='of diamonds' 
p='of spades' 
r='of hearts' 
#clubs 
A1=k+' '+c 
B1=q+' '+c 
C1=j+' '+c 
D1=t+' '+c 
E1=n+' '+c 
F1=e+' '+c 
G1=s+' '+c 
H1=i+' '+c 
I1=f+' '+c 
J1=u+' '+c 
K1=h+' '+c 
L1=w+' '+c 
M1=a+' '+c 
#diamonds 
A2=k+' '+d 
B2=q+' '+d 
C2=j+' '+d 
D2=t+' '+d 
E2=n+' '+d 
F2=e+' '+d 
G2=s+' '+d 
H2=i+' '+d 
I2=f+' '+d 
J2=u+' '+d 
K2=h+' '+d 
L2=w+' '+d 
M2=a+' '+d 
#spades 
A3=k+' '+p 
B3=q+' '+p 
C3=j+' '+p 
D3=t+' '+p 
E3=n+' '+p 
F3=e+' '+p 
G3=s+' '+p 
H3=i+' '+p 
I3=f+' '+p 
J3=u+' '+p 
K3=h+' '+p 
L3=w+' '+p 
M3=a+' '+p 
#hearts 
A=k+' '+r 
B=q+' '+r 
C=j+' '+r 
D=t+' '+r 
E=n+' '+r 
F=e+' '+r 
G=s+' '+r 
H=i+' '+r 
I=f+' '+r 
J=u+' '+r 
K=h+' '+r 
L=w+' '+r 
M=a+' '+r 

clubs=[A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1] 
diamonds=[A2,B2,C2,D2,E2,F2,G2,H2,I2,J2,K2,L2,M2] 
hearts=[A3,B3,C3,D3,E3,F3,G3,H3,I3,J3,K3,L3,M3] 
spades=[A,B,C,D,E,F,G,H,I,J,K,L,M] 

CardTotal=len(clubs) 

X='' 
Da='' 
Fa='' 
sep='\n And \n' 
hand='' 

Cardhand=7 

while(Cardhand != 0): 
    Cardhand=Cardhand-1 
    Da=random.choice(['1', '2', '3','4']) 
    if(Da=='1'): 
     Fa=random.choice(clubs) 
    elif(Da=='2'): 
     Fa=random.choice(hearts) 
    elif(Da=='3'): 
     Fa=random.choice(spades) 
    elif(Da=='4'): 
     Fa=random.choice(diamonds) 

    hand=hand+sep+Fa+sep 

    if(Fa in clubs): 
     clubs.pop(Fa) 
    elif(Fa in diamonds): 
     diamonds.pop(Fa) 
    elif(Fa in hearts): 
     hearts.pop(Fa) 
    elif(Fa in spades): 
     spades.pop(Fa) 

    Da='' 
    Fa='' 


cards=[clubs,diamonds,hearts,spades]  
+0

просто заменить, например, 'random.choice (clubs)' by 'i = random.choice (диапазон (len (клубы))'. Тогда 'i' является индексом, а' clubs [i] 'является значением. –

ответ

0

Вы должны понимать, что питон не проходит «имена переменных» при создании списка.

Поступая:

spades=[A,B,C,D,E,F,G,H,I,J,K,L,M] 

список состоит только из значений, которые эти переменные указывали, вы можете увидеть это, просто распечатав список:

>>> spades 
['King of hearts', 'Queen of hearts', 'Jack of hearts', 'Ten of hearts', 'Nine of hearts', 'Eight of hearts', 'Seven of hearts', 'Six of hearts', 'Five of hearts', 'Four of hearts', 'Three of hearts', 'two of hearts', 'ace of hearts'] 

Если вы хотите, чтобы вместо получите имена переменных, которые вы можете сохранить в виде строк без значений:

spades=['A','B','C','D','E','F','G','H','I','J','K','L','M'] 

или список кортежи с именем и значением:

spades=[('A',A),('B',B),('C',C),('D',D),('E',E),('F',F),('G',G),('H',H),('I',I),('J',J),('K',K),('L',L),('M',M)] 

то значение и имя могут быть извлечены с:

name, value = Fa 

Хотя это на самом деле гораздо лучше подходит для отображения, вместо списка элементов, извлекается индексами вы связать каждое значение с именем:

spades = {'A':A, 'B':B, 'C':C, 'D':D, 'E':E, 'F':F, 'G':G, 'H':H, 'I':I, 'J':J, 'K':K, 'L':L, 'M':M} 

Хотя это останавливает random.choice от работы, вы бы тогда изменить его на:

Fa=random.choice(tuple(spades)) 

Поскольку random.choice опирается на использование индексов, чтобы выбрать случайный элемент, так что нужна последовательность для правильной работы

Тогда вы можете получить текст карты, ловя возвращаемое значение .pop:

card_text = spades.pop(Fa) 

Возможно, вам не нравится идея передачи значения переменной вместо имени переменной, но вы поймете, что она может значительно упростить код, например, вместо того, чтобы делать:

Da=random.choice(['1', '2', '3','4']) 
if(Da=='1'): 
    Fa=random.choice(clubs) 
elif(Da=='2'): 
    Fa=random.choice(hearts) 
elif(Da=='3'): 
    Fa=random.choice(spades) 
elif(Da=='4'): 
    Fa=random.choice(diamonds) 

вы можете просто выбрать один из списка/dicts для костюма, как это:

Da=random.choice([clubs,diamonds,hearts,spades]) 
#Da is now the dict for the selected suit 
Fa = random.choice(tuple(Da)) 

Тогда весь цикл, а может быть просто так:

spades = { 'A': A, 'B': B, 'C': C, 'D': D, 'E': E, 'F': F, 'G': G, 'H': H, 'I': I, 'J': J, 'K': K, 'L': L, 'M': M} 
clubs = {'A1':A1, 'B1':B1, 'C1':C1, 'D1':D1, 'E1':E1, 'F1':F1, 'G1':G1, 'H1':H1, 'I1':I1, 'J1':J1, 'K1':K1, 'L1':L1, 'M1':M1} 
diamonds = {'A2':A2, 'B2':B2, 'C2':C2, 'D2':D2, 'E2':E2, 'F2':F2, 'G2':G2, 'H2':H2, 'I2':I2, 'J2':J2, 'K2':K2, 'L2':L2, 'M2':M2} 
hearts = {'A3':A3, 'B3':B3, 'C3':C3, 'D3':D3, 'E3':E3, 'F3':F3, 'G3':G3, 'H3':H3, 'I3':I3, 'J3':J3, 'K3':K3, 'L3':L3, 'M3':M3} 
while(Cardhand != 0): 
    Cardhand=Cardhand-1 
    Da=random.choice([clubs,diamonds,hearts,spades]) 
    #Da is now the dict for the selected suit 
    Fa = random.choice(tuple(Da)) 
    #Fa is the key in that dict, so A or B2 or similar 
    card_text = Da.pop(Fa) 
    hand=hand+sep+card_text+sep 
+0

Спасибо, это очень помогло! : D –

0

вопрос с вашими структурами данных: clubs=[A1,B1,C1,D1,E1,F1,G1,H1,I1,J1,K1,L1,M1] будет иметь только значение переменных в массивах. Если вы хотите также иметь имя переменной, я бы предложил изменить его на dict и иметь имя переменной key. Пример:

clubs = { 
    'A1': A1, 
    'B1': B1, 
    'C1': C1, 
    'D1': D1, 
    'E1': E1, 
    'F1': F1, 
    'G1': G1, 
    'H1': H1, 
    'I1': I1, 
    'J1': J1, 
    'K1': K1, 
    'L1': L1, 
    'M1': M1 
} 

Редактировать: (Как было предложено Исхак Хан, для Python3 clubs.keys() возвращает dict_keys объект, который не итератора) random.choice(clubs) бы затем изменить, чтобы быть random.choice(list(clubs.keys())).

0

Если я понял ясно, то используйте словарь.

Скопируйте код из моего примера:

import random 

dic = {'k' : 'king', 'q' : 'queen'} 

dic_keys = list(dic.keys()) 

which = random.choice(dic_keys) 

selected_v = which 
selected_v_v = dic[selected_v] 

print(selected_v, selected_v_v)