def close(self): self.allow_receiving = False self.allow_connection = False self.allow_sending = False for sock in self.inputs[1:]: send_to(sock, "BYE") self.server.close() print("Program end engaged") os._exit(0)
def wait_for_STR_signal(self): while True: #if not self.received_queue.empty():print(data) data = self.received_queue.get() if data == "STR": return True else: send_to( self.conv_pnumber_to_psock(0), "MSG Croupier En attente de votre signal de lancement")
def __init__(self, players, server): self.players = players self.server = server ## lance le gdm qui gère localement les donées de jeu self.gdm = Game_data_manager() print("initialization complete, croupier rdy") for sock, name in self.players.items(): print("{} IS {}".format(sock.getsockname(), name)) self.gdm.add_new_player() send_to(sock, "MSG Croupier Bienvenue, la table est prête") # demande le lancement du jeu send_to(self.conv_pnumber_to_psock(0), "MSG Croupier En attente de votre signal de lancement") self.received_queue = Queue() self.current_player_turn = 0 # 0 non participant à la partie, 1 participant, 2 participant all in self.players_statut = [1 for x in range(NB_PLAYER)] # entrée à payer pour rester dans le jeu self.current_entry_fee = 0 self.start_treating()
def start_game_phase(self): while not self.gdm.check_loser(): # tant qu'il n'y a pas de pertant for player in range(NB_PLAYER): if self.gdm.check_loser(): break if self.gdm.check_empty_hand( player ): # si un joueur n'a plus de carte il en reprends 2 self.gdm.deal_card_to_player(player) self.gdm.deal_card_to_player(player) self.send_hand_to_player_sock( self.conv_pnumber_to_psock(player)) if self.gdm.get_player_statut(player): # 1 or 2 played_a_card = False while not played_a_card: self.brodcast( "MSG Croupier c'est au joueur {} de jouer une carte" .format(self.get_player_name(player))) self.ask_input_to_player_sock( self.conv_pnumber_to_psock(player), "PLY", " ") #demande au joueur de jouer une carte player_rep = self.received_queue.get( ) #recupere sa reponse player_rep = player_rep.split() if player_rep[0] == "PLY": try: player_input = int( player_rep[1]) #reconverti sa mise en int except: send_to( self.conv_pnumber_to_psock(player), "MSG Croupier Merci de respecter les format" ) continue if self.gdm.remove_card_from_hand( player, player_input): #carte valide et joué self.brodcast("ANN PLY {} {}".format( self.get_player_name(player), player_input)) self.brodcast( "MSG Croupier la pile vaut maintenant {}". format(self.gdm.get_pile())) played_a_card = True else: send_to( self.conv_pnumber_to_psock(player), "MSG Croupier Merci de joueur une carte valide" ) else: send_to( self.conv_pnumber_to_psock(player), "MSG Croupier Merci de respecter les format") self.current_player_turn = (self.current_player_turn + 1) % NB_PLAYER
def receiving_accept(self): while self.allow_connection or self.allow_recept: try: rlist, wlist, elist = select.select(self.inputs,[],[]) except: continue for s in rlist: if s is self.server and self.allow_connection: # si nouvelle connection socket conn, cliaddr = s.accept() print("connection from {}".format(cliaddr)) self.inputs.append(conn) #demande au socket de s'identifier if self.current_nb_connected < MAX_CONNECTION: self.players_dict[conn] = "VISITOR" send_to(conn,"WHO") else: self.spectators_dict[conn] = "VISITOR" send_to(conn,"WHO") self.current_nb_connected +=1 else: # sinon, il s'agit d'une reception de donnée try: data = s.recv(1024) except: continue data = data.decode() if data: # si autentification if data[:3] == "IAM" : if self.add_to_lists(s, data): print("add new player {}".format(data[4:])) self.current_nb_players +=1 self.brodcast("ARV {}".format(data[4:])) ## si le nombre de joueur necessaire pour le jeu est atteint, le croupier est appelé et le jeu se lance if self.current_nb_players == NB_PLAYER and self.game_statut is False : self.croupier = Croupier(self.players_dict, self.server) self.game_statut = True # si message, on retransmet le message au joueurs elif data[:3] == "MSG" or data[:3]=="ANN": print("arg = MSG or ANN, brodcasting to everyone") self.brodcast(data) elif data[:3] in ["STR", "PUT", "PLY"]:#mecanisme de controle qui assure que c'est le bon socket qui envoie une reponse if s is self.croupier.get_current_player_sock(): self.croupier.push_to_rqueue(data) else: send_to(s,"MSG Croupier Merci de respecter l'ordre de jeu") elif "BYE" == data:#close signal print("received BYE signal") self.inputs.remove(s) print("removed socket :{}".format(s)) if s in self.players_dict: self.brodcast("LFT {}".format(self.players_dict[s])) self.players_dict.pop(s) send_to(s, "BYE") s.close() else: print(">>data received :") print(data) else:#socket closing print("handle closed") self.inputs.remove(s) print("removed socket :{}".format(s)) if s in self.players_dict: self.players_dict.pop(s) send_to(s, "BYE") s.close() print("End receiving_accept thread")
def brodcast(self, data): for s in self.inputs[1:]: # if s is not self.server : send_to(s, data)
def add_to_lists(self, player_sock, raw_data): data = raw_data.split() if len(data) != 2:# erreur format:IAM PSEUDO send_to(player_sock, "ERR ARGV MISMATCH") return False if data[0] == "IAM":#bonne entete if player_sock in self.players_dict: if data[1] not in self.players_dict.values():#si le pseudo n'est pas pris if self.players_dict[player_sock] == "VISITOR": #si le pseudo n'est pas set(evite les changement de pseudo) self.players_dict[player_sock] = data[1] send_to(player_sock, "MSG SYS Welcome") return True send_to(player_sock, "ERR PSEUDO ALEADY SET") return False send_to(player_sock, "ERR PSEUDO USED") return False else: if data[1] not in self.spectators_dict.values(): self.spectators_dict[player_sock] = data[1] send_to(player_sock, "WELCOME!! ") return True send_to(player_sock, "ERR PSEUDO USED") return False send_to(player_sock, "ERR ENTETE") return False#erreur entete
def send_msg(self, msg): send_to(self.client, msg)
def send_client_name(self, name): self.client_name = name send_to(self.client, "IAM " + name)
def close(self): self.allow_sending = False self.allow_receiving = False send_to(self.client, "BYE") print("Program end engaged") os._exit(0)
def start_bet_phase(self): self.current_entry_fee = 0 while not self.gdm.check_bet_phase_done(self.current_entry_fee): for player in range(NB_PLAYER): #itere sur toutes les joueurs while not self.gdm.check_player_bet_done( player, self.current_entry_fee ): #Tant que ce joueur n'a pas fini son mise player_wallet = self.gdm.get_player_wallet( player) #check son portefeuille self.brodcast( "MSG Croupier c'est au joueur {} de miser".format( self.get_player_name(player))) self.ask_input_to_player_sock( self.conv_pnumber_to_psock(player), "PUT", player_wallet) player_rep = self.received_queue.get( ) #recupere sa reponse player_rep = player_rep.split() if player_rep[0] == "PUT": #si le joueur mise try: player_input = int( player_rep[1]) #reconverti sa mise en int except: send_to( self.conv_pnumber_to_psock(player), "MSG Croupier Merci de respecter les format") continue if player_wallet <= 0 or player_input == 0: #s'il n'a pas de jeton self.gdm.set_player_statut(player, 0) # dehors self.brodcast("ANN PUT {} {}".format( self.get_player_name(player), 0)) elif player_wallet < player_input: send_to( self.conv_pnumber_to_psock(player), "MSG Croupier Vous n'avez pas assez de jetons") elif player_input < self.current_entry_fee: # s'il mise moins que l'entrée necessaire if player_wallet > player_input: send_to( self.conv_pnumber_to_psock(player), "MSG Croupier Vous devez miser un montant valide" ) else: self.gdm.set_player_statut( player, 2) #son statut est update en 2 (all in) self.gdm.set_player_chip(player, player_wallet) self.brodcast("ANN PUT {} {}".format( self.get_player_name(player), player_wallet)) else: #sinon, il en a assez pour miser self.current_entry_fee = player_input #on update l'entry fee self.gdm.set_player_chip(player, player_input) self.brodcast("ANN PUT {} {}".format( self.get_player_name(player), player_input)) elif player_rep[0] == "FLD": #il se couche self.gdm.set_player_statut(player, 0) # dehors self.brodcast("ANN FLD {}".format( self.get_player_name(player))) else: send_to(self.conv_pnumber_to_psock(player), "MSG Croupier Merci de respecter les format") self.current_player_turn = (self.current_player_turn + 1) % NB_PLAYER
def brodcast(self, data): for player_sock in self.players: send_to(player_sock, data)
def close(self): for sock in self.players: send_to(sock, "BYE") self.server.close() print("Program end engaged") os._exit(0)
def ask_input_to_player_sock(self, player_sock, arg1, arg2): send_to(player_sock, "REQ {} {}".format(arg1, arg2))
def send_hand_to_player_sock(self, player_sock): player_hand = self.gdm.get_player_hand( self.conv_psock_to_pnumber(player_sock)) player_hand = " ".join(map(str, player_hand)) if player_hand != "": send_to(player_sock, "GET " + player_hand)