Языки программирования

Игра «Крестики-нолики» для двух игроков на Python

В данной статье мы разработаем небольшую консольную программу «Крестики-нолики» для закрепления темы «Функции в Python«. Сначала рекомендуем изучить теорию создания функций и потом возвращаться к этой статье.

Используемые функции в программе

draw_board() — рисует игровое поле в привычном для человека формате.
take_input() — принимает ввод пользователя. Проверяет корректность ввода.
check_win — функция проверки игрового поля, проверяет, выиграл ли игрок.
main() — основная функция игры, которая будет запускать все ранее описанные функции. Данная функция запускает и управляет игровым процессом.

Полный листинг программы

print("*" * 10, " Игра Крестики-нолики для двух игроков ", "*" * 10)

board = list(range(1,10))

def draw_board(board):
   print("-" * 13)
   for i in range(3):
      print("|", board[0+i*3], "|", board[1+i*3], "|", board[2+i*3], "|")
      print("-" * 13)

def take_input(player_token):
   valid = False
   while not valid:
      player_answer = input("Куда поставим " + player_token+"? ")
      try:
         player_answer = int(player_answer)
      except:
         print("Некорректный ввод. Вы уверены, что ввели число?")
         continue
      if player_answer >= 1 and player_answer <= 9:
         if(str(board[player_answer-1]) not in "XO"):
            board[player_answer-1] = player_token
            valid = True
         else:
            print("Эта клетка уже занята!")
      else:
        print("Некорректный ввод. Введите число от 1 до 9.")

def check_win(board):
   win_coord = ((0,1,2), (3,4,5), (6,7,8), (0,3,6), (1,4,7), (2,5,8), (0,4,8), (2,4,6))
   for each in win_coord:
       if board[each[0]] == board[each[1]] == board[each[2]]:
          return board[each[0]]
   return False

def main(board):
    counter = 0
    win = False
    while not win:
        draw_board(board)
        if counter % 2 == 0:
           take_input("X")
        else:
           take_input("O")
        counter += 1
        if counter > 4:
           tmp = check_win(board)
           if tmp:
              print(tmp, "выиграл!")
              win = True
              break
        if counter == 9:
            print("Ничья!")
            break
    draw_board(board)
main(board)

input("Нажмите Enter для выхода!")

Функция draw_board()

Внутри программы игровое поле представлено в виде одномерного списка с числами от 1 до 9.

Функция take_input()

Задачи данной функции:
1. Принять ввод пользователя.
2. Обработать некорректный ввод, например, введено не число. Для преобразования строки в число используем функцию int().
3. Обработать ситуации. когда клетка занята или когда введено число не из диапазона 1..9.
Для обработки некорректного ввода мы используем блок try…except. Если пользователь введет строку, то выполнение программы не прервется, а будет выведено сообщение «Некорректный ввод. Вы уверены, что ввели число?», а затем цикл перейдет на следующую итерацию с возможностью по-новому ввести число.

Функция check_win()

Данная функция проверяет игровое поле. Мы создаем кортеж с выигрышными координатами и проходимся циклом for по нему.
Если символы во всех трех заданных клетках равны — возвращаем выигрышный символ, иначе — возвращаем значение False.
Непустая строка(выигрышный символ) при приведении ее к логическому типу вернет True.

Функция main()

В данной функции создаем цикл while. Цикл выполняется пока один из игроков не выиграл. В данном цикле мы выводим игровое поле, принимаем ввод пользователя, при этом определяя токен(икс или нолик) игрока.
Ждем, когда переменная counter станет больше 4 для того, чтобы избежать заведомо ненужного вызова функции check_win.
Переменная tmp была создана для того, чтобы лишний раз не вызывать функцию check_win, мы просто «запоминаем» ее значение и при необходимости используем в строке «print(tmp, «выиграл!»)».
Вывод программы:
Наша игра получилась очень простой. Рекомендуется самостоятельно написать данный код для полного его понимания. Ждем ваших предложений по улучшению или модернизации данной игры.

Видео по созданию игры:
Самоучитель по Python