Advertisement
Guest User

OthelloGameLogic.py

a guest
May 30th, 2015
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.29 KB | None | 0 0
  1. #Alex Lin 47142386
  2. NONE = ' '
  3. BLACK = 'B'
  4. WHITE = 'W'
  5. DIRECTIONS = [[1,1],[0,1],[1,0],[1,-1],[0,-1],[-1,-1],[-1,0],[-1,1]]
  6.  
  7. class InvalidMove(Exception):
  8.     pass
  9.  
  10. class Othello(object):
  11.  
  12.     def __init__(self, default, row, column, position, win_input):
  13.         board = []
  14.         self.win_choice = win_input
  15.         if default == 'Black':
  16.             self.turn = 'B'
  17.         elif default == 'White':
  18.             self.turn = 'W'
  19.         self.board = board
  20.  #       self.turn = default
  21.         self._row = int(row)
  22.         self._column = int(column)
  23.         if position == 'Black':
  24.             self.position = 'B'
  25.         elif position == 'White':
  26.             self.position = 'W'
  27.  
  28.        
  29.     def winner_choice(self, choice):
  30.         if self.b_score == self.w_score:
  31.             return('Game ends with a tie')
  32.         if choice == 'Most':
  33.             if self.b_score > self.w_score:
  34.                 return('Black wins')
  35.             else:
  36.                 return('White wins')
  37.         elif choice == 'Least':
  38.             if self.b_score > self.w_score:
  39.                 return('White wins')
  40.             else:
  41.                 return('Black wins')
  42.                
  43.     def is_valid(self, row, column)-> bool:
  44.        
  45.         if self.on_board(row, column):
  46.             try:
  47.                 if self.board[column][row] == NONE:
  48.                     return True
  49.             except IndexError:
  50.                 return False
  51.         return False      
  52.        
  53.     def on_board(self, row, column)-> bool:
  54.         if row <= int(self._row-1) and column <= int(self._column-1) and row >= 0 and column >= 0:
  55.             return True
  56.         else:
  57.            # print('Not on board')
  58.             return False
  59.        
  60.     def check_direction(self, row, column)-> bool:
  61.         possible = []
  62.         result = False
  63.         flip_test = []
  64.         for d in DIRECTIONS:
  65.             if self.on_board(row+d[0], column+d[1]):
  66.                 possible.append([row+d[0], column+d[1],d])        
  67.         for piece in possible:
  68.             row = piece[0]
  69.             column = piece[1]
  70.             if self.board[column][row] == self._opposite_player():
  71.                 if self._check_possible(piece[0],piece[1], piece[2]) != False:
  72.                     flip_test.append(piece)
  73.         for flipping in flip_test:
  74.             result = self._to_flip(flipping[0], flipping[1], flipping[2])
  75.         return result                
  76.            
  77.     def _check_possible(self, row, column, d_check):
  78.         while True:
  79.             row += d_check[0]
  80.             column += d_check[1]
  81.             if self.on_board(row, column):
  82.                 if self.board[column][row] == self.turn:
  83.                     return column, row
  84.                 elif self.board[column][row] == self._opposite_player():
  85.                     pass
  86.                 else:
  87.                     break
  88.             else:
  89.                 break
  90.         return False
  91.    
  92.     def _get_score(self):
  93.         self.b_score = 0
  94.         self.w_score = 0
  95.         for row in range(self._row):
  96.             for column in range(self._column):
  97.                 if self.board[column][row] == 'B':
  98.                     self.b_score += 1
  99.                 elif self.board[column][row] == 'W':
  100.                     self.w_score += 1
  101.         print('Score: ')
  102.         print('B:',self.b_score)
  103.         print('W:',self.w_score)
  104.        
  105.     def _to_flip(self, row, column, d):
  106.         result = False
  107.         while self.on_board(row, column):
  108.             if self.board[column][row] == self._opposite_player():
  109.                 self.board[column][row] = self.turn
  110.                 result = True
  111.                 pass
  112.             elif self.board[column][row] == self.turn:
  113.                 break
  114.             else:
  115.                 pass
  116.             row += d[0]
  117.             column += d[1]
  118.  
  119.         return result
  120.    
  121.     def _get_color(self, row, column)-> str:
  122.         if self.board[column][row] == 'B':
  123.             return 'Black'
  124.         elif self.board[column][row] == 'W':
  125.             return 'White'
  126.         else:
  127.             return
  128.    
  129.     def _get_color_no_str(self, row, column):
  130.         return self.board[column][row]
  131.    
  132.     def _opposite_player(self)-> str:
  133.     #Returns opposite player as string
  134.         if self.turn == 'B':
  135.             return 'W'
  136.         elif self.turn == 'W':
  137.             return 'B'
  138.         else:
  139.             pass
  140.  
  141.     def _opposite_player_position(self)-> str:
  142.     #Returns opposite player as string
  143.         if self.position == 'B':
  144.             return 'W'
  145.         elif self.position == 'W':
  146.             return 'B'
  147.         else:
  148.             pass          
  149.     def place_move(self, row, column):
  150.         if self.is_valid(row, column):
  151.             if self.check_direction(row, column):
  152.                 print('Placing move in row',row+1, 'column', column+1)
  153.                 self.board[column][row] = self.turn
  154.                 self._switch_turn()
  155.  #               self.print_game()
  156.             else:
  157.                 print('Could not place the move at location specified.')
  158.         else:
  159.             print('Could not place the move at location specified.')
  160.        
  161.     def _switch_turn(self):
  162.         if self.turn == 'B':
  163.             self.turn = 'W'
  164.         elif self.turn == 'W':
  165.             self.turn = 'B'    
  166.    
  167.     def new_game_board(self):
  168.         MIDDLE_COLUMN = int(self._column/2)
  169.         MIDDLE_ROW = int(self._row/2)
  170.         board = []
  171.         for col in range(self._column):
  172.             board.append([])
  173.             for row in range(self._row):
  174.                 board[-1].append(NONE)
  175.         board[MIDDLE_COLUMN-1][MIDDLE_ROW-1] = self.position
  176.         board[MIDDLE_COLUMN][MIDDLE_ROW] = self.position
  177.         board[MIDDLE_COLUMN][MIDDLE_ROW-1] = self._opposite_player_position()
  178.         board[MIDDLE_COLUMN-1][MIDDLE_ROW] = self._opposite_player_position()
  179.         self.board = board
  180.         return self.board
  181.  
  182.     def print_game(self):
  183.         for row in range(self._row):
  184.             print(row+1, end = '___ ')
  185.         print()
  186.         row_display = 1
  187.         for row in self.board:
  188.             for space in row:
  189.                 if space == ' ' or space == '':
  190.                     print('|___|', end = '')
  191.                 else:
  192.                     print('[',space,']', end = '')
  193.             print(row_display)
  194.             row_display += 1
  195.  
  196.     def _valid_turn(self)-> bool:
  197.         check_piece = []          
  198.         valid_move = []
  199.         check_piece = []
  200.         vpiece = []
  201.         for row in range(self._row):
  202.             for column in range(self._column):
  203.                 if self.board[column][row] == self.turn:
  204.                     check_piece.append([row, column])
  205.         for piece in check_piece:
  206.             if self._check_valid(piece[0], piece[1]) != False:
  207.                 vpiece.append(self._check_valid(piece[0], piece[1]))
  208.         if not vpiece:
  209.             return False
  210.         else:
  211.             return True
  212.  
  213.     def _check_valid(self, row, column):
  214.         self._check = self.turn
  215.         valid = []
  216.         valid_moves = []
  217.         for d in DIRECTIONS:
  218.             check_r = row+d[0]
  219.             check_c = column+d[1]
  220.             if self.on_board(check_r, check_c):
  221.                 if self.board[check_c][check_r] == self._opposite_player():
  222.                     valid.append([check_r, check_c, d])
  223.         for val in valid:
  224.             row = val[0]
  225.             col = val[1]
  226.             self.turn = NONE
  227.             if self._check_possible(row, col, val[2]) != False:
  228.                 valid_moves.append(self._check_possible(row, col, val[2]))
  229.         self.turn = self._check
  230.         if not valid_moves:
  231.             return False
  232.         else:
  233.             return valid_moves            
  234.        
  235.     def _get_score(self):
  236.         self.b_score = 0
  237.         self.w_score = 0
  238.         for row in range(self._row):
  239.             for column in range(self._column):
  240.                 if self._get_color(row, column) == 'Black':
  241.                     self.b_score += 1
  242.                 elif self._get_color(row, column) == 'White':
  243.                     self.w_score += 1
  244.  
  245.     def _current(self):
  246.         if self._valid_turn():
  247.             if self.turn == 'B':
  248.                 return 'Black\'s turn to place a move'
  249.             elif self.turn == 'W':
  250.                 return 'White\'s turn to place a move'
  251.         else:
  252.             self._switch_turn()
  253.             if self._valid_turn():
  254.                 return ('{} has no available moves, {}s turn to move'.format(self._opposite_current_turn(),self._current_turn()))
  255.             else:
  256.                 winner = self.winner_choice(self.win_choice)
  257.                 print(winner)
  258.                 return winner
  259.                 self._game_end = True
  260.     def _current_turn(self):
  261.         if self.turn == 'B':
  262.             return 'Black'
  263.         elif self.turn == 'W':
  264.             return 'White'
  265.     def _opposite_current_turn(self):
  266.         if self.turn == 'B':
  267.             return 'White'
  268.         elif self.turn == 'W':
  269.             return 'Black'
  270.     def _empty_board(self):
  271.         b = []
  272.         for row in range(self._row):
  273.             for column in range(self._column):
  274.                 if self._get_color(row, column) != None:
  275.                     b.append(self._get_color(row, column))
  276.             return True                
  277.         else:
  278.             return False
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement