weranda
@weranda

Как правильно решить простую задачу с передачей ходов игрокам с помощью Python и где в ней ошибки?

Приветствую

Попробовал решить задачу, но из-за отсутствия практики решал ее долго и чувствую, что решение это не оптимально. К примеру, через каждый параметр функции передается имя игрока, а чувствую, что возможно не нужно передавать каждый раз и есть простое решение.

Расскажите пожалуйста об ошибках, допущенных в решении задачи, где, что и как переделать и почему?

Правила игры
На столе лежат сто монет. За ход одному игроку разрешается взять до десяти монет. Проигрывает тот игрок, которому нечего взять.


import random

# случайный выбор игрока и передача хода
def player_choise(players):
	player = random.choice(players)
	print('Первый ход достался: ', player, '\n-----------------------------------\n')
	check_summ(player)


# проверка суммы и определение проигравшего игрока
def check_summ(player):
	if summ < 100:
		check_count(player)
	else:
		print('\n-----------------------------------\nИГРА ОКОНЧЕНА\nПРОИГРАЛ: ', player)


# проверка допустимого диапазона ввода
def check_count(player):
	if summ <= 90:
		max_enter = 10
	else:
		max_enter = 100 - summ
	player_move(player, max_enter)


# ход игрока
def player_move(player, max_enter):
	global summ
	x = None
	print('Монет забрано / осталось: ', summ, '/', 100 - summ)
	print('Вы можете забрать до', max_enter, 'монет')
	print('Ходит игрок: ', player.upper())
	while x not in range(1, max_enter + 1):
		x = int(input('Введите количество монет: '))
	summ += x
	print('\n')
	player_change(player)


# смена игроков
def player_change(player):
	if (players.index(player) + 2) > len(players):
		player = players[0]
		check_summ(player)
	else:
		player = players[players.index(player) + 1]
		check_summ(player)


summ = 0
players = ['Cat', 'Dog', 'Spider', 'Mouse']
player_choise(players)
  • Вопрос задан
  • 783 просмотра
Решения вопроса 3
chupasaurus
@chupasaurus
Сею рефлекторное, злое, временное
Мои ненужные советы:
  • Вместо передачи игрока в функции, держать глобальную переменную с индексом активного игрока.
  • Вместо вызова одной функции и рекурсии, которая только мешает читать код, лучше разбить на что-то типа
    initGame(players) //Заводим игроков и даем право первого хода
    	while(check_summ): //перед каждым ходом проверяем оставшуюся сумму
    	    playerMove()
    	    playerChange()
    	endGame() //выводим результаты игры


  • По массиву удобнее бегать , вычитая из индекса текущего игрока длину массива ±1 в зависимости от направления:
    def playerChange():
    playerActive = players[playerActive-len(players)+1].index()

Ответ написан
qmax
@qmax
программер
Я нифига не понял вашего вопроса и какие у вас проблемы.
Но вот вам совсем неправильное решение. Параметр имени вобще не передавался.
Подумайте об этом.

import random
from itertools import cycle

def game():
    bank = 100
    while bank > 0:
        bank -= yield bank
        print("...осталось", bank)
    print("game over!")
    yield None

def player(name):
    print("Я", name, "!")
    have = 0
    rest = yield 0
    while have < 100500:
        take = random.randint(1, min(10, rest))
        have += take
        print(name, "взял" + name[7:8], take)
        rest = yield take
        if rest is None:
            print(name, "лошара!")
            break
        if name[0] == 'К' and random.random() > .5:
            print("Да ну вас нафег, пусть за меня Вася играет!")
            yield from player("Вася")


def play(game, *players):
    take = None
    [p.send(None) for p in players]
    for player in cycle(players):
        try:
            rest = game.send(take)
            take = player.send(rest)
        except StopIteration:
            break

play(game(), player("Ослик"), player("Суслик"), player("Паукан"), player("Кисонька"))
Ответ написан
Комментировать
angru
@angru
Еще вариант:

import random
import itertools


def take_coins(max_coins):
    while True:
        raw_coins = input('возьмите монеты[{}..{}]'.format(1, max_coins))

        try:
            coins = int(raw_coins)

            if not 1 <= coins <= max_coins:
                raise ValueError()
        except ValueError as ex:
            print('неверные данные')
        else:
            return coins


def game(coins, players):
    players = random.sample(players, len(players))

    for player in itertools.cycle(players):
        if coins == 0:
            print('игрок {} проиграл'.format(player))
            break
        else:
            print('{} ходит'.format(player))
            coins -= take_coins(min(10, coins))

            print('осталось {} монет'.format(coins))


if __name__ == '__main__':
    game(coins=100, players=['Вася', 'Петя'])
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы