1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
| import random
def drawBoard(board):
# Impression du tableau
# "board" est un ensemble de 10 chaines de caractères (ignorant index 0)
print(' | |')
print(' ' + board[7] + ' | ' + board[8] + ' | ' + board[9])
print(' | |')
print('-----------')
print(' | |')
print(' ' + board[4] + ' | ' + board[5] + ' | ' + board[6])
print(' | |')
print('-----------')
print(' | |')
print(' ' + board[1] + ' | ' + board[2] + ' | ' + board[3])
print(' | |')
def inputPlayerLetter():
# Permets à l'utilisateur de choisir sa lettre
# Retourne une collection avec pour premier élément la lettre choisie par l'utilisateur
letter = ''
while not (letter == 'X' or letter == 'O'):
print('Voulez-vous etre X ou O?')
letter = input().upper()
if letter == 'X':
return ['X', 'O']
else:
return ['O', 'X']
def whoGoesFirst():
# Arbitrairement, choisis le joueur qui commence.
if random.randint(0, 1) == 0:
return 'ordinateur'
else:
return 'joueur'
def playAgain():
# Cette fonction retourne vrai si le joueur veut retenter sa chance.
print('Voulez-vous recommencer? (oui ou non)')
return input().lower().startswith('oui')
def makeMove(board, letter, move):
board[move] = letter
def isWinner(bo, le):
# Ayant pour paramètres un tableau nommé "bo" et une lettre nommée "le" (X/O), la fonction retourne vrai si le joueur a gagné.
return ((bo[7] == le and bo[8] == le and bo[9] == le) or # ligne du haut
(bo[4] == le and bo[5] == le and bo[6] == le) or # ligne du milieu
(bo[1] == le and bo[2] == le and bo[3] == le) or # ligne du bas
(bo[7] == le and bo[4] == le and bo[1] == le) or # ligne de gauche
(bo[8] == le and bo[5] == le and bo[2] == le) or # ligne centrale
(bo[9] == le and bo[6] == le and bo[3] == le) or # ligne de droite
(bo[7] == le and bo[5] == le and bo[3] == le) or # diagonale de gauche à droite
(bo[9] == le and bo[5] == le and bo[1] == le)) # diagonale de droite à gauche
def getBoardCopy(board):
# crée puis retoune la copie du tableau (passage de "à vide" à "complet"), mise à jour du tableau en somme.
dupeBoard = []
for i in board:
dupeBoard.append(i)
return dupeBoard
def isSpaceFree(board, move):
# retourne vrai si le mouvement passé est libre sur le tableau.
return board[move] == ' '
def getPlayerMove(board):
# Le joueur tape la case qu'il veut jouer.
move = ' '
while move not in '1 2 3 4 5 6 7 8 9'.split() or not isSpaceFree(board, int(move)):
print('Quel coup voulez-vous jouer ? (tappez un chiffre entre 1 et 9)')
move = input()
return int(move)
def chooseRandomMoveFromList(board, movesList):
# Retourne un mouvement valide à partir du tableau mis à jour, issu du dernier coup, à défaut retourne "None-aucun".
possibleMoves = []
for i in movesList:
if isSpaceFree(board, i):
possibleMoves.append(i)
if len(possibleMoves) != 0:
return random.choice(possibleMoves)
else:
return None
def getComputerMove(board, computerLetter):
# Ayant pour paramètres le tableau et la lettre attribuée à l'ordinateur, l'algorithme choisit un coup à jouer.
if computerLetter == 'X':
playerLetter = 'O'
else:
playerLetter = 'X'
# Algorithme:
# Dans un premier temps, l'application vérifie si l'ordinateur ne peut pas gagner avec le prochain coup
for i in range(1, 10):
copy = getBoardCopy(board)
if isSpaceFree(copy, i):
makeMove(copy, computerLetter, i)
if isWinner(copy, computerLetter):
return i
# Dans un deuxième temps (en cas d'impossibilité du premier), l'application vérifie si le joueur humain peut gagner avec le prochain coup et bloque ce coup en le jouant à sa place.
for i in range(1, 10):
copy = getBoardCopy(board)
if isSpaceFree(copy, i):
makeMove(copy, playerLetter, i)
if isWinner(copy, playerLetter):
return i
# Puis, il y a un choix effectué pour l'ordinateur de manière prioritaire:
# Si l'un des coins du tableau est libre, l'ordinateur joue un coup sur l'un des coins.
move = chooseRandomMoveFromList(board, [1, 3, 7, 9])
if move != None:
return move
# Si le centre du tableau est libre, l'ordinateur le joue.
if isSpaceFree(board, 5):
return 5
# Enfin, l'ordinateur joue l'une des autres cases libres.
return chooseRandomMoveFromList(board, [2, 4, 6, 8])
def isBoardFull(board):
# Retourne vrai si toutes les cases du tableau sont remplies.
for i in range(1, 10):
if isSpaceFree(board, i):
return False
return True
print('Tic Tac Toe!')
while True:
# Réinitialisation du tableau
theBoard = [' '] * 10
playerLetter, computerLetter = inputPlayerLetter()
turn = whoGoesFirst()
print('Le ' + turn + ' commence.')
print('Les nombres associés aux cases vont de bas en haut et de gauche à droite')
gameIsPlaying = True
while gameIsPlaying:
if turn == 'joueur':
# Tour du joueur.
drawBoard(theBoard)
move = getPlayerMove(theBoard)
makeMove(theBoard, playerLetter, move)
if isWinner(theBoard, playerLetter):
drawBoard(theBoard)
print('Bravo! Vous avez gagné!')
gameIsPlaying = False
else:
if isBoardFull(theBoard):
drawBoard(theBoard)
print('Pas de solution!')
break
else:
turn = 'ordinateur'
else:
# Tour de l'ordinateur.
move = getComputerMove(theBoard, computerLetter)
makeMove(theBoard, computerLetter, move)
if isWinner(theBoard, computerLetter):
drawBoard(theBoard)
print('Vous avez perdu.')
gameIsPlaying = False
else:
if isBoardFull(theBoard):
drawBoard(theBoard)
print('Pas de solution!')
break
else:
turn = 'joueur'
if not playAgain():
break |
Partager