2013-09-18 2 views
1

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

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
# Imports 

import time 


def play_game(): 

    # Variables 

    acard = int() 
    bcard = int() 
    apoints = int() 
    bpoints = int() 

    # Repeat 

    repeat = True 

    # Hand out cards 

    print 'Cards have been served' 
    input('\nPress Enter to Reveal') 

    # Cards Turn 

    time.sleep(0.5) 
    t = time.time() 
    acard = int(str(t - int(t))[2:]) % 13 
    print '\nYour card value is ' + str(acard) 

    time.sleep(0.1) 

    t = time.time() 
    bcard = int(str(t - int(t))[2:]) % 13 

    # Number Check & Point Assign 

    time.sleep(2) 
    if acard > 5: 
     apoints += 1 
     print '\nYour points have increased by one, your total is now ' \ 
      + str(apoints) 
    if acard < 5: 
     apoints -= 1 
     print '\nYour points have decreased by one, your total is now ' \ 
      + str(apoints) 
    if bcard > 5: 
     bpoints += 1 
     print '\nYour opponent got ' + str(bcard) \ 
      + ', their points have increased by one,\ntheir total is now ' \ 
      + str(bpoints) 
    if bcard < 5: 
     bpoints -= 1 
     print '\nYour opponent got ' + str(bcard) \ 
      + ', their points have decreased by one,\ntheir total is now ' \ 
      + str(bpoints) 

    # Card Reset 

    bcard = 0 
    acard = 0 

    # Shuffle 

    input('\nPress enter to shuffle deck') 
    print '\nCards being shuffled' 
    time.sleep(1) 
    print '.' 
    time.sleep(1) 
    print '.' 
    time.sleep(1) 
    print '.' 
    print 'Cards have been shuffled' 
    global enda 
    global endb 
    enda = apoints 
    endb = bpoints 


# Loop 

time.sleep(1) 
answer = 'y' 
while answer.lower() == 'y': 
    play_game() 
    answer = input('\nDo you wish to play again? (Y/N)') 

# Scores 

if enda > endb: 
    print '\nYou Win!' 
    print '\nScores' 
    print 'You: ' + str(enda) + ' Opponent: ' + str(endb) 

if endb > enda: 
    print '\nYou Lost!' 
    print '\nScores' 
    print 'You: ' + str(enda) + ' Opponent: ' + str(endb) 
+4

Python не требует, чтобы 'объявить' переменные; 'acard = int()' точно так же, как 'acard = 0', но на самом деле линия избыточна. –

+1

Вместо того, чтобы использовать цифры со времени для ваших случайных значений, я предлагаю использовать «случайный» модуль. Это будет гораздо более случайным! – Blckknght

+0

Для этого я бы использовал класс и задал значения __init__ как ваши переменные (self.acard, self.bcard и т. Д.) И просто создавал новый экземпляр класса после запуска новой игры. @MartijnPieters вам может не понадобиться объявлять переменные в python, но если вы хотите перебирать несколько функций с одинаковыми переменными, вам нужно как-то их хранить. – asdf

ответ

4

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

apoints = 0 
bpoints = 0 

def play_game(): 
    global apoints 
    global bpoints 
    ... 
+0

Не работает, прежде чем дает мне «UnboundLocalError: локальная переменная» «ссылки перед назначением», а после этого они еще не назначены. –

+1

Установите все переменные равными нулю, а затем добавьте их внутри функции – asdf

+0

Не работает, прежде чем дает мне «UnboundLocalError: локальная переменная« apoints », на которую ссылаются перед назначением» –

0

Переместить переменные вне функции и установить те, которые вы используете + = на 0, и так как вы устанавливаете значение ACARD и bcard в функции вам не нужно устанавливать глобальная переменная для него, поскольку она постоянно меняется:

def play_game(apoints: int, bpoints: int): 
    ... 


if __name__ == __main__: 
    apoints = 0 
    bpoints = 0 
    play_game(apoints, bpoints) 
+0

+1 за то, что он дал ему решение, избегая использования глобальных объектов, но он должен был иметь play_game в цикле, который, как я полагаю, вы оставили без внимания только для целей. – Matt

+0

-1 Это не будет работать без инструкции 'global'. Python не работает так. – flornquake

+0

@flornquake вам не нужны глобальные утверждения, потому что значение acard и bcard устанавливается внутри функции и ссылается только внутри этой функции, поэтому их не нужно переносить в любом месте. – asdf

1

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

class GameVariables(object): 

     def __init__(self): 
      self.acard = 0 
      self.bcard = 0 
      self.apoints = 0 
      self.bpoints = 0 

     def reset(self): 
      self.acard = 0 
      self.bcard = 0 
      self.apoints = 0 
      self.bpoints = 0 

    #need to initialize class. 
    gamevar = GameVariables() 

Однако, как утверждают другие, установка переменной = для int() не требуется в python. Лучше было бы просто установить его равным некоторое число:

self.acard = 0

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

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

gamevar.reset() #this will reset variables.

Это будет особенно полезно есть ваши игры получить больше и сложнее. надеюсь это поможет.

+0

Это не питон. Он не будет делать то, что требуется. – Marcin

+0

Я вижу, что это происходит, и я думал, что это сработает, но я получаю эту ошибку: «TypeError: __init __() принимает 0 позиционных аргументов, но 1 дано« –

+1

Это почти Python, но синтаксис перепутался. 'class' неаккалитизирован,' self' отсутствует везде, вызовы 'int()' причудливы, точка с запятой избыточна, и класс должен наследовать от 'object'. – user2357112

1

Характер функций, которые их переменные инициализируются при каждом вызове. Дело в том, что они работают одинаково каждый раз.

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

1

Простейшим изменением, которое вы можете сделать, было бы сделать эти переменные «глобальными».

Так, например:

a = 5 

def myfunc(): 
    print a 
    a = 7 

myfunc() 

не будет работать, так как назначение a в myfunc() делает Python думать, что вы объявляете второй, локальной переменной a в функции. Вы можете использовать глобальную переменную, делая это:

a = 5 

def myfunc(): 
    global a 
    print a 
    a = 7 

myfunc() 

Это явно указано, что вы хотите, чтобы все ссылки на a внутри функции для обозначения определены глобально a.

Что может ввести в заблуждение в том, что если вы не приписывая a в функции, то она будет относиться к переменной, определенной вне функции в пределах объема работы функции:

a = 5 

def myfunc(): 
    print a 

myfunc() 

(Это печатает номер 5 .)

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

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

В своем коде, что делает эти переменные глобальные изменит эту часть:

def play_game(): 

    # Variables 

    acard = int() 
    bcard = int() 
    apoints = int() 
    bpoints = int() 

к этому:

acard = int() 
bcard = int() 
apoints = int() 
bpoints = int() 

def play_game(): 

    # Variables 

    global acard 
    global bcard 
    global apoints 
    global bpoints 

# etc. 

Еще одна мысль: Используя что-то вроде

apoints = int() 

потому что вы хотите «объявить» переменную как целое число, вероятно, не имеет эффекта, который, по вашему мнению, имеет место. Это вполне допустимо в Python, чтобы сделать это:

apoints = int() 
print(apoints) 

apoints = 5.0 
print(apoints) 

apoints = "My string" 
print(apoints) 

так что делает apoints ИНТ не делает переменную целое всегда и навсегда. Вы, вероятно, лучше назначить явное значение переменной:

apoints = 0 

Это свойство Python переменной ввода называется «утка набора текста.»

http://en.wikipedia.org/wiki/Duck_typing

1

Вот код преобразуется в класс на основе программирования:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
# Imports 

import time 

class Play_Game: 

    def __init__(self): 
     self.apoints = 0 
     self.bpoints = 0 

    def play_game(self): 

     repeat = True 
     print 'Cards have been served' 
     raw_input('\nPress Enter to Reveal') 

     # Cards Turn 

     time.sleep(0.5) 
     t = time.time() 
     acard = int(str(t - int(t))[2:]) % 13 
     print '\nYour card value is ' + str(acard) 

     time.sleep(0.1) 

     t = time.time() 
     bcard = int(str(t - int(t))[2:]) % 13 

     # Number Check & Point Assign 

     time.sleep(2) 
     if acard > 5: 
      self.apoints += 1 
      print '\nYour points have increased by one, your total is now ' \ 
       + str(self.apoints) 
     elif acard < 5: 
      self.apoints -= 1 
      print '\nYour points have decreased by one, your total is now ' \ 
       + str(self.apoints) 
     elif bcard > 5: 
      self.bpoints += 1 
      print '\nYour opponent got ' + str(bcard) \ 
       + ', their points have increased by one,\ntheir total is now ' \ 
       + str(self.bpoints) 
     elif bcard < 5: 
      self.bpoints -= 1 
      print '\nYour opponent got ' + str(bcard) \ 
       + ', their points have decreased by one,\ntheir total is now ' \ 
       + str(self.bpoints) 
     else: 
      pass 

     # Shuffle 

     raw_input('\nPress enter to shuffle deck') 
     print '\nCards being shuffled' 
     time.sleep(1) 
     print '.' 
     time.sleep(1) 
     print '.' 
     time.sleep(1) 
     print '.' 
     print 'Cards have been shuffled' 
     return 

    def check_winner(self): 
     if self.apoints > self.bpoints: 
      print '\nYou Win!' 
      print '\nScores' 
      print 'You: ' + str(self.apoints) + ' Opponent: ' + str(self.bpoints) 

     else: 
      print '\nYou Lost!' 
      print '\nScores' 
      print 'You: ' + str(self.apoints) + ' Opponent: ' + str(self.bpoints) 
     return 


if __name__ == '__main__': 

    time.sleep(1) 
    answer = 'y' 
    current_game = Play_Game() 
    while answer.lower() == 'y': 
     current_game.play_game() 
     current_game.check_winner() 
     answer = raw_input('\nDo you wish to play again? (Y/N)') 
Смежные вопросы