Сап детский утренник, ребята, я очень рад буду помощи по Пайтону. Надо создать игру пьяница со следующими классами: Card, Deck, Player и Game. В классе Card Метода init должна получить value и suit value=1-13, когда туз это 1, 11-хуй который между 10 и королевой, забыл как зовут,12-королева,13-король. suit=1-4, когда 1-бубны, 2-пики, червы -3, трефы - 4. И метода gt что получает карту и сравнивает её с существующей картой. Если существующая карта выше - True, если нет - False. Это первый класс, а я уже запутался блять. Как я обозначаю что 1(Туз) выше остальных карт и бубны ебут всё остальное?
>>261124493 Можно и так сказать. Я думал сначала через dictionary делать, но сказали нахуй не надо, а просто чтобы суит и валуе получили цифры. И вот вроде должно легче стать, но я че то туплю и волнуюсь.
>>261124746 Да это то, что я уже понял, поэтому борода вначале затупил. >>261124748 вот здесь вот правильно сделал? Но где я должен обозначить что выше, а что ниже. как 1 сделать выше 13, то есть где прописапть и как?
>>261124985 Ты прав, заметил сейчас def __gt__(self, other): if self.value>other.value or self.value==other.value and self.suit>other.suit: return True else: return False так?
>>261125187 > self.suit>other.suit: > return True Наоборот, например десятка червей больше чем восьмерка червей, их можно сравнить, потому что они оба черви, а например десятку червей и восьмерку крестей сравнить нельзя. Само собой, это если речь идёт о каком-нибудь дураке, если речь идёт о покере, то там всё наоборот. Так что ты сперва сам для себя проясни, как оно должно быть, а потом делай.
>>261124985 Я сделал туз(1) выше остальных так., вроде работает if value==1: self.value=14 А как я в gt ввожу больше одной переменной, у меня ведь и value и suit Сорри что я тупой
>>261125746 почти def __init__(self,value,suit): self.value=value self.suit=suit if value==1: self.value=14
def __gt__(self, other): if self.value>other.value or self.value==other.value and self.suit>other.suit: return True else: return False
только туз = 1 и надо сделать чтобы он был выше остальных, что у меня вышло и в gt при одинаковом value решает suit, что тоже у меня вышло Сейчвс хочу проверить и не могу понять как в gt я вставляю две переменные и value и suit
1.Класс Card. Включает в себя value и suit. Value 1-13, когда 1-это туз, 2-10 - это 2-10, 11 - это валет, 12 - это королева, 13 - это король. Большее бьет меньшее, туз бьёт всех остальных. Когда value карт равны смотрят на suit. Suit 1-4, когда 1-это бубны, 2-это пики,3-это червы, 4-это трефы. Большее бьет меньшее. Две методы у этого класса: init что получает value и suit gt что получает карту и сравнивает её с существующей картой. Если существующая карта выше - возвращаетTrue, если нет- False. Сверху я написал что у меня вышло, вроде норм, только насчет gt я не понимаю как вводить две переменные.
2_Класс Deck включает в себя целую колоду карт - 13 каждого вида, всего 52. Это будет список/лист Cards Методы: cards_shuffle случайный образом перемешивает карты(можно использовать функцию shuffle) метода не получит ничего и ничего не вернет. init что загрузит целую колоду, то есть создаст целую колоду из 52 карт. deal_one вытянет одну случайную карту из колоды, должна вернуть(реторн) карту что она вытащила. 3)Класс Player Имя, колода карт игрока и количество карт что игрок получит. количество карт решится в с началом новой игры и по умолчанию будет 26. Можно будет поменять что количество карт будет другим, в лбом случае количество карт не будет больше 26 и меньше 10. Методы: init получит имя игрока и кличество карт что нужно раздать каждому игроку(по умолчанию 26, если получит больше 26 или меньше 26, будет 26) Метода загрузит колоду карт игрока как чистый лист. set_hand - получает колоду карт игры(из deck) г раздает из нее случайные карты для игрока, по количество карт которые этот игрок должен получить. Испаользовать методу deal_one. метода ничего не возвращает(реторн) get_card вытаскивает случайную карту и колоды игрока, метода реторн карту что вытащила. add_card - метода получает карту и добавляет ее в колоду карт игрока. Ничего не реторн.
Есть еще класс 4 и потом сама программа, сейчас добавлю
>>261126713 Продолжение 4) класс CardGame. Характеристики класса: колода карт (типа DecOfCards) и 2 игрока(типа Player). Методы класса: 1. _init_ получает имена игроков и количество карт которые нужно распределить каждому игроку(.по умолчанию 26, если получает число выше, чем 26 или ниже 10, число будет равняться 26) Метод вызовет метод newgame в разделе 2: ==> 2. Метод new_game которая размешает колоду и раздаст карты игрокам. Нужно использовать подходящие методы из классов. Метод ничего не возвращает. Метод должен вызываться только из Констрактор. Если по какой-либо причине, метод объявляется после того, как игра уже началась, он распечатает «Ошибка» и ничего не выполнит. 3. Метод get_winner который возвращает победителя из игроков. Победителем является игрок, оставшийся с наибольшим количеством карт и если количество карт одинаковое у обоих игроков, он вернет None
5) Сама программа. Получает имена игроков и начинает новую игру с 26 картами на каждого игрока. В начале игры программа print для каждого игрока его имя и карты что он получил. а) После начала игры, программа сыграет 10 раундом игры Пьяница. б)В каждом раунде игрок кидает случайную карту из его колоды. в)Игрок с самой большой картой побеждает и берет себе две другие карты из тех что выпали у других игроков. г) Распечатай карты что были в каждом раунде и победитель каждого раунда.
В конце игры распечатай данные игрока что выиграл в игре, если была ничья - распечатай ничью.
>>261127614 опа, красиво, вопрос только то, что ты сверху импортировал мне не понадобится? И еще я не уверен если по условию туз бьет всё, но я проверю, спасибо, добрый человек
>>261127614 И можешь объяснить почему в gt не оставил other, а прописал кард, так еще и дважды? Я вижу ты потом еще и в deck его использовал Мне просто ошибку выдает этот card в пайшарме
>>261128548 >не оставил other Параметр можно обозвать как угодно. Назвал card потому что так семантически правильнее. >так еще и дважды После двоеточия идёт аннотация типа, чтобы было понятно какие типы приходят в параметрах. Можешь это убрать. >ошибку выдает этот card в пайшарме Заключи в кавычки: card: "Card" либо убери.
>>261128815 в gt у тебя выходит, что на первый туз постоянно. def __gt__(self, card: "Card"): if self.value == 1: return True if card.value == 1: return False if self.value == card.value: return self.suit > card.suit return self.value > card.value
Должен выходить False, потому что suit card2> suit card1, но он смотрит на первый туз и выдает True. С остальными цифрами работает, но если будет два туза, он выберет всегда первый, даже если он из suit что стоит ниже. То есть при тузе бубен и тузе пик, он выберет бубны, потому что их туз идет первым.
>>261133097 так что я переставил так, и вроде работает def __gt__(self, card): if self.value>card.value or self.value==card.value and self.suit>card.suit: return True else: return False if self.value==1: return True if card.value==1: return False
>>261133635 Хорошо, спасибо большое и на том. >>261133854 Я оп, это не домашнее задание, я пытаюсь самообучаться и поэтому мне нужна помощь чтобы по этому заданию и его решению я смог бы понять что и как. Поэтому и просил помощи с решением всего, чтобы было отчего отталкиваться.
>>261133348 Вот рабочая, таки смог сам def __gt__(self, card:"Card"): if self.value==1 and self.suit>card.suit: return True if card.value==1 and card.suit>self.suit: return False if self.value==card.value: return self.suit>card.suit return self.value>card.value
>>261137031 >if self.value==1 and self.suit>card.suit: >return True >if card.value==1 and card.suit>self.suit: >return False Здесь второй if не нужен, нужен else False.
>>261137948 Да я переделал в итоге в такую простыню. def __gt__(self, card:"Card"): if self.value==1 and card.value!=1: return True elif self.value!=1 and card.value==1: return False elif self.value>card.value: return True elif self.value<card.value: return False elif self.value==card.value: if self.suit>card.suit: return True else: return False
>>261138219 >Объясни пожалуйста здешний рэйс Я тут не дописал. По условию new_game нельзя вызвать дважды. Поэтому при первом вызове ты ставишь флаг _game_started = True, который не позволяет вызвать метод повторно.
>не нужен ли тут селф в cards_quantity_ Да, это нужно положить в self: self.cards_quantity = cards_quantity if 10 < cards_quantity < 26 else 26
>>261138259 Хуйню какую-то понаписал. Тебе нужно покрыть ровно три кейса: 1. Одна из карт - Туз. Она выигрывает. 2. Одна карта больше другой - она выигрывает. 2. Обе карты равны - сравниваем по масти. Итого: if self.value == card.value: return self.suit > card.suit здесь ты покрыл 3 кейс, в том числе что обе тузы.
if self.value == 1: return True if card.value == 1: return False Это кейс 1.
return self.value > card.value Это оставшийся 2 кейс. Тут нет if, потому что к этому моменту других вариантов быть не может.
>>261138412 > По условию new_game нельзя вызвать дважды. По этой же причине здесь фолс? def __init__(self, player1, player2, cards_quantity): self._game_started = False
>>261138769 Первый скрин - убери аннотацию в 6 строке, а то спросят что это а ты обосрёшься. Расставь пробелы вокруг операторов сравнения. Второй скрин: две пустых строки после импортов, пробелы после запятых. Глаза режет и пучарм тебе подсказывает. Четвёртый: строки 19 и 21 - нужны аргументы в скобках - имя и кол-во карт.
>>261123826 (OP) Вы условные операторы не прошли еще, а уже к ООП прыгнули? Если не можешь справиться с такой простейшей задачей, то погромировоние не твое.
>>261141101 Логические/алгоритмические ошибки? Ну так ясен хуй они будут, особенно если нет опыта. А вообще, погугли что такое дебагер и жизнь упростится в разы.
В общем если я правильно понял, то всё так: def __init__(self, value, suit): self.value = value self.suit = suit программа просто получает данные карты
def __gt__(self, card): if self.value == card.value: return self.suit > card.suit if self.value == 1: return True if card.value == 1: return False return self.value > card.value программа сравнивает карту с полученной картой
def __init__(self): self.cards = [] пустой лист - это колода карт for value in range(1, 13+1): for suit in range(1, 4+1): self.cards.append(Card(value, suit)) заполняем это колоду 13 картами 4 разных видом, всего должно получится 52 карты.
def cards_shuffle(self): random.shuffle(self.cards) перемешиваем колоду случайным образом
def deal_one(self): return self.cards.pop(random.randrange(1, len(self.cards)-1)) вынимаем рандомную карту из колоды
def __init__(self, name, cards_quantity=26): self.name = name self.cards_quantity = cards_quantity self.cards = [] получаем игрока с именем и количеством карт(по умолчанию 26)
def set_hand(self, deck: DeckOfCards): for i in range(1, self.cards_quantity+1): self.cards.append(deck.deal_one()) получает колоду карт из дек оф кардс и раздает игроку случайные карты количеством что этому иггроку прописаны, использует методу дил_ван из класса Дек оф Кардс
def get_card(self): return self.cards.pop(random.randrange(1, len(self.cards)-1)) вытайскивает случайную карту из колоды игрока