Best Python code snippet using ATX
main.py
Source:main.py
1"""2Création : 03/04/20213Personnes : Martin Prévost4Bibliothèques : 5 PySimpleGUI6 random 7 pygame8"""9import PySimpleGUI as sg10from random import randint11import pygame12#----Ecran d'accueille----13pygame.init()14sg.theme('LightGrey1')15start = [[sg.B('', image_filename='menu.png', key='Start')]]16window = sg.Window('Bataille Navale', layout=start)17while True:18 event, values = window.read()19 if event == 'Start':20 break21 if event in (sg.WIN_CLOSED, 'Exit'):22 break23window.close()24#----Phase de Jeu----25#----Phase 1 : Placement des bateaux par le joueur----26def autour_bateau(tab):27 '''28 Récupérer les cases autour d'un bateau ou autour d'un groupe de cases29 Parameters30 ----------31 tab : list32 tableau avec les vecteurs correspondant aux cases33 Returns34 -------35 autour : list36 tableau avec les cases et les cases autours37 '''38 autour = []39 for i in range(0,len(tab)):40 autour.append(tab[i])41 autour.append((tab[i][0]+1,tab[i][1]))42 autour.append((tab[i][0]-1,tab[i][1]))43 autour.append((tab[i][0],tab[i][1]+1))44 autour.append((tab[i][0],tab[i][1]-1)) 45 autour = list(set(autour)) #enveler les doublets46 return autour47def verif(t1,t2):48 '''49 Vérifier qu'un bateau est bien placé par rapport aux autres50 Parameters51 ----------52 t1 : list53 cases des autres bateaux54 t2 : list55 cases d'un bateau56 Returns57 -------58 int59 indice vrai ou faux : bien placé ou non60 save : list61 tableau avec les cases fausses62 '''63 save = []64 res = False65 for i in range(len(t2)):66 if t2[i] in t1:67 save.append(t2[i])68 res = True69 autour = autour_bateau(t1)[:]70 for i in range(len(t2)):71 if t2[i] in autour:72 res = True73 return res, save74def reste(tab,save):75 '''76 Enlever un bateau mal placé77 Parameters78 ----------79 tab : list80 coordonnées des cases du tableau81 save : list82 cases déjà utilisées par un autre bateau83 Returns84 -------85 None.86 '''87 for i in range(len(tab)):88 if tab[i] not in save:89 window[tab[i]].update('', button_color=('white'))90 91def placement_j(n):92 '''93 Placement des n cases d'un bateau de manière juxtaposée94 Parameters95 ----------96 n : int97 taille du bateau98 Returns99 -------100 tab : list101 coordonnées des cases du bateau102 '''103 tab = []104 cpt = 0105 while True:106 event, values = window.read()107 if type(event)==tuple and min(event)>10:108 window[event].update('â¯', button_color=('green'))109 tab.append(event)110 cpt += 1111 break112 while True:113 event, values = window.read()114 if type(event)==tuple and min(event)>10:115 if (event[0]==tab[0][0]-1 or event[0]==tab[0][0]+1) and event[1]==tab[0][1]:116 break117 if (event[1]==tab[0][1]-1 or event[1]==tab[0][1]+1) and event[0]==tab[0][0]:118 break119 cpt +=1120 window[event].update('â¯', button_color=('green'))121 tab.append(event)122 save1 = [tab[0][1],tab[1][1]]123 save2 = [tab[0][0],tab[1][0]]124 if n>2:125 while True:126 event, values = window.read()127 if type(event)==tuple and min(event)>10:128 if tab[0][0]==tab[1][0] and tab[0][0]==event[0]:129 if event[1]==min(save1)-1 or event[1]==max(save1)+1:130 save1.append(event[1])131 window[event].update('â¯', button_color=('green'))132 tab.append(event)133 cpt += 1134 if cpt==n:135 break136 continue137 if tab[0][1]==tab[1][1] and tab[0][1]==event[1]:138 if event[0]==min(save2)-1 or event[0]==max(save2)+1:139 save2.append(event[0])140 window[event].update('â¯', button_color=('green'))141 tab.append(event)142 cpt += 1143 if cpt==n:144 break145 return tab146def recur_placement(t_tot,t1,a):147 '''148 Placer le nouveau bateau jusqu'à que tout soit correct (collé/chevauchement)149 Parameters150 ----------151 t_tot : list152 coordonnées des bateaux précédents153 t1 : list154 coordonnées du nouveau bateau (à vérifier)155 a : int156 longueur du bateau157 Returns158 -------159 t1 : tab160 coordonnées du nouveau bateau161 '''162 while True:163 res, save = verif(t_tot,t1) #on vérifie si c'est juste164 if res==False:165 return t1166 if res==True:167 reste(t1,save) #on reset les cases du bateau168 t1 = placement_j(a)[:] #on redemande un new bateau169 170def phase_1():171 '''172 Placer les 5 bateaux avec appel aux fonctions de placement et vérification et message d'info173 Returns174 -------175 emplacement : list176 liste des coordonnées des cases de l'emsemble des bateaux du joueur177 '''178 window['Commencer'].update(visible=False)179 window['Finir'].update(visible=False)180 181 window['faire'].update('Vous devez placer vos différents bateaux')182 window['flotte'].update('Placez votre porte-avions : 5 cases')183 tab_5 = placement_j(5)[:]184 185 window['flotte'].update('Placez votre croiseur : 4 cases')186 tab_4 = placement_j(4)[:]187 tab_save_4 = recur_placement(tab_5,tab_4,4)[:]188 189 window['flotte'].update('Placez votre contre-torpilleur n1 : 3 cases')190 tab_3_1 = placement_j(3)191 tab_tot1 = tab_5[:] + tab_save_4[:]192 tab_save_3_1 = recur_placement(tab_tot1,tab_3_1,3)[:]193 194 window['flotte'].update('Placez votre contre-torpilleur n2: 3 cases')195 tab_3_2 = placement_j(3)[:]196 tab_tot2 = tab_tot1[:] + tab_save_3_1[:]197 tab_save_3_2 = recur_placement(tab_tot2,tab_3_2,3) 198 199 window['flotte'].update('Placez votre sous-marin : 2 cases')200 tab_2 = placement_j(2)[:]201 tab_tot3 = tab_tot2[:] + tab_save_3_2[:]202 tab_save_2 = recur_placement(tab_tot3,tab_2,2)203 204 emplacement = tab_tot3[:] + tab_save_2[:]205 window['flotte'].update('')206 return emplacement207#----Phase 2 : Placement des bateaux par le robot----208def placement_bot(n):209 '''210 Placement aléatoire d'un bateau de n cases (pour le robot)211 Parameters212 ----------213 n : int214 longeur du bateau215 Returns216 -------217 bateau : list218 coordonnées des n cases du nouveau bateau 219 '''220 alea = randint(0,1)221 bateau = [(0, 0)]*n222 if alea == 0: 223 ligne = randint(1,11-n)224 colone = randint(1,10)225 for i in range(len(bateau)):226 bateau[i] = (ligne+i,colone) 227 if alea == 1:228 ligne = randint(1,10)229 colone = randint(1,11-n)230 for i in range(len(bateau)):231 bateau[i] = (ligne,colone+i)232 return bateau 233def verif_bot(total,new):234 '''235 Vérification que le nouveau bateau est valide (pas collé à un autre bateau236 et pas de chevauchement)237 Parameters238 ----------239 total : list240 tableau contenant les anciens bateaux241 new : list242 nouveau bateau243 Returns244 -------245 res : booleen246 true valide / false invalide247 '''248 res = True249 for i in range(len(new)):250 if new[i] in total:251 res = False252 autour = autour_bateau(total)[:]253 for i in range(len(new)):254 if new[i] in autour:255 res = False256 return res257def phase_2():258 '''259 Placement par le robot des bateaux260 Returns261 -------262 coordonner_bot : list263 coordonnées des cases des différents bateaux264 '''265 coordonner_bot = placement_bot(5) #place un bateau de taille n=5266 267 bateau_4 = placement_bot(4)268 while verif_bot(coordonner_bot,bateau_4) == False: #s'arrete quand bateau_4 269 bateau_4 = placement_bot(4) #n'est pas collé ou au dessus de bateau_5270 271 bateau_3_1 = placement_bot(3)272 coordonner_bot += bateau_4[:]273 while verif_bot(coordonner_bot,bateau_3_1) == False:274 bateau_3_1 = placement_bot(3)275 276 bateau_3_2 = placement_bot(3)277 coordonner_bot += bateau_3_1[:]278 while verif_bot(coordonner_bot,bateau_3_2) == False:279 bateau_3_2 = placement_bot(3)280 281 bateau_2 = placement_bot(2)282 coordonner_bot += bateau_3_2[:]283 while verif_bot(coordonner_bot,bateau_2) == False:284 bateau_2 = placement_bot(2)285 286 coordonner_bot += bateau_2 287 #décommenter pour afficher les bateaux ennemis (utile pour le debug et le dev)288 """289 for i in range(len(coordonner_bot)):290 window[coordonner_bot[i]].update(button_color=('','green'))291 """292 return coordonner_bot 293#----Phase 3 : Phase de tir----294 295def couler_bateau(tire,coord,indice):296 '''297 Détermine si un bateau a été coulé, si oui on affiche un message et on 298 modifie la première case du bateau coulé par (0,0) dans le tableau coord 299 pour savoir lesquelles sont déjà coulées. Fonction commune au robot et au joueur.300 Parameters301 ----------302 tire : list303 Tableau contenant l'historique des tirs.304 coord : list305 coordonnées des différents bateaux.306 indice : str307 Pour le message coulé par le 'robot' ou le 'joueur'.308 Returns309 -------310 Booléen311 True : un bateau est coulé, None : l'inverse.312 coord : list313 coordonnées des différents bateaux.314 int315 score à ajouter.316 int317 indice pour le tir intelligent : savoir si dernier tir a mené à un 'coulé'.318 '''319 bateau = [0,5,9,12,15,17]320 longeur = ['porte-avions','croiseur','contre-torpilleur n1','contre-torpilleur n2'321 ,'sous-marin']322 for i in range(len(bateau)-1):323 if set(coord[bateau[i]:bateau[i+1]]).issubset(set(tire))==True:324 window['flotte'].update(str(indice)+str(longeur[i])+' !')325 coord[bateau[i]] = (0, 0)326 return True, coord, bateau[i+1]-bateau[i], 2327 return None, coord, 0, 0 328 329def couler(tire,coord,score):330 '''331 Changer le score en cas de touché ou coulé332 Parameters333 ----------334 tire : list335 Tableau contenant l'historique des tirs.336 coord : list337 coordonnées des différents bateaux.338 score : int339 score du joueur.340 Returns341 -------342 list343 coordonnées des différents bateaux modifiés ou non.344 int345 score modifié.346 '''347 indice = 'Vous avez coulé le '348 rep, coordonner, score_add, mar = couler_bateau(tire,coord,indice)349 if rep==True:350 pygame.mixer.Sound('couler.mp3').play()351 return coordonner, score+(score_add*2)352 if tire[-1] in coord:353 window['flotte'].update('Vous avez touché un bateau !')354 return coord, score+1355 356def toucher(tire,coord):357 '''358 Savoir si le joueur a touché ou coulé ou raté et donc qui doit jouer après.359 Parameters360 ----------361 tire : list362 Tableau contenant l'historique des tirs.363 coord : list364 coordonnées des différents bateaux.365 366 Returns367 -------368 bool369 Le joueur garde la main ou c'est au robot de jouer.370 '''371 if tire[-1] in tire[0:len(tire)-1]: #case déjà tiré 372 pygame.mixer.Sound('plouffe.mp3').play(0, 0, 5000)373 return False374 if tire[-1] in coord:375 window[tire[-1]].update('⬤', button_color=('red',''))376 explosion_son = pygame.mixer.Sound("explosion.ogg")377 explosion_son.play()378 return True379 else:380 pygame.mixer.Sound('plouffe.mp3').play(0, 0, 5000)381 window[tire[-1]].update('⬤', button_color=('#5DADE2',''))382 window['flotte'].update('Raté')383 return False384def tire_joueur(tire_du_joueur,n): 385 '''386 Demander au joueur de tirer, et ajouter la case à l'historique de tirs387 Parameters388 ----------389 tire_du_joueur : list390 Tableau contenant l'historique des tirs.391 n : booléen392 indice : déjà tiré ou pas : utile pour le 'message'393 Returns394 -------395 tire_du_joueur : list396 Tableau contenant l'historique des tirs et la nouvelle case.397 '''398 while True:399 if n==False:400 window['faire'].update('Sélectionnez une case à torpiller')401 if n==True:402 window['faire'].update('Sélectionnez une nouvelle case à torpiller')403 event, values = window.read()404 if type(event)==tuple and max(event)<11:405 tire_du_joueur.append(event)406 break407 return tire_du_joueur408def alea_tire_bot(tire_b):409 '''410 Tire intélligent : Mode 1 : tire une case aléatoire pas déjà touchée 411 (et pas à coté des bateaux coulés) et uniqement sur les diagonales une sur deux.412 Parameters413 ----------414 tire_b : list415 Tableau contenant l'historique des tirs et les cases 'interdites'.416 Returns417 -------418 tire_b : list419 Tableau contenant l'historique des tirs et la nouvelle case.420 '''421 ligne = randint(11,20) 422 col = randint(1,5)*2+10 423 if (ligne % 2) == 0:424 col-=1425 while ((ligne, col) in tire_b)==True:426 ligne = randint(11,20) 427 col = randint(1,5)*2+10 428 if (ligne % 2) == 0:429 col-=1430 tire_b.append((ligne, col))431 return tire_b432def chasse(tire_b,save_case): 433 '''434 Tir intélligent : Mode 2.1 : après avoir touché une case on en cherche une435 juxtaposée jusqu'à toucher ou couler436 Parameters437 ----------438 tire_b : list439 Tableau contenant l'historique des tirs.440 save_case : list441 case touchée du bateau chassé.442 Returns443 -------444 tire_b : list445 Tableau contenant l'historique des tirs et la nouvelle case.446 '''447 new_tire = (1,50)448 while (min(new_tire) > 10 and max(new_tire) < 21 and (new_tire not in tire_b))==False:449 alea = randint(1,4)450 if alea == 1 :451 new_tire = (save_case[0][0]-1,save_case[0][1])452 if alea == 2 :453 new_tire = (save_case[0][0]+1,save_case[0][1])454 if alea == 3 :455 new_tire = (save_case[0][0],save_case[0][1]-1)456 if alea == 4 :457 new_tire = (save_case[0][0],save_case[0][1]+1)458 tire_b.append(new_tire)459 return tire_b460 461def chasse1(tire_b,save_case): 462 '''463 Tir intélligent : Mode 2.2 : après avoir touché 2 cases d'un même bateau, 464 on tire aléatoirement sur les 2 cases possibles (si elles sont valides)465 Parameters466 ----------467 tire_b : list468 Tableau contenant l'historique des tirs.469 save_case : list470 cases touchées du bateau chassé.471 Returns472 -------473 tire_b : list474 Tableau contenant l'historique des tirs et la nouvelle case.475 '''476 new_tire = (1,50)477 while (min(new_tire) > 10 and max(new_tire) < 21 and (new_tire not in tire_b))==False:478 alea = randint(1,2)479 if save_case[0][0]==save_case[1][0]: 480 if alea==1:481 mini_tab=save_case[0][1]482 for i in range(len(save_case)):483 if mini_tab>save_case[i][1]:484 mini_tab=save_case[i][1]485 new_tire = (save_case[0][0],mini_tab-1,) 486 if alea==2:487 max_tab=save_case[0][1]488 for i in range(len(save_case)):489 if max_tab<save_case[i][1]:490 max_tab=save_case[i][1]491 new_tire = (save_case[0][0],max_tab+1)492 493 if save_case[0][1]==save_case[1][1]: 494 if alea==1:495 mini_tab=save_case[0][0]496 for i in range(len(save_case)):497 if mini_tab>save_case[i][0]:498 mini_tab=save_case[i][0]499 new_tire = (mini_tab-1,save_case[0][1]) 500 if alea==2:501 max_tab=save_case[0][0]502 for i in range(len(save_case)):503 if max_tab<save_case[i][0]:504 max_tab=save_case[i][0]505 new_tire = (max_tab+1,save_case[0][1])506 tire_b.append(new_tire)507 return tire_b508 509def tire_bot(tire_b,etat,save_case,nb_touche):510 '''511 Tir du robot : Choisie entre le mode de tir 1 ; 2.1 et 2.2 512 elle peut initialiser le tableau save_c qui stocke les cases du bateau chassé513 514 Parameters515 ----------516 tire_b : list517 Tableau contenant l'historique des tirs.518 etat : int519 indice pour choisir le mode de tir provenant entre autre de la réponse du joueur.520 save_case : list521 cases touchées du bateau chassé.522 nb_touche : int523 nombre de cases touchées par le robot sur le bateau chassé.524 Returns525 -------526 tire_b : list527 Tableau contenant l'historique des tirs et la nouvelle case.528 save_case : list529 cases touchées du bateau chassé.530 '''531 if etat==0 or etat==2:532 if len(save_case)>1:533 save_c = autour_bateau(save_case)534 tire_b = tire_b[:] + save_c[:]535 save_case = []536 tire_b = alea_tire_bot(tire_b)[:]537 if etat==1:538 if nb_touche==1:539 save_case = []540 save_case.append(tire_b[-1])541 tire_b = chasse(tire_b,save_case)[:]542 if nb_touche==2:543 tire_b = chasse(tire_b,save_case)[:]544 if nb_touche>2:545 tire_b = chasse1(tire_b,save_case)[:] 546 alpha = '-ABCDEFGHIJ'547 localisation = 'Je joue en : '+str(alpha[tire_b[-1][1]-10])+str(tire_b[-1][0]-10)548 window['bot'].update(localisation)549 pygame.mixer.Sound("audio/"+str(alpha[tire_b[-1][1]-10])+str(tire_b[-1][0]-10)+'.mp3').play()550 return tire_b, save_case551def placement_pion_bot(coord,tire,score,etat,nb_touche,save_case):552 '''553 Réponse du joueur au robot et placement du pion par le joueur; anti triche et reste de 554 tour; appel aux fonctions pour calculer le score, savoir si un bateau est coulé..; 555 changement des indices pour le tir intélligent; jouer les effets sonores;556 message d'indication pour le joueur; sauvegarde dans save_case de la case si touchée ou 557 coulée.558 559 Parameters560 ----------561 coord : list562 coordonnées des bateaux du robot.563 tire : list564 Tableau contenant l'historique des tirs.565 score : int566 score du joueur.567 etat : int568 indice pour le choisir le mode de tir intélligent.569 nb_touche : int570 indice du nb de cases touchées d'un même bateau.571 save_case : list572 cases touchées du bateau chassé.573 Returns574 -------575 list576 coordonnées des bateaux du robot (modifier si un bateau est coulé).577 bool578 qui joue : robot ou joueur.579 int580 score du joueur.581 int582 score à enlever si triche.583 tire : list584 Tableau contenant l'historique des tirs et la nouvelle case.585 int586 etat : indice pour le choisir le mode de tir intélligent.587 nb_touche : int588 indice du nb de cases touché d'un même bateau..589 save_case : list590 cases touchées du bateau chassé + eventuellement une nouvelle.591 '''592 new_tire = []593 save_score = score594 save_coord = coord[:]595 for i in range(len(tire)):596 new_tire.append((tire[i][0],tire[i][1]))597 while True:598 window['faire'].update('Répondez au robot si il a raté ou touché ou coulé')599 event, values = window.read()600 if event == 'Touché' or event == 'Coulé' or event == 'Raté': 601 if new_tire[-1] not in coord:602 window['flotte'].update('Le robot a raté')603 a = False604 if event != 'Raté':605 pygame.mixer.Sound("cheat.mp3").play()606 window['info'].update('Vous avez triché sur la réponse !!!')607 window['flotte'].update('Le tour est annulé')608 del tire[-1]609 return save_coord, True, save_score+1, -10, tire, etat, nb_touche, save_case 610 indice = 'Le robot a coulé le '611 bool1, coord, add_scores, etat2 = couler_bateau(new_tire,coord,indice) 612 score += add_scores*2613 if bool1 == True: 614 a = True615 if event != 'Coulé':616 pygame.mixer.Sound("cheat.mp3").play() 617 window['info'].update('Vous avez triché sur la réponse !!!')618 window['flotte'].update('Le tour est annulé')619 del tire[-1]620 return save_coord, True, save_score+1, -10, tire, etat, nb_touche, save_case 621 if bool1 == None: 622 if new_tire[-1] in coord: 623 window['flotte'].update('Le robot a touché un bateau')624 score += 1625 a = True626 if event != 'Touché':627 pygame.mixer.Sound("cheat.mp3").play() 628 window['info'].update('Vous avez triché sur la réponse !!!')629 window['flotte'].update('Le tour est annulé')630 del tire[-1]631 return save_coord, True, save_score+1, -10, tire, etat, nb_touche, save_case632 633 window['faire'].update('Placer la case du robot demandée')634 event, values = window.read()635 chang = (tire[-1][0],tire[-1][1])636 if event != chang:637 pygame.mixer.Sound("cheat.mp3").play() 638 window['info'].update('Vous avez triché sur la localisation !!!')639 window['flotte'].update('Le tour est annulé')640 del tire[-1]641 return save_coord, True, save_score+1, -10, tire, etat, nb_touche, save_case 642 if a==False:643 window['info'].update('')644 window[chang].update('⬤', button_color=('#5DADE2',''))645 if etat==1 and len(save_case)==1:646 nb_touche=2647 if etat==1 and len(save_case)>1:648 nb_touche=3649 pygame.mixer.Sound('plouffe.mp3').play(0, 0, 5000)650 return coord, False, score, 0, tire, etat, nb_touche, save_case651 if a==True:652 window['info'].update('')653 window[chang].update('⬤', button_color=('red',''))654 if etat2==0:655 pygame.mixer.Sound("explosion.ogg").play()656 if etat==1:657 nb_touche = 3658 if etat==0:659 nb_touche = 1660 etat2=1661 save_case.append(tire[-1])662 if etat2==2:663 pygame.mixer.Sound('couler.mp3').play() 664 nb_touche = 0665 etat2 = 0666 save_case.append(tire[-1])667 return coord, True, score, 0, tire, etat2, nb_touche, save_case668def stop_jeu(coord_joueur,coord_bot):669 '''670 Arrêter la partie si plus de points ou tous les bateaux sont coulés671 Parameters672 ----------673 coord_joueur : list674 Coordonnées des bateaux du joueur.675 coord_bot : list676 Coordonnées des bateaux du robot.677 Returns678 -------679 bool680 Si partie finie = True sinon false.681 '''682 if coord_joueur[0] == (0, 0) and coord_joueur[5] == (0, 0) and coord_joueur[9] == (0, 0) and coord_joueur[12] == (0, 0) and coord_joueur[15] == (0, 0):683 return True684 if coord_bot[0] == (0, 0) and coord_bot[5] == (0, 0) and coord_bot[9] == (0, 0) and coord_bot[12] == (0, 0) and coord_bot[15] == (0, 0):685 return True686 return False 687def phase_3(coord_joueur,coord_bot):688 '''689 Gére qui doit tirer et fait appel au différentes fonctions de tir...690 Renvoie le score final en fin de partie691 Parameters692 ----------693 coord_joueur : list694 Coordonnées des bateaux du joueur.695 coord_bot : list696 Coordonnées des bateaux du robot.697 Returns698 -------699 score_bot : int700 score du robot.701 score_joueur : int702 score du joueur.703 '''704 window['Raté'].update(visible=True)705 window['Touché'].update(visible=True)706 window['Coulé'].update(visible=True)707 score_bot = 25708 score_joueur = 25709 tire_du_joueur = []710 tire_du_bot = []711 etat = 0712 save_case = []713 nb_touche = 0 714 window['t_joueur'].update(image_filename='fire.png')715 while score_bot>0 and score_joueur>0:716 n=False717 tire_du_joueur = tire_joueur(tire_du_joueur,n)718 score_joueur -= 1719 while toucher(tire_du_joueur,coord_bot)==True:720 coord_bot, score_joueur = couler(tire_du_joueur,coord_bot,score_joueur)721 if stop_jeu(coord_joueur,coord_bot) == True:722 break723 if score_bot<1 or score_joueur<1:724 break725 n=True726 tire_du_joueur = tire_joueur(tire_du_joueur,n)727 score_joueur -= 1728 if stop_jeu(coord_joueur,coord_bot) == True:729 break 730 reponce = True 731 window['t_joueur'].update(image_filename='blanc.png')732 window['t_bot'].update(image_filename='fire.png')733 while reponce == True:734 if stop_jeu(coord_joueur,coord_bot) == True:735 break736 if score_bot<1 or score_joueur<1:737 break738 tire_du_bot, save_case = tire_bot(tire_du_bot,etat,save_case,nb_touche) 739 score_bot -= 1740 coord_joueur, reponce, score_bot, add_score_j, tire_du_bot, etat, nb_touche, save_case = placement_pion_bot(coord_joueur,tire_du_bot,score_bot,etat,nb_touche,save_case)741 score_joueur += add_score_j742 window['t_joueur'].update(image_filename='fire.png')743 window['t_bot'].update(image_filename='blanc.png')744 if stop_jeu(coord_joueur,coord_bot) == True:745 break 746 return score_bot, score_joueur 747#----Affichage graphique---748score_bot = 'stop'749score_joueur = 'stop' 750alphab = 'ABCDEFGHIJ'751nb_col = nb_ligne = 10752layout_bot = [[sg.T('', key=('bot'), size=(50, 3))]]753layout_bot += [[sg.Button('', size=(4,2), pad=(0,0), button_color=('white'), key=('t_bot'))]+754 [sg.Button(alphab[i], pad=(0,0), size=(4,2), key=('rien1'), button_color=('#318CE7')) 755 for i in range(nb_col)]]756layout_bot += [[sg.B(i, size=(4,2), pad=(0,0), button_color=('#318CE7'))]+757 [sg.Button('', size=(4, 2), key=(i,j), pad=(0,0), button_color=('white')) 758 for j in range(1,1+nb_col)] for i in range(1,1+nb_col)]759layout_j = [[sg.T('', key=('flotte'), size=(50, 3))]]760layout_j += [[sg.Button('', size=(4,2), pad=(0,0), button_color=('white'), key=('t_joueur'))]+761 [sg.Button(alphab[i], pad=(0,0), size=(4,2), key=('rien2'), button_color=('#318CE7')) 762 for i in range(nb_col)]]763layout_j += [[sg.B(i-10, size=(4,2), pad=(0,0), button_color=('#318CE7'))]+764 [sg.Button('', size=(4, 2), key=(i,j), pad=(0,0), button_color=('white')) 765 for j in range(nb_col+1,nb_col+11)] for i in range(nb_ligne+1,nb_ligne+11)]766lay_button = [[sg.Button("Raté", visible=False, pad=(0,0))]]767lay_b2 = [[sg.Button("Touché", visible=False, pad=(0,0))]]768lay_b3 = [[sg.Button("Coulé", visible=False, pad=(0,0))]]769lay_button2 = [[sg.T('', key=('info'), size=(30, 1))]]770lay_button2 += [[sg.T('Chose à faire :'), 771 sg.T('Appuyez sur commencer pour débuter', key=('faire'), size=(25, 2))]]772lay_button3 = [[sg.Button("Commencer"), sg.Button("Finir")]]773layout_var = [[sg.Frame('Ennemi', layout_bot, title_color='red', pad=(10,10))]+774 [sg.Frame('Vous', layout_j, title_color='blue')],775 [sg.Column(lay_button, justification='centrer')]+776 [sg.Column(lay_b2, justification='centrer')]+777 [sg.Column(lay_b3, justification='centrer')],778 [sg.Column(lay_button2, justification='centrer')],779 [sg.Column(lay_button3, justification='centrer')]]780window = sg.Window('Bataille navale', layout=layout_var) #afficher la fenêtre781#----Boucle while : appel des phases 1,2 et 3----782while True:783 event, values = window.read()784 if event in (sg.WIN_CLOSED, 'Exit'):785 break786 if event == 'Finir':787 break788 if event == 'Commencer':789 coord_joueur = phase_1()[:] #phase de placement des bateaux par le joueur790 coord_bot = phase_2()[:] #phase de placement des bateaux du bot791 score_bot, score_joueur = phase_3(coord_joueur,coord_bot) #phase de tir792 break793 794window.close()795#----Partie finie : gestion de la base de données et score----796def changement_ordre(nom, score):797 '''798 Trie les scores avec les pseudos associés dans l'ordre décroissant.799 Parameters800 ----------801 nom : list802 liste des pseudos.803 score : list804 liste des scores.805 Returns806 -------807 nom : list808 liste des pseudos triés.809 score : list810 liste des scores triés.811 '''812 n = len(nom)813 for i in range(n):814 for j in range(0, n-i-1):815 score_nb1 = int(score[j][0:score[j].find('!')])816 score_nb2 = int(score[j+1][0:score[j+1].find('!')])817 if score_nb1 < score_nb2:818 score[j], score[j+1] = score[j+1], score[j]819 nom[j], nom[j+1] = nom[j+1], nom[j]820 return nom, score 821def remplisage_actu(nom, score):822 '''823 Réécrire le fichier txt trié824 Parameters825 ----------826 nom : list827 liste des pseudos.828 score : list829 liste des scores.830 Returns831 -------832 data_base : list833 contient tous les pseudos et scores associés pour afficher la base de données.834 '''835 f = open("score_data.txt", "w", encoding="utf8")836 f.write(str(2*len(nom))+'!\n')837 data_base = []838 for j in range(len(nom)):839 f.write(str(nom[j][0:nom[j].find('!')]).upper()+'!\n')840 f.write(str(score[j][0:score[j].find('!')])+'!\n')841 data_base.append(str(nom[j][0:nom[j].find('!')])+' : '+842 str(score[j][0:score[j].find('!')]))843 f.close() 844 return data_base845def cherche_pseudo(nom,score,pseudo,score_joueur):846 '''847 Si le joueur existe : afficher le score total sinon add le joueur dans base 848 de données fait appel aux fonctions changement_ordre et remplisage_actu849 Parameters850 ----------851 nom : list852 liste des pseudos.853 score : list854 liste des scores.855 pseudo : str856 Pseudo du joueur.857 score_joueur : int858 score du joueur.859 Returns860 -------861 data_base : list862 contient tous les pseudos et scores associés pour afficher la base de données.863 '''864 for i in range(len(nom)):865 if pseudo.upper() == str(nom[i][0:nom[i].find('!')]):866 score[i] = int(score[i][0:score[i].find('!')]) + score_joueur 867 affichage = 'Pseudo : '+str(nom[i][0:nom[i].find('!')].lower())+'\n'868 window['res'].update(affichage+'Vous avez un score total : '+str(score[i])) 869 score[i] = str(score[i])+'!'870 nom_new, score_new = changement_ordre(nom, score)[:]871 data_base = remplisage_actu(nom_new, score_new)872 return data_base873 nom.append(pseudo) 874 score.append(score_joueur)875 affichage = 'Nouveau joueur : '+str(nom[-1])+'\n'+'Vous avez '+str(score[-1])+' de score !'876 window['res'].update(affichage)877 nom[-1] = str(nom[-1])+'!'878 score[-1] = str(score[-1])+'!'879 nom_new, score_new = changement_ordre(nom, score)[:]880 data_base = remplisage_actu(nom_new, score_new) 881 return data_base882 883def resultat(pseudo,score_joueur):884 '''885 Lis le fichier score_data.txt pour crée 2 tableaux : nom et score886 Parameters887 ----------888 pseudo : str889 Pseudo du joueur.890 score_joueur : int891 score du joueur.892 Returns893 -------894 data_base : list895 contient tous les pseudos et scores associés pour afficher la base de données.896 '''897 f = open("score_data.txt", "r", encoding="utf8")898 nom = []899 score = []900 longeur = f.readline()901 longeur = longeur[0:longeur.find('!')]902 for i in range(int(longeur)):903 if (i % 2) == 0:904 nom.append(f.readline())905 else:906 score.append(f.readline())907 f.close()908 data_base = cherche_pseudo(nom,score,pseudo,score_joueur)909 return data_base910def fermer_win():911 '''912 Permet de fermer la fenêtre où on entre son pseudo913 ''' 914 while True:915 event, values = window.read()916 if event == 'Fermer' or event in (sg.WIN_CLOSED, 'Exit'):917 break918#----Affichage perdu ou gagné----919resume=False920if score_bot != 'stop' and score_joueur != 'stop': 921 if score_bot < score_joueur:922 pygame.mixer.Sound("victoir.mp3").play() 923 score_tot = 'Avec un score de : '+str(score_joueur)924 layout_fin = [[sg.Txt('Vous avez gagné ð !!'),sg.Txt(score_tot)]]925 layout_fin += [[sg.Txt('Entrez votre pseudo : '), 926 sg.In(size=(12,1), key='pseudo_entrer')]]927 layout_fin += [[sg.Ok("Entrer"), sg.Txt('', key=('res'), size=(30,2))]]928 layout_fin += [[sg.Button('Fermer')]]929 if score_bot > score_joueur:930 pygame.mixer.Sound("perdu.mp3").play()931 layout_fin = [[sg.Txt("Vous avez perdu ð",size=(22,1))]]932 933 window = sg.Window('Résultat', layout=layout_fin)934 935 while True:936 event, values = window.read()937 if event in (sg.WIN_CLOSED, 'Exit'):938 break939 if event == 'Entrer':940 pseudo = values['pseudo_entrer']941 data_base = resultat(pseudo,score_joueur)942 fermer_win()943 resume = True 944 break 945 window.close()946#----Affichage Base de données----947if resume==True:948 longeur_data = 20949 if len(data_base)<20:950 longeur_data = len(data_base)951 layout_data = [[sg.T('Base de données (affiche les 20 premiers max):')]]952 layout_data += [[sg.T(data_base[i].lower(), size=(30, 1))] for i in range(longeur_data)]953 window = sg.Window('Base de données', layout=layout_data)954 955 while True:956 event, values = window.read()957 if event in (sg.WIN_CLOSED, 'Exit'):958 break...
test_common.py
Source:test_common.py
1import pytest2from unittest import mock3from types import SimpleNamespace4from clean.exceptions import FilterDoesNotExist5from clean.request.inout.ports import Response, Request6from clean.request.inout.filter import Page, Sort7from clean.use_case.common import SaveUseCase, RetrieveUseCase, UpdateUseCase, DeleteUseCase, ListUseCase8from clean.use_case.case import BaseUseCase9from clean.repository.abs import BaseRepository, BaseListRepository10class FakeSave(SaveUseCase):11 def create_entity(self, req):12 return SimpleNamespace(**dict(age=req.age, name=req.name))13def test_base_raises_required_custom_process():14 class Foo(BaseUseCase):15 pass16def test_base_process_request():17 request = mock.Mock(spec=Request)18 request.age = 2019 request.name = 'crl'20 class Baz(BaseUseCase):21 def custom_process(self, req) -> Response:22 return Response(context=SimpleNamespace(**dict(age=req.age, name=req.name)))23 res = Baz().custom_process(req=request)24 assert bool(res) is True25 assert res.result.name == 'crl'26 assert res.result.age == 2027def test_save_create_entity_raises():28 repo = mock.Mock(spec=BaseRepository)29 save_case = SaveUseCase(repo=repo)30 req = SimpleNamespace(**dict(name='crl', age=20))31 with pytest.raises(NotImplementedError):32 save_case.create_entity(req=req)33def test_save():34 repo = mock.Mock(spec=BaseRepository)35 save_case = FakeSave(repo=repo)36 req = SimpleNamespace(**dict(name='crl', age=20))37 res = save_case.create_entity(req=req)38 assert res.name == 'crl'39 assert res.age == 2040def test_save_repo_calls():41 repo = mock.Mock(spec=BaseRepository)42 req = SimpleNamespace(**dict(name='crl', age=20))43 save_case = FakeSave(repo=repo)44 save_case.process_request(req=req)45 assert repo.save.call_count == 146def test_retrieve_repo_calls():47 repo = mock.Mock(spec=BaseRepository)48 req = mock.Mock()49 req.oid.return_value = '123456'50 save_case = RetrieveUseCase(repo=repo)51 save_case.process_request(req=req)52 assert repo.get.call_count == 153 assert repo.get.call_args == mock.call(oid=req.oid)54def test_update_repo_calls():55 repo = mock.Mock(spec=BaseRepository)56 req = mock.Mock()57 req.to_dict.return_value = dict(oid='123456', age=20, name='crl')58 save_case = UpdateUseCase(repo=repo)59 save_case.process_request(req=req)60 assert repo.update.call_count == 161 assert repo.update.call_args == mock.call(oid='123456', attributes=dict(age=20, name='crl'))62def test_delete_repo_calls():63 repo = mock.Mock(spec=BaseRepository)64 req = mock.Mock()65 req.oid.return_value = '123456'66 save_case = DeleteUseCase(repo=repo)67 save_case.process_request(req=req)68 assert repo.delete.call_count == 169 assert repo.delete.call_args == mock.call(oid=req.oid)70def test_list_repo_calls():71 repo = mock.Mock(spec=BaseListRepository)72 req = mock.Mock()73 req.oid.return_value = '123456'74 req.ft = 'all'75 req.filters = {}76 req.page = Page()77 req.sort = Sort()78 save_case = ListUseCase(repo=repo)79 save_case.process_request(req=req)80 assert repo.execute.call_count == 181 assert repo.execute.call_args == mock.call(req.ft, req.filters, req.page, req.sort)82def test_list_silent_repo_filer_does_not_exist_exception():83 repo = mock.Mock(spec=BaseListRepository)84 repo.execute.side_effect = FilterDoesNotExist('')85 req = mock.Mock()86 req.oid.return_value = '123456'87 req.ft = 'all'88 req.filters = {}89 req.page = Page()90 req.sort = Sort()91 save_case = ListUseCase(repo=repo)92 res = save_case.process_request(req=req)93 assert bool(res) is False94 assert repo.execute.call_count == 1...
READ.py
Source:READ.py
1import xlrd23wb = xlrd.open_workbook(filename=r"HKR.xlsx", encoding_override=True)4wb_len = len(wb.sheets())5# class ReadExcel():6user_case = []7save_case = []8take_case = []9transfor_case = []10def readdata(count):11 for j in range(wb_len):12 st = wb.sheet_by_index(j)13 rows = st.nrows14 # cols = st.ncols15 for i in range(1,rows):16 if j == 0:17 data = st.row_values(i)18 user_case.append([data[0],data[1],data[2],data[3],data[4],data[5],data[6],data[7],i])19 # print(save_case)2021 elif j == 1:22 data = st.row_values(i)23 save_case.append([data[0],data[1],data[2],i])2425 elif j == 2:26 data = st.row_values(i)27 take_case.append([data[0],data[1],data[2],data[3],i])2829 elif j == 3:30 data = st.row_values(i)31 transfor_case.append([data[0],data[1],data[2],data[3],data[4],i])323334 if count == 0:35 return user_case36 elif count == 1:37 return save_case38 elif count == 2:39 return take_case40 elif count == 3:41 return transfor_case4243# print(save_case)44# print(readdata(0))454647
...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!