Pygame multijoueur

a marqué ce sujet comme résolu.

Bonjour,

Merci beaucoup pour les conseils !

Pour l’instant, voici mon code (j’en suis au tout début, et ce code fonctionne avec 2 ordis précis, pour commencer) :

import pygame as pg
import socket

#################################SETUP PYGAME##################################

pg.init()

screen = pg.display.set_mode((640,640))


###################SET THE CONNEXION WITH THE OTHER PLAYER#####################

def setup_serveur_connexion():
    my_socket = socket.socket()

    host_this_player = socket.gethostname()

    host_other_player = ''

    #meant to be changed

    if "imac" in host_this_player:
        host_other_player = 'pluton-1.home'
    else:
        host_other_player = 'imac-de-christian-mayeux.home'
        

    port = 6667

    my_socket.bind((host_this_player,port))

    my_socket.listen(5)

    print("done")
    connexion, adr = my_socket.accept()

    connexion.send((host_this_player+" is connected").encode())

    print(connexion.recv(1024).decode())
    return connexion

def setup_client_connexion():
    my_socket = socket.socket()

    host_this_player = socket.gethostname()

    host_other_player = ''

    #meant to be changed

    if "imac" in host_this_player:
        host_other_player = 'pluton-1.home'
    else:
        host_other_player = 'imac-de-christian-mayeux.home'
        

    port = 6667


    my_socket.connect((host_other_player,port))

    print("done")

    my_socket.send((host_this_player+" is connected").encode())

    print(my_socket.recv(1024).decode())

    return my_socket

if 'imac' in socket.gethostname():
    cxn =  setup_serveur_connexion()
else:
    cxn = setup_client_connexion()


###############################DEFINE CLASSES####################################

class Grille:
    def __init__(self,w,h):
        self.data = []
        for i in range(h):
            self.data.append([])
            for j in range(w):
                self.data[-1].append(None)
        for ligne in self.data:
            print(ligne)

Grille(4,3)

###################################MAIN LOOP##############################s######

done = False

tour = 0

ready = False

while not done:
    for event in pg.event.get():
        if event.type == pg.QUIT:
            done = True
    screen.fill("white")
    

    pg.display.update()

pg.quit()
cxn.close()

Du coup, le code est censé être le même pour le serveur et client, et le serveur est toujours le même.

Effectivement, je crois que je vais créer, comme vous le dites, une option "héberger la partie"…

Merci beaucoup !

@flopy78

Salut,

Il semblerait que ton script commence déjà à se complexifier un peu et à partir dans trois directions qu’il pourrait être souhaitable de ne pas mélanger. Les trois trucs à gérer ici sont :

  • la logique du jeu de bataille navale lui-même, c’est-à-dire l’implémentation des règles du jeu en elles-même (appelons ça le "moteur de jeu") ;
  • l’interface graphique du jeu (que tu sembles vouloir gérer avec pygame), qui fait l’interface entre un joueur et le moteur de jeu ;
  • la connexion entre deux joueurs pour que les deux instances du moteur de jeu puissent communiquer.

Là tu pars sur un script monolithique découpé en segments à coup de ASCII art où tu mélanges déjà la gestion de la connexion et la boucle principale de pygame. Si c’est encore lisible parce que le code ne fait pas encore grand chose, ça va très vite devenir le bordel si tu ne compartimentes pas un minimum les différentes parties du code. Tu peux quasiment utiliser les segments ASCII pour découper ton code en trois fichiers par exemple :

  • SETUP PYGAME et MAIN LOOP pourraient aller ensemble dans le point d’entrée de ton application, avec le reste de ce qui affecte l’état global du jeu (créer cxn, instancier Grille, etc) ;
  • DEFINE CLASSES a l’air d’être un embryon de moteur de jeu ;
  • SET THE CONNEXION WITH THE OTHER PLAYER est la partie qui gère la connexion.

Il serait bien sûr contre-productif de chercher d’entrée de jeu à avoir un modèle super-propre et bien modulaire (parce que ces choses sont amenées à évoluer lorsque l’implémentation s’affine), mais il est aussi important de trouver un juste milieu pour éviter de se retrouver très vite avec un truc ingérable.

Bonjour,

Merci pour votre remarque !

Il faudrait donc que j’utilise une structure modulaire pour que les choses soient plus claires (un fichier "main.py" accompagné de deux modules "moteur_de_jeu.py" et "connexion.py", dans lesquelles je vais pouvoir répartir les différents parties de mon gros monolithe).

Comme ça, j’importe "moteur_de_jeu" et "connexion" au début de mon script "main" le projet sera plus facile à développer et à entretenir derrière !

Merci infiniment,

Bonne journée,

@flopy78

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte