jmooremcc

TTT Gameboard class

Jun 10th, 2022
1,654
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.54 KB | None | 0 0
  1. #Tic Tac Toe Gameboard Class
  2. from pprint import pprint
  3.  
  4. X = 1
  5. O = 10
  6. XWINNER = 3
  7. OWINNER = 30
  8. EMPTY = ' '
  9. MAXCELLS = 9
  10.  
  11. def chunker(seq, size):
  12.     return (seq[pos:pos + size] for pos in range(0, len(seq), size))
  13.  
  14. class GameBoardProof:
  15.     winningSlices = [
  16.         slice(0,9,4), # Left Diagonal
  17.         slice(2,7,2) # Right Diagonal
  18.     ]
  19.     winningSlices.extend([slice(i, i+7, 3)  for i in range(0,3)]) # Columns
  20.     winningSlices.extend([slice(i, i + 3) for i in range(0, 9, 3)])  # Rows
  21.  
  22.     def __init__(self):
  23.         self._board = [i for i in range(10)]
  24.  
  25.     def display(self):
  26.         bar ="|"
  27.         for i in range(0, 9, 3):
  28.             print(bar+bar.join([str(ch) for ch in self._board[slice(i,i+3)]])+bar)
  29.  
  30.     def proof(self):
  31.         for s in self.winningSlices:
  32.             print(self._board[s])
  33.  
  34.  
  35. class GameBoard:
  36.     winningSlices = [
  37.         slice(0, 9, 4),  # Left Diagonal
  38.         slice(2, 7, 2)  # Right Diagonal
  39.     ]
  40.     winningSlices.extend([slice(i, i + 7, 3) for i in range(0, 3)])  # Columns
  41.     winningSlices.extend([slice(i, i + 3) for i in range(0, 9, 3)])  # Rows
  42.  
  43.     def __init__(self):
  44.         self.clear()
  45.  
  46.     def clear(self):
  47.         self._board = [EMPTY for i in range(9)]
  48.  
  49.     def display(self, doprint=True):
  50.         bar ="|"
  51.         result = ''
  52.         for i in range(0, 9, 3):
  53.             tmp = bar+bar.join([str(ch) for ch in self._board[slice(i,i+3)]])+bar
  54.             tmp = tmp.replace(str(O),'O')
  55.             tmp = tmp.replace(str(X),'X')
  56.             if doprint:
  57.                 print(tmp)
  58.             else:
  59.                 result += tmp
  60.  
  61.         if doprint:
  62.             print("*" * 7)
  63.         else:
  64.             return result
  65.  
  66.     def addMark(self,pos, mark,TEST=False):
  67.         if TEST:
  68.             self._board[pos] = mark
  69.             return
  70.  
  71.         if 0 <= pos < MAXCELLS and self._board[pos] is EMPTY:
  72.             self._board[pos] = mark
  73.  
  74.     def getMark(self, pos):
  75.         if 0 <= pos < MAXCELLS and self._board[pos] is not EMPTY:
  76.             return self._board[pos]
  77.  
  78.     def isTieGame(self):
  79.         try:
  80.             self._board.index(EMPTY)
  81.             return False
  82.         except:
  83.             return True
  84.  
  85.     def getWinner(self):
  86.         for s in self.winningSlices:
  87.             try:
  88.                 slicesum = sum(self._board[s])
  89.                 if slicesum == XWINNER:
  90.                     return 'X'
  91.                 elif slicesum == OWINNER:
  92.                     return 'O'
  93.             except Exception as e:
  94.                 pass
  95.  
  96.     def __repr__(self):
  97.         return list(chunker(self.display(False),7))
  98.  
  99. gb = GameBoardProof()
  100. print("PROOF")
  101. gb.display()
  102. print()
  103. pprint(gb.winningSlices)
  104. print()
  105. gb.proof()
  106. print("*"*40)
  107.  
  108. print("TEST WINNER DETECTION")
  109. gb = GameBoard()
  110. gb.display()
  111. print("No Winner")
  112.  
  113. positions = [x for x in range(9)]
  114. for s in gb.winningSlices:
  115.     for pos in positions[s]:
  116.         gb.addMark(pos,X)
  117.  
  118.     gb.display()
  119.     winner = gb.getWinner()
  120.     print(f"{winner=}")
  121.  
  122.  
  123.     gb.clear()
  124.  
  125. print("*"*40)
  126.  
  127. print("TEST For A TIE")
  128. mark = X
  129. gb.clear()
  130. gb.display()
  131. print("No Tie")
  132. for n, s in enumerate(gb.winningSlices):
  133.     for pos in positions[s]:
  134.         gb.addMark(pos,mark,True)
  135.         mark = O if mark == X else X
  136.  
  137.     if n == 2:
  138.         if gb.getWinner() is None:
  139.             gb.display()
  140.             print("No Winner")
  141.             print(f"{gb.isTieGame()=}")
  142.  
  143. gb.addMark(0,X,True)
  144. gb.addMark(2,X,True)
  145. gb.addMark(1,O,True)
  146. gb.display()
  147. print(f"{gb.isTieGame()=}")
  148.  
  149. print("Finished...")
  150.  
Advertisement
Add Comment
Please, Sign In to add comment