def global_input(self, value): # сюда идут все нажатия на кнопки, которые создал класс game # print(self.not_choosen) if self.state['choose char']: self.active_player().choose_character(value) self.update_interface() self.not_choosen -= 1 text = 'выберите персонажа, ' if self.not_choosen == 6 and len(self.players) == 2: self.controller.next_player() self.set_text('выберите персонажа, ' + self.active_player().name) return if len(self.players) == 2: self.state['choose char'], self.state['drop char'] = False, True self.controller.interface.add_text('сбросьте персонажа') return elif self.not_choosen == 1 and len(self.players) < 7: self.state['choose char'], self.state['drop char'] = False, True text = 'сбросьте персонажа, ' self.set_text(text + self.active_player().name) return elif self.not_choosen == 1 and len(self.players) == 7: char = self.controller.dropList[0] self.controller.dropList.clear() self.controller.create_buttons([[char.primImg["open"], char.name]], False) elif self.not_choosen == 0 and len(self.players) == 7: self.not_choosen += 1 self.state['choose char'], self.state['drop char'] = False, True text = 'сбросьте персонажа, ' self.set_text(text + self.active_player().name) return self.controller.next_player() self.set_text(text + self.active_player().name) elif self.state['drop char']: self._choosen_drop(value) self.state['choose char'], self.state['drop char'] = True, False self.controller.next_player() if self.not_choosen == 0: self.preparing = False self.state['choose char'] = False doc.write("*/round;") self.rounding = True else: self.set_text('выберите персонажа, ' + self.active_player().name) elif self.state['resources']: self.active_player().take_resources(value) elif self.state['take quarter']: self.active_player().take_quarter(value) elif self.state['action pool']: self.active_player().recive_command(value) elif self.state['build']: self.active_player().build(value) elif self.state['character ability']: self.active_player().character.ability(value) elif self.state['grave yard']: self.active_player().buy_quart(value) elif self.state['smithy']: self.active_player().smithy_bonus(value) elif self.state['laboratory']: self.active_player().burn(value)
def build(self, card): self.gameMaster.state['build'] = False if card == 'cancel': self.action_pool.append('build') self.activate_action() return if card.value > self.gold: return self.gold -= card.value # нужно обновить золото на интерфейсе self.setTextRenderer() self.city.append(card) self.city[-1].built(self) doc.write(f"->build: {card.name};") # print(self.name + " have built " + card.name + "(value: " + str(card.value) +")" + ", now he(she) has " + str(self.gold) + " gold") for i in range(len(self.hand)): if self.hand[i] == card: self.hand.pop(i) break self.activate_action( ) # мы вернулись в множество действий, а точнее в его остатки "action pool = True" if len( self.city ) >= self.gameMaster.max_city_size and self.gameMaster.firstConstruct == None: self.gameMaster.firstConstruct = self self.gameMaster.update_interface()
def _reload(self): # забирает у всех игроков карты персонажей, делает колоду персонажей полной, опусташает очередь self.openChars.clear() self.not_choosen = 8 self.controller.dropList.clear() self.preparing = True game_running = True self.set_active_player(self.players[0]) doc.write("*/reload") for player in self.players: player.dropCharList() player.character = self.character # отдаем каждому игроку нейтрального персонажа if len(player.city) >= self.max_city_size: # проверка на конец игры game_running = False self._winner() for char in self.deckChar: char.state = "hide" char.choosen = False # делаем каждого персонажа НЕ выбранным char.alive = True # делаем каждого персонажа вновь живым(исправляем активити ассасина) char.robed = False # делаем каждого необоворованным, чтобы обворовать char.player = None # теперь карта персонажа не присовоена игроку char.set_pos(0, 0) # забираем персонажей из зон игроков for i in range(len(self.queue)): # опусташаем очередь self.queue[i] = None if game_running: self.state['choose char'] = True # если игра не закончена, то ожидаем выбор персонажа self.update_interface() self.running = game_running
def prepare_round(self): self.info() doc.write("*/prepare;") doc.write(f"/queue: {self.getPlayersQueue()};") if len(self.players) == 2 or len(self.players) == 3: self.prepareChoosHand(1, 0) elif len(self.players) == 4: self.prepareChoosHand(1, 2) elif len(self.players) == 5: self.prepareChoosHand(1, 1) elif len(self.players) == 6: self.prepareChoosHand(1, 0) elif len(self.players) == 7: self.prepareChoosHand(1, 0)
def take_quarter(self, quarter): self.gameMaster.state['take quarter'] = False self.hand.append(quarter) for button in self.gameMaster.controller.buttons: self.gameMaster.takeCard([button.value]) self.gameMaster.update_interface() self.activate_action() doc.write( f"hand({len(self.hand)-1}+1={len(self.hand)}) ~/got: {quarter.name};" )
def round(self): for i in range(len(self.queue)): if self.queue[i]: self.controller.active_player = self.queue[i] self.active_player().action(i + 1) doc.write(f"/turn: {self.active_player().name}({self.active_player().character.name});") self.queue[i] = None # это вызовит ошибки в дальнейшем, очередь используется в методах персонажей(я уже не уверен) return print("round is over") self.rounding = False
def choose_character(self, char_name): for char in self.gameMaster.deckChar: if char.name == char_name: char.choosen = True self.charList.append(char) char.player = self char = self.charList[-1] self.charList[-1].x = self.x + char.width * (len(self.charList) - 1) self.charList[-1].y = self.y - char.height self.gameMaster.queue[char.initiative - 1] = self doc.write(f"->pick: {char_name};")
def info(self): quarters = "" built = "" for card in self.hand: quarters += f"{card.name}, " for card in self.city: # built += f"{card.name}{card.value, card.color}, " built += f"{card.name}, " if built == "": built = "None, " if quarters == "": quarters = "None, " doc.write(self.name + ': gold = ' + str(self.gold) + '; quarters = ' + quarters[:-2] + '; city = ' + built[:-2] + ";")
def init(self, names): width = self.controller.get_width() height = self.controller.get_height() hands = [] for i in range(len(names)): hand = [] for j in range(4): hand.append(self.deckQuar.pop(0)) hands.append(hand) pos = [] p_width, p_height = width / 3, height / 2.3 rate = width / len(names) step = rate / len(names) if len(names) == 2: # высчитываем расположение каждого игрока в зависимости от их количества for i in range(len(names)): pos.append([rate * i + step - p_width / 2, height / 2 - p_height / 2, p_width, p_height, colors[i]]) if len(names) == 3: pos.append([rate + step * 1.5, p_height / 2, p_width, p_height, colors[0]]) pos.append([p_width + rate * 2 + step * 1.5,p_height / 2, p_width, p_height, colors[2]]) pos.append([p_width + rate + step * 1.5 , p_height * 2.65, p_width, p_height, colors[1]]) if len(names) == 4: pos.append([p_width * 1.7, p_height * .5, p_width, p_height, colors[0]]) # pos.append([p_width, 0, p_width, p_height, colors[0]]) pos.append([p_width * 3.3, p_height * .5, p_width, p_height, colors[1]]) pos.append([p_width * 3.3, p_height * 2.5, p_width, p_height, colors[3]]) pos.append([p_width * 1.7, p_height * 2.5, p_width, p_height, colors[2]]) if len(names) == 5: pos.append([p_width * 2.75 + p_width * .5, p_height * .5, p_width, p_height, colors[0]]) pos.append([p_width * 4.5, p_height * 2, p_width, p_height, colors[2]]) pos.append([p_width * 4, p_height * 3.5, p_width, p_height, colors[4]]) pos.append([p_width * 2.5, p_height * 3.5, p_width, p_height, colors[3]]) pos.append([p_width * 2, p_height * 2, p_width, p_height, colors[1]]) if len(names) == 6: pos.append([p_width * 2.5, p_height * .5, p_width, p_height, colors[0]]) pos.append([p_width * 4, p_height * .5, p_width, p_height, colors[1]]) pos.append([p_width * 4.5, p_height * 2, p_width, p_height, colors[3]]) pos.append([p_width * 4, p_height * 3.5, p_width, p_height, colors[5]]) pos.append([p_width * 2.5, p_height * 3.5, p_width, p_height, colors[4]]) pos.append([p_width * 2, p_height * 2, p_width, p_height, colors[2]]) if len(names) == 7: pos.append([p_width * 4.5, p_height * .5, p_width, p_height, colors[0]]) pos.append([p_width * 5.5, p_height * 2, p_width, p_height, colors[2]]) pos.append([p_width * 6, p_height * 3.5, p_width, p_height, colors[4]]) pos.append([p_width * 5.25, p_height * 5, p_width, p_height, colors[6]]) pos.append([p_width * 3.75, p_height * 5, p_width , p_height, colors[5]]) pos.append([p_width * 3, p_height * 3.5, p_width, p_height, colors[3]]) pos.append([p_width * 3.5, p_height * 2, p_width, p_height, colors[1]]) self.players.append(Player(names[0], self, hands[0], pos[0], None)) # self.players.append(Player(names[0], self, hands[0], pos[0], AI.Ai(self, self.controller, names[0]))) for i in range(len(names) - 1): self.players.append(Player(names[i + 1], self, hands[i + 1], pos[i + 1], AI.Ai(self, self.controller, names[i + 1]))) # self.players.append(Player(names[i + 1], self, hands[i + 1], pos[i + 1], None)) doc.write("/start")
def prepareChoosHand(self, hide, open): d_open = "" for i in range(hide): self._random_drop(True) for i in range(open): str = self._random_drop(False) if len(str) != 0: d_open += str + ", " if len(d_open) == 0: d_open = "None, " chars = [] str_chars = "" for char in self.deckChar: if not char.choosen: chars.append([char.primImg["open"], char.name]) str_chars += char.name + ", " self.controller.create_buttons(chars, False) self.set_text('выберите персонажа, ' + self.active_player().name) self.controller.shuffle() if self.active_player().ai: # если раунд начинает ИИ self.active_player().ai.setSolution("chooseChar") doc.write(f"/dropped: open({d_open[:-2]}), hide({hide}) ~/active: {str_chars[:-2]};")
def take_resources(self, kind): self.gameMaster.state['resources'] = False if kind == 'gold': doc.write( f"->resources: gold({self.gold}+{self.take['gold']}={self.gold+self.take['gold']});" ) self.gold += self.take["gold"] # print(self.name + ' has gold: ' + str(self.gold) + ", he recived " + str(self.take["gold"]) + " gold") self.setTextRenderer() # обновим золото на столе у игрока self.activate_action() elif kind == 'quarter': cards = self.gameMaster.giveCard(self.take['quarter']) doc.write( f"->resources: quarter({self.take['quarter']}) ~/{self._getRow(cards)}" ) self.gameMaster.controller.del_but('all') if len(cards) == 0: self.activate_action() return if self.all_actions['library_bonus']: str = "" for quar in cards: str += quar.name + ", " self.hand.append(quar) self.gameMaster.update_interface() self.activate_action() doc.write( f"hand({len(self.hand)-self.take['quarter']}+{self.take['quarter']}=" f"{len(self.hand)}) ~/got: {str[:-2]};") return buttons = [] for card in cards: buttons.append([card.primImg["open"], card]) self.gameMaster.controller.create_buttons(buttons, False) self.gameMaster.state['take quarter'] = True self.gameMaster.update_interface()
def info(self): # просто дает информацию о состоянии игры doc.write("~/info") for player in self.players: player.info()