В этой статье хотелось бы поделиться 22 фрагментами кода на Python, которые помогут вам в решении повседневных задач.
1. Прием нескольких входных значений, разделенных пробелами
Этот фрагмент кода позволяет принимать сразу несколько значений вводимых данных, которые разделены пробелами. Он пригодится при решении задач на соревнованиях по программированию.
## Прием двух целых чисел в качестве входных данных a,b = map(int,input().split()) print(«a:»,a) print(«b:»,b) ## Прием списка в качестве входных данных arr = list(map(int,input().split())) print(«Input List:»,arr)
2. Одновременный доступ к индексу и значению
Одновременный доступ к индексу и значению в цикле позволяет получить встроенная функция enumerate():
arr = [2,4,6,3,8,10] for index,value in enumerate(arr): print(f»At Index The Value Is -> «) »’Output At Index 0 The Value Is -> 2 At Index 1 The Value Is -> 4 At Index 2 The Value Is -> 6 At Index 3 The Value Is -> 3 At Index 4 The Value Is -> 8 At Index 5 The Value Is -> 10 »’
3. Проверка использования памяти
Этот фрагмент используется для проверки использования памяти объекта:
import sys a = 20 print(sys.getsizeof(a)) #28
4. Проверка существования файла
Важно знать, существуют ли используемые в коде файлы. Python здорово облегчает управление файлами благодаря встроенному синтаксису для чтения и записи файлов:
# Метод перебора import os.path from os import path def check_for_file(): print(«File exists: «,path.exists(«data.txt»)) if __name__==»__main__»: check_for_file() »’ File exists: False »’
5. Вывод уникального идентификатора переменной
Уникальный идентификатор переменной находится с помощью метода id(). Для этого нужно просто передать в метод имя переменной:
a = 20 name = ‘Karl’ deci = 5.5 print(id(a)) # 2557830785936 print(id(name)) # 2557830785956 print(id(deci)) # 2557830785996
6. Вычисление времени выполнения в оболочке
Иногда важно знать время выполнения в оболочке или в блоке кода для получения лучшего алгоритма с минимальным количеством затраченного им времени:
# МЕТОД 1 import datetime start = datetime.datetime.now() «»» CODE «»» print(datetime.datetime.now()-start) # МЕТОД 2 import time start_time = time.time() main() print(f»Total Time To Execute The Code is <(time.time() — start_time)>» ) # МЕТОД 3 import timeit code = »’ ## Фрагмент кода, чье время выполнения подлежит измерению [2,6,3,6,7,1,5,72,1].sort() »’ print(timeit.timeit(stmy = code,number = 1000))
7. Цепочка вызовов функций
В Python есть возможность вызывать несколько функций в одной строке:
def add(a,b): return a+b def sub(a,b): return a-b a,b = 9,6 print((sub if a > b else add)(a, b))
8. Перестановка значений
Быстрый способ поменять местами две переменные без использования дополнительной:
5 интересных программ на python (питон) | Сборник
a,b = 5,7 # Метод 1 b,a = a,b # Метод 2 def swap(a,b): return b,a swap(a,b)
9. Калькулятор без if-else
Этот фрагмент кода показывает, как просто написать калькулятор без использования каких-либо условных операторов if-else:
import operator action = < «+» : operator.add, «-» : operator.sub, «/» : operator.truediv, «*» : operator.mul, «**» : pow >print(action[‘*’](5, 5)) # 25
10. Обработка ошибок
В Python, как и в языках Java и C++, имеется способ обработки исключений с помощью блоков try, except и finally:
# Пример 1 try: a = int(input(«Enter a:»)) b = int(input(«Enter b:»)) c = a/b print(c) except: print(«Can’t divide with zero») # Пример 2 try: #если файл не существует, будет выброшено исключение. fileptr = open(«file.txt»,»r») except IOError: print(«File not found») else: print(«The file opened successfully») fileptr.close() # Пример 3 try: fptr = open(«data.txt»,’r’) try: fptr.write(«Hello World!») finally: fptr.close() print(«File Closed») except: print(«Error»)
11. Проверка наличия анаграммы
Анаграмма — это слово, которое образуется путем перестановки букв другого слова, причем каждая буква используется только один раз.
def check_anagram(first_word, second_word): return sorted(first_word) == sorted(second_word) print(check_anagram(«silent», «listen»)) # True print(check_anagram(«ginger», «danger»)) # False
12. Проверка наличия подстрок в строке списка
А вот и задача, с которой мне обычно приходится иметь дело ежедневно: проверять, есть ли в строке подстрока. В отличие от других языков программирования, в Python имеется для этого хорошее ключевое слово:
addresses = [ «12/45 Elm street», ’34/56 Clark street’, ‘56,77 maple street’, ’17/45 Elm street’ ] street = ‘Elm street’ for i in addresses: if street in i: print(i) »’output 12/45 Elm street 17/45 Elm street »’
13. Форматирование строки
Самые важные части кода — это входные данные, логика и выходные данные. Все три части требуют некоторого форматирования при написании кода для получения лучших и более удобных для восприятия человеком выходных данных. В Python имеется целый ряд методов форматирования строки.
name = «Abhay» age = 21 ## МЕТОД 1: конкатенация print(«My name is «+name+», and I am «+str(age)+ » years old.») ## МЕТОД 2: форматированные строки (F-строки в Python 3+) print(f»My name is , and I am years old») ## МЕТОД 3: join print(».join([«My name is «, name, «, and I am «, str(age), » years old»])) ## МЕТОД 4: оператор модуля print(«My name is %s, and I am %d years old.» % (name, age)) ## МЕТОД 5: format (Python 2 и 3) print(«My name is <>, and I am <> years old».format(name, age))Списки
14. Сортировка списка строк
Этот фрагмент кода пригодится, например при упорядочении всех имен студентов в списке:
list1 = [«Karl»,»Larry»,»Ana»,»Zack»] # Метод 1: sort() list1.sort() # Метод 2: sorted() sorted_list = sorted(list1) # Метод 3: метод перебора size = len(list1) for i in range(size): for j in range(size): if list1[i] < list1[j]: temp = list1[i] list1[i] = list1[j] list1[j] = temp print(list1)
15. Генератор списков с If и Else
А этот фрагмент кода будет очень полезен при проведении фильтрации структуры данных на основе некоторых условий:
## List Comprehension with if and else [«Divided by 5″ if i%5=0 else i for i in range(1,20)] ### FizzBuzz Implementation Threw the same [‘FizzBuzz’ if i%3=0 and i%5=0 else ‘Fizz’ if i%3=0 else ‘Buzz’ if i%5=0 else i for i in range(1,20)] »’output [1, 2, ‘Fizz’, 4, ‘Buzz’, ‘Fizz’, 7, 8, ‘Fizz’, ‘Buzz’, 11, ‘Fizz’, 13, 14, ‘FizzBuzz’, 16, 17, ‘Fizz’, 19] »’
16. Сложение элементов двух списков
Допустим, у вас есть два списка, которые надо объединить в один, суммировав их элементы. Это пригодится, например в таком сценарии:
maths = [59, 64, 75, 86] physics = [78, 98, 56, 56] # Метод перебора list1 = [ maths[0]+physics[0], maths[1]+physics[1], maths[2]+physics[2], maths[3]+physics[3] ] # Генератор списков list1 = [x + y for x,y in zip(maths,physics)] # Использование методов map import operator all_devices = list(map(operator.add, maths, physics)) # Использование библиотеки Numpy import numpy as np list1 = np.add(maths,physics) »’Output [137 162 131 142] »’
17. Самые часто встречающиеся в списке
Этот метод возвращает элементы, появляющиеся в списке наиболее часто:
def most_frequent(nums): return max(set(nums), key = nums.count)
18. Возведение в квадрат всех чисел в заданном диапазоне
В этом фрагменте для нахождения квадрата каждого целого числа в заданном диапазоне прибегнем к помощи встроенной функции itertools:
# МЕТОД 1 from itertools import repeat n = 5 squares = list(map(pow, range(1, n+1), repeat(2))) print(squares) # МЕТОД 2 n = 6 squares = [i**2 for i in range(1,n+1)] print(squares) «»»Output [1, 4, 9, 16, 25] «»»
19. Поиск дублей
Эти фрагменты кода позволяют проверить, есть ли в списке повторяющиеся значения:
def has_duplicates(lst): return len(lst) ≠ len(set(lst)) x = [1,2,2,4,3,5] y = [1,2,3,4,5] has_duplicates(x) # True has_duplicates(y) # False
20. Преобразование двух списков в словарь
Здесь используются следующие методы:
list1 = [‘karl’,’lary’,’keera’] list2 = [28934,28935,28936] # Метод 1: zip() dictt0 = dict(zip(list1,list2)) # Метод 2: генераторы словарей dictt1 = # Метод 3: использование цикла For (не рекомендуется) tuples = zip(list1, list2) dictt2 = <> for key, value in tuples: if key in dictt2: pass else: dictt2[key] = value print(dictt0, dictt1, dictt2, sep = «n»)
21. Сортировка списка словарей
Бывают задачи, в которых требуется упорядочить список словарей, чтобы получить с помощью ключа отсортированный в определенном порядке список:
dict1 = [ <«Name»:»Karl», «Age»:25>, , ] ## Использование sort() dict1.sort(key=lambda item: item.get(«Age»)) # Сортировка списка с помощью itemgetter from operator import itemgetter f = itemgetter(‘Name’) dict1.sort(key=f) # Функция sorted для итерируемых элементов dict1 = sorted(dict1, key=lambda item: item.get(«Age»)) »’Output [, , ] »’
22. Объединение двух словарей
А этот фрагмент кода пригодится при работе с базами данных и файлами JSON, когда нужно объединить данные из разных файлов или таблиц в общий файл. Объединение двух словарей таит в себе ряд опасностей, например возможность появления повторяющихся ключей. К счастью, у нас есть решения и для этого:
basic_information = academic_information = details = dict() ## Объединяет словари ## Метод генераторов словарей details = print(details) ## Распаковывание словарей details = <**basic_information ,**academic_information>print(details) ## Метод копирования и обновления details = basic_information.copy() details.update(academic_information) print(details)
В конце статьи хочу сказать, что еще больше полезной и нужной информации вы найдете в моём Telegram-канале. Подпишитесь, мне будет очень приятно.
Источник: vc.ru
Интересные программы на python код
Комментарии
Популярные По порядку
Не удалось загрузить комментарии.
ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ
ООП на Python: концепции, принципы и примеры реализации
Программирование на Python допускает различные методологии, но в его основе лежит объектный подход, поэтому работать в стиле ООП на Python очень просто.
3 самых важных сферы применения Python: возможности языка
Существует множество областей применения Python, но в некоторых он особенно хорош. Разбираемся, что же можно делать на этом ЯП.
Программирование на Python: от новичка до профессионала
Пошаговая инструкция для всех, кто хочет изучить программирование на Python (или программирование вообще), но не знает, куда сделать первый шаг.
Источник: proglib.io
Пишем игру крестики-нолики на Python на двоих и против компьютера
Если вы учитесь программировать, то программирование игр — это очень хороший способ освоить алгоритмы и структуры данных. В этом уроке мы разберем запрограммируем игру крестики нолики на Python. Полный код программы с искусственным интеллектом для игрока-компьютера занимает всего 140 строк. В варианте игры где человек играет против человека — раза в два меньше.
Игра крестики-нолики хороша тем, что ее правила знакомы всем с детства и понятны каждому. Это даст вам возможность сосредоточиться именно на процессе программирования, а не на анализе правил игры. В процессе работы над игрой крестики-нолики мы будем использовать только стандартные функции языка Python без подключения каких либо сторонних библиотек.
Шаг 1. Подбор структуры данных
Программирование любой игры начинается с моделирования ее объектов средствами языка программирования. Когда мы программируем игру крестики нолики нам нужно подумать где в программе хранить поле для игры с ходами которые сделали игроки.
В языке программирования Python наилучшим выбором будет список из 9 значений. Назовем его maps. Первоначально этот список будет заполнен цифрами от 1 до 9. Это сделано для удобства организации диалога с пользователем. Пользователю будет достаточно ввести символ от 1 до 9, что бы мы смогли понять куда он сделал ход. После того как ход сделан, цифру мы заменим на символ нолика или крестика. (Можно было заполнить цифрами от 0 до 8. В этом случает было бы удобнее работать — цифра и есть индекс элемента в списке, но первый нолик будет смущать игроков).
Еще мы создадим второй список victories в котором будем хранить информацию обо всех выигрышных комбинациях. И нам будет нужно создать функцию print_maps, которая будет выводить содержимое нашего списка maps на экран.
# Инициализация карты maps = [1,2,3, 4,5,6, 7,8,9] # Инициализация победных линий victories = [[0,1,2], [3,4,5], [6,7,8], [0,3,6], [1,4,7], [2,5,8], [0,4,8], [2,4,6]] # Вывод карты на экран def print_maps(): print(maps[0], end = » «) print(maps[1], end = » «) print(maps[2]) print(maps[3], end = » «) print(maps[4], end = » «) print(maps[5]) print(maps[6], end = » «) print(maps[7], end = » «) print(maps[8])
Со структурами данных разобрались.
Шаг 2. Выполнение очередного хода и проверка на выигрыш
Карта для игры у нас есть, отображать ее мы умеем. Теперь нужно создать две вспомогательные функции, прежде чем мы приступим к программированию основного цикла игры.
Первая функция будет рисовать на поле крестик или нолик, в зависимости от того что в нее передали. Позицию в нее так же нужно будет передавать. Вставлять переданный элемент мы будем по индексу. Индекс определим функцией index (если бы мы пронумеровали от 0 до 8 элементы в maps, то переданное значение и было бы индексом. Можете попробовать — будет на одну строчку кода меньше.)
# Сделать ход в ячейку def step_maps(step,symbol): ind = maps.index(step) maps[ind] = symbol
После каждого ходы мы должны проверять — не победил ли кто то из игроков. Для этого переберем все победные линии из списка victories и проверим нет ли там комбинации из трех крестиков или трех ноликов.
# Получить текущий результат игры def get_result(): win = «» for i in victories: if maps[i[0]] == «X» and maps[i[1]] == «X» and maps[i[2]] == «X»: win = «X» if maps[i[0]] == «O» and maps[i[1]] == «O» and maps[i[2]] == «O»: win = «O» return win
Эта функция вернет «X» в случае победы крестиков и «O» в случае победы ноликов.
Шаг 3. Основный игровой цикл
Ну вот мы и подошли к созданию основного игрового цикла. Нам предстоит крутиться в цикле до момента пока кто нибудь не выиграет. Игроки будут по очереди делать ходы, мы будем проверять каждый раз не победил ли кто и как только кто то побеждает — выходим из цикла и завершаем программу.
# Основная программа game_over = False player1 = True while game_over == False: # 1. Показываем карту print_maps() # 2. Спросим у играющего куда делать ход if player1 == True: symbol = «X» step = int(input(«Человек 1, ваш ход: «)) else: symbol = «O» step = int(input(«Человек 2, ваш ход: «)) step_maps(step,symbol) # делаем ход в указанную ячейку win = get_result() # определим победителя if win != «»: game_over = True else: game_over = False player1 = not(player1) # Игра окончена. Покажем карту. Объявим победителя. print_maps() print(«Победил», win)
Вот полный код программы крестики-нолики на Python для двух игроков:
# Инициализация карты maps = [1,2,3, 4,5,6, 7,8,9] # Инициализация победных линий victories = [[0,1,2], [3,4,5], [6,7,8], [0,3,6], [1,4,7], [2,5,8], [0,4,8], [2,4,6]] # Вывод карты на экран def print_maps(): print(maps[0], end = » «) print(maps[1], end = » «) print(maps[2]) print(maps[3], end = » «) print(maps[4], end = » «) print(maps[5]) print(maps[6], end = » «) print(maps[7], end = » «) print(maps[8]) # Сделать ход в ячейку def step_maps(step,symbol): ind = maps.index(step) maps[ind] = symbol # Получить текущий результат игры def get_result(): win = «» for i in victories: if maps[i[0]] == «X» and maps[i[1]] == «X» and maps[i[2]] == «X»: win = «X» if maps[i[0]] == «O» and maps[i[1]] == «O» and maps[i[2]] == «O»: win = «O» return win # Основная программа game_over = False player1 = True while game_over == False: # 1. Показываем карту print_maps() # 2. Спросим у играющего куда делать ход if player1 == True: symbol = «X» step = int(input(«Человек 1, ваш ход: «)) else: symbol = «O» step = int(input(«Человек 2, ваш ход: «)) step_maps(step,symbol) # делаем ход в указанную ячейку win = get_result() # определим победителя if win != «»: game_over = True else: game_over = False player1 = not(player1) # Игра окончена. Покажем карту. Объявим победителя. print_maps() print(«Победил», win)
Вот так выглядит процесс игры в крестики-нолики для 2 игроков:
1 2 3 4 5 6 7 8 9 Человек 1, ваш ход: 5 1 2 3 4 X 6 7 8 9 Человек 2, ваш ход: 1 O 2 3 4 X 6 7 8 9 Человек 1, ваш ход: 6 O 2 3 4 X X 7 8 9 Человек 2, ваш ход: 4 O 2 3 O X X 7 8 9 Человек 1, ваш ход: 3 O 2 X O X X 7 8 9 Человек 2, ваш ход: 7 O 2 X O X X O 8 9 Победил O
Шаг 4. Добавление алгоритма для искусственного интеллекта в игре крестики-нолики
А вот теперь мы подобрались к самому интересному моменту в программировании. Нам нужно создать искусственный интеллект, который всегда будет выигрывать или сводить игру к ничьей. На самом деле в игре крестики-нолики такой алгоритм написать совсем не сложно.
Для написания такого алгоритма нам понадобится вспомогательная функция, которая будет проверять все победные линии в игре и подсчитывать в них количество крестиков и ноликов. Если функция находит такую линию, то она возвращает позицию на этой линии куда нужно сделать ход. Например мы будем отслеживать линии где противник поставил два крестика и обязательно поставим нолик, что бы не дать ему выиграть. Вот эта функция:
#Искусственный интеллект: поиск линии с нужным количеством X и O на победных линиях def check_line(sum_O,sum_X): step = «» for line in victories: o = 0 x = 0 for j in range(0,3): if maps[line[j]] == «O»: o = o + 1 if maps[line[j]] == «X»: x = x + 1 if o == sum_O and x == sum_X: for j in range(0,3): if maps[line[j]] != «O» and maps[line[j]] != «X»: step = maps[line[j]] return step
А сейчас мы напишем функцию для поиска очередного лучшего хода для искусственного интеллекта. Запрограммируем такой алгоритм для каждого хода (компьютер играет ноликами):
- Если этим ходом можем выиграть — выигрываем (уже 2 нолика стоят на одной из линий). Иначе идем к шагу 2.
- Если можем помешать выиграть человеку — мешаем ( у человека уже 2 крестика на линии — ставим на нее нолик). Иначе идем к шагу 3.
- Если на линии одна наша фигура — ставим вторую. Если пока ни одной нашей фигуры — идем к шагу 4.
- Ставим нолик в центр. Если центр занят идем к шагу 5.
- Ставим в левый верхний угол.
А вот так все это выглядит в программе на Python:
#Искусственный интеллект: выбор хода def AI(): step = «» # 1) если на какой либо из победных линий 2 свои фигуры и 0 чужих — ставим step = check_line(2,0) # 2) если на какой либо из победных линий 2 чужие фигуры и 0 своих — ставим if step == «»: step = check_line(0,2) # 3) если 1 фигура своя и 0 чужих — ставим if step == «»: step = check_line(1,0) # 4) центр пуст, то занимаем центр if step == «»: if maps[4] != «X» and maps[4] != «O»: step = 5 # 5) если центр занят, то занимаем первую ячейку if step == «»: if maps[0] != «X» and maps[0] != «O»: step = 1 return step
Немного перепишем и основной цикл игры. Теперь вместо человека 2 ход будет делать компьютер. Компьютер каждый раз будет говорить куда делает ход. Если компьютер не дает ответ, значит наметилась ничья — завершаем партию и объявляем ничью. Вот таким станет основной цикл игры, когда мы перепишем программу крестики-нолики под игру против компьютера:
# Основная программа game_over = False human = True while game_over == False: # 1. Показываем карту print_maps() # 2. Спросим у играющего куда делать ход if human == True: symbol = «X» step = int(input(«Человек, ваш ход: «)) else: print(«Компьютер делает ход: «) symbol = «O» step = AI() # 3. Если компьютер нашел куда сделать ход, то играем. Если нет, то ничья. if step != «»: step_maps(step,symbol) # делаем ход в указанную ячейку win = get_result() # определим победителя if win != «»: game_over = True else: game_over = False else: print(«Ничья!») game_over = True win = «дружба» human = not(human) # Игра окончена.
Покажем карту. Объявим победителя. print_maps() print(«Победил», win)
Готовая программа для игры в крестики нолики против компьютера на Python
Вот готовая программа для для игры против искусственного интеллекта.
# Инициализация карты maps = [1,2,3, 4,5,6, 7,8,9] # Инициализация победных линий victories = [[0,1,2], [3,4,5], [6,7,8], [0,3,6], [1,4,7], [2,5,8], [0,4,8], [2,4,6]] # Вывод карты на экран def print_maps(): print(maps[0], end = » «) print(maps[1], end = » «) print(maps[2]) print(maps[3], end = » «) print(maps[4], end = » «) print(maps[5]) print(maps[6], end = » «) print(maps[7], end = » «) print(maps[8]) # Сделать ход в ячейку def step_maps(step,symbol): ind = maps.index(step) maps[ind] = symbol # Получить текущий результат игры def get_result(): win = «» for i in victories: if maps[i[0]] == «X» and maps[i[1]] == «X» and maps[i[2]] == «X»: win = «X» if maps[i[0]] == «O» and maps[i[1]] == «O» and maps[i[2]] == «O»: win = «O» return win #Искусственный интеллект: поиск линии с нужным количеством X и O на победных линиях def check_line(sum_O,sum_X): step = «» for line in victories: o = 0 x = 0 for j in range(0,3): if maps[line[j]] == «O»: o = o + 1 if maps[line[j]] == «X»: x = x + 1 if o == sum_O and x == sum_X: for j in range(0,3): if maps[line[j]] != «O» and maps[line[j]] != «X»: step = maps[line[j]] return step #Искусственный интеллект: выбор хода def AI(): step = «» # 1) если на какой либо из победных линий 2 свои фигуры и 0 чужих — ставим step = check_line(2,0) # 2) если на какой либо из победных линий 2 чужие фигуры и 0 своих — ставим if step == «»: step = check_line(0,2) # 3) если 1 фигура своя и 0 чужих — ставим if step == «»: step = check_line(1,0) # 4) центр пуст, то занимаем центр if step == «»: if maps[4] != «X» and maps[4] != «O»: step = 5 # 5) если центр занят, то занимаем первую ячейку if step == «»: if maps[0] != «X» and maps[0] != «O»: step = 1 return step # Основная программа game_over = False human = True while game_over == False: # 1. Показываем карту print_maps() # 2. Спросим у играющего куда делать ход if human == True: symbol = «X» step = int(input(«Человек, ваш ход: «)) else: print(«Компьютер делает ход: «) symbol = «O» step = AI() # 3. Если компьютер нашел куда сделать ход, то играем. Если нет, то ничья. if step != «»: step_maps(step,symbol) # делаем ход в указанную ячейку win = get_result() # определим победителя if win != «»: game_over = True else: game_over = False else: print(«Ничья!») game_over = True win = «дружба» human = not(human) # Игра окончена. Покажем карту. Объявим победителя. print_maps() print(«Победил», win)
Вот пример игрового процессе. В этой игре победил компьютер:
1 2 3 4 5 6 7 8 9 Человек, ваш ход: 1 X 2 3 4 5 6 7 8 9 Компьютер делает ход: X 2 3 4 O 6 7 8 9 Человек, ваш ход: 2 X X 3 4 O 6 7 8 9 Компьютер делает ход: X X O 4 O 6 7 8 9 Человек, ваш ход: 4 X X O X O 6 7 8 9 Компьютер делает ход: X X O X O 6 O 8 9 Победил O
Вы можете прямо сейчас поиграть в крестики нолики против компьютера или друг против друга. Просто скопируйте текст программы на этой странице и вставьте его в поле программы в этом онлайн эмуляторе Python: https://replit.com/languages/python3 или тут https://www.onlinegdb.com/online_python_compiler
Домашнее задание
У нас получилась довольно беспощадная программа. Ее искусственный интеллект победить не возможно. Человек либо проигрывает, либо играет в ничью. Подумайте как можно дать человеку иногда выигрывать? Возможно вы захотите создать несколько уровней. Например в первом искусственный интеллект очень слаб, дальше он умнет.
Или у вас будет на выбор несколько режимов игры на выбор: слабый ИИ, средний и непобедимый.
В общем ваша задача немного ослабить искусственный интеллект в нашей игре крестики-нолики. Сделать его чуть более человечным.
Источник: programclub.ru