2016-06-08 1 views
-2

Я отправил что-то подобное ранее, но я сделал ужасную работу, задав правильный вопрос. Я пытаюсь закодировать двух игроков, подключающих четыре игры, но может управлять только игроком в 1 игрок, когда пользователь играет против компьютера. Может ли кто-нибудь помочь мне с попыткой написать 2-игровой подход к игре? Я все еще довольно новичок и все еще изучаю веревки, поэтому извиняюсь, если это еще не очень хороший вопрос и/или слишком расплывчато.Редактировать: Python - Переход от 1 игрока к игре с двумя игроками с использованием функций

Вот мой текущий код:

import random 

def winner(board): 

# Check rows 
    for row in range(6): 
     for col in range(3): 
      if (board[row][col] == board[row][col + 1] == board[row][col + 2] == board[row][col + 3]) and (board[row][col] != " "): 
       return board[row][col] 

    # Check columns 
    for col in range(6): 
     for row in range(3): 
      if (board[row][col] == board[row + 1][col] == board[row + 2][col] == board[row + 3][col]) and (board[row][col] != " "): 
       return board[row][col] 

    # Check diagonal A 

    for row in range(3): 
     for col in range(4): 
      if (board[row][col] == board[row + 1][col + 1] == board[row + 2][col + 2] == board[row + 3][col + 3]) and (board[row][col] != " "): 
       return board[row][col] 


    # Check diagonal B 

    for row in range(5, 2, -1): 
     for col in range(3): 
      if (board[row][col] == board[row - 1][col + 1] == board[row - 2][col + 2] == board[row - 3][col + 3]) and (board[row][col] != " "): 
       return board[row][col] 

    # Tie (just returns an empty string) 
    return "" 

def printBoard(board): 
# there are probably better ways to print a board, but I didn"t want to bother with another function, especially since the number of columns and rows are fixed in this game. 

    print (" 1 2 3 4 5 6 7") 
    print ("1: " + board[0][0] + " | " + board[0][1] + " | " + board[0][2] + " | " + board[0][3] + " | " + board[0][4] + " | " + board[0][5] + " | " + board[0][6] + " | " + board[0][7]) 
    print (" ---+---+---+---+---+---+---") 
    print ("2: " + board[1][0] + " | " + board[1][1] + " | " + board[1][2] + " | " + board[1][3] + " | " + board[1][4] + " | " + board[1][5] + " | " + board [1][6] + " | " + board [1][7]) 
    print (" ---+---+---+---+---+---+---+") 
    print ("3: " + board[2][0] + " | " + board[2][1] + " | " + board[2][2] + " | " + board[2][3] + " | " + board [2][4] + " | " + board [2][5] + " | " + board [2][6] + " | " + board [2][7]) 
    print (" ---+---+---+---+---+---+---+") 
    print ("4: " + board[3][0] + " | " + board[3][1] + " | " + board[3][2] + " | " + board[3][3] + " | " + board [3][4] + " | " + board [3][5] + " | " + board [3][6] + " | " + board [3][7]) 
    print (" ---+---+---+---+---+---+---+") 
    print ("5: " + board[4][0] + " | " + board[4][1] + " | " + board[4][2] + " | " + board[4][3] + " | " + board [4][4] + " | " + board [4][5] + " | " + board [4][6] + " | " + board [4][7]) 
    print (" ---+---+---+---+---+---+---+") 
    print ("6: " + board[5][0] + " | " + board[5][1] + " | " + board[5][2] + " | " + board[5][3] + " | " + board [5][4] + " | " + board [5][5] + " | " + board [5][6] + " | " + board [5][7]) 
    print 

def playerMove(board): 

     validMove = False 
     while not validMove: 
      col = input("What column would you like to play? :") 
      for row in range (6,0,-1): 
       if (1 <= int(row) <= 6) and (1 <= int(col) <= 7) and (board[int(row)-1][int(col)-1] == " "): 
        board[int(row)-1][int(col)-1] = "X" 
        validMove = True 
        break 
      else: 
       print ("Invalid input. Please try again!\n") 

def computerTurn(board): 

    validMove = False 
    while not validMove: 
     row = random.randint(0,5) 
     col = random.randint(0,6) 
     for row in range (5,0,-1): 
      if board[row][col] == " ": 
       board[row][col] = "O" 
       validMove = True 
       break 


def game(): 
    openCells = 42 
    playerTurn = True 
    count = 1 
    newBoard = [ [ " ", " ", " ", " ", " ", " "," ", " "], [ " ", " ", " ", " ", " "," ", " ", " "], [ " ", " ", " ", " ", " ", " ", " ", " "], [ " ", " ", " ", " ", " ", " ", " ", " "], [ " ", " ", " ", " ", " ", " ", " ", " "], [ " ", " ", " ", " ", " ", " ", " ", " "] ] 


    while not winner(newBoard) and (openCells > 0): 
     printBoard(newBoard) 
     if playerTurn: 
      playerMove(newBoard) 
      playerTurn = not playerTurn 
     else: 
      computerTurn(newBoard) 
      playerTurn = not playerTurn 
     openCells -= 1 

    printBoard(newBoard) 
    if (winner(newBoard) == "X"): 
     print ("You Won!") 


     print ("\nGAME OVER") 
    elif (winner(newBoard) == "O"): 
     print ("The Computer Won!") 
     print ("\nGAME OVER") 
    else: 
     print ("Tie!") 
     print ("\nGAME OVER \n") 

EDIT: Я изменил мой код, чтобы я избавилась от функции computerTurn и включена 2 входа пользователя в моей функции playerMove, однако моя игра продолжает цикл назад к игроку вместо входных переменных. Вот новый код (обратите внимание, что только за последние пару функций были изменены):

def playerMove(board): 
    turn = 0 
    players = [] 
    numPlayers = 2 
    checkers = ['X','O'] 
    for i in range(numPlayers): 
     players.append(input("Please enter player"+str(i+1)+" name: ")) 

    validMove = False 
    while not validMove: 
     col = input(players[turn]+" what column would you like to play? :") 
     for row in range (6,0,-1): 
      if (1 <= int(row) <= 6) and (1 <= int(col) <= 7) and (board[int(row)-1][int(col)-1] == " "): 
       board[int(row)-1][int(col)-1] = "X" 
       validMove = True 
       break 
      else: 
       print ("Invalid input. Please try again!\n") 

def game(): 
    openCells = 42 
    playerTurn = True 
    turn = 0 
    players = [] 
    numPlayers = 2 
    count = 1 
    newBoard = [ [ " ", " ", " ", " ", " ", " "," ", " "], [ " ", " ", " ", " ", " "," ", " ", " "], [ " ", " ", " ", " ", " ", " ", " ", " "], [ " ", " ", " ", " ", " ", " ", " ", " "], [ " ", " ", " ", " ", " ", " ", " ", " "], [ " ", " ", " ", " ", " ", " ", " ", " "] ] 


    while not winner(newBoard) and (openCells > 0): 
     printBoard(newBoard) 
     playerMove(newBoard) 
     playerTurn = not playerTurn 
     openCells -= 1 

    printBoard(newBoard) 
    if (winner(newBoard) == "X"): 
     print ("You Won!") 


     print ("GAME OVER") 
    elif (winner(newBoard) == "O"): 
     print ("The Computer Won!") 
     print ("GAME OVER") 
    else: 
     print ("Tie!") 
     print ("GAME OVER") 


game() 
+0

Что вы пробовали до сих пор для достижения функциональности 2-х игроков? Где вы застряли? –

+0

Поэтому вместо определения функции computerTurn я попытался включить 2 пользовательских ввода в функцию userMove. Это позволяет вводить и работает, но я не могу получить функцию выполнения игры (def game()) для координации с функцией userMove самостоятельно. – greatdonut

+0

Попробуйте путь ООП, сделайте 2 объекта для 2 пользователей с параметрами и переместите имя игрока в __init__ и статическую функцию для вычисления материала между деталями из 2 игроков, чтобы определить победителя. –

ответ

0

Я нашел более простой способ: Я сделал новую функцию, playerMoveO и переименовал ваш старый playerMoveX. Я сделал playerMoveO выглядеть следующим образом:

def playerMoveO(board): 

    validMove = False 
    while not validMove: 
     col = input("You are the O player. What column would you like to play? :") 
     for row in range (6,0,-1): 
      if (1 <= int(row) <= 6) and (1 <= int(col) <= 7) and (board[int(row)-1][int(col)-1] == " "): 
       board[int(row)-1][int(col)-1] = "O" 
       validMove = True 
       break 
     else: 
      print ("Invalid input. Please try again!\n") 

Я также изменил playerMoveX выглядеть следующим образом:

def playerMoveX(board): 

    validMove = False 
    while not validMove: 
     col = input("You are the X player. What column would you like to play? :") 
     for row in range (6,0,-1): 
      if (1 <= int(row) <= 6) and (1 <= int(col) <= 7) and (board[int(row)-1][int(col)-1] == " "): 
       board[int(row)-1][int(col)-1] = "X" 
       validMove = True 
       break 
     else: 
      print ("Invalid input. Please try again!\n") 

Затем я изменил основной цикл, но я заменил функцию computerTurn с playerMoveO. Он отлично работает: D

EDIT Очевидно, что существует более чистый способ. В этом случае функция playerMove передает текущий символ. Итак:

def playerMove(board, symbol): 

    validMove = False 
    while not validMove: 
     col = input("You are the {} player. What column would you like to play? :".format(symbol)) 
     for row in range (6,0,-1): 
      if (1 <= int(row) <= 6) and (1 <= int(col) <= 7) and (board[int(row)-1][int(col)-1] == " "): 
       board[int(row)-1][int(col)-1] = symbol 
       validMove = True 
       break 
     else: 
      print ("Invalid input. Please try again!\n") 

И в главном цикле, есть переменная, currentSymbol, которая меняется после каждого хода:

def game(): 
openCells = 42 
playerTurn = True 
count = 1 
newBoard = [ [ " ", " ", " ", " ", " ", " "," ", " "], [ " ", " ", " ", " ", " "," ", " ", " "], [ " ", " ", " ", " ", " ", " ", " ", " "], [ " ", " ", " ", " ", " ", " ", " ", " "], [ " ", " ", " ", " ", " ", " ", " ", " "], [ " ", " ", " ", " ", " ", " ", " ", " "] ] 
currentSymbol = "X" 

while not winner(newBoard) and (openCells > 0): 
    printBoard(newBoard) 
    playerMove(newBoard, currentSymbol) 
    if currentSymbol == "X": currentSymbol = "O" 
    elif currentSymbol == "O": currentSymbol = "X" 
    openCells -= 1 

printBoard(newBoard) 
if (winner(newBoard) == "X"): 
    print ("X Won!") 


    print ("\nGAME OVER") 
elif (winner(newBoard) == "O"): 
    print ("O Won!") 
    print ("\nGAME OVER") 
else: 
    print ("Tie!") 
    print ("\nGAME OVER \n") 
+0

Он работает! Не могу поверить, что я не думал просто рассматривать компьютерную функцию как пользовательскую, а затем редактировал ее соответствующим образом. Спасибо за прекрасное решение! – greatdonut

+0

Да! @greatdonut, я только что отредактировал свой ответ, есть лучший способ сделать это. –

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