0
\$\begingroup\$

I looked a little into HTML a year ago but decided to try python yesterday and came up with this for tic-tac-toe. I have no programming experience and I haven't yet looked at other peoples versions of tic-tac-toe as I wanted to see if I could do it myself, there's definitely a lot of ways I could have been more efficient that I notice but in terms of general bad code writing habits that you might see input would be very welcome.

turn = 2
winner = 0
gamestate = 0
row1 =[]
row2 =[]
row3 =[]
rowlist =[row1,row2,row3]
gamestate = 1
#arbitraryvalues
xrow1alt = [3,6,9]
xrow2alt = [2,5,8]
xrow3alt = [1,4,7]
orow1alt = [3,6,9]
orow2alt = [2,5,8]
orow3alt = [1,4,7]
xaltrows = [xrow1alt,xrow2alt,xrow3alt]
oaltrows = [orow1alt,orow2alt,orow3alt]
def printboard():
    print(*row1, sep="")
    print(*row2, sep="")
    print(*row3, sep="")
def drawboard():
    for i in range(3):
        row1.append('-')
        row2.append('-')
        row3.append('-')
#fix turn and consolidate inputs
def controls():
    global turn
    if turn == 2:
        playerturn = 'x'
        playernum = 1
    if turn == 1:
        playerturn = 'o'
        playernum = 2
    if playernum == 1:
        rownum = int(input("player 1's turn, select row "))
        columnnum = int(input("player 1's turn, select clumn "))
    if playernum == 2:
        rownum = int(input("player 2's turn, select row "))
        columnnum = int(input("player 2's turn, select clumn "))
    if rownum == 1:
        row1.pop(columnnum-1)
        row1.insert(columnnum-1,playerturn)
        if playernum == 1:
            xrow1alt.pop(columnnum-1)
            xrow1alt.insert(columnnum-1,playerturn)
        else:
            orow1alt.pop(columnnum-1)
            orow1alt.insert(columnnum-1,playerturn)
    if rownum == 2:
        row2.pop(columnnum-1)
        row2.insert(columnnum-1,playerturn)
        if playernum == 1:
            xrow2alt.pop(columnnum-1)
            xrow2alt.insert(columnnum-1,playerturn)
        else:
            orow2alt.pop(columnnum-1)
            orow2alt.insert(columnnum-1,playerturn)
    if rownum == 3:
        row3.pop(columnnum-1)
        row3.insert(columnnum-1,playerturn)
        if playernum == 1:
            xrow3alt.pop(columnnum-1)
            xrow3alt.insert(columnnum-1,playerturn)
        else:
            orow3alt.pop(columnnum-1)
            orow3alt.insert(columnnum-1,playerturn)
    if playerturn =='x':
        turn = 1
    if playerturn =='o':
        turn = 2

def wincheck():
    global winner
    xtotal = 0
    ototal = 0
    global gamestate
    y = 0
    for i in xaltrows:
        xvalues = [159,150,141,147,153]
        for x in range(len(i)):
            if i[x] == 'x':
                i[x] = 40
    xtotal = sum(xrow1alt) + sum(xrow2alt) + sum(xrow3alt)
    print(xtotal)
    if xtotal in xvalues:
        winner = 1
        gamestate +=1
    for i in oaltrows:
        ovalues = [276,279,282,288,270]
        for x in range(len(i)):
            if i[x] == 'o':
                i[x] = 83
    ototal = sum(orow1alt) + sum(orow2alt) + sum(orow3alt)
    if ototal in ovalues:
        winner +=2
        gamestate +=1
drawboard()
printboard()
while gamestate == 1:
    controls()
    printboard()
    wincheck()
print("winner is player ",winner)
\$\endgroup\$
3
  • \$\begingroup\$ see PEP 8 -- Style Guide for Python Code \$\endgroup\$
    – furas
    Mar 3, 2022 at 3:23
  • \$\begingroup\$ first you could add some empty lines to make it more readable - ie. before every def. Next: all global at the beginning of function - it helps to see what external variables function will use. Next: all functions put at the beginning - before turn = 2 \$\endgroup\$
    – furas
    Mar 3, 2022 at 3:25
  • 2
    \$\begingroup\$ @furas You have a real start on an answer with these comments. \$\endgroup\$
    – pacmaninbw
    Mar 9, 2022 at 18:47

1 Answer 1

1
\$\begingroup\$

See PEP 8 -- Style Guide for Python Code

Add some empty lines to make it more readable - ie. before every def.
And sometimes before if or for.

Add spaces after , to make code readable.

All global put at the beginning of function - it helps to see what external variables function will use.

All functions put at the beginning - before turn = 2

You could use else instead of some if - to make code simpler.

You keep rows in rowlist so you could use for-loop to display rows.

You could also keep xaltrows and oaltrows on list or dictionary and use turn to select values.

gamestate could use True/False instead of 0, 1


I saw one problem - player can select place which is already used and it changes o into x.

I didn't try to find other problems.


def printboard():
    for row in rowlist:
        print(*row, sep="")
    
def drawboard():
    for i in range(3):
        for row in rowlist:
            row.append('-')
        
def controls():
    global turn
    
    if turn == 2:
        playerturn = 'x'
        playernum = 1
    else:
        playerturn = 'o'
        playernum = 2

    if playernum == 1:
        rownum = int(input("player 1's turn, select row "))
        columnnum = int(input("player 1's turn, select clumn "))
    else:
        rownum = int(input("player 2's turn, select row "))
        columnnum = int(input("player 2's turn, select clumn "))

    if rownum == 1:
        row1.pop(columnnum-1)
        row1.insert(columnnum-1, playerturn)
        if playernum == 1:
            xrow1alt.pop(columnnum-1)
            xrow1alt.insert(columnnum-1, playerturn)
        else:
            orow1alt.pop(columnnum-1)
            orow1alt.insert(columnnum-1, playerturn)
    elif rownum == 2:
        row2.pop(columnnum-1)
        row2.insert(columnnum-1, playerturn)
        if playernum == 1:
            xrow2alt.pop(columnnum-1)
            xrow2alt.insert(columnnum-1, playerturn)
        else:
            orow2alt.pop(columnnum-1)
            orow2alt.insert(columnnum-1, playerturn)
    elif rownum == 3:
        row3.pop(columnnum-1)
        row3.insert(columnnum-1, playerturn)
        if playernum == 1:
            xrow3alt.pop(columnnum-1)
            xrow3alt.insert(columnnum-1, playerturn)
        else:
            orow3alt.pop(columnnum-1)
            orow3alt.insert(columnnum-1, playerturn)

    if playerturn =='x':
        turn = 1
    else:
        turn = 2

def wincheck():
    global winner
    global gamestate
    
    xtotal = 0
    ototal = 0
    y = 0
    
    for i in xaltrows:
        xvalues = [159, 150, 141, 147, 153]
        for x in range(len(i)):
            if i[x] == 'x':
                i[x] = 40
                
    xtotal = sum(xrow1alt) + sum(xrow2alt) + sum(xrow3alt)
    print('xtotal:', xtotal)
    
    if xtotal in xvalues:
        winner = 1
        gamestate = False
        
    for i in oaltrows:
        ovalues = [276, 279, 282, 288, 270]
        for x in range(len(i)):
            if i[x] == 'o':
                i[x] = 83
                
    ototal = sum(orow1alt) + sum(orow2alt) + sum(orow3alt)
    
    if ototal in ovalues:
        winner +=2
        gamestate = False

# --- main ---

turn = 2
winner = 0
gamestate = True

row1 = []
row2 = []
row3 = []

rowlist = [row1, row2, row3]

#arbitraryvalues
xrow1alt = [3,6,9]
xrow2alt = [2,5,8]
xrow3alt = [1,4,7]
orow1alt = [3,6,9]
orow2alt = [2,5,8]
orow3alt = [1,4,7]

xaltrows = [xrow1alt,xrow2alt,xrow3alt]
oaltrows = [orow1alt,orow2alt,orow3alt]

drawboard()
printboard()

while gamestate:
    controls()
    printboard()
    wincheck()
    
print("winner is player", winner)
```
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.