git-subtree-dir: users/wpcarro git-subtree-mainline:464bbcb15cgit-subtree-split:24f5a642afChange-Id: I6105b3762b79126b3488359c95978cadb3efa789
		
			
				
	
	
		
			99 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import random
 | |
| 
 | |
| def print_board(board):
 | |
|     result = []
 | |
|     for row in range(len(board)):
 | |
|         r = []
 | |
|         for col in range(len(board[row])):
 | |
|             cell = board[row][col]
 | |
|             if not cell:
 | |
|                 r.append("-")
 | |
|             else:
 | |
|                 r.append(cell)
 | |
|         result.append(" | ".join(r))
 | |
|     print("\n---------\n".join(result))
 | |
| 
 | |
| def init_board():
 | |
|     result = []
 | |
|     for row in range(3):
 | |
|         r = []
 | |
|         for col in range(3):
 | |
|             r.append(None)
 | |
|         result.append(r)
 | |
|     return result
 | |
| 
 | |
| def check(board, player):
 | |
|     print_board(board)
 | |
|     print()
 | |
|     if player not in "XO":
 | |
|         raise Exception("Only checking the board for Xs or Os. You supplied {}".format(player))
 | |
|     dn, ax, ddg, udg = "DOWN", "ACROSS", "DOWN_DIAGONAL", "UP_DIAGONAL"
 | |
|     ways = [
 | |
|         [[dn, ax, ddg], [dn], [dn, udg]],
 | |
|         [[ax], [], []],
 | |
|         [[ax], [], []],
 | |
|     ]
 | |
|     for row in range(len(board)):
 | |
|         for col in range(len(board[row])):
 | |
|             if board[row][col] == player:
 | |
|                 xs = ways[row][col]
 | |
|                 for x in xs:
 | |
|                     if x == dn:
 | |
|                         if {player} == {board[row+1][col], board[row+2][col]}:
 | |
|                             return True
 | |
|                     if x == ax:
 | |
|                         if {player} == {board[row][col+1], board[row][col+2]}:
 | |
|                             return True
 | |
|                     if x == ddg:
 | |
|                         if {player} == {board[row+1][col+1], board[row+2][col+2]}:
 | |
|                             return True
 | |
|                     if x == udg:
 | |
|                         if {player} == {board[row+1][col-1], board[row+2][col-2]}:
 | |
|                             return True
 | |
|     return False
 | |
| 
 | |
| def op(player):
 | |
|     return "X" if player == "O" else "O"
 | |
| 
 | |
| dn_win = lambda p: [
 | |
|     [op(p), p, None],
 | |
|     [op(p), p, None],
 | |
|     [None,  p, None],
 | |
| ]
 | |
| 
 | |
| ax_win = lambda p: [
 | |
|     [p, p, p],
 | |
|     [op(p), op(p), None],
 | |
|     [None, None, None],
 | |
| ]
 | |
| 
 | |
| ddg_win = lambda p: [
 | |
|     [p, None, None],
 | |
|     [op(p), p, None],
 | |
|     [op(p), None, p],
 | |
| ]
 | |
| 
 | |
| udg_win = lambda p: [
 | |
|     [op(p), None, p],
 | |
|     [op(p), p, None],
 | |
|     [p, None, None],
 | |
| ]
 | |
| 
 | |
| # Down
 | |
| p = random.choice(["X", "O"])
 | |
| assert check(dn_win(p), p) == True
 | |
| assert check(dn_win(p), op(p)) == False
 | |
| # Across
 | |
| p = random.choice(["X", "O"])
 | |
| assert check(ax_win(p), p) == True
 | |
| assert check(ax_win(p), op(p)) == False
 | |
| # Down Diagonally
 | |
| p = random.choice(["X", "O"])
 | |
| assert check(ddg_win(p), p) == True
 | |
| assert check(ddg_win(p), op(p)) == False
 | |
| # Down Diagonally
 | |
| p = random.choice(["X", "O"])
 | |
| assert check(udg_win(p), p) == True
 | |
| assert check(udg_win(p), op(p)) == False
 | |
| # Success
 | |
| print("Tests pass!")
 |