Крестики-нолики на Python (без ИИ)

Крестики-нолики на Python (без ИИ)

Konark 2 мая, 2021 Комментариев (1)

Получаю сертификат на одном сайте (не буду называть каком, так как чту кодекс). И там одна из задач была написать игру крестики-нолики против компьютера без использования искусственного интеллекта.

Так как я только начал менять стек, хотел бы выложить этот код на критику. Насколько он плох как для новичка? Принимается даже самая жёсткая критика, если по делу.
Некоторые задачи можно было решить немного иначе, но были ограничения в виде условий.

from random import randrange

def displayBoard(board):
    step = 0
    
    if step == 0:
        board[1][1] = 'X'
        
    
    for i in range(len(board)):
        if i == 0:
            print('+-------+-------+-------+')
        print('|       |       |       |')
        for j in range(len(board[i])):
            print('|   ' + str(board[i][j]) + '   ', end='')
            if j == (len(board[i]) - 1):
                print('|')
        print('|       |       |       |')
        print('+-------+-------+-------+')

def enterMove(board):
    your_move = int(input('Enter your move:'))
    a = 0
    b = 0
    found = False
    if your_move > 0 and your_move < 10:
        free = makeListOfFreeFields(board)

        for row in board:
            b = 0
            for i in row:
                if i == your_move:
                    board[a][b] = '0'
                    found = True
                    break
                
                b += 1
            if found:
                break
            a += 1
        else:
            print('This cell is busy')
            enterMove(board)
    else:
        print('Your move is incorrect')
        enterMove(board)
            
    displayBoard(board)
    drawMove(board)


def makeListOfFreeFields(board):
    free = []
    for i in range(len(board)):
        for j in range(len(board[i])):
            if type(board[i][j]) == int:
                free.append((i, j))
                
    return free

def victoryFor(board, sign):
    wins = (((0,0), (1,1), (2,2)), ((0,0), (1,0), (2,0)), ((0,0), (0,1), (0,2)), ((0,1), (1,1), (2,1)), ((0,2), (1,2), (2,2)), ((2,0), (2,1), (2,2)), ((0,2), (1,1), (2,0)))
    column = 0
    row = 0
    win = False
    for i in range(len(wins)):
        for j in range(len(wins[i])):
            row = wins[i][j][0]
            column = wins[i][j][1]
            win = True
            if board[row][column] != sign:
                win = False
                break
        if win:
            return True
        
                
    return False


def drawMove(board):
    free = makeListOfFreeFields(board)
    select = free[randrange(len(makeListOfFreeFields(board)))]
    board[select[0]][select[1]] = 'X'

    displayBoard(board)

r = 0
board = list()
for j in range(3):
    board.append([])
    for i in range(3):
        board[j].append(r + 1)
        r += 1
        
displayBoard(board)
while True:
    enterMove(board)
    
    over = True
    for i in range(len(board)):
        for j in range(len(board)):
            if type(board[i][j]) == int:
                over = False
    
    if over:
        print('GAME OVER')
        break
    
    if victoryFor(board, '0'):
        print('You WIN!')
        break
        
    if victoryFor(board, 'X'):
        print('You LOSE...')
        break

Этот код выложен для примера. Не стоит использовать его для прохождения курсов.
This code is just an example. Do not use it for courses.

крестики нолики
Просмотров: 107

Один ответ из “Крестики-нолики на Python (без ИИ)”

  1. В одном ТГ чате по пайтону мне уже указали на некоторые ошибки. Основные из них:
    1. Функция displayBoard кроме вывода не должна ничего делать, у меня же делает еще и без инкремента.
    2. Список победных ходов в функцииvictoryFor задавать не хорошо, желательно делать это алгоритмом. Это, в целом, логично, но я не хотел запариваться.
    3. Пойти читать по РЕР 8.

Добавить комментарий

Ваш e-mail не будет опубликован. Имя и e-mail обязательны для заполнения.