Неопределенные символы для архитектуры x86_64 ... C ++ игра MineSweeper - PullRequest
0 голосов
/ 21 ноября 2018

Мне нужно написать код игры MineSweeper на C ++.У меня странная ошибка при выполнении моего кода .... Надеюсь, вы можете помочь мне с этим ... Также все названия функций или переменных на французском языке, извините в адвенсе ... извините задлинный пост

Ошибка:

/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake --build 
"/Users/alexisboud/Desktop/SHERBZ/Session 1/IFT159/Demineur_1/cmake- 
build-debug" --target Demineur_1 -- -j 2
Scanning dependencies of target Demineur_1
[ 33%] Building CXX object CMakeFiles/Demineur_1.dir/main.cpp.o
[ 66%] Linking CXX executable Demineur_1
Undefined symbols for architecture x86_64:
"OuvreCase(Carte&, int, int)", referenced from:
  _main in main.cpp.o
 ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see 
invocation)
make[3]: *** [Demineur_1] Error 1
make[2]: *** [CMakeFiles/Demineur_1.dir/all] Error 2
make[1]: *** [CMakeFiles/Demineur_1.dir/rule] Error 2
make: *** [Demineur_1] Error 2

Вот мой основной код моей основной:

#include "Carte.h"
#include "Utilities.h"

#include <fstream>
#include <iostream>
#include <limits>
#include <string>

using namespace std;

int main()
{
// Prototypes
bool OuvreCase(Carte& carte, int ligne, int colonne);

string nomFichierCarte;

// 1. Lire le nom du fichier contenant la carte de jeu
cout << "Entrez le nom du fichier contenant la carte : ";
cin >> nomFichierCarte;

// 2. Ouvrir le fichier
ifstream fichierCarte(nomFichierCarte);
// 3. Tant que le nom du fichier est different de "quitter" et que le fichier demande n'a pas pus etre ouvert
while (nomFichierCarte != "quitter" && !fichierCarte.is_open())
{
    // 3.1 Afficher un message d'erreur
    cout << "Fichier introuvable!" << endl << "Entrez le nom du fichier contenant la carte : ";
    // 3.2 Redemander un nom de fichier
    cin >> nomFichierCarte;
    // 3.3 Tenter d'ouvrir a nouveau le fichier
    fichierCarte.open(nomFichierCarte);
}

// 4. Si le fichier a bien ete ouvert
if (fichierCarte.is_open())
{
    // 4.1 Creer la carte a partir du fichier
    Carte carte(fichierCarte);

    //4.2 Afficher la carte
    cout << carte;

    int ligne = 0;
    int colonne = 0;
    // 4.3 Tant qu'on ne veut pas quitter
    while (ligne != -1)
    {
        // 4.3.1 Lire la ligne a essayer
        cout << "Entrez la ligne : ";
        // 4.3.2 Tant qu'on ne lit pas un nombre entier
        while (!(cin >> ligne))
        {
            // 4.3.2.1 Afficher un message d'erreur et redemander le numero de ligne
            cout << "Erreur! Vous devez entrer une nombre entier! " << endl << "Entrez la ligne : ";
            // 4.3.2.2 Vider le tampon de lecture
            cin.clear();
            // 4.3.2.3 Ignorer tous les caracteres deja entres
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }

        // 4.3.3 Si la ligne est negative
        if (ligne < 0)
        {
            // 4.3.3.1 On quitte le jeu
            return 0;
        }

        // 4.3.4 Lire la colonne a essayer
        cout << "Entrez la colonne : ";
        // 4.3.5 Tant qu'on ne lit pas un nombre entier
        while (!(cin >> colonne))
        {
            // 4.3.5.1 Afficher un message d'erreur et redemander le numero de colonne
            cout << "Erreur! Vous devez entrer une nombre entier! " << endl << "Entrez la colonne : ";
            // 4.3.5.2 Vider le tampon de lecture
            cin.clear();
            // 4.3.5.3 Ignorer tous les caracteres deja entres
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        }

        // 4.3.6 Effacer tout l'ecran
        Console::ClearScreen();

        // 4.3.7 Ouvre la case demande, si on ne peut pas
        if (!OuvreCase(carte, ligne, colonne))
        {
            // 4.3.7.1 Affiche un message d'erreur et indique de quitter le jeu
            ligne = -1;
            cout << "Vous avez touche une mine!!!" << endl;
        }
        //    4.3.8 Sinon, si on vient de terminer la partie
        else if(carte.EstFini())
        {
            // 4.3.8.1 Affiche un message de felicitation et indique de quitter le jeu
            ligne = -1;
            cout << "Vous avez gagne!" << endl;
        }

        else (OuvreCase(carte, ligne, colonne));


        // 4.3.9 Affiche la carte
        cout << carte;
    }
}

return 0;
}

Вот .h:

#ifndef _CARTE_H_
#define _CARTE_H_

#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
enum Case
{
    Chiffre,
    Libre,
    Mine
};

class Carte
{
    vector<vector<bool>> casesOuvertes;
    vector<vector<Case>> cases;

    int nbMines;

    void UpdateCarte();

public:
    Carte(ifstream&);
    Case GetCase(int ligne, int colonne) const;
    int GetNbMinesAdjacentes(int ligne, int colonne) const;
    int GetNbLigne() const;
    int GetNbColonne() const;
    void Ouvre(int ligne, int colonne);
    bool EstOuvert(int ligne, int colonne) const;
    bool EstFini() const;
    bool OuvreCase(Carte& carte, int ligne, int colonne);
    friend ostream& operator<<(ostream& out, const Carte& carte);
};

ostream& operator<<(ostream& out, const Carte& carte);

#endif

Вот часть файла .pp, которая имеет проблему в ..

bool Carte::OuvreCase(Carte& carte, int ligne, int colonne)
{
// 1.1 Si la ligne demander est dans la carte
if (ligne >= 0 && ligne < GetNbLigne() && colonne >= 0 && colonne < GetNbColonne())
{
    // 1.2 Si la case est un chiffre
    if (GetCase(ligne, colonne) == Case::Chiffre)
    {
        //1.3 Ouvrir la case
        Ouvre(ligne, colonne);
        return true;
    }
    // 1.4 Si la la case n'est pas une mine et n'est pas un chiffre
    else if (GetCase(ligne, colonne) == !Case::Mine || GetCase(ligne, colonne) == !Case::Chiffre)
    {
        //1.5 Pour les lignes adjacentes
        for (int i = - 1; i < 2; i++)
        {
            //1.6 Pour les colonnes adjacentes
            for (int j = - 1; j < 2; j++)
            {
                //1.7 Ouvre la cases demander et les cases adjacentes
                Ouvre(ligne, colonne);
            }
        }
        OuvreCase(carte, ligne, colonne);
        return true;
    }
    else if (GetCase(ligne, colonne) == Case::Mine)
    {
        return false;
    }
}
else
{
    return false;
}
}

1 Ответ

0 голосов
/ 21 ноября 2018
  1. Вы объявляете функцию OuvreCase внутри функции main, это необычно и, вероятно, не то, что вы хотите.Если это то, что желательно, для реализации может потребоваться лямбда.
  2. Функция OuvreCase, видимая компилятором (см. Выше), не имеет реализации, по крайней мере, не показана, следовательно, ошибка компоновщика.
  3. Версия класса этой функции имеет реализацию,как только объявление выше будет удалено, я подозреваю, что вы получите ошибку компилятора.В этот момент вы можете вызвать функцию из экземпляра объекта класса или переместить функцию в свободную функцию.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...