Простой проект крестики-нолики с использованием python

Создание проектов — это полезный способ применить то, что вы узнали из учебника, и отличный способ избежать ада учебников. Что может быть лучше для создания проекта с помощью классической игры под названием крестики-нолики!

Это один из проектов, который мне нужно создать во время моего учебного лагеря по программированию. Мне потребовалась неделя и несколько поисков в гугле.

Знание следующих концепций Python полезно для воссоздания этого проекта:

  • списки
  • словари
  • если еще заявление
  • в то время как циклы
  • функции
  • попробуй… кроме

На этом этапе преподавалась только основная концепция, такая как выше, поэтому «класс» не использовался в этом проекте.

Мы можем спланировать простую блок-схему, чтобы проиллюстрировать, как код должен работать, прежде чем писать код.

Игровая доска

Во-первых, мы создаем скелет игрового поля, чтобы распечатать число в каждом поле.

Мы создаем новую строку, используя \n.

print('Game started: \n\n' +                    
      ' 1 | 2 | 3 \n' +                    
      ' --------- \n' +                    
      ' 4 | 5 | 6 \n' +                    
      ' --------- \n' +                    
      ' 7 | 8 | 9 \n')

Затем мы создаем доску для хранения отметки в соответствии с выбранной игроком позицией. С помощью словаря создано всего 9 позиций.

# The Game Board 
board = {    
        1: ' ', 2: ' ', 3: ' ',    
        4: ' ', 5: ' ', 6: ' ',    
        7: ' ', 8: ' ', 9: ' '
}

Создать все функции

Для создания функциональной игры все игровые утилиты можно создать отдельно и объединить их в одну.

В этом уроке мы создадим следующие функции:

  • markBoard — отметьте X или O в соответствии с выбором позиции игрока
  • printBoard — распечатать игровое поле
  • validateMove — подтвердить выбор позиции игроком
  • checkWin — проверить, выиграл игрок или нет
  • checkFull — проверяет, все ли позиции были заняты
  • winCombinations — хранить выигрышные комбинации

markBoard(позиция, отметка)

Функция markBoard принимает два аргумента:

  • position — число, представляющее номер ящика (1–9).
  • отметка — X или O

Мы преобразуем входные данные (position) в целое число и присваиваем значение переменной (position).

Затем позиция будет действовать как индекс для переменной board, созданной ранее, принимая отметить как значение.

В конце вернуть (распечатать) доску.

def markBoard(position, mark):    
    position = int(position)    
    board[position] = mark    
    return board

печатная доска()

Функция printBoard() распечатывает игровое поле без каких-либо аргументов, как показано ниже:

Для этой функции номер должен быть распечатан, даже если ящик не занят. Занятый ящик имеет X или O, а незанятый ящик имеет соответствующий номер позиции.

Цикл for и оператор if…else полезны для этого шага.

  • ключ, представленный как k —номер позиции на доске
  • значение, представленное как v —может быть знаком (X или O) или пустым

Для каждого элемента() (получите пары ключ-значение, k и v) на доске, если значение из v не равно пустому, добавьте значение к board[k], чтобы значение в k это либо X, либо O.

В противном случае добавьте k к board[k] в виде строкового значения, чтобы значение в k — номер позиции.

Распечатайте значения платы.

def printBoard():    
    for k, v in board.items():        
        if v != ' ':            
           board[k] = v        
        else:            
           board[k] = str(k)    
     print("\t")    
     print("\t"+ board[1] + " | " + board[2] + " | " + board[3])    
     print("\t---------")    
     print("\t"+ board[4] + " | " + board[5] + " | " + board[6])
     print("\t---------")    
     print("\t"+ board[7] + " | " + board[8] + " | " + board[9])     
     print("\t")

validateMove(position)

Эта функция проверяет ввод игрока, возвращает False (неверная позиция) или True (верная позиция)

Во-первых, мы устанавливаем тип данных позиции как целое число.

Затем, используя оператор if…else для проверки:

  • если значение позиции меньше 1 или больше 9, вернуть False
  • иначе, если позиция была занята «X» или «O», вернуть False
  • в противном случае вернуть True
def validateMove(position):    
    position = int(position)    
    if (position < 1) or (position > 9):        
        return False    
    elif (board[position] == 'X' or board[position] == 'O' or board[position] == int(position)):        
        return False    
    else:        
        return True

выигрышКомбинации()

Создайте переменную, в которой хранятся все выигрышные комбинации. Всего 8 выигрышных комбинаций. Каждому списку соответствуют позиции по горизонтали, вертикали и диагонали.

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

проверитьВыигрыш()

Эта функция проверяет, выиграл ли пользователь игру. player — это аргумент (имеет значение «X» или «O»).

В этой функции создайте пустой список для хранения метки игрока (X или O). Затем повторите элементы доски, чтобы увидеть, соответствует ли значение отметке игрока. Если это так, добавьте ключ (позицию) в список. Например, список вернет позицию X только в том случае, если игрок X.

Затем мы создаем цикл для x в winCombinations, чтобы проверить, удовлетворяется ли какая-либо выигрышная комбинация.

def checkWin(player):    
    mark_list = []    
    for k,v in board.items():        
        if v == player:            
            mark_list.append(k)    
    for x in winCombinations:      
        if all(y in mark_list for y in x):        
            return True

проверитьПолный()

Эта функция проверяет, все ли поля были заняты X или O. Сначала мы устанавливаем счетчик равным 0. Для каждого значения на доске, если значение равно X или O, счетчик увеличивается на 1, и цикл суммируется. пока на доске не останется X или O. Если сумма счетчика равна 9, функция вернет True.

def checkFull():    
    count = 0    
    for v in board.values():        
        if (v == 'X') or (v == 'O'):            
            count += 1            
            if count == 9:                
                return True        
        else:            
            return False

Собираем все вместе

Все определенные функции будут помещены вверху кода вместе с переменной с именем gameEnded, равной False, и currentTurnPlayer равно X до реализации пользовательского ввода. Весь этот код использует логическое значение для выполнения команды.

Простой игровой процесс должен быть таким:

  1. Запрашивать ввод пользователя и проверять его

Пока игра не закончена, попросите currentTurnPlayer ввести позицию (число).

Нужно ожидать, что пользователь может ввести не число, поставив try…except, чтобы обработать ошибку. Распечатайте сообщение об ошибке, чтобы игрок знал, что поставить.

while not gameEnded:        
    move = input(currentTurnPlayer + "'s turn, input: ")
    try:            
        validateMove(move)        
    except ValueError:            
        print("Wrong Input! Please Try Again!")            
        continue        
    if validateMove(move) == False:            
        print('Please choose another position')              
        continue

2. Обновите доску

Здесь использовались функции markboard и printBoard, чтобы отметить выбранную игроком позицию и распечатать, чтобы показать текущую отмеченную позицию. позиция. Если ход действителен, доска будет распечатана.

else:
    markBoard(move,currentTurnPlayer)            
    printBoard()

3. Проверить выигрыш или ничью

Ситуация с ничьей сработает, когда все позиции будут заполнены, а значение не совпадает ни с одной выигрышной комбинацией.

if checkFull() == True:          
    if checkWin(currentTurnPlayer) == True:             
        print("\nGame Over!\n")             
        print(currentTurnPlayer + " player won\n")      
        gameEnded = True          
    else:             
        print("\nGame Over!\n")             
        print("It's a tie\n")             
        gameEnded = True         
else:           
    if checkWin(currentTurnPlayer) == True:              
        print("\nGame Over!\n")              
        print(currentTurnPlayer + " player won\n")  
        gameEnded = True

4. Сменить пользователя

Когда ситуация выигрыша или ничьей не срабатывала, игрок переключается (с X на O).

if currentTurnPlayer == 'X':            
    currentTurnPlayer = 'O'        
else:            
    currentTurnPlayer = 'X'

Окончательный вывод должен выглядеть так:

Бонус: функция перезапуска

Блок-схема функции перезапуска может выглядеть следующим образом:

Дайте выбор игроку, если он хочет перезапустить игру. Если игрок хочет продолжить игру, gameEnded будет равно False, ключи доски будут равны пустой строке, чтобы очистить значения доски и дать игроку новую позицию. заполнить. Значение gameEndedравно Trueостановит игру.

choice = input("\nDo you want to restart? (y/n): ")    
if choice == 'Y' or choice == 'y':        
    gameEnded = False        
    print('Game started: \n\n' +                    
        ' 1 | 2 | 3 \n' +                    
        ' --------- \n' +                    
        ' 4 | 5 | 6 \n' +                    
        ' --------- \n' +                    
        ' 7 | 8 | 9 \n')        
    for k in board.keys():            
        board[k] = ' '     
else:        
    print("Thanks for playing :)\n")        
    gameEnded = True        
    break

Полный код, включая функцию перезапуска:

Вот и все для проекта! Удачного кодирования!

Githubссылка на проект

Скоро будут новые статьи о моих проектах :)