def changementDePoste(self): baller = None ball = False distance = [] closer = None for joueur in self.joueurs[0].match.joueurs: if joueur.hasTheBall(): baller = joueur ball = True balle = self.joueurs[0].match.balle d = joueur.distanceToXY(balle.position) joueur.distance_balle = d distance.append(d) closer = self.joueurs[0].match.joueurs[np.argmin(distance)] for joueur in self.joueurs: if joueur.poste[-1] == 'WAIT': if ball: if baller == joueur: joueur.defPoste('ATT') joueur.teammate().defPoste('DEMARQUE') elif baller.team != self.nom: if (self.whoIsTheGoal() == joueur) & ( joueur.teammate().poste[-1] != 'GOAL'): joueur.defPoste('GOAL') else: if ((self.side == 'L') & (balle.x < 0)) | ((self.side == 'R') & (balle.x > 0)): joueur.defPoste('TACKLE') else: joueur.defPoste('DEF') else: if closer.team != self.nom: if (self.whoIsTheGoal() == joueur) & ( joueur.teammate().poste[-1] != 'GOAL'): joueur.defPoste('GOAL') elif (min(distance) / joueur.distanceToXY(balle.position)) > 0.7: joueur.defPoste('CHASER') elif closer == joueur: joueur.defPoste('CHASER') elif joueur.poste[-1] == 'ATT': if self.openGoal(joueur): joueur.defPoste('SHOOTER') else: if self.openGoal(joueur.teammate()): joueur.defPoste('PASSEUR') joueur.teammate().defPoste('RECEVEUR') else: # print('here') field = joueur.create_game() final_pos_joueur, score_joueur, fail = ia.play_game_3( agent=self.ia, game=field) # print(field) # ia.Game(9,9,terrain=field).print() field = joueur.teammate().create_game() final_pos_mate, score_mate, fail = ia.play_game_3( agent=self.ia, game=field) if score_mate > score_joueur + 2: if self.side == 'L': joueur.teammate().goto = final_pos_mate else: joueur.teammate().goto = (-final_pos_mate[0], final_pos_mate[1]) joueur.teammate().goto = final_pos_mate joueur.teammate().status = joueur.teammate( ).commande_position(joueur.teammate().goto[0], joueur.teammate().goto[1], self.but_adversaire[0], self.but_adversaire[1], spin=True) joueur.teammate().defPoste('DEMARQUE') joueur.defPoste('PASSEUR') else: if self.side == 'L': joueur.goto = final_pos_joueur else: joueur.goto = (-final_pos_joueur[0], final_pos_joueur[1]) joueur.status = joueur.commande_position( joueur.goto[0], joueur.goto[1], self.but_adversaire[0], self.but_adversaire[1], spin=True) # print(joueur.goto) joueur.defPoste('DRIBBLE') elif joueur.poste[-1] == 'SHOOTER': if joueur.status == 'DONE': joueur.defPoste('WAIT') if joueur.teammate().poste[-1] == 'DEMARQUE': joueur.teammate().defPoste('WAIT') elif joueur.poste[-1] == 'DEMARQUE': if ball: if baller in joueur.opponents(): joueur.defPoste('WAIT') elif (min(distance) / joueur.distanceToXY(balle.position)) > 0.7: joueur.defPoste('CHASER') elif joueur.poste[ -1] == 'DRIBBLE': #commande vers la position calcuée if joueur.status == 'DONE': joueur.defPoste('ATT') joueur.teammate().defPoste('DEMARQUE') if not ball: #perte de balle joueur.defPoste('WAIT') joueur.status = 'DONE' if self.openGoal(joueur): #on tire si le but est ouvert joueur.defPoste('SHOOTER') elif (joueur.poste[-1] == 'PASSEUR'): #procédure avant la passe #Calcul si la passe est possible passe = True a, b = np.polyfit([joueur.x, joueur.teammate().x], [joueur.y, joueur.teammate().y], 1) for robot in joueur.opponents(): if robot.distance_droite(a, b) < r_robot: passe = False break if not passe: #dans ce cas, il faut determiner ce qu'on doit faire print('passe impossible') joueur.status = 'DONE' joueur.defPoste('DRIBBLE') joueur.teammate().defPoste('DEMARQUE') elif ( joueur.poste[-1] == 'RECEVEUR' ): #procédure pendant la passe pour ajuster la position du receveur # if ball: # if baller==joueur: # joueur.defPoste('ATT') # joueur.teammate().defPoste('DEMARQUE') if joueur.distanceToXY(balle.position) < 200: joueur.defPoste('CHASER') joueur.teammate().defPoste('DEMARQUE') elif joueur.poste[-1] == 'CHASER': if ball: if baller: if (baller == joueur): joueur.defPoste('ATT') joueur.teammate().defPoste('DEMARQUE') elif joueur.poste[-1] == 'GOAL': if ball: if baller == joueur: joueur.defPoste('ATT') joueur.teammate().defPoste('DEMARQUE') if joueur == closer: joueur.defPoste('CHASER') elif joueur.poste[-1] == 'DEF': if ball: if baller == joueur: joueur.defPoste('ATT') joueur.teammate().defPoste('DEMARQUE') elif baller.team != self.nom: if ((self.side == 'L') & (balle.x < 0)) | ( (self.side == 'R') & (balle.x > 0)): #Balle de notre coté joueur.defPoste('TACKLE') else: joueur.defPoste('CHASER') elif joueur.poste[-1] == 'TACKLE': if ball: if baller == joueur: joueur.defPoste('ATT') joueur.teammate().defPoste('DEMARQUE') else: joueur.defPoste('CHASER') #Affichage changement de status if self.joueurs[0].match.disp == 0: changement = False status = '' for joueur in self.joueurs: status += (f'{joueur} {joueur.poste} {joueur.status} \n') if joueur.poste[-2] != joueur.poste[-1]: changement = True if changement: print('---------------') print(status)
def action(self): for joueur in self.joueurs: if joueur.poste[-1] == 'SHOOTER': joueur.status = joueur.Tir() elif joueur.poste[-1] == 'CHASER': joueur.status = joueur.commande_balle() elif joueur.poste[-1] == 'DEMARQUE': if (joueur.status == 'DONE') & (not self.openGoal(joueur) ): #calcul d'une nouvelle position field = joueur.create_game() final_pos_joueur, score_joueur, fail = ia.play_game_3( agent=self.ia, game=field) if self.side == 'L': #l'ia est entrainée que sur un coté donc on doit flip la position joueur.goto = final_pos_joueur else: joueur.goto = (-final_pos_joueur[0], final_pos_joueur[1]) joueur.status = joueur.commande_position( joueur.goto[0], joueur.goto[1], joueur.teammate().x, joueur.teammate().y) else: #la position est déjà calculée donc commande vers la position joueur.status = joueur.commande_position( joueur.goto[0], joueur.goto[1], joueur.teammate().x, joueur.teammate().y) #affichage de la position prédicte if joueur.match.disp == 2: goto, = ax.plot(joueur.goto[0], joueur.goto[1], 'go') ax.draw_artist(goto) elif joueur.poste[ -1] == 'DRIBBLE': #commande vers la position calcuée if (joueur.status == 'DONE') & (not self.openGoal(joueur) ): #calcul d'une nouvelle position field = joueur.create_game() final_pos_joueur, score_joueur, fail = ia.play_game_3( agent=self.ia, game=field) if self.side == 'L': #l'ia est entrainée que sur un coté donc on doit flip la position joueur.goto = final_pos_joueur else: joueur.goto = (-final_pos_joueur[0], final_pos_joueur[1]) joueur.status = joueur.commande_position( joueur.goto[0], joueur.goto[1], self.but_adversaire[0], self.but_adversaire[1], spin=True) if joueur.match.disp == 2: #affichage goto, = ax.plot(joueur.goto[0], joueur.goto[1], 'go') ax.draw_artist(goto) joueur.defPoste('DRIBBLE') elif (joueur.poste[-1] == 'PASSEUR'): #procédure avant la passe joueur.status = joueur.Passe() elif ( joueur.poste[-1] == 'RECEVEUR' ): #procédure pendant la passe pour ajuster la position du receveur joueur.reception() elif joueur.poste[-1] == 'GOAL': joueur.defPoste('GOAL') joueur.goal() elif joueur.poste[-1] == 'DEF': joueur.defPoste('DEF') if self.side == 'L': x = -300 else: x = 300 joueur.commande_position(x, joueur.match.balle.y / 2, joueur.match.balle.x, joueur.match.balle.y) elif joueur.poste[-1] == 'TACKLE': joueur.defPoste('TACKLE') joueur.commande_balle() elif joueur.poste[-1] == 'WAIT': joueur.commande_position(joueur.x, joueur.y, 0, 0)
def changementDePoste(self): baller=None ball=False distance=[] closer=None for joueur in self.joueurs[0].match.joueurs : if joueur.hasTheBall(): baller=joueur ball=True balle=self.joueurs[0].match.balle d=joueur.distanceToXY(balle.position) joueur.distance_balle=d distance.append(d) closer=self.joueurs[0].match.joueurs[np.argmin(distance)] for joueur in self.joueurs: if joueur.poste[-1]=='WAIT': if ball: if baller==joueur: joueur.defPoste('ATT') joueur.teammate().defPoste('DEMARQUE') elif baller.team!=self.nom: if (self.whoIsTheGoal()==joueur)&(joueur.teammate().poste[-1]!='GOAL'): joueur.defPoste('GOAL') else: if ((self.side=='L')&(balle.x<0))|((self.side=='R')&(balle.x>0)): # joueur.defPoste('TACKLE') # joueur.defPoste('DEF') defense=random.random() # print(defense) if defense<0.5: joueur.defPoste('DEF') elif defense < 0.75: joueur.defPoste('DEF1') else: joueur.defPoste('DEF2') else : defense=random.random() # print(defense) if defense<0: joueur.defPoste('DEF') elif defense < 0.5: joueur.defPoste('DEF1') else: joueur.defPoste('DEF2') else : if closer.team!=self.nom: if (self.whoIsTheGoal()==joueur)&(joueur.teammate().poste[-1]!='GOAL'): joueur.defPoste('GOAL') elif ((min(distance)/joueur.distanceToXY(balle.position))>0.7)&(joueur.teammate().poste[-1]!='RECEVEUR'): joueur.defPoste('CHASER') joueur.teammate().defPoste('GOAL') else : joueur.defPoste('DEF') joueur.teammate().defPoste('GOAL') # elif (closer==joueur)&(joueur.teammate().poste[-1]!='RECEVEUR'): # joueur.defPoste('CHASER') else : joueur.defPoste('DEMARQUE') elif joueur.poste[-1]=='ATT': if self.openGoal(joueur): joueur.defPoste('SHOOTER') else : if (self.openGoal(joueur.teammate()))&(self.openPasse()): alea=random.random() if alea<0.650: joueur.defPoste('PASSEUR') joueur.teammate().defPoste('RECEVEUR') else: joueur.defPoste('DRIBBLE') elif not self.openGoal(joueur.teammate()) : # print('here') alea=random.random() if alea<0.750: field=joueur.create_game() final_pos_joueur,score_joueur,fail,_=ia.play_game_3(agent=self.ia,game=field) # print(field) # ia.Game(9,9,terrain=field).print() field=joueur.teammate().create_game() final_pos_mate,score_mate,fail,_=ia.play_game_3(agent=self.ia,game=field) if score_mate>score_joueur+2: if self.side=='L': joueur.teammate().goto=complex(final_pos_mate[0],final_pos_mate[1]) else: joueur.teammate().goto=complex(-final_pos_mate[0],final_pos_mate[1]) # joueur.teammate().goto=final_pos_mate joueur.teammate().status=joueur.teammate().commande_position(joueur.teammate().goto.real, joueur.teammate().goto.imag, self.but_adversaire[0],self.but_adversaire[1],spin=True) joueur.teammate().defPoste('DEMARQUE') joueur.defPoste('PASSEUR') else: if self.side=='L': joueur.goto=complex(final_pos_mate[0],final_pos_mate[1]) else: joueur.goto=complex(-final_pos_joueur[0],final_pos_joueur[1]) joueur.status=joueur.commande_position(joueur.goto.real, joueur.goto.imag, self.but_adversaire[0],self.but_adversaire[1],spin=True) # print(joueur.goto) joueur.defPoste('DRIBBLE') else: joueur.defPoste('PASSEUR') joueur.teammate().defPoste('RECEVEUR') elif not self.openPasse(): print('here') joueur.defPoste('DRIBBLE') elif joueur.poste[-1]=='SHOOTER': if not ball: joueur.defPoste('ATT') if joueur.status=='DONE': joueur.defPoste('WAIT') if joueur.teammate().poste[-1]=='DEMARQUE': joueur.teammate().defPoste('WAIT') elif joueur.poste[-1]=='DEMARQUE': if ball: if baller in joueur.opponents(): joueur.defPoste('WAIT') elif baller==joueur: joueur.defPoste('ATT') elif (min(distance)/joueur.distanceToXY(balle.position))>0.7: joueur.defPoste('CHASER') elif (closer.team!=self.nom): joueur.defPoste('WAIT') elif joueur.poste[-1]=='DRIBBLE': #commande vers la position calcuée # if not ball: if joueur.distanceToXY(balle.position)>150: joueur.defPoste('ATT') if joueur.status=='DONE': joueur.defPoste('ATT') joueur.teammate().defPoste('DEMARQUE') if not ball:#perte de balle joueur.defPoste('WAIT') joueur.status='DONE' if self.openGoal(joueur):#on tire si le but est ouvert joueur.defPoste('SHOOTER') elif (joueur.poste[-1]=='PASSEUR') : #procédure avant la passe if not ball: joueur.defPoste('WAIT') if not self.openPasse(): #dans ce cas, il faut determiner ce qu'on doit faire print('passe impossible') joueur.status='DONE' joueur.defPoste('DRIBBLE') joueur.teammate().defPoste('DEMARQUE') elif (joueur.poste[-1]=='RECEVEUR'): #procédure pendant la passe pour ajuster la position du receveur if ball: if baller.team!=self.nom: joueur.defPoste('WAIT') if joueur.distanceToXY(balle.position)<200: joueur.defPoste('CHASER') joueur.teammate().defPoste('DEMARQUE') elif joueur.poste[-1]=='CHASER': if ball: if(baller==joueur): joueur.defPoste('ATT') joueur.teammate().defPoste('DEMARQUE') else : joueur.defPoste('DEF') #on évite d'avoir les deux robots qui chassent la balle if joueur.teammate().poste[-1]=='CHASER': if joueur.distanceToXY(balle.position)>joueur.teammate().distanceToXY(balle.position): joueur.defPoste('DEMARQUE') else: joueur.teammate().defPoste('DEMARQUE') elif joueur.poste[-1]=='GOAL': if ball: if baller==joueur: joueur.defPoste('ATT') joueur.teammate().defPoste('DEMARQUE') #Si la balle est pas loin, on va la récupérer if (joueur==closer) and (not ball): joueur.defPoste('CHASER') elif joueur.poste[-1]=='DEF': if ball: if baller==joueur: joueur.defPoste('ATT') joueur.teammate().defPoste('DEMARQUE') elif baller.team!=self.nom: if ((self.side=='L')&(balle.x<0))|((self.side=='R')&(balle.x>0)): #Balle de notre coté # joueur.defPoste('TACKLE') joueur.defPoste('DEF2') elif closer==joueur: joueur.defPoste('CHASER') elif joueur.poste[-1]=='DEF1': if ball: if baller==joueur: joueur.defPoste('ATT') joueur.teammate().defPoste('DEMARQUE') elif baller.team!=self.nom: joueur.defPoste('DEF1') elif closer==joueur: joueur.defPoste('CHASER') elif joueur.poste[-1]=='DEF2': if ball: if baller==joueur: joueur.defPoste('ATT') joueur.teammate().defPoste('DEMARQUE') elif baller.team!=self.nom: joueur.defPoste('DEF2') elif closer==joueur: joueur.defPoste('CHASER') elif joueur.poste[-1]=='TACKLE': if joueur.teammate().poste[-1]=='TACKLE': if joueur.distanceToXY(balle.position)>joueur.teammate().distanceToXY(balle.position): joueur.defPoste('GOAL') else: joueur.teammate().defPoste('GOAL') if ball: if baller==joueur: joueur.defPoste('ATT') joueur.teammate().defPoste('DEMARQUE') else: joueur.defPoste('CHASER') #Affichage changement de status if self.joueurs[0].match.disp==0: changement=False status='' for joueur in self.joueurs: status+=(f'{joueur} {joueur.poste} {joueur.status} \n') if joueur.poste[-2]!=joueur.poste[-1]: changement=True if changement: print('---------------') print(status)
def action(self): for joueur in self.joueurs: if joueur.poste[-1]=='SHOOTER': joueur.status=joueur.Tir() joueur.defPoste('SHOOTER') elif joueur.poste[-1]=='CHASER': joueur.status=joueur.commande_balle() joueur.defPoste('CHASER') elif joueur.poste[-1]=='DEMARQUE': if (joueur.status=='DONE')&(not self.openPasse()) or (abs(joueur.goto-joueur.teammate().goto)<500): #calcul d'une nouvelle position field=joueur.create_game() final_pos_joueur,score_joueur,fail,_=dmq.play_game_3(agent=self.dmq,game=field) if self.side=='L': #l'ia est entrainée que sur un coté donc on doit flip la position joueur.goto=complex(final_pos_joueur[0],final_pos_joueur[1]) else: joueur.goto=complex(-final_pos_joueur[0],final_pos_joueur[1]) joueur.status=joueur.commande_position(joueur.goto.real, joueur.goto.imag, joueur.teammate().x,joueur.teammate().y,spin=True) elif (joueur.status=='DONE')&(not self.openGoal(joueur)): #calcul d'une nouvelle position field=joueur.create_game() final_pos_joueur,score_joueur,fail,_=ia.play_game_3(agent=self.ia,game=field) if self.side=='L': #l'ia est entrainée que sur un coté donc on doit flip la position joueur.goto=complex(final_pos_joueur[0],final_pos_joueur[1]) else: joueur.goto=complex(-final_pos_joueur[0],final_pos_joueur[1]) joueur.status=joueur.commande_position(joueur.goto.real, joueur.goto.imag, joueur.teammate().x,joueur.teammate().y,spin=True) else : #la position est déjà calculée donc commande vers la position joueur.status=joueur.commande_position(joueur.goto.real, joueur.goto.imag, joueur.teammate().x,joueur.teammate().y,spin=True) joueur.defPoste('DEMARQUE') elif joueur.poste[-1]=='DRIBBLE': #commande vers la position calcuée if (joueur.status=='DONE')&(not self.openGoal(joueur)): #calcul d'une nouvelle position field=joueur.create_game() final_pos_joueur,score_joueur,fail,_=ia.play_game_3(agent=self.ia,game=field) if self.side=='L': #l'ia est entrainée que sur un coté donc on doit flip la position joueur.goto=complex(final_pos_joueur[0],final_pos_joueur[1]) else: joueur.goto=complex(-final_pos_joueur[0],final_pos_joueur[1]) joueur.status=joueur.commande_position(joueur.goto.real, joueur.goto.imag, self.but_adversaire[0],self.but_adversaire[1],spin=True) joueur.defPoste('DRIBBLE') elif (joueur.poste[-1]=='PASSEUR') : #procédure avant la passe joueur.status=joueur.Passe() joueur.defPoste('PASSEUR') elif (joueur.poste[-1]=='RECEVEUR') : #procédure pendant la passe pour ajuster la position du receveur joueur.defPoste('RECEVEUR') joueur.reception() elif joueur.poste[-1]=='GOAL': joueur.goal() joueur.defPoste('GOAL') elif joueur.poste[-1]=='DEF':#placement dans notre camp, mode 'passif' if self.side=='L': x=-300 else : x=300 joueur.commande_position(x, joueur.match.balle.y/2, joueur.match.balle.x,joueur.match.balle.y) joueur.defPoste('DEF') elif joueur.poste[-1]=='DEF1':#placement entre les 2 attaquants, orienté vers le plus proche de la balle adversaires=joueur.opponents() adv1=adversaires[0].positionc adv2=adversaires[1].positionc placement=(adv1+adv2)/2 joueur.goto=placement distance1=adversaires[0].distanceToXY(joueur.match.balle.position) distance2=adversaires[1].distanceToXY(joueur.match.balle.position) if distance1<distance2: orientation=adv1 else: orientation=adv2 joueur.commande_position(joueur.goto.real,joueur.goto.imag,orientation.real,orientation.imag) joueur.defPoste('DEF1') elif joueur.poste[-1]=='DEF2':#placement entre le 2è attaquant et le but, orienté vers lui adversaires=joueur.opponents() distance1=adversaires[0].distanceToXY(joueur.match.balle.position) distance2=adversaires[1].distanceToXY(joueur.match.balle.position) if distance1<distance2: adv=adversaires[1] else: adv=adversaires[0] pos_adv=adv.positionc placement=(pos_adv+complex(self.but[0],self.but[1]))/2 joueur.goto=placement joueur.commande_position(joueur.goto.real,joueur.goto.imag,pos_adv.real,pos_adv.imag) joueur.defPoste('DEF2') elif joueur.poste[-1]=='TACKLE': joueur.commande_balle() joueur.defPoste('TACKLE') elif joueur.poste[-1]=='WAIT': joueur.commande_position(joueur.x,joueur.y,0,0,spin=True) joueur.defPoste('WAIT')
def whereIstheBall(self): ball = False baller = None distance = [] for joueur in self.joueurs[0].match.joueurs: if joueur.hasTheBall(): ball = True baller = joueur balle = self.joueurs[0].match.balle d = joueur.distanceToXY(balle.position) joueur.distance_balle = d distance.append(d) # if joueur==Robot('B',0,match_test): # print(d) # if joueur.poste[-1]=='RECEVEUR': # self.passe=True # if (joueur.poste[-1]=='DRIBBLE')&(joueur.status=='DONE'): # joueur.defPoste('RECEVEUR') # print(ball) if ball: if (baller.team == self.nom): if self.openGoal(baller): baller.defPoste('SHOOTER') baller.teammate().defPoste('AT2') #ou defense elif (baller.poste[-1] == 'DRIBBLE') & (baller.status == 'EN COURS'): baller.defPoste('DRIBBLE') baller.teammate().defPoste('DEMARQUE') # elif (baller.poste[-1]=='DRIBBLE')&(baller.status=='DONE'): # baller.defPoste('BALLER') # baller.teammate().defPoste('MATE' ) else: if self.openGoal(baller.teammate()): self.passe = True baller.defPoste('PASSEUR') baller.teammate().defPoste('RECEVEUR') elif baller.status != 'EN COURS': # print('here') field = baller.create_game() final_pos_baller, score_baller, fail = ia.play_game_3( agent=self.ia, game=field) # print(field) # ia.Game(9,9,terrain=field).print() field = baller.teammate().create_game() final_pos_mate, score_mate, fail = ia.play_game_3( agent=self.ia, game=field) if score_mate > score_baller + 2: if self.side == 'L': baller.teammate().goto = final_pos_mate else: baller.teammate().goto = (-final_pos_mate[0], final_pos_mate[1]) baller.teammate().goto = final_pos_mate baller.teammate().status = baller.teammate( ).commande_position(baller.teammate().goto[0], baller.teammate().goto[1], self.but_adversaire[0], self.but_adversaire[1], spin=True) baller.teammate().defPoste('DRIBBLE') baller.defPoste('PASSEUR') else: if self.side == 'L': baller.goto = final_pos_baller else: baller.goto = (-final_pos_baller[0], final_pos_baller[1]) baller.status = baller.commande_position( baller.goto[0], baller.goto[1], self.but_adversaire[0], self.but_adversaire[1], spin=True) # print(baller.goto) baller.defPoste('DRIBBLE') elif baller.team != self.nom: # print('defense1',baller) goal = self.whoIsTheGoal() goal.defPoste('GOAL') if ((baller.x < 0) & (self.side == 'L')) | ( (baller.x > 0) & (self.side == 'R')): #Baller de notre coté goal.teammate().defPoste('TACKLE') else: goal.teammate().defPoste('DEF') elif (not ball): closer = self.joueurs[0].match.joueurs[distance.index( min(distance))] if closer.team == self.nom: #on est plus proche de la balle if (closer.poste[-1] == 'PASSEUR') & ( joueur.status == 'DONE' ): #on verifie que ce n'est pas celui qui vient de faire la passe closer.defPoste('DEMARQUE') elif (closer.poste[-1] == 'DEMARQUE') & ( joueur.status == 'EN COURS' ): #pareil que précédemment mais à l'instant d'aprés closer.defPoste('DEMARQUE') elif closer.poste[ -1] == 'RECEVEUR': #si c'est le receveur, alors on ne change pas son poste closer.defPoste('RECEVEUR') else: #sinon on va chercher la balle closer.defPoste('CHASER') closer.teammate().defPoste('DEMARQUE') else: #l'autre équipe est plus proche de la balle goal = self.whoIsTheGoal() #attribution d'un gardien goal.defPoste('GOAL') if ((self.side == 'L') & (balle.x < 0)) | ((self.side == 'R') & (balle.x > 0)): #Balle de notre coté goal.teammate().defPoste('CHASER') else: if (min(distance) / goal.teammate().distanceToXY(balle.position) ) > 0.7: #Rapport de décision def/chaser goal.teammate().defPoste('DEF') else: goal.teammate().defPoste('CHASER') #Affichage changement de status if self.joueurs[0].match.disp == 0: changement = False status = '' for joueur in self.joueurs: status += (f'{joueur} {joueur.poste} {joueur.status} \n') if joueur.poste[-2] != joueur.poste[-1]: changement = True if changement: print('---------------') print(status)
def action(self): for joueur in self.joueurs: if joueur.poste[-1]=='SHOOTER': joueur.Tir() elif joueur.poste[-1]=='CHASER': joueur.status=joueur.commande_balle() elif joueur.poste[-1]=='AT2': if joueur.status!='EN COURS': field=joueur.create_game() final_pos_joueur,score_joueur,fail=ia.play_game_3('ia3',game=field) if self.side=='L': joueur.goto=final_pos_joueur else: joueur.goto=(-final_pos_joueur[0],final_pos_joueur[1]) joueur.status=joueur.commande_position(joueur.goto[0], joueur.goto[1], joueur.teammate().x,joueur.teammate().y) # print(joueur.goto) else : joueur.status=joueur.commande_position(joueur.goto[0], joueur.goto[1], joueur.teammate().x,joueur.teammate().y) ax.plot(joueur.goto[0],joueur.goto[1],'go') # p = psl.packetCommandBot(joueur.team=='Y', # id=joueur.id, # veltangent=0., # velnormal=0, # velangular=0.) # grSim.send(p) self.passe=False # field=joueur.create_game() # final_pos,score=ia.play_game('ia2',game=field) # if self.side=='L': # joueur.goto=final_pos # else: # joueur.goto=(-final_pos[0],final_pos[1]) elif joueur.poste[-1]=='BALLER': # field=self.joueurs[0].match.create_game() # final_pos,score=ia.play_game('ia2',game=field) # joueur.goto=final_pos # joueur.status=joueur.commande_position(joueur.goto[0], joueur.goto[1], 0,spin=True) joueur.defPoste('DRIBBLE') joueur.defPoste('DRIBBLE') # print(final_pos) # time.pause(5) elif joueur.poste[-1]=='DRIBBLE': joueur.status=joueur.commande_position(joueur.goto[0], joueur.goto[1], self.but_adversaire[0],self.but_adversaire[1],spin=True) ax.plot(joueur.goto[0],joueur.goto[1],'go') joueur.defPoste('DRIBBLE') elif (joueur.poste[-1]=='PASSEUR') & (joueur.teammate().poste[-1]=='RECEVEUR'): joueur.Passe() joueur.defPoste('PASSEUR') elif (joueur.poste[-1]=='RECEVEUR') & (joueur.teammate().poste[-1]=='AT2'): joueur.reception() joueur.defPoste('RECEVEUR') # if joueur.distance_balle<100: # joueur.poste[-1]=='CHASER' elif joueur.poste[-1]=='GOAL': joueur.goal() elif joueur.poste[-1]=='DEF': if self.side=='L': x=-600 else : x=600 joueur.commande_position(x, 0, 0,0) elif joueur.poste[-1]=='TACKLE': joueur.commande_balle()
def whereIstheBall(self): ball=False baller=None distance=[] for joueur in self.joueurs[0].match.joueurs : if joueur.hasTheBall(): ball=True baller=joueur d=joueur.distanceToXY(self.joueurs[0].match.balle.position) joueur.distance_balle=d distance.append(d) # if joueur==Robot('B',0,match_test): # print(d) # if joueur.poste[-1]=='RECEVEUR': # self.passe=True # if (joueur.poste[-1]=='DRIBBLE')&(joueur.status=='DONE'): # joueur.defPoste('RECEVEUR') # print(ball) if ball: if (baller.team==self.nom): # baller.defPoste('BALLER') self.baller=baller if self.openGoal(baller): baller.defPoste('SHOOTER') baller.teammate().defPoste('AT2') elif (baller.poste[-1]=='DRIBBLE')&(baller.status=='EN COURS') : baller.defPoste('DRIBBLE') baller.teammate().defPoste('AT2' ) # elif (baller.poste[-1]=='DRIBBLE')&(baller.status=='DONE'): # baller.defPoste('BALLER') # baller.teammate().defPoste('MATE' ) else : if self.openGoal(baller.teammate()): self.passe=True baller.defPoste('PASSEUR') baller.teammate().defPoste('RECEVEUR') elif baller.status!='EN COURS': print('here') field=baller.create_game() final_pos_baller,score_baller,fail=ia.play_game_3('ia3',game=field) # print(field) # ia.Game(9,9,terrain=field).print() field=baller.teammate().create_game() final_pos_mate,score_mate,fail=ia.play_game_3('ia3',game=field) if score_mate>score_baller+2: if self.side=='L': baller.teammate().goto=final_pos_mate else: baller.teammate().goto=(-final_pos_mate[0],final_pos_mate[1]) baller.teammate().goto=final_pos_mate baller.teammate().status=baller.teammate().commande_position(baller.teammate().goto[0], baller.teammate().goto[1], self.but_adversaire[0],self.but_adversaire[1],spin=True) baller.teammate().defPoste('DRIBBLE') baller.defPoste('PASSEUR') else: if self.side=='L': baller.goto=final_pos_baller else: baller.goto=(-final_pos_baller[0],final_pos_baller[1]) baller.status=baller.commande_position(baller.goto[0], baller.goto[1], self.but_adversaire[0],self.but_adversaire[1],spin=True) # print(baller.goto) baller.defPoste('DRIBBLE') # passe=True # print('attaque PASSE',baller) if (baller.team==self.nom) & (self.passe): if baller.teammate()==self.baller: self.passe=False baller.defPoste('AT2') elif baller.team!=self.nom : # print('defense1',baller) goal=self.whoIsTheGoal() goal.defPoste('GOAL') if ((baller.x<0)&(self.side=='L'))|((baller.x>0)&(self.side=='R')): goal.teammate().defPoste('TACKLE') else : goal.teammate().defPoste('DEF') elif (not ball) & (not self.passe): closer=self.joueurs[0].match.joueurs[distance.index(min(distance))] if closer.team==self.nom: if (min(distance)<300)&(closer.poste[-1]=='DRIBBLE'): pass else: closer.defPoste('CHASER') closer.teammate().defPoste('AT2') else : # print('defense', closer) goal=self.whoIsTheGoal() goal.defPoste('GOAL') goal.teammate().defPoste('DEF') elif (not ball) & self.passe: for joueur in self.joueurs: if joueur.poste[-1]=='PASSEUR': joueur.defPoste('AT2') changement=False status='' for joueur in self.joueurs: status+=(f'{joueur} {joueur.poste} {joueur.status} \n') if joueur.poste[-2]!=joueur.poste[-1]: changement=True if changement: print('---------------') print(status)