zalidael
zalidael

Reputation: 149

How to make randint change for every game and why does game suddenly quit? Python

I'm working on a 2-player battleship game in Python. There are a few problems with the following code that I was hoping you could help me out with:

  1. The ships coordinates do not get reallocated after each successive game. So if you found where the ship was in the first game you could just keep typing in those coordinates and win every game after that until you quit.

  2. The game seems to randomly quit after (15/16?) or so turns. There is no 'Thanks for playing!' message and the program just closes. If you notice any other bugs yourself please point them out.

Thank you all for your help in advance!

from random import randint

game_board = []
player_one = {
    "name": "Player 1",
    "wins": 0,
    "lose": 0
}
player_two = {
    "name": "Player 2",
    "wins": 0,
    "lose": 0
}


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

def show_board(board):
    print("Find and sink the ship!")
    for row in board:
        print(" ".join(row))

# Defining ships locations
def load_game(board):
    print("WELCOME TO BATTLESHIP!")
    print("START")
    del board[:]
    build_game_board(board)
    show_board(board)
    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

    else:
        return player_two

# Allows new game to start
def play_again():
    answer = input("Would you like to play again? ")
    if answer == "yes" or answer == "y":
        ship_points = load_game(game_board)

    else:
        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("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":
            print("You guessed that one already.")

        else:
            print("You missed my battleship!")
            board[guess_row][guess_col] = "X"
        show_board(game_board)

    else:
        return 0


def main():
    begin = input('Type \'start\' to begin: ')
    while (begin != str('start')):
        begin = input('Type \'start\' to begin: ')
    for games in range(3):
        for turns in range(6):

            if player_turns(turns) == player_one:
                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 == 6:
                print("The game is a draw")
                play_again()
if __name__ == "__main__":
    main()

Upvotes: 0

Views: 44

Answers (1)

Max
Max

Reputation: 11

For the ships not relocating, you are setting a new local variable rather than changing the ship_points. Just calling the global ship_points should fix it.

def play_again():
   global ship_points
    answer = input("Would you like to play again? ")
    if answer == "yes" or answer == "y":
        ship_points = load_game(game_board)

    else:
        print("Thanks for playing!")
        exit()

For the randomly quitting, the loop was ending and ending the code. for turns in range(6) will return turns from 0 to 5 not 1 to 6 meaning it will never equal 6. In this case, turns equaling 5 will be the sixth turn.

if turns == 5:
    print("The game is a draw")
    play_again()

I've also changed the elif to if as it won't run the code if it is a player's turn.

Upvotes: 1

Related Questions