Adaptation du mini-jeu Attakth, en mode Joueur contre IA.
from kandinsky import * from ion import * from random import * from time import * kd=keydown fr=fill_rect Machine_parameters = { # 11 machines possibles #"Bondisseur":(1,"F","B",1,1,4,3),\ "Brouteur":(1,"F","LR",1,1,2,4),\ #"Long-nez":(1,"F","B",2,1,2,5),\ #"Pillard":(1,"F","B",2,1,3,5),\ "Tunnelier":(1,"F","B",2,1,2,4),\ #"Charognarde":(2,"F","B",3,2,2,5),\ #"Corne-filante":(2,"F","LR",2,2,2,5),\ #"Corne-sabre":(2,"F","LR",2,2,2,5),\ "Coureuse":(2,"F","B",2,2,3,4),\ #"Etincelle":(2,"B","F",2,3,3,5),\ "Fouisseur":(2,"F","B",2,1,3,4),\ #"Hautes-pattes":(2,"F","B",1,2,4,6),\ #"Laboureur":(2,"F","B",2,1,2,5),\ "Razoptere":(2,"F","B",2,3,2,6),\ #"Tunnelier pisteur":(2,"F","B",2,1,2,4),\ #"Aile-d'Helion":(3,"B","F",3,2,3,7),\ #"Carapateur":(3,"F","B",3,3,2,7),\ #"Cracheur boursoufle":(3,"F","BLR",3,2,2,7),\ "Galop-griffe":(3,"F","B",3,2,2,8),\ #"Grande-bouche":(3,"F","B",3,2,2,7),\ #"Testudien":(3,"FR","B",2,1,2,7),\ #"Veilleur rouge":(3,"LR","F",2,2,2,5),\ #"Galop-griffe elemental":(4,"F","B",3,2,2,8),\ #"Grimpeur":(4,"F","B",3,1,3,8),\ #"Gyrodorse":(4,"FLR","B",3,2,3,5),\ "Ravageur":(4,"F","B",2,2,2,9),\ #"Traqueur":(4,"F","B",4,2,3,5),\ #"Frappe-defense":(5,"F","B",3,2,2,10),\ #"Galop-griffe supreme":(5,"FLR","B",3,1,2,8),\ #"Mastodonte":(5,"F","LR",3,2,2,10),\ #"Vulpivol":(5,"F","B",3,3,2,9),\ #"Brise-roc":(6,"LR","B",3,2,3,9),\ "Brisevague":(6,"LR","B",4,3,2,10),\ #"Carapeste":(6,"BLR","F",3,3,2,10),\ #"Gueule-d'orage":(6,"BF","LR",3,2,3,10),\ #"Oiseau-tempete":(6,"F","B",3,3,3,9),\ #"Griffes de feu":(7,"F","B",4,2,3,10),\ #"Griffes de gel":(7,"LR","F",4,2,2,10),\ #"Grilleuse":(8,"F","B",4,2,2,12),\ #"Rampant":(9,"F","B",4,3,2,12),\ "Massacrepine":(10,"F","LR",4,1,2,15)} #icones={"puissance":('2#','$%,%$#',"$'('$#",'%%*%%#','%$$$($$$%#','($&$(#','+$)#','*$*#',')$+#','($&$(#',"'$($'#",'&$*$&#','$%,%$#','$%,%$#','2#'),"portee":('*$*#','($$$$$(#','&%%$%%&#',"%$'$'$%#",'%$,$%#','$$.$$#','*$*#',"#'%&%'#",'*$*#','$$.$$#','%$,$%#',"%$'$'$%#",'&%%$%%&#','($$$$$(#','*$*#'),"deplacement":('*$*#',')&)#','(%$%(#','($&$(#','*$*#','%%&$&%%#',"$%'$'%$#",'#%%*%%#',"$%'$'%$#",'%%&$&%%#','*$*#','($&$(#','(%$%(#',')&)#','*$*#'),"sante":("&'$'&#","%$'$'$%#",'$$%%&%%$$#',"#$%'$'%$#",'#$$.$$#','#$$.$$#','#$$.$$#','#$%,%$#','$$%*%$$#','%$%(%$%#','&$%&%$&#',"'$%$%$'#",'($&$(#',')$$$)#','*$*#')} images=(('#&###','#$$$#','#$$$#','#$$$#','#&###'),('$$$#','#%$#','$$$#','$$$#','#&###'),('#&###','%$#','#&###','#$%#','#&###'),('#&###','%$#','#&###','%$#','#&###'),('#$$$#','#$$$#','#&###','%$#','%$#'),('#&###','#$%#','#&###','%$#','#&###'),('#&###','#$%#','#&###','#$$$#','#&###'),('#&###','%$#','$$$#','#$%#','#$%#'),('#&###','#$$$#','#&###','#$$$#','#&###'),('#&###','#$$$#','#&###','%$#','#&###')) Palette=("brown","cyan",(150,255,50),"g","grey",(220,220,220)) class Machine: def __init__(self,name,posX,posY,rotation = 0): self.name,self.moved,self.attacked,self.posX,self.posY,self.rotA = name,False,False,posX,posY,rotation self.PV,self.Armor,self.Weak,self.Power,self.Range,self.Move,self.Health = Machine_parameters[name] def update_position(self,posX,posY,rotation = 0): self.posX,self.posY,self.rotA = posX,posY,rotation def ClearScreen(c="w"): fr(0,0,320,222,c) def DessineChaine(string,X,Y,color,colorback="w"): CurX=X for char in string: if char!='\n': draw_string(char,CurX,Y,color,colorback) CurX += 9 else: CurX,Y = X,Y+16 def Curseur(x,y,clr): for k in (0,1): fr(x,y+25*k,8,1,clr) fr(x+18,y+25*k,8,1,clr) fr(x+25*k,y+18,1,8,clr) fr(x+25*k,y,1,8,clr) def EffacementCurseur(xA=0,yA=0,xB=7,yB=7): for i in range(xA,xB+1): for j in range(yA,yB+1): Curseur(Xc+25*i,Yc+25*j,"k") fr(0,0,320,19,clrFond) fr(0,0,116,60,clrFond) def ActualiseAffichageSante(machine,degats=0,simulation=False,attaque_sur_blindage=False,attaque_sur_faiblesse=False): degats = max(1,degats) sante_restante,Xa,Ya = max(0,machine.Health-degats*simulation),machine.posX,machine.posY if simulation: fr(Xc+5+25*Xa-7*(degats>9),Yc+3+25*Ya,8+7*(degats>9)+8,12,"r") DessineImage(-degats,Xc+6+25*Xa-7*(degats>9),Yc+4+25*Ya,"w","r",2) else: ActualiseAffichage(machine,True,False) Puissance=Map[Ya][Xa]+machine.Power+simulation*(attaque_sur_blindage-attaque_sur_faiblesse) fr(Xc+1+25*Xa,Yc+18+25*Ya,5+4*(Puissance<0),7,"rb"[machine in Player_Hand]) DessineImage(Puissance,Xc+2+25*Xa,Yc+19+25*Ya,("w",(100,200,255),"pink")[attaque_sur_blindage+2*attaque_sur_faiblesse],"rb"[machine in Player_Hand]) fr(Xc+20+25*Xa-4*(sante_restante>9),Yc+18+25*Ya,5+4*(sante_restante>9),7,"rb"[machine in Player_Hand]) DessineImage(sante_restante,Xc+21+25*Xa-4*(sante_restante>9),Yc+19+25*Ya,"w","rb"[machine in Player_Hand]) def ActualiseAffichage(machine_choisie,actu_machine=True,actu_sante=True): Xa,Ya = machine_choisie.posX,machine_choisie.posY fr(119+25*Xa,20+25*Ya,24,24,Palette[Map[Ya][Xa]+2]) if actu_machine: DessineChaine(machine_choisie.name[0:2],Xc+25*Xa+4,Yc+25*Ya+4,"k",Palette[Map[Ya][Xa]+2]) FlecheBlindage(Xc+25*Xa+5,Yc+25*Ya+5,machine_choisie.name,machine_choisie.rotA) if actu_sante: ActualiseAffichageSante(machine_choisie) def FlecheBlindage(x,y,carte,rotation=0): clrs=[((200,200,200),("r",(50,200,255))[lettre in Machine_parameters[carte][1]])[lettre in "".join(Machine_parameters[carte][1:3])] for lettre in "FLB"] for k in (-1,0,1): fr((x+7+2*k,x+18-2*k**2,x+7-2*k,x-3+2*k**2)[rotation],(y-4+2*k**2,y+7+2*k,y+18-2*k**2,y+7-2*k)[rotation],2,2,clrs[0]) for k in (0,1,2): fr((x-4,x+4,x+18,x+4)[rotation-k],(y+4,y-4,y+4,y+18)[rotation-k],(2,8)[rotation%2-k%2],(8,2)[rotation%2-k%2],(clrs[1+k%2],(100,200,255))[carte=="Testudien" and k==2]) def DessineImage(truc,x,y,clr="b",clr_fond="w",zoom=1): for element in range(len(str(truc))): if str(truc)[element]=="-": fr(x,y+2*zoom,zoom*3,zoom*1,clr) else: motif=images[int(str(truc)[element])] for ligne in range(len(motif)): elt,rang = motif[ligne],0 for pos in range(0,len(elt)-1,2): for k in (0,1): fr(x+zoom*rang+zoom*4*element,y+zoom*ligne,zoom*(ord(elt[pos+k])-35),1*zoom,(clr_fond,clr)[k]) rang+=ord(elt[pos+k])-35 def CadreCarte(X=5,Y=105,clr="brown"): for k in (0,1): fr(X-4,Y-20+97*k,116,3,clr) fr(X-5+115*k,Y-19,3,98,clr) def CarteIdentite(carte,machine=None,X=198,Y=28,clr="brown"): fr(X-2,Y-17,112,94,"k") DessineChaine((carte,carte.split(" ")[0])[len(carte)>14],X-3,Y-15,"y","k") if len(carte)>14:DessineChaine(carte.split(" ")[1],X-3,Y+1,"y","k") CadreCarte(X,Y,clr) DessineChaine("PV",X+47,Y+20,"y","k") for l in range(20): fr(X+89-l,Y+39-l,2*l,1,"y") DessineChaine(str(Machine_parameters[carte][0]),X+84-4*(Machine_parameters[carte][0]>9),Y+20,"brown","y") FlecheBlindage(X+15,Y+30,carte) fr(X,Y+55,108,18,"brown") for k in range(4): #DessineImage(("puissance","portee","deplacement","sante")[k],X+25*k,Y+57,"w","brown") DessineChaine("PRMH"[k],X+4+25*k,Y+55,"w","brown") if k==3 and machine: DessineImage(machine.Health,X+92,Y+60,"w","brown",2) else: DessineImage(Machine_parameters[carte][k+3],X+17+25*k,Y+60,"w","brown",2) def AffichageCarte(X,Y): for machine in Player_Hand+Adv_Hand: if (X,Y)==(machine.posX,machine.posY): CarteIdentite(machine.name,machine,5,105,"rb"[machine in Player_Hand]) def AffichageMain(liste_machines): X,Y,liste_ordonnee=25,80,sorted(set(liste_machines)) fr(5,108,224,114,"w") for k in range(len(liste_ordonnee)): DessineChaine(str(liste_machines.count(liste_ordonnee[k]))+"x"+liste_ordonnee[k],X+2,Y+28+16*k,"g") DessineImage(Machine_parameters[liste_ordonnee[k]][0],X-6,Y+32+16*k,"brown","y",2) DessineChaine("PMP "+str(sum([Machine_parameters[liste_machines[k]][0] for k in range(len(liste_machines))]))+"/10",X,Y-15,"r","w") sleep(0.2) machine_attaquable,attaque_sur_blindage,attaque_sur_faiblesse,machine_active,machines_utilisees,score = None,False,False,None,set(),[0,0] def orientation(machine_active): DessineChaine("SHIFT/ALPHA Tourner",160,1,clr,clrFond) if kd(KEY_ALPHA) or kd(KEY_SHIFT): machine_active.rotA = (machine_active.rotA+kd(KEY_ALPHA)-kd(KEY_SHIFT))%4 if machine_attaquable: ActualiseAffichage(machine_attaquable) ActualiseAffichage(machine_active) sleep(0.1) def EmplacementLibre(X,Y): return not any((X,Y) == (machine.posX,machine.posY) for machine in Player_Hand+Adv_Hand) def PlacementPiece(choix): X,Y,chgX,chgY=4,7,-1,0 for i in range(8): for j in (6,7): Curseur(Xc+25*i,Yc+25*j,"y") while not (kd(KEY_EXE) and Y in (6,7) and EmplacementLibre(X,Y)):# and (Map[Y][X]!=-2)): if chgX or chgY: CarteIdentite(Machines_choisies[choix],None,5,105,clr="b") Curseur(Xc+25*X,Yc+25*Y,"ky"[Y in (6,7)]) X,Y = (X+chgX)%8,(Y+chgY)%8 Curseur(Xc+25*X,Yc+25*Y,"r") AffichageCarte(X,Y) sleep(0.2) chgX,chgY=kd(KEY_RIGHT)-kd(KEY_LEFT),kd(KEY_DOWN)-kd(KEY_UP) Player_Hand.append(Machine(Machines_choisies[choix],X,Y,0)) while kd(KEY_EXE):1 Curseur(Xc+25*X,Yc+25*Y,"k") ActualiseAffichage(Player_Hand[-1]) EffacementCurseur(0,6,7,7) def AffichageScores(): DessineChaine("Scores",5,65,"purple",clrFond) for joueur in (0,1): DessineChaine(str(score[joueur]),70+20*joueur,65,"rb"[joueur],clrFond) def Destruction(machine): score[machine in Adv_Hand]+=machine.PV AffichageScores() (Adv_Hand,Player_Hand)[machine in Player_Hand].remove(machine) ActualiseAffichage(machine,False) while max(score)>=7: DessineChaine("Fin de partie ! Victoire du joueur "+("bleu","rouge")[score[0]>=7],40,1,"br"[score[0]>=7],clrFond) def Machines_Attaquables(machine_active): machine_attaquable=None for k in range(1,machine_active.Range+1): machine_attaquable = [machine for machine in (Player_Hand,Adv_Hand)[machine_active in Player_Hand] if (machine.posX,machine.posY) == (machine_active.posX + k*(2-machine_active.rotA)*(machine_active.rotA%2),machine_active.posY + k*(1-machine_active.rotA)*(machine_active.rotA%2-1)) ] if machine_attaquable: return machine_attaquable[0] return machine_attaquable def SimulationAttaque(machine_attaquable,machine_active,affichage=True): cote_attaque = "BRFL"[(machine_attaquable.rotA-machine_active.rotA)%4] attaque_sur_faiblesse, attaque_sur_blindage = (cote_attaque in machine_attaquable.Weak, cote_attaque in machine_attaquable.Armor) degats = max(1,machine_active.Power+Map[machine_active.posY][machine_active.posX]-machine_attaquable.Power-Map[machine_attaquable.posY][machine_attaquable.posX]+attaque_sur_faiblesse-attaque_sur_blindage) if affichage: ActualiseAffichage(machine_attaquable,True,False) ActualiseAffichageSante(machine_attaquable,degats,True,attaque_sur_blindage,attaque_sur_faiblesse) return degats #def DestiPossibles(machine,affichage=False): #DestiPoss=[(machine.posX,machine.posY)] #for i in range(machine.Move): #N=len(DestiPoss) #for k in range(N): #(Xp,Yp) = DestiPoss[k] #if i==0 or Map[Yp][Xp]!=-1: #for (dx,dy) in ((-1,0),(0,1),(1,0),(0,-1)): #if 0<=Xp+dx<=7 and 0<=Yp+dy<=7: #if Map[Yp+dy][Xp+dx]!=-2: #DestiPoss.append((Xp+dx,Yp+dy)) #if affichage: Curseur(Xc+25*(Xp+dx),Yc+25*(Yp+dy),"y") #return DestiPoss[1:] def DeplacementSimple(machine_active): global machines_utilisees, machine_attaquable, attaque_sur_blindage, attaque_sur_faiblesse, X, Y X0,Y0,rot0,chgX,chgY = machine_active.posX,machine_active.posY,machine_active.rotA,0,0 #DestiPoss=DestiPossibles(machine_active,True) for i in range(8): for j in range(8): if abs(X-i)+abs(Y-j)<=machine_active.Move: Curseur(Xc+25*i,Yc+25*j,"y") while not ((kd(KEY_EXE) or kd(KEY_OK)) and (X,Y)!=(X0,Y0) and abs(X-X0)+abs(Y-Y0)<=machine_active.Move and len([machine for machine in Player_Hand+Adv_Hand if (machine.posX,machine.posY)==(X,Y)])==1): if chgX or chgY: Xnouv,Ynouv =min(7,max(0,X+chgX)), min(7,max(0,Y+chgY)) if (chgX or chgY) and ((Xnouv,Ynouv)!=(X,Y)) and abs(Xnouv-X0)+abs(Ynouv-Y0)<=machine_active.Move: ActualiseAffichage(machine_active,False) machine_active.posX,machine_active.posY=Xnouv,Ynouv if not EmplacementLibre(X,Y): ActualiseAffichage([machine for machine in Player_Hand+Adv_Hand if (machine.posX,machine.posY)==(X,Y)][0]) X,Y,attaque_sur_blindage,attaque_sur_faiblesse = Xnouv,Ynouv,False,False ActualiseAffichage(machine_active) if machine_attaquable: ActualiseAffichage(machine_attaquable) ActualiseAffichageSante(machine_attaquable,0,False) sleep(0.1) orientation(machine_active) machine_attaquable=Machines_Attaquables(machine_active) if machine_attaquable and abs(X-X0)+abs(Y-Y0)<=machine_active.Move: SimulationAttaque(machine_attaquable,machine_active) chgX,chgY=kd(KEY_RIGHT)-kd(KEY_LEFT),kd(KEY_DOWN)-kd(KEY_UP) if kd(KEY_BACKSPACE): ActualiseAffichage(machine_active,False) machine_active.update_position(X0,Y0,rot0) ActualiseAffichage(machine_active) if not EmplacementLibre(X,Y): ActualiseAffichage([machine for machine in Player_Hand+Adv_Hand if (machine.posX,machine.posY)==(X,Y)][0]) if machine_attaquable: ActualiseAffichageSante(machine_attaquable) EffacementCurseur() return False while kd(KEY_EXE):1 machines_utilisees.add(machine_active) if machine_attaquable: ActualiseAffichageSante(machine_attaquable) ActualiseAffichageSante(machine_active) EffacementCurseur() return True def AttaqueSimple(machine_active): global machines_utilisees, machine_attaquable, attaque_sur_blindage, attaque_sur_faiblesse while kd(KEY_OK) and Player_attaquant:1 X0, Y0, rot0 = machine_active.posX,machine_active.posY,machine_active.rotA for i in range(8): for j in range(8): Curseur(Xc+25*i,Yc+25*j,"kr"[abs(X0-i)+abs(Y0-j)<=machine_active.Range]) while 1: orientation(machine_active) machine_attaquable=Machines_Attaquables(machine_active) if machine_attaquable: SimulationAttaque(machine_attaquable,machine_active) if kd(KEY_OK) or not Player_attaquant: EffacementCurseur() degats=SimulationAttaque(machine_attaquable,machine_active) machine_attaquable.Health -= degats ActualiseAffichage(machine_attaquable,machine_attaquable.Health>0) while kd(KEY_OK):1 machines_utilisees.add(machine_active) if machine_attaquable.Health<=0: Destruction(machine_attaquable) return True if kd(KEY_BACKSPACE): machine_active.rotA=rot0 ActualiseAffichage(machine_active) if machine_attaquable: ActualiseAffichageSante(machine_attaquable) while kd(KEY_BACKSPACE):1 EffacementCurseur() return False def DeroulementTour(joueur): global machines_utilisees,machine_attaquable,attaque_sur_blindage,attaque_sur_faiblesse,Xa,Ya,X,Y,Player_Hand,Adv_Hand machines_utilisees,X,chgX,chgY,tour,mode1machine=set(),X+1,-1,0,1,(len(joueur)==1) AffichageScores() while 1: if len([machine for machine in machines_utilisees if machine.moved ])==2 or (mode1machine and joueur[0].moved): DessineChaine("HOME Fin du tour "+"12"[tour-1]*mode1machine,5,1,clr,clrFond) if kd(KEY_HOME): EffacementCurseur() if (mode1machine and tour==2) or not mode1machine: break elif mode1machine and tour==1: tour, machine_active.moved,machine_active.attacked = 2,False,False if chgX or chgY: Curseur(Xc+25*X,Yc+25*Y,"k") X,Y=(X+chgX)%8,(Y+chgY)%8 fr(3,88,112,94,"k") if EmplacementLibre(X,Y): CadreCarte() fr(40,95,40,40,Palette[Map[Y][X]+2]) DessineChaine(("Gouffre","Marais","Prairie","Foret","Colline","Montagne")[Map[Y][X]+2]+"\nPuissance "+str(Map[Y][X]),5,142,"w","k") #DessineImage("puissance",79,160,"w","brown") else: AffichageCarte(X,Y) EffacementCurseur() sleep(0.2) Curseur(Xc+25*X,Yc+25*Y,"r") chgX,chgY=kd(KEY_RIGHT)-kd(KEY_LEFT),kd(KEY_DOWN)-kd(KEY_UP) if (X,Y) in [(machine.posX,machine.posY) for machine in joueur]: machine_active=[machine for machine in joueur if (machine.posX,machine.posY)==(X,Y)][0] if len(machines_utilisees)<2 or machine_active in machines_utilisees: X0,Y0,rot0=machine_active.posX,machine_active.posY,machine_active.rotA if not machine_active.moved: DessineChaine("EXE Deplacer",5,21,clr,clrFond) if kd(KEY_EXE): machine_active.moved = DeplacementSimple(machine_active) if not machine_active.attacked: DessineChaine("OK Attaquer",5,41,clr,clrFond) if kd(KEY_OK): machine_active.attacked = AttaqueSimple(machine_active) Xc,Yc,X,Y,X0,Y0,rot0,clrFond,Player_attaquant,Player_Hand,Adv_Hand = 118,19,4,7,0,0,0,(220,220,160),False,[],[] ClearScreen() DessineChaine("ATTAKTH",130,15,"g") DessineChaine(" Mode\n\n\n Joueur vs IA\n\n\nValider avec EXE",95,58,"purple") for k in range(2): fr(60,40+k*147,200,1,"b") while not kd(KEY_EXE):1 while kd(KEY_EXE):1 Map=[[randint(0,2)+randint(-1,1) for k in range(8)] for i in range(4)] Map+=[[Map[3-i][8-k-1] for k in range(8)] for i in range(4)] Machines_adverses=["Galop-griffe","Tunnelier","Brisevague"] ClearScreen() Liste_machines=sorted([machine for machine in Machine_parameters.keys()]) DessineChaine("Choisir les pieces\n du joueur bleu",20,12,"b") Machines_choisies,rang,chg,Nb_PMP=[],1,-1,0 DessineChaine("PMP "+str(Nb_PMP)+"/10",25,65,"r","w") Machine_selectionnee=Liste_machines[rang+chg] while not (kd(KEY_EXE) and 7 <= Nb_PMP <= 10): if chg: rang=(rang+chg)%len(Liste_machines) Machine_selectionnee=Liste_machines[rang] CarteIdentite(Machine_selectionnee,clr="b") sleep(0.2) Nb_PMP=sum([Machine_parameters[Machines_choisies[k]][0] for k in range(len(Machines_choisies))]) if kd(KEY_DOWN): if Machines_choisies.count(Machine_selectionnee)<4 and Nb_PMP<=10-Machine_parameters[Machine_selectionnee][0]: Machines_choisies.append(Machine_selectionnee) AffichageMain(Machines_choisies) if kd(KEY_UP): if Machine_selectionnee in Machines_choisies: Machines_choisies.remove(Machine_selectionnee) AffichageMain(Machines_choisies) chg=kd(KEY_RIGHT)-kd(KEY_LEFT) while kd(KEY_EXE):1 ClearScreen(clrFond) for i in range(8): for j in range(len(Map[i])): fr(Xc+1+25*j,Yc+1+25*i,24,24,Palette[Map[i][j]+2]) for i in range(9): fr(118+25*i,19,1,25*8,"k") fr(118,19+25*i,25*8,1,"k") for choix in range(max(len(Machines_choisies),len(Machines_adverses))): if choix<len(Machines_choisies): PlacementPiece(choix) if choix<len(Machines_adverses): Adv_Hand.append(Machine(Machines_adverses[choix],2+choix,randint(0,1),2)) # eviter le cas du gouffre ActualiseAffichage(Adv_Hand[-1]) Player_attaquant=(True,False)[randint(0,1)] while 1: Player_attaquant = not Player_attaquant clr=((150,0,0),"b")[Player_attaquant] for machine in Adv_Hand+Player_Hand: machine.moved,machine.attacked,machine.Power = False,False,Machine_parameters[machine.name][3]*((machine in Adv_Hand, machine in Player_Hand)[Player_attaquant]) ActualiseAffichageSante(machine) if Player_attaquant: DeroulementTour(Player_Hand) else: # IA joue mode1machine,Machines_utilisees=(len(Adv_Hand)==1),[] for passe in range(2): meilleure_attaque=[0,None,0,0,0] for machine in Adv_Hand: if (mode1machine or machine not in Machines_utilisees) and len(Machines_utilisees)<2: X0,Y0,rot0=machine.posX,machine.posY,machine.rotA #DestiPoss=[(X,Y) for (X,Y) in DestiPossibles(machine) if EmplacementLibre(X,Y) and (X,Y)!=(X0,Y0)] for i in range(8): for j in range(8): for Orientation in range(4): machine.update_position(i,j,Orientation) cible=Machines_Attaquables(machine) if cible: degats=SimulationAttaque(cible,machine,False) if abs(X0-i)+abs(Y0-j)<=machine.Move and EmplacementLibre(i,j) and (i,j)!=(XO,YO) and degats>meilleure_attaque[0] and (mode1machine or machine not in Machines_utilisees) and len(Machines_utilisees)<2: meilleure_attaque=[degats,cible,machine,i,j,Orientation] machine.update_position(X0,Y0,rot0) if meilleure_attaque[0]>0 and len(Machines_utilisees)<2: degats,cible,machine,Xd,Yd,ori=meilleure_attaque if mode1machine or machine not in Machines_utilisees: #DestiPossibles(machine,True) #sleep(1) ActualiseAffichage(machine,False) machine.update_position(Xd,Yd,ori) ActualiseAffichage(machine) ##sleep(1) #EffacementCurseur() SimulationAttaque(cible,machine) ##sleep(1) AttaqueSimple(machine) Machines_utilisees.append(machine) #sleep(1) while len(Machines_utilisees)<2: for altitude in range(3,-2,-1): for machine in Adv_Hand: X0,Y0,rot0=machine.posX,machine.posY,machine.rotA for X in range(8): for Y in range(8): if Map[Y][X]==altitude and abs(X0-X)+abs(Y0-Y)<=machine.Move and EmplacementLibre(X,Y) and (X,Y)!=(X0,Y0) and len(Machines_utilisees)<2 and (mode1machine or machine not in Machines_utilisees): #DestiPossibles(machine,True) ActualiseAffichage(machine,False) machine.update_position(X,Y,rot0) ActualiseAffichage(machine) Machines_utilisees.append(machine) ##sleep(1) #EffacementCurseur() break else: machine.update_position(X0,Y0,rot0)