IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Free Pascal Discussion :

Bataille Navale : sélection par IA


Sujet :

Free Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 2
    Par défaut Bataille Navale : sélection par IA
    Bonjour à tous !

    Donc en tant qu'élève ingénieur, je dois rendre un projet d'info.

    Comme vous avez du le comprendre, j'ai décidé de programmer une bataille navale en pascal

    Ma méthode est simple, je stocke les coordonnées de chaque bateau, leur nom, leur taille, et s'ils sont coulés, dans un tableau de record.

    Pour l'IA, j'utilise une base de donnée qui est en fait une matrice du même type que la grille de jeu, et lorsqu'on touche un bateau, la case correspondante dans la BDD reçoit la valeur 1.

    Et voici quelques extraits du programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    program bataille_navale;
     
    uses crt;
     
    const   LMAX=10; //Nombre maximal de lignes dans la grille
    		CMAX=10; //Nombre maximal de colonnes dans la grille
            TMAX=5; //Taille maximale des bateaux
    		NBBAT=5; //Nombre de bateaux
     
    type	t_element=0..3; //Elements de la grille
    		t_coord=array[1..TMAX] of integer; //Forme des coordonnées
    		t_mat=array[1..LMAX,1..CMAX] of t_element; //Les éléments de la grille sont des entiers de 0 à 3
    {0:case vide, 1:bateau pas touché, 2:case vide tirée, 3:bateau touché}
    		t_bat=	record //Type des bateaux
    				nom:string; //Stocke le nom du bateau
    				coule:boolean; //Stocke si le bateau est coulé ou non
    				taille:integer; //Stocke la taille du bateau
    				x,y:t_coord; //Abscisses-Ordonnées du bateau
    				end;
    		t_nav=array[1..NBBAT] of t_bat;//Tableau contenant les bateaux (Flotte)
     
    { Fonctions booléennes de test :
    voisin(x1,y1,x2,y2): rend TRUE si la case 2 est autour de la 1
    existe(x,y): rend TRUE si la case est dans la grille de jeu
    coule: rent TRUE si le bateau est coulé }
    procedure selectIA(var x,y:integer;var m,bdd:t_mat;var N:t_nav); //selection de la case à tirer à partir de la base de données par IA
    var i,j,k,l:integer;
    begin		
    randomize;
    for i:=1 to LMAX do //On parcourt bdd
    	for j:=1 to CMAX do
    		if(bdd[i,j]<>0) //La case C de la bdd est un bateau
    			and not (existe(x,y)) //La case C n'a pas encore été trouvée
    				and not (coule(m,N,m[i,j])) then //Le bateau considéré n'est pas coulé
    			begin
    			for k:=i-1 to i+1 do //On tourne autour de C
    				for l:=j-1 to j+1 do
    					if(m[k,l]<>0) //La case autour de C n'a pas été tirée
    						and(existe(l,k)) //La case existe
    							and (voisin(j,i,l,k)) then //La case est voisine
    							begin
    							if(i-k=1)
    								or (i-k=-1)then //vertical
    								begin
    									repeat
    									if(i-k=1) then //(haut)
    										begin
    										if(random(2)=1) then y:=k-1
    										else y:=i+1;
    										end
    									else //(bas)
    										begin
    										if(random(2)=1) then y:=k+1
    										else y:=i-1;
    										end;
    									x:=l;
    									until (existe(x,y)) 
    										and (bdd[y,x]=0);
    								end
    							else //horizontal
    								begin
    									repeat
    									if(j-l=1) then //(gauche)
    										begin
    										if(random(2)=1) then x:=l-1
    										else x:=j+1;
    										end
    									else //(droite)
    										begin
    										if(random(2)=1) then x:=l+1
    										else x:=j-1;
    										end;
    									y:=k;
    									until (existe(x,y)) 
    										and (bdd[y,x]=0);
    								end;
    							end;
    			end;
    end;
    Voilà la part qui pose problème ! Donc si vous avez une solution, ce serait sympa de me sortir de ce me**ier


    Vous trouverez aussi en pièce jointe le programme complet si vous arrivez pas à lire

    Merci d'avance,

    JM
    Fichiers attachés Fichiers attachés

  2. #2
    Membre éclairé
    Avatar de EpiTouille
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2009
    Messages
    372
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2009
    Messages : 372
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    y:=k;
    									until (existe(x,y)) 
    										and (bdd[y,x]=0);
    								end;
    							end;
    			end;
    end;
    Je croit que tu n'a pas assez indenté

    Donc si vous avez une solution
    Mais de quoi ? Pose une vraie question Expose ton problème

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    je crois que tu te poses trop de question

    1) la grille est vide
    2) je prend un position random libre
    3) je tire :
    - plouf, la case est vide
    - coulé ! bateau sur 1 case, les cases autour sont vides
    - touché ! il faut tester les 4 cases autour pour trouver le reste du bateau
    * plouf ! : tester les 3 autres cases (au prochain tour)
    * touché ! c'est la bonne direction, on peut supprimer 2 cases sur 4
    * coulé ! bateau sur 2 cases, les cases autour sont vides

    donc à chaque tour tu as maxi 4 hypothèses à vérifier, c'est tout
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 056
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    J'ai essayé ton jeu et il tourne.

    Hormis une certaine lenteur d'affichage et une ergonomie qui pourrait être améliorée (par exemple, ne pas être obligé de presser systématiquement une touche entre chaque coup), je n'ai pas vu de problème particulier.

    Sans vouloir te froisser, l'IA n'a pratiquement aucune chance de gagner : lorsqu'un de mes bateaux est touché, elle n'essaye pas de le couler et continue à tirer au hasard dans ma grille. Est-ce le problème dont tu veux nous faire part ?

    P.S. Ce serait bien de donner une autre couleur ou un signe distinctif aux bateaux lorsqu'ils sont coulés.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  5. #5
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 2
    Par défaut
    Ah oui, effectivement, j'ai pas posé de question précise (on dira que c'està cause du gros copié/collé bourrin).

    Donc comme le faisais remarquer Alcatiz, oui mon IA est c**ne : mon problème réside dans la sélection de la case qu'elle veut tirer, car l'IA ne se rend pas compte qu'elle a touché un de mes bateaux !

    D'où ma question : comment faire pour qu'elle tire autour d'une case où elle a déjà touché un de mes bateaux, si le bateau en question n'est pas coulé ?

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2002
    Messages
    641
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 641
    Par défaut
    Bonjour,

    J'ai créé un jeu de bataille navale il y a quelque temps. Tu trouveras ci-joint le code du jeu. Regardes particulièrement les méthodes DoComputerTurn() et GetTargets().
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Editeur de texte qui fait la sélection par colonne
    Par wodel dans le forum Windows XP
    Réponses: 5
    Dernier message: 10/11/2010, 13h45
  2. aide pour jeu de la bataille navale
    Par Jeannot Alpin dans le forum Delphi
    Réponses: 17
    Dernier message: 19/11/2006, 20h33
  3. bataille navale
    Par keenurives dans le forum C
    Réponses: 7
    Dernier message: 21/11/2005, 12h15
  4. [LG]Programme Bataille Navale en Pascal
    Par RaFaL dans le forum Langage
    Réponses: 21
    Dernier message: 10/06/2003, 21h22
  5. Couleur de sélection par défaut
    Par sicard_51 dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 20/04/2003, 23h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo