Last active
September 28, 2017 23:45
-
-
Save colyk/ad7273c8ca319406b3a1bf70da906f77 to your computer and use it in GitHub Desktop.
tic
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from random import randint | |
from copy import deepcopy | |
board = [['-','-','-'],['-','-','-'],['-','-','-']] | |
def prnt(): | |
print('-'*15) | |
for i in range(3): | |
print ("|| {} | {} | {} ||".format(*board[i])) | |
print('-'*15) | |
def is_finished(): | |
for i in range(3): | |
for j in range(3): | |
if(board[i][j] == '-'): | |
return 0 | |
return 1 | |
def get_points(mark): | |
return divmod(mark,3) | |
def is_field(mark): | |
i, j = get_points(mark) | |
if(board[i][j] == '-'): | |
return 0 | |
return 1 | |
def fill(mark, instance = 'X'): | |
i, j = get_points(mark) | |
board[i][j] = instance | |
def bot_fill(): | |
if(is_finished()): | |
return | |
# Если есть такой хо при котором бот выграет, то он его сделает | |
local_board = deepcopy(board) | |
for mark in range(9): | |
i, j = get_points(mark) | |
if(not is_field(mark)): | |
local_board[i][j] = '0' | |
else: | |
continue | |
if(get_winner(local_board) == 0 and not is_field(mark)): | |
fill(mark,'0') | |
return | |
local_board[i][j] = '-' | |
# Если есть такой ход при котором человек выграет, то бот заблокирует его | |
row_sum_list = [] | |
col_sum_list = [] | |
for i in range(3): | |
row_sum = '' | |
col_sum = '' | |
for j in range(3): | |
row_sum += board[i][j] | |
col_sum += board[j][i] | |
row_sum_list.append(row_sum) | |
col_sum_list.append(col_sum) | |
for i in row_sum_list: | |
if(i.count('X') == 2 and '0' not in i): | |
board[row_sum_list.index(i)][i.find('-')] = '0' | |
return | |
for j in col_sum_list: | |
if(j.count('X') == 2 and '0' not in j): | |
board[j.find('-')][col_sum_list.index(j)] = '0' | |
return | |
dig1 = board[0][0] + board[1][1] + board[2][2] | |
dig2 = board[0][2] + board[1][1] + board[2][0] | |
if(dig1.count('X') == 2 and '0' not in dig1): | |
a = dig1.find('-') | |
board[a][a] = '0' | |
return | |
if(dig2.count('X') == 2 and '0' not in dig2): | |
a = dig1.find('-') | |
if(a == 0): | |
board[2][0] = '0' | |
elif(a == 1): | |
board[1][1] = '0' | |
else: | |
board[0][2] = '0' | |
return | |
# В остальных случаях ходить рандомно | |
mark = randint(0,8) | |
while(is_field(mark) and not is_finished()): | |
mark = randint(0,8) | |
fill(mark,'0') | |
def get_winner(tab): | |
row_sum_list = [] | |
col_sum_list = [] | |
for i in range(3): | |
row_sum = '' | |
col_sum = '' | |
for j in range(3): | |
row_sum += tab[i][j] | |
col_sum += tab[j][i] | |
row_sum_list.append(row_sum) | |
col_sum_list.append(col_sum) | |
result = [] | |
result.extend(row_sum_list) | |
result.extend(col_sum_list) | |
dig1 = '' | |
for i in range(3): | |
dig1 += tab[i][i] | |
result.append(dig1) | |
dig2 = tab[0][2] + tab[1][1] + tab[2][0] | |
result.append(dig2) | |
if('XXX' in result): | |
return 1 # print('Человек победил!') | |
elif('000' in result): | |
return 0 # print('Бот победил!') | |
else: | |
return -1 # print('Ничья!') | |
while(not is_finished()): | |
mark = int(input(': ')) | |
while(is_field(mark)): | |
mark = int(input(': ')) | |
fill(mark) | |
bot_fill() | |
prnt() | |
if(get_winner(board) == 0): | |
print('Бот победил!') | |
break | |
if(get_winner(board) == 1): | |
print('Человек победил!') | |
break | |
else: | |
print('Ничья!') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment