2014-02-12 3 views
2

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

def game(P1,P2,board): 
    P1 = 0 
    P2 = 0 
    for x in range(len(board)): 
     if x%2 == 0: 
      move = greedy(board) 
      P1 += board[move] 
      board.remove(board[move]) 
     else: 
      move = zoomin(board) 
      P2 += board[move] 
      board.remove(board[move]) 
    if P1 > P2: 
     return 1 
    elif P1 == P2: 
     return 0.5 
    else: 
     return 0 

Эта стратегия всегда предполагает, что P1 является жадной функцией, но мне нужно иметь возможность играть в первую очередь. Я думал, что я мог бы пройти в функциях, поэтому мой призыв будет

game(greedy,zoomin,board) 

, но я не знаю, как на самом деле реализовать его так, что он может распознать, кто играет первым.

Заранее благодарю вас за помощь!

EDIT:

Вот моя жадная и ZoomIn функция:

def greedy(board): 
    if board[0] > board[len(board)-1]: 
     #returns position of first item 
     return 0 
    elif board[len(board)-1] > board[0]: 
     #returns position of last item 
     return len(board)-1 
    else: 
     #if board[-1] == board[0] 
     return 0 

def zoomin(board): 
    if len(board)%2 == 0: 
     evens = 0 
     odds = 0 
     for x in range(len(board)): 
      if x%2 ==0: 
       evens += board[x] 
      else: 
       odds += board[x] 
     if evens > odds: 
      return 0 
     else: 
      return len(board)-1 
    else: 
     #choose the larger value (greedy) 
     if board[0] < board[len(board)-1]: 
      return len(board)-1 
     else: 
      return 0 
+0

Пожалуйста, также разместите свои функции 'жадные 'и' zoomin'. – senshin

+0

Спасибо, я сделал это. – AbigailB

+0

* «но я не уверен, как его реализовать, чтобы он мог распознать, кто играет первым». * - Я не понимаю, почему это * это *, это проблема для вас, поскольку у вас уже есть метод для определения этого в вашем текущем коде (в том, что сначала играет P1). Почему вы чувствуете, что это изменяется только потому, что вы передаете функции в качестве аргументов? – Dolda2000

ответ

2

Вы хотите немного переписать game функции. Обратите внимание, что ваша функция game принимает P1 и P2, но вы ничего не делаете с ними - вы сразу же назначаете 0 обоим из них.

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

def game(strategy1, strategy2, board): 

Вам также необходимо заменить явные вызовы greedy и zoomin в теле функции (например, move = greedy(board)) с вызовами стратегий, принятых в вашей функции вместо этого - что-то вроде move = strategy1(board).

Тогда для того, чтобы иметь greedy играть первый и zoomin играть вторую, можно назвать:

game(greedy, zoomin, board) 

Или, если вы хотите zoomin первый и greedy второй, вы могли бы назвать:

game(zoomin, greedy, board) 

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

+0

Это имеет смысл! Я думал, что на самом деле мне приходилось вводить код в стратегии вместо того, чтобы передавать их в любом порядке. СПАСИБО! :) – AbigailB

+0

Поскольку вы попросили общий совет - ответ от @ Dolda2000 является более общим решением и лучшим примером того, как думать в Python. –

4

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

def game(players, board): 
    scores = [0] * len(players) 
    while i in range(len(board)) 
     p = i % len(players) 
     move = players[p](board) 
     scores[p] += board[move] 
     del board[move] # <-- This is also a faster and more fail-safe version of your "board.remove(board[move])" 
    return scores 

Вы можете назвать эту функцию game([greedy, zoomin], board). Также обратите внимание, как он распространяется на произвольное количество игроков, хотя это может и не быть полезным для вас.:)

+0

Спасибо! Я посмотрю на оптимизацию моего кода. :) – AbigailB

+2

@AbigailB: Имейте в виду, что в этом случае речь идет скорее о когнитивной избыточности, чем о оптимизации производительности. Сведение к минимуму дублирования кода в первую очередь полезно для поддержания кода. Например, если вы хотите изменить игру игры или исправить ошибку или что-то в этом роде, вам не нужно делать изменения в двух или более местах, но только в одном месте. Хотя это не проблема в вашем случае, это такие вещи, которые могут сделать большие проекты незаменимыми через некоторое время. – Dolda2000

Смежные вопросы