Jump to content
luismsantana

[Resolvido] vector bidimensional, duvida de código, erro

Recommended Posts

luismsantana

boa noite,

estou a tentar fazer um tabuleiro de jogo, uma mina! O vector contem outro vector com objectos blocos! Consigo criá-lo ... mas depois não o consigo voltar a apresentar no ecrã, dá erro "Expression: vector subscript out of range" .. vejam se me conseguem ajudar a encontrar o bug, por favor!

#pragma once
#include "Minerio.h"
#include "consola1.h"
class Blocos{
 Minerio tipoMinerio;
protected:
 bool existenciaMinerio;
 bool existeAlgo;
 bool permiteMineiro;
 Consola c;
public:
 //
 Blocos();
 ~Blocos();
 void desenhaPedra(int x, int y);
};

//subclasse de Bloco (Pedra)
class Pedra:public Blocos{
//

public:
 Pedra();
 ~Pedra();
 void setPermiteMineiro();
 void setPedra(){
 existeAlgo = true;
}
void setExistenciaMinerio();
void desenhaPedra(int x, int y);

//
};


#pragma once

#include "Mineiro.h"
#include "consola1.h"
#include "Blocos.h"
//#include "Material.h"
#include <iostream>

using namespace std;

class Jogo
{
 vector< vector<Blocos> >mina;
 //Pedra p;
 Consola c;
 Mineiro mineiro;
 string nome;
 int linha;
 int coluna;
 int dificuldade;
 int visibilidade;
public:
 Jogo(string nome, int linha, int coluna, int dificuldade);
 Jogo(void);
 ~Jogo(void);

 void comecaJogo();
 void desenhaMineiro();
 void desenhaTabuleiro(float x, float y);
 void desenhaMina(float x, float y);
};

#include "Blocos.h"
#include "consola1.h"

Blocos::Blocos(){

}

Blocos::~Blocos(){

}

void Blocos::desenhaPedra(int x, int y){
 c.gotoxy(x,y);
 cout << (char) 218 << (char) 196 << (char) 196 << (char) 196 << (char) 196 << (char) 191 << '\n';
 c.gotoxy(x,y+1);
 cout << (char) 179 << (char) 219 << (char) 219 << (char) 219 << (char) 219 << (char) 179 << '\n';
 c.gotoxy(x,y+2);
 cout << (char) 179 << (char) 219 << (char) 219 << (char) 219 << (char) 219 << (char) 179 << '\n';
 c.gotoxy(x,y+3);
 cout << (char) 179 << (char) 219 << (char) 219 << (char) 219 << (char) 219 << (char) 179 << '\n';
 c.gotoxy(x,y+4);
 cout << (char) 192 << (char) 196 << (char) 196 << (char) 196 << (char) 196 << (char) 217 << '\n';
}

Pedra::Pedra(){

}

Pedra::~Pedra(){

}

void Pedra::setPermiteMineiro(){
permiteMineiro = false;
}

void Pedra::setExistenciaMinerio(){
 existenciaMinerio = false;
}

void Pedra::desenhaPedra(int x, int y){
 c.gotoxy(x,y);
 cout << (char) 218 << (char) 196 << (char) 196 << (char) 196 << (char) 196 << (char) 191 << '\n';
 c.gotoxy(x,y+1);
 cout << (char) 179 << (char) 219 << (char) 219 << (char) 219 << (char) 219 << (char) 179 << '\n';
 c.gotoxy(x,y+2);
 cout << (char) 179 << (char) 219 << (char) 219 << (char) 219 << (char) 219 << (char) 179 << '\n';
 c.gotoxy(x,y+3);
 cout << (char) 179 << (char) 219 << (char) 219 << (char) 219 << (char) 219 << (char) 179 << '\n';
 c.gotoxy(x,y+4);
 cout << (char) 192 << (char) 196 << (char) 196 << (char) 196 << (char) 196 << (char) 217 << '\n';
}

Share this post


Link to post
Share on other sites
luismsantana

por incrível que pareça, não vi um único vector nesse código

std::vector


vector<vector<Blocos> > mina;

penso que se faça assim!

fiz mais de um tópico igual, nao sei como, e nao os consigo apagar :S

Edited by luismsantana

Share this post


Link to post
Share on other sites
luismsantana

void Jogo::desenhaTabuleiro(float x, float y){ // este método serve para desenhar o tabuleiro (é onde acontece o erro)
      c.clrscr();

      for(int i=x, indiceX=0; indiceX<linha; i=i+6, indiceX++){
           for(int j=y, indiceY=0; indiceY<coluna; j=j+5, indiceY++){ //o i e o j servem para determinar onde serão desenhadas as pedras
              mina[indiceX][indiceY].desenhaPedra(i, j);

           }
      }
}

void Jogo::desenhaMina(float x, float y){ // este metodo serve para desenhar a mina pela primeira vez e guardá-la no vector
         int n;

        for(int i=x, indiceX=0; indiceX<linha; i=i+6, ++indiceX){
              vector<Blocos>tempLinha;

              for(int j=y, indiceY=0; indiceY<coluna; j=j+5, ++indiceY){

                    n=rand()%100;

                    if(n <=30 ){

                        Pedra pedra;

                        pedra.desenhaPedra(i, j);
                        tempLinha.push_back(pedra);
//p.setExistenciaMinerio();
                   }

             }
            mina.push_back(tempLinha);
            tempLinha.clear();

//c.gotoxy(y++, i);
       }
}

Edited by thoga31
Correcção do GeSHi

Share this post


Link to post
Share on other sites
luismsantana

a pedra vai ser desenhada na coordenada dada por x e y ...

i=x, j= y

.... desenhaPedra(i, y);

o erro é "Exp<b></b>ression: vector subscript out of range" ... dá-se no 2º for:

void Jogo::desenhaTabuleiro(float x, float y){
     c.clrscr();

     for(int i=x, indiceX=0; indiceX<linha; i=i+6, indiceX++){
            for(int j=y, indiceY=0; indiceY<coluna; j=j+5, indiceY++){
                 mina[indiceX][indiceY].desenhaPedra(i, j);

            }
      }
}

parece-me que, apesar de estar a fazer push_back dos elementos, o vector está vazio :s

ando há dias à volta disto e nao consigo resolver ... :s

tambem pode ser da forma como estou a fazer o acesso ao vector bidimensional.. mas conforme pesquisei, é assim que se faz :s

Edited by thoga31
Correcção do GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

n=rand()%100;
if(n <=30 ){
 Pedra pedra;
 pedra.desenhaPedra(i, j);
 tempLinha.push_back(pedra);
}                    }

só estás a adicionar se n for menor ou igual a 30

separa o código de criação do tabuleiro com o de apresentação.


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
luismsantana

já consegui resolver ..

o problema penso que a condição para criar pedra, ficando posições do vector sem nada!

solucção: criei uma subclass de Blocos com nome vazio que representa um bloco que nao tem nada!

Obrigado pelas respostas HappyHippyHippo :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.