Variable int qui se réecrit

a marqué ce sujet comme résolu.

Bonjour ! Je suis en train de devellopé un programe de puissance 4.


#include <iostream>
#include <iomanip>
#include <windows.h>
void affiche_tableau(char tabjeu[6][7],int tour)
{
    std::cout << "\ntour : " << tour;
    std::cout << "\n            *************\n            *puissance 4*\n            *************\n";
    std::cout << "    -----------------------------\n";
    for (int i{0}; i < 6; i++)
    {
        std::cout << "    |";
        for (int j{0}; j < 7; j++)
        {
            std::cout << std::setw(2) << tabjeu[i][j] << std::setw(2) << '|';
        }
        std::cout << std::endl;
    }
    std::cout << "    -----------------------------\n   ";
    for (int i{0}; i < 7; i++)
    {
        std::cout << std::setw(4) << i + 1;
    }
}
void demande_joueur(int tour)
{
    if (tour%2==1)
    {
        std::cout << "\n\nC'est au tour du rouge (Representer avec des &) d'ajouter une piece,\nveuilliez choisir ou vous la rentrer (utilise le numero de la colone)  : ";
    }
    else
    {

        std::cout << "\n\nC'est au tour du jaune (Representer avec des *) d'ajouter une piece,\nveuilliez choisir ou vous la rentrer (utilise le numero de la colone) : ";
    }
}
void ajoute_piece(char tab[6][7], int a, int &safe, int tour)
{
    int cont{0};
    char piece{};
    if (tour%2==1)
    {
        piece = '&';
    }
    else
    {
        piece = '*';
    }
    safe = 1;
    while (tab[cont][a] == ' ')
    {
        safe = 0;
        system("cls");
        tab[cont - 1][a] = ' ';
        tab[cont][a] = piece;
        affiche_tableau(tab, tour);
        Sleep(100);
        cont++;
    }
}
void verif_nb(int a, bool &b)
{
    if (a < 0 || a > 6)
    {
        b = 0;
        std::cout << "ereur le nombre doit-etre entre 1 et 7 !\n";
    }
    else
    {
        b = 1;
    }
}
void demande(char tab[6][7], int &tour)
{
    int colone{};
    bool verif{1};
    int safe{0};
    do
    {
        do
        {
            demande_joueur(tour);
            std::cin >> colone;
            colone--;
            verif_nb(colone, verif);
        }
        while (!verif);
        safe = 0;
        ajoute_piece(tab, colone, safe, tour);
        if (safe == 1)
        {
            std::cout << "\nVous avez rentrer rentrer un pion dans une colone remplis.";
            system("pause");
        }
        else
        {
            tour++;
            std::cout << "\njoueur : " << (tour%2)+1;
        }
    }
    while (safe == 0);
}
int main()
{
    system("color 0B");
    char tabjeu[6][7] {};
    int tour(1);
    bool partiefini(1);
    for (int i{0}; i < 6; i++)
    {
        for (int j{0}; j < 7; j++)
        {
            tabjeu[i][j] = ' ';
        }
    }
    while (partiefini)
    {
        //system("cls");
        affiche_tableau(tabjeu,tour);
        demande(tabjeu, tour);
    }
    return 0;
}

et quand j’execute la ligne


tab[cont - 1][a] = ' ';

Et que je rentre une valeur au dessus de 4 (qui devien alors 3 dans mon tableau) La valeur de ma variable tour est réécrite (pour 4 c’est 32, pour 5 c’est 8194 etc..) Je sais que mon code n’est pas très optimal je commence à suivre le cours de zestedesavoir actuellement mais j’ai appris en cours mais mon prof utilise le courp d’op donc j’ai quelque erreur encore à réglé (comme le std::aray) Et quand je mets cette ligne en commentaire


tab[cont - 1][a] = ' ';

Ça n’efface plus forcement donc j’ai les traces de ou est passer ma piece mais je n’ai surtout plus le problème. Quelqu’un comprend ce qu’il se passe et peut me l’expliquer et peut être donner des pistes pour changer ça :) (ps : j’ai déjà essayer de changé ma variable tour par une autre mais tour se fait ré-écrire quand même :( ) Je ne comprend pas vraiment ce qui se passe ahah Merci à tous ce qui prendrons du temps à lire et m’aider !

J’ai du mal à comprendre ta fonction ajouter_piece.

void ajoute_piece(char tab[6][7], int a, int &safe, int tour)
{
    int cont{0};
    char piece{};
    if (tour%2==1)
    {
        piece = '&';
    }
    else
    {
        piece = '*';
    }
    safe = 1;
    while (tab[cont][a] == ' ')
    {
        safe = 0;
        system("cls");
        tab[cont - 1][a] = ' ';
        tab[cont][a] = piece;
        affiche_tableau(tab, tour);
        Sleep(100);
        cont++;
    }
}

Si j’ai bien compris, l’idée c’est que tu fais descendre la pièce et qu’on la voit tombé ? C’est rigolo. Mais du coup, à la ligne :

tab[cont - 1][a] = ' ';

Eh bien tu es hors du tableau ! cont étant égale à 0 à la première itération. Tu accèdes à tab[-1][a]

Tu devrais en premier lieu, vérifier si tab[0][a] == ' '.

void ajoute_piece(char tab[6][7], int a, int &safe, int tour)
{
    int cont{0};
    char piece{};
    if (tour%2==1)
    {
        piece = '&';
    }
    else
    {
        piece = '*';
    }
    if(tab[0][a] == ' ') {
        tab[cont][a] = piece;    
        safe = 0;
    } else {
      safe = 1;
    }
    cont = 1;
    while (tab[cont][a] == ' ' && safe) // Tant que la pièce peut tomber
    {
        system("cls");
        tab[cont - 1][a] = ' '; // On efface la précedente pièece
        tab[cont][a] = piece;   // On écrit la nouvelle juste en dessous pour avoir l'impression qu'elle tombe !
        affiche_tableau(tab, tour);
        Sleep(100);
        cont++;
    }
}

Ça devrait mieux marcher comme ça.

+0 -0

J’ai du mal à comprendre ta fonction ajouter_piece.

void ajoute_piece(char tab[6][7], int a, int &safe, int tour)
{
    int cont{0};
    char piece{};
    if (tour%2==1)
    {
        piece = '&';
    }
    else
    {
        piece = '*';
    }
    safe = 1;
    while (tab[cont][a] == ' ')
    {
        safe = 0;
        system("cls");
        tab[cont - 1][a] = ' ';
        tab[cont][a] = piece;
        affiche_tableau(tab, tour);
        Sleep(100);
        cont++;
    }
}

Si j’ai bien compris, l’idée c’est que tu fais descendre la pièce et qu’on la voit tombé ? C’est rigolo. Mais du coup, à la ligne :

tab[cont - 1][a] = ' ';

Eh bien tu es hors du tableau ! cont étant égale à 0 à la première itération. Tu accèdes à tab[-1][a]

Tu devrais en premier lieu, vérifier si tab[0][a] == ' '.

void ajoute_piece(char tab[6][7], int a, int &safe, int tour)
{
    int cont{0};
    char piece{};
    if (tour%2==1)
    {
        piece = '&';
    }
    else
    {
        piece = '*';
    }
    if(tab[0][a] == ' ') {
        tab[cont][a] = piece;    
        safe = 0;
    } else {
      safe = 1;
    }
    cont = 1;
    while (tab[cont][a] == ' ' && safe) // Tant que la pièce peut tomber
    {
        system("cls");
        tab[cont - 1][a] = ' '; // On efface la précedente pièece
        tab[cont][a] = piece;   // On écrit la nouvelle juste en dessous pour avoir l'impression qu'elle tombe !
        affiche_tableau(tab, tour);
        Sleep(100);
        cont++;
    }
}

Ça devrait mieux marcher comme ça.

ache

Re, il donc c’est a cause du tab[-1][a] que ça causer le problème Il fallait juste changer le while (tab[cont][a] == ' ' && safe) par while (tab[cont][a] == ' ' && !safe) et tout marche ! Un grand merci ! :D

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