2017-06-01 43 views
0

我正在用python制作一个2人战舰游戏。我已经让每个'游戏'总共有6回合(每个玩家3回合),之后会出现一条消息,说'转数已经结束'。当玩家的回合数= 6时程序退出。蟒蛇战列舰游戏

一旦发生这种情况,他们将被要求再次玩。如果他们回答'是'或'是',游戏应该重新加载。但事实并非如此。板加载但程序退出。我相信问题在于我的play_again()函数,但我不太确定它是什么。

我想让玩家可以玩他们想玩的游戏,直到他们决定回答“否”或“n”。我如何去实现这个?

from random import randint 


game_board = [] 

player_one = { 
    "name": "Player 1", 
    "wins": 0, 
} 

player_two = { 
    "name": "Player 2", 
    "wins": 0, 
} 

colors = {"reset":"\033[00m", 
      "red":"\033[91m", 
      "blue":"\033[94m", 
      "cyan":"\033[96m" 
       } 


# Building our 5 x 5 board 
def build_game_board(board): 
    for item in range(5): 
     board.append(["O"] * 5) 

def show_board(board): 
    for row in board: 
     print(" ".join(row)) 

# Defining ships locations 
def load_game(board): 
    print("WELCOME TO BATTLESHIP!") 
    print("Find and sink the ship!") 
    del board[:] 
    build_game_board(board) 
    print(colors['blue']) 
    show_board(board) 
    print(colors['reset']) 
    ship_col = randint(1, len(board)) 
    ship_row = randint(1, len(board[0])) 
    return { 
     'ship_col': ship_col, 
     'ship_row': ship_row, 
    } 

ship_points = load_game(game_board) 


# Players will alternate turns. 
def player_turns(total_turns): 

    if total_turns % 2 == 0: 
     total_turns += 1 
     return player_one 

    return player_two 

# Allows new game to start 
def play_again(): 

    positive = ["yes", "y"] 
    negative = ["no", "n"] 

    global ship_points 

    while True: 
     answer = input("Play again? [Y(es)/N(o)]: ").lower().strip() 
     if answer in positive: 
      ship_points = load_game(game_board) 
      break 

     elif answer in negative: 
      print("Thanks for playing!") 
      exit() 

# What will be done with players guesses 
def input_check(ship_row, ship_col, player, board): 
    guess_col = 0 
    guess_row = 0 
    while True: 
     try: 
      guess_row = int(input("Guess Row:")) - 1 
      guess_col = int(input("Guess Col:")) - 1 
     except ValueError: 
      print("Enter a number only: ") 
      continue 
     else: 
      break 
    match = guess_row == ship_row - 1 and guess_col == ship_col - 1 
    not_on_game_board = (guess_row < 0 or guess_row > 4) or (guess_col < 0 or guess_col > 4) 

    if match: 
     player["wins"] += 1 
     print("Congratulations! You sunk my battleship!") 
     print('The current match score is %d : %d (Player1 : Player2)' % (player_one["wins"], player_two["wins"])) 
     print("Thanks for playing!") 
     play_again() 

    elif not match: 
     if not_on_game_board: 
      print("Oops, that's not even in the ocean.") 

     elif board[guess_row][guess_col] == "X" or board[guess_row][guess_col] == "Y": 
      print("You guessed that one already.") 

     else: 
      print("You missed my battleship!") 
      if player == player_one: 
       board[guess_row][guess_col] = "X" 
      else: 
       board[guess_row][guess_col] = "Y" 

     print(colors['cyan']) 
     show_board(game_board) 
     print(colors['reset']) 

    else: 
     return 0 


def main(): 
    begin = input('Type \'start\' to begin: ') 
    while (begin != str('start')): 
     begin = input('Type \'start\' to begin: ') 

    for turns in range(6): 

     if player_turns(turns) == player_one: 
      print(ship_points) 
      print("Player One") 
      input_check(
       ship_points['ship_row'], 
       ship_points['ship_col'], 
       player_one, game_board 
      ) 

     elif player_turns(turns) == player_two: 
      print("Player Two") 
      input_check(
       ship_points['ship_row'], 
       ship_points['ship_col'], 
       player_two, game_board 
      ) 

     if turns == 5: 
      print("The number of turns has ended.") 
      print(colors['red']) 
      show_board(game_board) 
      print(colors['reset']) 
      print('The current match score is %d : %d (Player1 : Player2)' % (player_one["wins"], player_two["wins"])) 
      play_again() 

if __name__ == "__main__": 
    main() 

回答

1

这也为我工作,当我在你的play_again添加了调用到main()函数:

# Allows new game to start 
def play_again(): 

    positive = ["yes", "y"] 
    negative = ["no", "n"] 

    global ship_points 

    while True: 
     answer = input("Play again? [Y(es)/N(o)]: ").lower().strip() 
     if answer in positive: 
      ship_points = load_game(game_board) 
      main() 
      break 

     elif answer in negative: 
      print("Thanks for playing!") 
      exit() 
+0

工作正常, 谢谢。 – zalidael

1

尝试修改main有:

turns = 0 
while turns < 6: 
    # Process turn... 
    if turns == 5: 
     # Show endgame board 
     if play_again(): 
      turns = -1 
    turns += 1 

而且具有play_again上积极投入['y', 'yes']False否则返回True

0

问题是您的play_again()呼叫在收到“Y”作为答案时,会加载该电路板,但只是返回。哪里?那么,到它被称为的地方 - for循环main()。不幸的是,这是for循环的最后一次迭代,所以循环结束,程序退出。

你应该已经把另一个循环周围的for循环:

while True: 
    for turns in range(6): 
     ...