Démineur c++

Résolu/Fermé
Pipette - Modifié le 8 janv. 2022 à 22:08
 Pipette - 8 janv. 2022 à 22:05
Bonjour, pour un tp je dois concevoir un jeu démineur, le problème vient quand je dois déterminer pour chaque case les mines alentours, impossible de faire fonctionner correctement la fonction si quelqu'un avec un oeil neuf peut regarder afin de voir si il trouve d'ou peut venir le problème car la je ne comprends vraiment pas la méthode me semblant correct...
Merci à vous pour votre aide
#include <iostream>
#include <cstdlib> 
#include<ctime>
using namespace std;


//Permet de réaliser un tableau a 2D
int * *creer_tab2D(int n, int m){
    int * *p=new int *[n] ;
    for(int i=0;i<n;i++) p[i]=new int[m] ;
    return (p);
}

//Structure de la matrice
struct matrice {
    int nbl;
    int nbc ;
    int * *T ; 
};

//Création de la matrice
matrice *Creer_matrice(int n, int m){
    matrice *p=new matrice;
    (*p).nbl=n;
    (*p).nbc=m;
    (*p).T=creer_tab2D(n,m);
    return (p);
}

//Initilisation de la matrice a zéro
void initZero_mat(matrice &J){
    for(int i=0;i<J.nbl;i++){
        for(int j=0;j<J.nbc;j++){
            J.T[i][j]=0;
        }   
    }
}

//Création du tableau avec les mines
int Int_jeu(matrice & J, int Mines, int n){
    srand(time(NULL));
    int i,j;
    for(int cpt=0;cpt<Mines;cpt++){
        i = rand()%n;
        j = rand()%n;
        if (J.T[i][j]==2){
            while(J.T[i][j]==2){
                i = rand()%n;
                j = rand()%n;
            }
            J.T[i][j]=2;
        }
        else{
            J.T[i][j]=2;
        }
    }
    return(0);
}

bool possible(int z, int e, int n){
    if((z==-1 or z>=n) and(e==-1 or e>=n)) return(false);
    else return(true);
}

//Determine les mines a coter de chaque case
void mines_autour(matrice &J, matrice &M, int n){
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int cpt=0;
            if(J.T[i][j]!=2){
            for(int a=-1; a!=1; a++){
                for(int b=-1; b!=1; b++){
                    if(a!=0 and b!=0){
                        if(possible(a+i,b+j,n)){
                            if(J.T[a+i][b+j]==2){
                                cpt++;
                            }
                        }
                    }
                }
            }
            }
            M.T[i][j]=cpt;
        }
    }
}


//fonction d'affichage du tableau de mines
// Affichage_TM(*J,n);
void Affichage_TM(matrice & J, int n){
    for(int i=0; i<n; i++){
        for(int j=0;j<n;j++){
            cout<<J.T[i][j]<<" ";
        }
        cout<<endl;
    }
}

int main(){
    int n=5;
    int m=5;
    int Mines=5;

    matrice *J=Creer_matrice(n,m);
    initZero_mat(*J);
    Int_jeu(*J,Mines,n);
    matrice *M=Creer_matrice(n,m);
    initZero_mat(*M);
    Affichage_TM(*J,n);
    cout<<endl;
    Affichage_TM(*M,n);
    
    return(0);
}

2 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
8 janv. 2022 à 20:49
Bonjour,

Le code que tu écris est à 95% du C. Seul
using namespace std
(qui est une très vielle commande à oublier), l'utilisation de
std::cout
,
std::cin
, l'utilisation de
new
(qui est à ne JAMAIS utiliser) et les références sont du C++. Le langage que tu apprends n'est donc pas vraiment le C++!

Les erreurs que j'ai vues
-
if((z==-1 or z>=n) and(e==-1 or e>=n)) return(false);
. Non: une erreur sur z OU BIEN une erreur sur e font une position non valide!
            for(int a=-1; a!=1; a++){
                for(int b=-1; b!=1; b++){
                    if(a!=0 and b!=0){

Ces 3 lignes ont une chacune une erreur:
- on veut aller de -1 à +1, et tu indiques de quitter la boucle quand
a
vaudra 1!
- la 3ième, tu confonds encore ET et OU. Il suffit que qu'un seul parmi
a
OU BIEN
b
soit non nul.
0
Merci de ton aide, en corrigeant tout marche parfaitement merci beaucoup!
Je ne voyais pas les erreurs a force de me prendre la tète dessus.
Normalement je suis censé apprendre le c++ mais bon je te crois si c'est que du c principalement, je ne fais que reprendre mes cours.
Merci encore de ton aide!!
0