kernel_memory_dump

TicTacToe

Apr 14th, 2014
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.31 KB | None | 0 0
  1. #!/usr/bin/env python
  2. #Filename: tic-tac-toe.py
  3. #Description: Tic-Tac-Toe two player game
  4.  
  5. class GAME:
  6.  
  7.     def __init__(self):
  8.         '''Initialize parameters - the game board, moves stack and winner'''
  9.  
  10.         self.board = [ '-' for i in range(0,9) ]
  11.         self.lastmoves = []
  12.         self.winner = None
  13.  
  14.     def print_board(self):
  15.         '''Print the current game board'''
  16.        
  17.         print "\nCurrent board:"
  18.  
  19.         for j in range(0,9,3):
  20.             for i in range(3):
  21.                 if self.board[j+i] == '-':
  22.                     print "%d |" %(j+i),
  23.                 else:
  24.                     print "%s |" %self.board[j+i],
  25.    
  26.             print "\n",
  27.  
  28.  
  29.     def get_free_positions(self):
  30.         '''Get the list of available positions'''
  31.  
  32.         moves = []
  33.         for i,v in enumerate(self.board):
  34.             if v=='-':
  35.                 moves.append(i)
  36.         return moves
  37.  
  38.     def mark(self,marker,pos):
  39.         '''Mark a position with marker X or O'''
  40.         self.board[pos] = marker
  41.         self.lastmoves.append(pos)
  42.  
  43.     def revert_last_move(self):
  44.         '''Reset the last move'''
  45.  
  46.         self.board[self.lastmoves.pop()] = '-'
  47.         self.winner = None
  48.  
  49.     def is_gameover(self):
  50.         '''Test whether game has ended'''
  51.  
  52.         win_positions = [(0,1,2), (3,4,5), (6,7,8), (0,3,6),(1,4,7),(2,5,8), (0,4,8), (2,4,6)]
  53.  
  54.         for i,j,k in win_positions:
  55.             if self.board[i] == self.board[j] == self.board[k] and self.board[i] != '-':
  56.                 self.winner = self.board[i]
  57.                 return True
  58.  
  59.         if '-' not in self.board:
  60.             self.winner = '-'
  61.             return True
  62.  
  63.         return False
  64.  
  65.     def play(self,player1,player2):
  66.         '''Execute the game play with players'''
  67.  
  68.         self.p1 = player1
  69.         self.p2 = player2
  70.    
  71.         for i in range(9):
  72.  
  73.             self.print_board()
  74.            
  75.             if i%2==0:
  76.                 if self.p1.type == 'H':
  77.                     print "\t\t[Human's Move]"
  78.                 else:
  79.                     print "\t\t[Computer's Move]"
  80.  
  81.                 self.p1.move(self)
  82.             else:
  83.                 if self.p2.type == 'H':
  84.                     print "\t\t[Human's Move]"
  85.                 else:
  86.                     print "\t\t[Computer's Move]"
  87.  
  88.                 self.p2.move(self)
  89.  
  90.             if self.is_gameover():
  91.                 self.print_board()
  92.                 if self.winner == '-':
  93.                     print "\nGame over with Draw"
  94.                 else:
  95.                     print "\nWinner : %s" %self.winner
  96.                 return
  97.  
  98. class Human:
  99.     '''Class for Human player'''
  100.  
  101.     def __init__(self,marker):
  102.         self.marker = marker
  103.         self.type = 'H'
  104.    
  105.     def move(self, gameinstance):
  106.  
  107.         while True:
  108.        
  109.             m = raw_input("Input position:")
  110.  
  111.             try:
  112.                 m = int(m)
  113.             except:
  114.                 m = -1
  115.        
  116.             if m not in gameinstance.get_free_positions():
  117.                 print "Invalid move. Retry"
  118.             else:
  119.                 break
  120.    
  121.         gameinstance.mark(self.marker,m)
  122.          
  123. class AI:
  124.     '''Class for Computer Player'''
  125.  
  126.     def __init__(self, marker):
  127.         self.marker = marker
  128.         self.type = 'C'
  129.  
  130.         if self.marker == 'X':
  131.             self.opponentmarker = 'O'
  132.         else:
  133.             self.opponentmarker = 'X'
  134.  
  135.     def move(self,gameinstance):
  136.         move_position,score = self.maximized_move(gameinstance)
  137.         gameinstance.mark(self.marker,move_position)
  138.  
  139.  
  140.  
  141.     def maximized_move(self,gameinstance):
  142.         ''' Find maximized move'''    
  143.         bestscore = None
  144.         bestmove = None
  145.  
  146.         for m in gameinstance.get_free_positions():
  147.             gameinstance.mark(self.marker,m)
  148.        
  149.             if gameinstance.is_gameover():
  150.                 score = self.get_score(gameinstance)
  151.             else:
  152.                 move_position,score = self.minimized_move(gameinstance)
  153.        
  154.             gameinstance.revert_last_move()
  155.            
  156.             if bestscore == None or score > bestscore:
  157.                 bestscore = score
  158.                 bestmove = m
  159.  
  160.         return bestmove, bestscore
  161.  
  162.     def minimized_move(self,gameinstance):
  163.         ''' Find the minimized move'''
  164.  
  165.         bestscore = None
  166.         bestmove = None
  167.  
  168.         for m in gameinstance.get_free_positions():
  169.             gameinstance.mark(self.opponentmarker,m)
  170.        
  171.             if gameinstance.is_gameover():
  172.                 score = self.get_score(gameinstance)
  173.             else:
  174.                 move_position,score = self.maximized_move(gameinstance)
  175.        
  176.             gameinstance.revert_last_move()
  177.            
  178.             if bestscore == None or score < bestscore:
  179.                 bestscore = score
  180.                 bestmove = m
  181.  
  182.         return bestmove, bestscore
  183.  
  184.     def get_score(self,gameinstance):
  185.         if gameinstance.is_gameover():
  186.             if gameinstance.winner  == self.marker:
  187.                 return 1 # Won
  188.             elif gameinstance.winner == self.opponentmarker:
  189.                 return -1 # Opponent won
  190.         return 0 # Draw
  191.        
  192.  
  193. if __name__ == '__main__':
  194.     game=GAME()    
  195.     player1 = Human("X")
  196.     player2 = AI("O")
  197.     game.play( player1, player2)
Advertisement
Add Comment
Please, Sign In to add comment