Partage
  • Partager sur Facebook
  • Partager sur Twitter

Bataille-Navale sous python

9 janvier 2019 à 12:35:40

Bonjour / Bonsoir selon l'horaire à laquelle vous lisez ces lignes. 

Je suis actuellement en terminale S option ISN (Informatique et Science du Numérique), dans le cadre d'un TP/DM nous devons avec un ami créer un jeu de bataille navale cela fait 2semaines que nous tournons en rond. 
Nous avons seulement a crée notre grille de jeu (donc soit une grille simple s'affichant dans la console [nous travaillons avec edu python] soit une grille dessiné s'affichant dans une fenêtre) + sous tkinter j'ai réussi à créer une fenêtre affichant nos règles voilà où nous en sommes bien peu avancé. J'ai hésité à demander de l'aide mais après avoir vu des lignes de codes ayant toutes un problèmes sur internet et très peu détaillé je me résous à vous demandez de l'aide.

Merci d'avance à tous ceux qui apporterons leur pierre à notre édifice ;)

  • Partager sur Facebook
  • Partager sur Twitter
9 janvier 2019 à 14:10:48

Bonjour, il vous faudra dans un premier temps modeliser le plateau, les navires par des classes, après avoir décidé, sur papier, à quoi ressemblera l'interface, quelles seront les règles, et concrètement que vera l'utilisateur. Par exemple y aura-t-il un moyen de jouer à deux ? Si oui sur un même écran ou en ligne ? Lorsque enfin vous aurez décidé de tout cela, vous créerez l'interface graphique qui fait le lien entre l'utilisateur et les mécanismes internes du jeu.
  • Partager sur Facebook
  • Partager sur Twitter

typage structurel ftw

11 janvier 2019 à 10:27:31

Alors je vais détailler un peu plus le projet qui est simplifié par rapport à des batailles navales déjà codées sous python. 

Nous devons faire une grille de 5x5, avec 2 bateaux (1 de 1 case et 1 de 2cases) nous devons faire aux choix soit contre l'ordi, soit l'ordi sélectionnant au hasard des emplacements et nous devons trouver les bateaux. Nous n'avons malheureusement pas les bagages nécessaires pour réaliser cela en ce moment. 

Merci de votre réponse

  • Partager sur Facebook
  • Partager sur Twitter
11 janvier 2019 à 18:45:21

Voici ce que je te propose pour modéliser le jeu :

from itertools import product


BLUE = "BLUE"
RED = "RED"


opponent = {BLUE: RED, RED: BLUE}


N, S, E, W = (-1, 0), (+1, 0), (0, +1), (-1, 0)


def add(p1, p2):
    return (p1[0] + p2[0], p1[1] + p2[1])


class Skins:

    BOAT = "X"
    DESTROYED_BOAT = "&"
    SEA = " "
    HIDDEN = "#"


class Location:
    """
    Une case du plateau
    """


    def __init__(self, player):
        """
        Joueur est le joueur qui doit voir cette case
        """

        self.contain_boat = False
        self.boat_destroyed = False
        self.revealed_to = {player: True, opponent[player]: False}

    def draw(self, player):
        """
        On veut ce que doit voir player de cette case
        """

        if self.revealed_to[player]:
            return [Skins.SEA, [Skins.BOAT, Skins.DESTROYED_BOAT][self.boat_destroyed]][self.contain_boat]

        else:
            return Skins.HIDDEN


class Boat:
    """
    Un bateau
    """


    def __init__(self, size):

        self.orientation = N
        self.size = size

    @staticmethod
    def new_boat1():
        return Boat(1)

    @staticmethod
    def new_boat2():
        return Boat(2)

    def occupied_positions(self, x, y):
        """
        Quelles sont les positions occupées par le bateau en sachant que (x, y) représente la position de sa "tête"
        """

        current = (x, y)

        for _ in range(self.size):
            yield add((x, y), tested)
            current = add(current, self.orientation)


class Board:
    """
    Le plateau de jeu
    Dans le cas des règles classiques, on a besoin de 2 plateaux par partie
    """


    def __init__(self, player, size):


        self.content = {position: Location(player) for position in product(range(size), range(size)}

    def __getitem__(self, key):
        return self.content[key]

    def can_place_boat(self, boat, x, y):
        return all(occupied_position[0]+x < self.size and occupied_position[1]+y < self.size and not self[occupied_position].contain_boat for occupied_position in boat.occupied_positions(x, y))

    def place_boat(self, boat, x, y):
        """
        Avec ce système c'est difficile de retirer des bateaux du plateau
        """

        for position in boat.occupied_positions(x, y):
             self.content[position].contain_boat = True

Ce n'est qu'une suggestion, qui plus est il y a sans doute des tonnes de nouveautés pour toi là-dedans. N'hésite pas à poser des questions et chercher dans la doc de Python.

Pour ce qui est de l'interface graphique je te laisse chercher un peu, mais j'ai une solution très simple à mettre en œuvre si jamais.

  • Partager sur Facebook
  • Partager sur Twitter

typage structurel ftw

16 janvier 2019 à 23:02:27

super merci beaucoup on a pas mal tatonné et avancé ce code devrait nous permettre de finir en terme de graph je pensais utiliser tktinter et ou des turtles mais sa me parait très compliqué à maitriser
  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2019 à 20:27:50

tkinter serait tout à fait correcte, en plus de ne pas être compliqué.
  • Partager sur Facebook
  • Partager sur Twitter

typage structurel ftw

15 avril 2021 à 13:23:15 - Message modéré pour le motif suivant : Merci de créer votre propre sujet


Anonyme
15 avril 2021 à 13:44:37 - Message modéré pour le motif suivant : Réponse à un message modéré


15 avril 2021 à 17:57:16

@AlexandreMandon1 Bonjour, merci de ne pas déterrer d'ancien sujet.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter