Найти - Пользователи
Полная версия: Игра в карты
Начало » Python для новичков » Игра в карты
1 2 3
pit_toner
#! coding: utf-8
import random
# Это колода карт
cardList =  [ {'5 pik':5}, {'6 pik':6}, {'7 pik':7}, {'8 pik':8}, {'9 pik':9}, {'10 pik':10}, {'Valet pik':11}, {'Dama pik':12}, {'King pik':13}, {'Tuz pik':14} ]
# Карты юзера 1
userCards = []
while len(userCards) < 5: # Берем 5 карт из колоды
    x = random.randint(0,9)
    y = cardList[x]
    userCards.append(y)
# Пытаемся делать карты юзера 2, но скрипт крашится
#userCards2 = cardList.remove(userCards)
#print userCards2
 
print('Карты пользователя:')
print userCards
print
print('Карты в колоде:')
print cardList

Пытаюсь сделать простейшую игрушку своими руками, но не могу понять как сделать карты для юзера 2.
pit_toner
userCards2 = cardList del userCards

тоже крашится, что я не так дела?
reclosedev
pit_toner
но не могу понять как сделать карты для юзера 2.
Без удаления карт из cardList можно вот так:
userCards2 = [card for card in cardList if card not in userCards]

Но в коде есть проблемы или я не до конца понял логику.

Если userCards не пустой, то будет взято не 5 карт.
Т.к. вы не удаляете карты из списка, возможно появление карты несколько раз.
В модуле random есть готовые функции: random.choice - возвращает случайный элемент из списка, а также random.sample. Т.е. вместо while цикла можно написать:
userCards = random.sample(cardList, 5)

Если для второго пользователя вы пытаетесь удалить карты из колоды, то почему не удалили для первого?
pit_toner
Вы совершенно правы, карту нужно удалять! Как это можно лучше сделать? Я так понимаю и choice и sample карты в списке оставляют. Функция del что то не работает со словарем или я ее не так использую.
pit_toner
Сейчас проверил, что метод choice не подходит, т.к. он возвращает не уникальный элемент списка, и может раздать юзеру 2 одинаковые карты из колоды))
Just_for_fun
Может подойдет.
import random
CL = [{'5p':5},{'6p':6},{'6p':6},{'7p':7},{'8p':8},{'9p':9},{'10p':10},{'11p':11},{'12p':12}]
k = len(CL)-1
usercard = []
j = len(usercard)
while j < 5:
    usercard.append(CL.pop(random.randint(0,k)))
    j +=1
    k = len(CL)-1
usercard2 = CL
print (usercard)
print (usercard2)
pit_toner
Just_for_fun неа reclosedev предложил просто идеальный вариант раздела карт из колоды. Проблема в другом. Изначально. Я сделал карты как словарь, а колоду ввиде списка. Думал сравнивать первые карты в списке карт у юзеров по их ключу, и так расчитывать кто какую карту побил, но похоже Питон не дает возможности сравнить разные значения из разных словарей по ключу. Это так? Прийдется делать каждую карту как отдельную переменную и присваивать ей значение.

pit_toner
Вот новая версия кода:

#! coding: utf-8
import random
# Карты
piki_5 = 5
piki_6 = 6
piki_7 = 7
piki_8 = 8
piki_9 = 9
piki_10 = 10
piki_Valet = 11
piki_Dama = 12
piki_King = 13
piki_Tuz = 14
# Колода карт
cardList =  [ piki_5, piki_6, piki_7, piki_8, piki_9, piki_10, piki_Valet, piki_Dama, piki_King, piki_Tuz ]
# Карты юзера 1
userCards1 = random.sample(cardList, 5)
# Карты юзера 2
userCards2 = [card for card in cardList if card not in userCards1]
x = random.randint(0,4)
if userCards1[x] > userCards2[x]:
    print 'win user 1'
if userCards1[x] < userCards2[x]:
    print 'win user 2'
if userCards1[x] == userCards2[x]:
    print 'equal'
print
print('Карты пользователя 1:')
print userCards1
print
print('Карты пользователя 2:')
print userCards2
print
print('Карты в колоде:')
print cardList
print(' Число х:')
print x

Подправил. Теперь работает. Получается:
1) Делим колоду 2 человек
2) При случайном вытягивании некой пары карт у 2 юзеров можно сразу определить кто из них кого победил.
Подозреваю что для рефакторинга здесь непаханое поле))
reclosedev
pit_toner, учитывая то, что нужно удалять карты из колоды, код у Just_for_fun как раз правильный.

pit_toner
Думал сравнивать первые карты в списке карт у юзеров по их ключу, и так расчитывать кто какую карту побил, но похоже Питон не дает возможности сравнить разные значения из разных словарей по ключу. Это так? Придется делать каждую карту как отдельную переменную и присваивать ей значение.
А вот здесь не очень понятно, что пытаетесь сделать.

Возможно карты вам нужно представить в виде кортежа (tuple)
 [('5 pik', 5), ('6 pik', 6), ...]
или словаря, но по другому
[{'name': '5 pik', 'points': 5}, {'name': '6 pik', 'points':6}...]
или namedtuple. Или вообще класс сделать.

Тогда можно будет сравнивать значения. Например, в случае с кортежем:
if userCards1[0][1] > userCards1[0][1]:
    ...
pit_toner
Ну удаление карт из колоды вроде как здесь не принципиально, главное чтобы одинаковые карты не достались, а также были у каждого разные. Про кортеж оч.интересный вариант.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB