Advertisement
Guest User

eqdist FINAL

a guest
May 23rd, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.09 KB | None | 0 0
  1.  
  2.  
  3. def board_legal(board):
  4.     for i in range(9):
  5.         for j in range(1, 4):
  6.             if i + 2 * j < 9:
  7.                 if board[i] != "_" and board[i] == board[i + j] and board[i] == board[i + 2 * j]:
  8.                     return False
  9.     return True
  10.  
  11.  
  12. def move_legal(board, player, move):
  13.     board[move] = player
  14.     if board_legal(board):
  15.         board[move] = "_"
  16.         return True
  17.     else:
  18.         board[move] = "_"
  19.         return False
  20.  
  21.  
  22. def no_moves_left(board, player):
  23.     for i in range(9):
  24.         if board[i] == "_" and move_legal(board, player, i):
  25.             return False
  26.     return True
  27.  
  28.  
  29. def switch_players(player):
  30.     if player == "X":
  31.         return "O"
  32.     else:
  33.         return "X"
  34.  
  35.  
  36. def play_move(board, player, move, end_set, game):
  37.     board[move] = player
  38.     new_game = game
  39.     new_game += ''.join(board)
  40.     new_game += ", "
  41.     do_turn(board, switch_players(player), end_set, new_game)
  42.     board[move] = "_"
  43.  
  44.  
  45. def moves_blocked(board, player, move, blockee):
  46.     current_moves = 0
  47.     for i in range(9):
  48.         if board[i] == "_" and move_legal(board, blockee, i):
  49.             current_moves += 1
  50.     board[move] = player
  51.     for i in range(9):
  52.         if board[i] == "_" and move_legal(board, blockee, i):
  53.             current_moves -= 1
  54.     board[move] = "_"
  55.     return current_moves
  56.  
  57.  
  58. def do_turn(board, player, end_set, game):
  59.     if no_moves_left(board, player) and switch_players(player) == "X":
  60.         end_set.add(game)
  61.     else:
  62.         if player == "X":  # #go over all possible moves for player 1
  63.             for i in range(9):
  64.                 if board[i] == "_" and move_legal(board, player, i):
  65.                     play_move(board, player, i, end_set, game)
  66.         else:  # go over possible moves for player 2, according to strategy
  67.             if board[0] == "_" and move_legal(board, player, 0):  # #first priority is edges
  68.                 play_move(board, player, 0, end_set, game)
  69.             if board[8] == "_" and move_legal(board, player, 8):
  70.                 play_move(board, player, 8, end_set, game)
  71.             if board[8] != "_" and board[0] != "_":  # if edges are not free
  72.                 if board[8] == "O" and board[0] == "O":  # in all cases where both edges are "O",
  73.                     for i in [1, 3, 4, 5, 7]:  # the only way to lose is to place a circle in 2,6
  74.                         if board[i] == "_" and move_legal(board, player, i):
  75.                             play_move(board, player, i, end_set, game)
  76.                 else:
  77.                     if board == ["O", "X", "_", "_", "_", "_", "_", "_", "X"]:
  78.                         play_move(board, player, 2, end_set, game)
  79.                     else:
  80.                         x = -1
  81.                         max_delta = -10000
  82.                         for i in range(9):
  83.                             if board[i] == "_":
  84.                                 i_delta = moves_blocked(board, player, i, "X") - moves_blocked(board, player, i, "O")
  85.                                 if i_delta > max_delta:
  86.                                     x = i
  87.                                     max_delta = i_delta
  88.                         play_move(board, player, x, end_set, game)
  89.  
  90.  
  91. def main():
  92.     board = ["_", "_", "_", "_", "_", "_", "_", "_", "_"]
  93.     player = "X"
  94.     end_set = set()
  95.     do_turn(board, player, end_set, "")
  96.     new_set = set()
  97.     count_x = [0, 0, 0, 0, 0, 0, 0, 0, 0]
  98.     count_o = [0, 0, 0, 0, 0, 0, 0, 0, 0]
  99.     for a in end_set:
  100.         if a[::-1] not in new_set:
  101.             if a[0] != "X":
  102.                 new_set.add(a[::-1])
  103.             if a[0] == "X":
  104.                 new_set.add(a)
  105.     for a in end_set:
  106.         print(a)
  107.     #     for i in range(9):
  108.     #         if a[i] != "_":
  109.     #             if a[i] == "X":
  110.     #                 count_x[i] = count_x[i] + 1
  111.     #             else:
  112.     #                 count_o[i] = count_o[i] + 1
  113.     # x_percent = [i * 100 / len(new_set) for i in count_x]
  114.     # o_percent = [i * 100 / len(new_set) for i in count_o]
  115.     # print(x_percent)
  116.     # print(o_percent)
  117.     print(len(new_set))
  118.  
  119.  
  120. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement