attakth_jcia.py

Created by florian-allard

Created on March 15, 2025

20.4 KB

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)

During your visit to our site, NumWorks needs to install "cookies" or use other technologies to collect data about you in order to:

With the exception of Cookies essential to the operation of the site, NumWorks leaves you the choice: you can accept Cookies for audience measurement by clicking on the "Accept and continue" button, or refuse these Cookies by clicking on the "Continue without accepting" button or by continuing your browsing. You can update your choice at any time by clicking on the link "Manage my cookies" at the bottom of the page. For more information, please consult our cookies policy.