# Ta Te Ti

Esto es un ta-te-ti (con jugador humano y/o programado!) que hice en algún momento de 2016.

```import copy

board = {
'A': [' ', ' ', ' '],
'B': [' ', ' ', ' '],
'C': [' ', ' ', ' '],
}

def print_board():
for i in "ABC":
print(" | {} | {} | {} |".format(*board[i]))

def check_winner_state(board, mark):

for i in "ABC":
if board[i] == [mark, mark, mark]:
return True

for j in [0,1,2]:
if [board["A"][j], board["B"][j], board["C"][j]]  == [mark, mark, mark]:
return True

if [board["A"],board["B"],board["C"]] == [mark, mark, mark]:
return True
if [board["A"],board["B"],board["C"]] == [mark, mark, mark]:
return True
return False

players_marks = "XO"

print_board()

player_names = {}

for mark in players_marks:
whatever = input("Enter your name for %s" % mark)
player_names[mark] = whatever

def human_player(mark):
return input("Enter turn {}: ".format(mark)).upper()

def computer_player(mark):
# Try everything and see if you can win
other_mark = set(players_marks) - set(mark)
for i in 'ABC':
for j in 0,1,2:
_b = copy.deepcopy(board)
if _b[i][j] != ' ':
continue
_b[i][j] = mark
if check_winner_state(_b, mark):
return i+str(j+1)

# So, we can't win. Try not to lose
for i in 'ABC':
for j in 0,1,2:
_b = copy.deepcopy(board)
if _b[i][j] != ' ':
continue
_b[i][j] = other_mark
if check_winner_state(_b, other_mark):
return i+str(j+1)

# fuck it
for i in 'ABC':
for j in 0,1,2:
if board[i][j] == ' ':
return i+str(j+1)

players = [computer_player, computer_player]

selector = 0
while True:

turn = selector % 2

mark = players_marks[turn]
inp = players[turn](mark)
if len(inp) != 2:   # A1
continue

x, y = inp
if x not in "ABC" or y not in "123":
continue
y = int(y)-1

if board[x][y] != ' ':
print("Position taken: ", inp)
continue

# mark the input
board[x][y] = mark

print_board()

if check_winner_state(board, mark):
print("%s, you are the winner, congrats!" % player_names[mark])

break

if selector == 8:
print("No more goes, no one wins, sorry :(")
break

selector += 1
```