Codage, algorithme, programmation, Python, Chain Reaction
Le but de ce mini-projet est d'écrire en langage Python un programme permettant de jouer au jeu de réflexion et de logique « Chain Reaction ». Entre 2 et 8 joueurs s'affrontent sur un plateau rectangulaire initialement vide comportant par défaut 8 lignes et 5 colonnes. Chaque joueur possède des pions d'une certaine couleur. Alternativement, chacun des joueurs va poser l'un de ses pions soit sur une case vide, soit sur une case contenant déjà un ou plusieurs de ses pions.
Les cases situées dans les coins du plateau ont une capacité maximale de 2 pions, celles situées sur les bords mais pas dans les coins ont une capacité maximale de 3 pions, et enfin celles situées à l'intérieur du plateau ont une capacité maximale de 4 pions.
Quand le nombre de pions sur une case est égal à la capacité maximale que celle-ci peut contenir, ces pions sont envoyés vers les cases adjacentes et la case se libère. Si sur l'une des cases adjacentes se trouvaient des pions du joueur, le nouveau pion se rajoute à ceux-ci. Si sur l'une des cases adjacentes se trouvaient des pions adverses, ceux-ci sont capturés, ils changent de couleur et le nouveau pion se rajoute ensuite.
Après un tel déplacement de pions, les cases adjacentes contiennent donc plus de pions qu'elles n'en avaient auparavant et peuvent donc à leur tour atteindre leur capacité maximale. Si c'est le cas, le phénomène se reproduit et ainsi de suite. On peut donc assister à une réaction en chaîne.
[...] Une fonction « loose(gameBoard,n,m,player) » où gameBoard est une liste à deux dimensions représentant un plateau de jeu, n son nombre de lignes, m son nombre de colonnes, et player le numéro d'un joueur. Elle retourne True si le joueur player a perdu la partie et False sinon. Une fonction « win(gameBoard,n,m,player) » où gameBoard est une liste à deux dimensions représentant un plateau de jeu, n son nombre de lignes, m son nombre de colonnes, et player le numéro d'un joueur. [...]
[...] On ajoute un compteur pour reperer #les chaines qui bouclent def put(gameBoard, player): fil = compt=0 while fil: #pop compt if compt>n*n*m*m: break x,y = fil.pop() if gameBoard[x,y,1] " ( 160)) leftPlrect = left.get_rect(topleft = (11 * width/16, height/6)) leftRorect = left.get_rect(topleft = (11 * width/ *height/6)) leftCorect = left.get_rect(topleft = (11 * width/ * height/6)) rightPlrect = right.get_rect(topleft = * width / height / rightRorect = right.get_rect(topleft = * width / * height / rightCorect = right.get_rect(topleft = * width / * height / rects = [rightPlrect, rightRorect, rightCorect, \ leftPlrect, leftRorect, leftCorect, startrect] nbPl = 2 nbRo = 8 nbCo = 5 pygame.display.flip() while going: pygame.time.wait(60) for event in pygame.event.get(): if event.type QUIT: going = False quit = True break elif event.type KEYDOWN and event.key K_ESCAPE: going = False quit = True break elif event.type MOUSEBUTTONDOWN : mousepos = pygame.mouse.get_pos() for r in rects: if r.inflate(20,20).collidepoint(mousepos): if r rightPlrect: if nbPl nbPl 1 elif r leftRorect: if nbRo > nbRo 1 elif r leftCorect: if nbCo > nbCo 1 elif r startrect: going = False nbPlSur = font.render(str(nbPl) ( 200)) nbRoSur = font.render(str(nbRo) ( 200)) nbCoSur = font.render(str(nbCo) ( 200)) if nbPl #on met en rouge nbPlSur = font.render(str(nbPl) ( 100)) mySurface.blit(background, mySurface.blit(nbPlSur, (25 * width/32, height/6)) mySurface.blit(nbRoSur, (25 * width/ * height/6)) mySurface.blit(nbCoSur, (25 * width/ * height/6)) mySurface.blit(selPl, (width/8, height/6)) mySurface.blit(selRo, (width/ * height/6)) mySurface.blit(selCo, (width/ * height/6)) mySurface.blit(left, leftPlrect) mySurface.blit(left, leftRorect) mySurface.blit(left, leftCorect) mySurface.blit(right, rightPlrect) mySurface.blit(right, rightRorect) mySurface.blit(right, rightCorect) mySurface.blit(start, startrect) pygame.display.flip() if quit : return return (nbPl, nbRo, nbCo) def drawCell(mySurface, gameBoard, width = mySurface.get_width() height = mySurface.get_height() size = width, height cellw = 100 cellh = 100 offsetw = 10 offseth = 10 basew = offsetw + j * cellw baseh = offseth + i * cellh positions = if gameBoard[i,j,1] in positions.append((basew + 50, baseh + if gameBoard[i,j,1] in positions.append((basew + 25, baseh + positions.append((basew + 75, baseh + for pos in positions : pygame.draw.circle(mySurface, colors[gameBoard[i,j,0] pos, def drawBoard(mySurface, gameBoard, player): width = mySurface.get_width() height = mySurface.get_height() size = width, height cellw = 100 cellh = 100 offsetw = 10 offseth = 10 for i in range(n+1): st = (offsetw, offseth + i * cellh) end = (offsetw + m * cellw, offseth + i * cellh) pygame.draw.line(mySurface, colors[player st, end) for j in range(m+1): st = (offsetw + j * cellw, offseth) end = (offsetw + j * cellw, offseth + n * cellh) pygame.draw.line(mySurface, colors[player st, end) def select(mySurface, gameBoard, player): going = True quit = False width = mySurface.get_width() height = mySurface.get_height() size = width, height cellw = 100 cellh = 100 offsetw = 10 offseth = 10 while going : pygame.time.wait(60) for event in pygame.event.get(): if event.type QUIT: going = False quit = True break elif event.type KEYDOWN and event.key K_ESCAPE: going = False quit = True break elif event.type MOUSEBUTTONDOWN : mousepos = pygame.mouse.get_pos() i = (mousepos[1] - offseth) / cellh j = (mousepos[0] - offsetw) / cellw if i in range(n) and j in range(m) and possible(gameBoard, player): going = False if quit: return return def gamePlay(mySurface, gameBoard, width = mySurface.get_width() height = mySurface.get_height() going = True quit = False size = width, height cellw = 100 cellh = 100 offsetw = 10 offseth = 10 background=pygame.Surface(size).convert() background.fill((10,10,10)) mySurface.blit(background, players=range(1, nb+1) current = 0 all_have_played = False while going or not(all_have_played): player = players[current] #on affiche tout mySurface.blit(background, drawBoard(mySurface, gameBoard, player) for i in range(n): for j in range(m): drawCell(mySurface, gameBoard, pygame.display.flip() i,j = select(mySurface, gameBoard, player) if i quit = True break put(gameBoard, player) if all_have_played and win(gameBoard, player): going = False break if all_have_played : for pl in players: if lose(gameBoard, players.remove(pl) current 1 if current len(players): all_have_played = True current = 0 mySurface.blit(background, drawBoard(mySurface, gameBoard, player) for i in range(n): for j in range(m): drawCell(mySurface, gameBoard, if quit: return return player, colors[current] def againstIa(mySurface, gameBoard, width = mySurface.get_width() height = mySurface.get_height() going = True quit = False size = width, height cellw = 100 cellh = 100 offsetw = 10 offseth = 10 background=pygame.Surface(size).convert() background.fill((10,10,10)) mySurface.blit(background, all_have_played = False while going: mySurface.blit(background, drawBoard(mySurface, gameBoard, for i in range(n): for j in range(m): drawCell(mySurface, gameBoard, pygame.display.flip() i,j = select(mySurface, gameBoard, if quit = True break put(gameBoard, if win(gameBoard, and all_have_played: going = False winner = 1 break all_have_played = True mySurface.blit(background, drawBoard(mySurface, gameBoard, for i in range(n): for j in range(m): drawCell(mySurface, gameBoard, pygame.display.flip() #opponent plays randomely i,j = random.choice([(i,j) for i in range(n) for j in range(m) if \ possible(gameBoard, rect = ((offsetw + j * cellw offseth + i * cellh c = ( 10) pygame.draw.rect(mySurface, rect) pygame.display.flip() pygame.time.wait(500) put(gameBoard, if win(gameBoard, going = False winner = 2 break mySurface.blit(background, drawBoard(mySurface, gameBoard, for i in range(n): for j in range(m): drawCell(mySurface, gameBoard, pygame.display.flip() if quit: return return winner, colors[winner-1] def main(): size = width, height = #initialisation de pygame pygame.init() screen = pygame.display.set_mode(size) pygame.display.set_caption('Chain Reaction') going = True quit = False while going : pl,n,m = initGame(screen) if pl : quit = True break board = newBoard(n,m) if pl > 1 : winner, color = gamePlay(screen,board,n,m,pl) else : winner, color = againstIa(screen, board, if winner : quit = True break font = pygame.font.Font(None, 60) wintext = font.render("player " + str(winner) + " wins " color) winrect = wintext.get_rect(center = (m*100/2, n*100/2)) quittext = font.render("quit" (200,200,200)) quitrect = quittext.get_rect(center = (m*100/4, 3*n*100/4)) replaytext = font.render("replay" (200,200,200)) replayrect = replaytext.get_rect(center= (3*m*100/4, 3*n*100/4)) disp = True while disp : pygame.time.wait(60) for event in pygame.event.get(): if event.type QUIT: disp = False quit = True break elif event.type KEYDOWN and event.key K_ESCAPE: disp = False quit = True break elif event.type MOUSEBUTTONDOWN : mousepos = pygame.mouse.get_pos() if quitrect.inflate(20,20).collidepoint(mousepos): disp = False quit = True if replayrect.inflate(20,20).collidepoint(mousepos): disp = False screen.blit(wintext, winrect) screen.blit(quittext, quitrect) screen.blit(replaytext, replayrect) pygame.display.flip() if quit: break if quit: pygame.quit() main() Algorithmique et Python 1ADS 1 PREAMBULE Cet examen est à réaliser par groupes de deux étudiants. Dans l'unique cas où le nombre d'étudiants de la promotion est impair, un et un seul groupe de trois est autorisé. Toute forme de plagiat ou utilisation de codes disponibles sur internet ou tout autre support, même de manière partielle, est strictement interdite et se verra sanctionnée d'un d'une mention « cheater », et le cas échéant d'un conseil de discipline. [...]
[...] Les captures d'écran de ce sujet (parties 2 et ne sont là que pour vous donner une idée. Remarque 3 : tous les événements seront déclenchés par la souris et non par le clavier SAISIE DES PARAMETRES Dans un fichier que l'on nommera « chainReactionGUI.py », implémenter le sous-programme suivant : Page 9 sur 13 © SUPINFO International University – http://www.supinfo.com Algorithmique et Python 1ADS • Une fonction « initGame(mySurface) » où mySurface est une surface Pygame déjà créée. Elle demande à l'utilisateur de saisir le nombre de joueurs (nécessairement entre 2 et le nombre de lignes (nécessairement entre 3 et 10) et le nombre de colonnes (nécessairement entre 3 et puis retourne ces trois valeurs sous la forme d'un t-uple. [...]
[...] Ce mini-projet donnera lieu à des soutenances. Vos horaires de passages vous seront communiqués par votre campus. Les soutenances sont également par groupes de deux. Elles dureront 20 minutes pendant lesquelles vous montrerez à votre examinateur le bon fonctionnement de votre programme en en faisant la démonstration. Si vous n'avez pas implémenté le projet dans sa totalité, vous exposerez les parties fonctionnelles. [...]
[...] Elle fait choisir au joueur player une case sur laquelle il peut poser un pion et retourne les coordonnées de celle-ci. Une procédure « gamePlay(mySurface,gameBoard,n,m,nb) » où gameBoard est une liste à deux dimensions représentant le plateau de jeu, n son nombre de lignes, m son nombre de colonnes, mySurface la surface sur laquelle on dessine, et nb le nombre de joueurs. Elle gère une partie complète entre les nb joueurs sur le plateau de jeu gameBoard. Elle affiche également le vainqueur à l'issue de la partie LA PROCEDURE PRINCIPALE Dans le fichier précédent, implémenter le sous-programme suivant : • Une procédure « chainReaction() » qui ne prend aucun paramètre. [...]
Source aux normes APA
Pour votre bibliographieLecture en ligne
avec notre liseuse dédiée !Contenu vérifié
par notre comité de lecture