Python Forum
Game not letting player 1 win straight away
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Game not letting player 1 win straight away
#1
I'm making a two player noughts and crosses game, and when player one wins, it asks player two to make a move before ending the game. I don't know how to get it to end the game straight away if player 1 wins. Also, at the end of the code, I'm not sure how to get the code to restart or end depending on the user's input. Any help, please?

grid = [1, 2, 3,
        4, 5, 6,
        7, 8, 9]

gridSave = [1, 2, 3,
            4, 5, 6,
            7, 8, 9]

gameRun = True


def show():                                         # creates the gameplay grid
    print(grid[0], '|', grid[1], '|', grid[2])
    print('----------')
    print(grid[3], '|', grid[4], '|', grid[5])
    print('----------')
    print(grid[6], '|', grid[7], '|', grid[8])

def checkX():                                       # checks if player 1 (X) has a line

    gameRun = True
    
    if grid[0] == 'X' and grid[1] == 'X' and grid[2] == 'X':
        print("Player one wins!")
        gameRun = False
    
    if grid[3] == 'X' and grid[4] == 'X' and grid[5] == 'X':
        print("Player one wins!")
        gameRun = False

    if grid[6] == 'X' and grid[7] == 'X' and grid[8] == 'X':
        print("Player one wins!")
        gameRun = False
        

    if grid[0] == 'X' and grid[3] == 'X' and grid[6] == 'X':
        print("Player one wins!")
        gameRun = False

    if grid[1] == 'X' and grid[4] == 'X' and grid[7] == 'X':
        print("Player one wins!")
        gameRun = False

    if grid[2] == 'X' and grid[5] == 'X' and grid[8] == 'X':
        print("Player one wins!")
        gameRun = False
        

    if grid[0] == 'X' and grid[4] == 'X' and grid[8] == 'X':
        print("Player one wins!")
        gameRun = False

    if grid[2] == 'X' and grid[4] == 'X' and grid[6] == 'X':
        print("Player one wins!")
        gameRun = False

    return gameRun

def checkY():                                       # checks if player 2 (Y) has a line

    gameRun = True
    
    if grid[0] == 'Y' and grid[1] == 'Y' and grid[2] == 'Y':
        print("Player one wins!")
        gameRun = False
    
    if grid[3] == 'Y' and grid[4] == 'Y' and grid[5] == 'Y':
        print("Player one wins!")
        gameRun = False

    if grid[6] == 'Y' and grid[7] == 'Y' and grid[8] == 'Y':
        print("Player one wins!")
        gameRun = False
        

    if grid[0] == 'Y' and grid[3] == 'Y' and grid[6] == 'Y':
        print("Player one wins!")
        gameRun = False

    if grid[1] == 'Y' and grid[4] == 'Y' and grid[7] == 'Y':
        print("Player one wins!")
        gameRun = False

    if grid[2] == 'Y' and grid[5] == 'Y' and grid[8] == 'Y':
        print("Player one wins!")
        gameRun = False
        

    if grid[0] == 'Y' and grid[4] == 'Y' and grid[8] == 'Y':
        print("Player one wins!")
        gameRun = False

    if grid[2] == 'Y' and grid[4] == 'Y' and grid[6] == 'Y':
        print("Player one wins!")
        gameRun = False

    return gameRun

show()

while gameRun == True:                          # main game

    inputX = input("Player one, please select a spot: ")
    inputX = (int(inputX) - 1)
    
    if grid[inputX] != 'X' and grid[inputX] != 'O':
        grid[inputX] = 'X'

    else:
        print("This space is taken!")

    gameRun = checkX()

    show()

    inputY = input("Player two, please select a spot: ")
    inputY = (int(inputY) - 1)
    
    if grid[inputY] != 'X' and grid[inputY] != 'O':
        grid[inputY] = 'O'

    else:
        print("This space is taken!")

    show()

    gameRun = checkX()

    

if gameRun == False: 

    playAgain = input("The game is now finished! Play again? (Y/N)")
    if playAgain == 'Y':
        gameRun = True

    if playAgain == 'N':
        print("Goodbye!")
Reply
#2
I'm not going to rewrite it for you, but it looks like gameRun already tracks whether or not someone won.  So you could just do something like:
while True:
    gameRun = True
    while gameRun:
        # player 1
        gameRun = checkX()
        if gameRun:
            # player 2
            gameRun = checkY()
    keep_playing = input("Want to play again? [Y/n] ")
    if keep_playing.lower() != "y":
        break
Reply
#3
A couple things that might help you:

>>> a = [1, 1, 1]
>>> a[0] == a[1] == a[2] == 1
True
and:

lines = [(0, 1, 2), (3, 4, 5), (6, 7, 8), ...]
for a, b, c in lines:
    if grid[a] == grid[b] == grid[c] == 'X':
        print('Player one wins!')
        ...
Craig "Ichabod" O'Brien - xenomind.com
I wish you happiness.
Recommended Tutorials: BBCode, functions, classes, text adventures
Reply
#4
I'm kinda confused, not to be annoying, but I really don't understand the code either of you have sent, or like, where it's supposed to go? This code's really confusing me, haha.
Reply
#5
Nilamo's code is an outline of how your program might be run. The player1 and player2 comments show where you would get the moves from those players.

My code has to do with your checkX and checkY functions. They both are a long list of if statements. My first bit of code shows how you could simplify the conditions in those if statements. My second bit of code shows how you could make one loop to to test all the conditions. The lines list would be a list of the index triplets that make a line on the board. That is, the indexes from each of the if conditions in checkX/checkY. Then you can loop through the index triplets and use them to check each line, greatly simplifying your code. All else being equal, simpler code is better. It's easier to maintain, upgrade, and leads to less bugs.
Craig "Ichabod" O'Brien - xenomind.com
I wish you happiness.
Recommended Tutorials: BBCode, functions, classes, text adventures
Reply
#6
Mine was to illustrate how you could reorganize the entire end of your program (everything you have starting with the while gameRun == True block).

The basics are:
- you already know if player 1 won.  It's the value of gameRun.  So before doing any processing for player 2, just check to see if gameRun is True, and
- to play the game again, wrap the entire game loop in ANOTHER loop, so once the game's over, a new game starts.
Reply
#7
I understand now, and my code's working, thank you!
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  trying to put a a filter on identifying a straight CompleteNewb 1 1,637 Dec-01-2021, 11:11 PM
Last Post: CompleteNewb
  coding a 2-player die game Pepper887 3 2,388 Mar-17-2019, 04:02 PM
Last Post: ichabod801

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020