2013-12-18 2 views
0

В моем checkWin() ниже я пытаюсь дать возможность выйти или перезапустить игру, когда игра была выиграна. С тем, что у меня есть, это позволит мне «перезагрузить», но на самом деле это просто позволяет мне продолжать играть с текущей доской. Другими словами, я не могу понять, как начать новую жизнь. Более того, я не думаю, что то, что я сделал в checkWin(), очень чисто. Ищете указатели на то, что делать.Перезапустите игру tictactoe после победы

(я знаю, есть и другие перегибы в этом сценарии, но я работаю одна вещь в то время)

'''Tic-tac-toe game''' 

import sys 
import time 
import random 


def printBoard(): 
    print "\n" 
    print " 1 | 2 | 3 " 
    print "____|____|____" 
    print " 4 | 5 | 6 " 
    print "____|____|____" 
    print " 7 | 8 | 9 " 
    print " | | " 
    print "\n" 

def makeMove(): 
    move = raw_input("\nIt's your turn. Choose a box between 1 and 9: \n") 
    move = int(move) 
    return move 

def boardCurrent(takenSpots): 
    print "",takenSpots[0]," |",takenSpots[1]," |",takenSpots[2]," " 
    print "____|____|____" 
    print "",takenSpots[3]," |",takenSpots[4]," |",takenSpots[5]," " 
    print "____|____|____" 
    print "",takenSpots[6]," |",takenSpots[7]," |",takenSpots[8]," " 
    print " | | " 
    print "\n" 

def compMove(takenSpots): 
    move = random.randint(0,8) 
    if takenSpots[move] == " ": 
     takenSpots[move] = "O" 
    else: 
     compMove(takenSpots) 
    return takenSpots 

def takeSpot(move): 
    if takenSpots[move - 1] != " ": 
     print "That spot is taken, choose another." 
     takeSpot(makeMove()) 
    else: 
     takenSpots[move - 1] = "X" 
    return takenSpots 

def checkWin(takenSpots): 
    win_positions = [ 
    (0, 3, 6), 
    (1, 4, 7), 
    (2, 5, 8), 
    (0, 1, 2), 
    (3, 4, 5), 
    (6, 7, 8), 
    (0, 4, 8), 
    (2, 4, 6), 
    ] 
    for line in win_positions: 
     if all(takenSpots[position] == "X" for position in line): 
      win = True 
      print "You win." 
      if win == True: 
       endgame = int(raw_input("Would you like to play another round?\n1) Yes\n2) No, this sucks. I want to quit.")) 
      if endgame == 1: 
       main() 
      if endgame == 2: 
       sys.exit() 
      return win 
     if all(takenSpots[position] == "O" for position in line): 
      win = True 
      print "The computer won." 
      return win 

def clearBoard(): 
    takenSpots = [" "," "," "," "," "," "," "," "," "] 
    return takenSpots 

def main(): 
    boardCurrent(takeSpot(makeMove())) 
    checkWin(takenSpots) 
    print "Now the computer will go...\n" 
    time.sleep(1) 
    compMove(takenSpots) 
    boardCurrent(takenSpots) 
    checkWin(takenSpots) 

takenSpots = [" "," "," "," "," "," "," "," "," "] 

print "\nWelcome to tic-tac-toe." 
win = False 
printBoard() 
main() 
while win == False: 
    main() 
+0

В 'checkWin()' вы создаете * локальную переменную 'win'. Я уверен, что вы хотите установить * глобальную переменную *. Вам нужно использовать ключевое слово 'global' в начале функции, чтобы сообщить интерпретатору, что вы используете глобальную переменную. –

+0

Я хотел бы сделать игру объектно-ориентированной с классом 'Board' и некоторым классом' Controller' (или просто функцией 'main()'). Класс «Board» должен иметь методы отображения себя, сброса настроек, перемещения и возврата состояния или состояния каждой позиции доски. Ваша функция 'checkwin()' может затем использовать эти методы для определения своего результата и вернуть его в 'main()' или один из методов '' Controller'', который может решить, продолжать ли воспроизведение или объявлять победителя и перезапускать ' (Или создать новый). – martineau

ответ

3

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

while True: 
    program... 

А когда игра выиграна или привязанные, запрашивает у пользователя ввод, как следует ли выйти или перезагрузить:

Enter q to quit or r to restart # for instance 

Если введено q, просто перерыв в цикле while с инструкцией break и завершение программы, или же для перезапуска, возврата назад, перерисовки платы и ну, в основном просто сбросьте любую переменную там, где это необходимо. С некоторыми соображениями для цикла это не слишком сложно.

checkwin:

Я бы повторно оценить полезность/необходимость переменной «выиграть». Это действительно необходимо? Если да, правильно ли он используется? Возможно, если вы реализуете решение while, эта проблема станет более очевидной. Я вижу, что у вас есть цикл, while win == False, но я не уверен, что выигрыш всегда оценивается правильно для ситуации, когда игрок выигрывает.

0
command = 'r' 
while True:     
    if command == 'r': 
     # game # 
     clearBoard() 
     print "\nWelcome to tic-tac-toe." 
     win = False 
     printBoard() 
     main() 
     while win == False: 
      main() 

    elif command == 'e': 
     return 
     break 

    else: 
     print "Invalid command." 

    command = raw_input('Enter r to restart, or e to end game: ') 
+1

Хм .. вы можете немного улучшить этот ответ. Например, не ясно, что он должен, вероятно, называть 'clearBoard():' перед перезапуском игры. Кроме того, в первый раз пользователю не нужно нажимать 'r', чтобы начать игру. –

+0

Большое спасибо за ваше предложение Мики. Я добавил свой оригинальный код в свою структуру, хотя я подозреваю необходимость определения переменной «win». – lennon310

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