Psycop Posted October 16, 2013 at 05:57 PM Report #529282 Posted October 16, 2013 at 05:57 PM (edited) Estou a desenvolver um pequeno jogo ao estilo FM em C++ para a faculdade, mas tenho me deparado com alguns problemas nomeadamente entre Classes, a criação de vectores de Objectos e a gravação desses vectores de objectos em ficheiros. O código que tenho desenvolvido até agora é o seguinte: A minha actual dúvida está no método save_equipa e como colocar lá dentro os jogadores recolhidos de forma formatada para que posteriormente possam ser lidos pela aplicação directamente. Equipa.h #pragma once #include<iostream> #include<string> #include<fstream> #include"Jogador.h" using namespace std; class Equipa { private: string nome_equipa; string nome_ficheiro; public: //Construtor da Classe Equipa Equipa(void); //Métodos de Acesso //Métodos de Acesso de Leitura string getNome_Equipa() const {return nome_equipa;} //Métodos de Acesso de Escrita bool setNome_Equipa(const string nome_equipa); //Método para Recolher o Nome da Equipa void criar_equipa(void); //Método para Apresentar a Equipa no Ecra void show_equipa(void); //Método para Gravar a Equipa Num Ficheiro void save_equipa(ofstream &ficheiro_saida) const; //Destrutor da Classe Equipa virtual ~Equipa(void); }; Equipa.cpp #include "Equipa.h" #include "Jogador.h" Equipa::Equipa(void) { this -> nome_equipa = " "; } Equipa::~Equipa(void) { } bool Equipa::setNome_Equipa(const string nome_equipa) { this -> nome_equipa = nome_equipa; return true; } //Implementação do Método Criar Equipa void Equipa::criar_equipa(void) { cout << "Insira o Nome da Equipa: "; cin >> nome_equipa; Jogador J[11]; //Equipa Composta por 11 Jogadores for(int i = 0; i < 2; i++) { J[i].criar_jogador(); } } //Implementação do Método Mostrar Equipa void Equipa::show_equipa(void) { cout << endl << "O Nome da Equipa e: " << nome_equipa << endl << endl; } //Implementação do Método de Gravação da Equipa Num Ficheiro void Equipa::save_equipa(ofstream &ficheiro_saida) const { string nome_ficheiro; nome_ficheiro = getNome_Equipa() + ".txt"; //Abertura do Ficheiro de Saida ficheiro_saida.open(nome_ficheiro); //Verificar a Abertura do Ficheiro if(!ficheiro_saida) { cout << "ERRO!!" << endl; system("PAUSE"); exit(1); } //Escrever no Ficheiro ficheiro_saida << "Nome da Equipa: " << getNome_Equipa() << endl; //Fechar o Ficheiro de Saida da Equipa ficheiro_saida.close(); } Jogador.h #pragma once #include<iostream> #include<string> #include<fstream> using namespace std; class Jogador { private: //Definição das Caractereisticas do Jogador string nome_jogador; int idade_jogador; float ataque, defesa, forca, tecnica, resistencia, velocidade; public: //Construtor da Classe Jogador(void); //Métodos de Acesso //Metodos Acesso de Leitura string getNome_Jogador() const {return nome_jogador;} int getIdade_Jogador() const { return idade_jogador;} float getAtaque() const { return ataque;} float getDefesa() const { return defesa;} float getForca() const { return forca;} float getTecnica() const { return tecnica;} float getResistencia() const { return resistencia;} float getVelocidade() const {return velocidade;} //Métodos de Acesso de Escrita bool setNome_Jogador(const string nome_jogador); bool setIdade_Jogador(const int idade_jogador); bool setAtaque(const float ataque); bool setDefesa(const float defesa); bool setForca(const float forca); bool setTecnica(const float tecnica); bool setResistencia(const float resistencia); bool setVelocidade(const float Velocidade); //Método para Criar o Jogador void criar_jogador(void); //Método para Mostrar o Jogador void show_jogador(void); //Destrutor da Classe virtual ~Jogador(void); }; Jogador.cpp #include "Jogador.h" //Implementação do construtor da Classe Jogador Jogador::Jogador(void) { this -> nome_jogador = " "; this -> idade_jogador = 0; this -> ataque = 0.0; this -> defesa = 0.0; this -> forca = 0.0; this -> tecnica = 0.0; this -> resistencia = 0.0; this -> velocidade = 0.0; } //Implementação do destrutor da Classe Jogador Jogador::~Jogador(void) { } //Implementação dos métodos de Acesso bool Jogador::setNome_Jogador(const string nome_jogador) { this -> nome_jogador = nome_jogador; return true; } bool Jogador::setIdade_Jogador(const int idade_jogador) { this -> idade_jogador = idade_jogador; return true; } bool Jogador::setAtaque(const float ataque) { this -> ataque = ataque; return true; } bool Jogador::setDefesa(const float defesa) { this -> defesa = defesa; return true; } bool Jogador::setForca(const float forca) { this -> forca = forca; return true; } bool Jogador::setResistencia(const float resistencia) { this -> resistencia = resistencia; return true; } bool Jogador::setTecnica(const float tecnica) { this -> tecnica = tecnica; return true; } bool Jogador::setVelocidade(const float velocidade) { this -> velocidade = velocidade; return true; } //Implementação do Método Criar Jogador void Jogador::criar_jogador(void) { cout << "Insira o Nome do Jogador: "; cin >> nome_jogador; cout << "Insira a Idade do Jogador: "; cin >> idade_jogador; cout << endl << "Insira as Caracteristicas do Jogador: " << endl; cout << "\t Insira o Valor do Ataque (0 a 1): "; cin >> ataque; cout << "\t Insira o Valor de Defesa (0 a 1): "; cin >> defesa; cout << "\t Insira o Valor de Forca (0 a 1): "; cin >> forca; cout << "\t Insira o Valor da Resistencia (0 a 1): "; cin >> resistencia; cout << "\t Insira o valor da Tecnica (0 a 1): "; cin >> tecnica; cout << "\t Insira o Valor da Velocidade (0 a 1): "; cin >> velocidade; } //Implementação do Método Show_Jogador void Jogador::show_jogador(void) { cout << endl << "Nome do Jogador: " << nome_jogador << endl; cout << "Idade do Jogador: " << idade_jogador << endl; cout << "Ataque: " << ataque << endl; cout << "Defesa: " << defesa << endl; cout << "Forca: " << forca << endl; cout << "Resistencia: " << resistencia << endl; cout << "Tecnica: " << tecnica << endl; cout << "Velocidade: " << velocidade << endl; } main.cpp #include<iostream> #include<string> #include"Equipa.h" #include"Jogador.h" #include"Treinador.h" using namespace std; int main() { //Definição da variavel de escolha para a Opção do Menu int escolha = 1; //MENU cout << "Menu: " << endl << endl; cout << "Configuracao do Jogo:" << endl << endl; cout << "\t 1 - Criar um Novo Jogo" << endl; cout << "\t 2 - Carregar Jogo Existente" << endl; cout << "\t 3 - Salvar Jogo" << endl; cout << "\t 4 - ... outra opcao ..." << endl; cout << "\t 5 - SAIR" << endl << endl; cout << "Opcao: "; cin >> escolha; //Estrutura de escolha do MENU Principal switch(escolha) { case 1: { cout << "1 - Criar um Novo Jogo" << endl; //Defeinição da variavel de escolha para o MENU criar Jogo int escolha_novo_jogo = 1; //MENU Novo Jogo cout << endl << endl << "Menu: " << endl << endl; cout << endl << "Configuração do Jogo:" << endl << endl; cout << "\t 1 - Inserir Equipa" << endl; cout << "\t 2 - Editar Equipa" << endl; cout << "\t 3 - Consultar Equipa" << endl; cout << "\t 4 - Apagar Equipa" << endl; cout << "\t 5 - SAIR" << endl << endl; cout << "Opcao: "; cin >> escolha_novo_jogo; //Estrutura de escolha do MENU criar Jogo switch(escolha_novo_jogo) { case 1: { //Definição da variavel para o Numero de Equipas int n_equipas = 0; cout << endl << "1 - Inserir Equipa" << endl; cout << endl << "Insira o Numero de Equipas Que Pretende Inserir: "; cin >> n_equipas; Equipa E[2]; //Abertura do Ficheiro de Saida ofstream ficheiro_saida; for(int i = 0; i < n_equipas; i++) { E[i].criar_equipa(); E[i].save_equipa(ficheiro_saida); } break; } case 2: { cout << "2 - Editar Equipa" << endl; break; } case 3: { cout << "3 - Consultar Equipa" << endl; break; } case 4: { cout << "4 - Apagar Equipa" << endl; break; } case 5: { cout << "5 - SAIR" << endl; exit(0); } default: { cout << "Opcao Invalida!!!" << endl; break; } } break; } case 2: { cout << "2 - Carregar Jogo Existente" << endl; break; } case 3: { cout << "3 - Salvar Jogo" << endl; break; } case 4: { cout << "... Outra Opcao ..." << endl; break; } case 5: { cout << "5 -SAIR" << endl; exit(0); } default: { cout << "Opcao Invalida!!!" << endl; break; } //Teste de Opção Escolhida Inválida if(escolha < 1 || escolha > 5) { cout << "Opcao Inválida!!!" << endl; } } system("PAUSE"); return 0; } Alguém me pode dar umas dicas e elucidar de como devo abordar estas situações? Cumps Edited October 16, 2013 at 06:00 PM by Psycop
HappyHippyHippo Posted October 16, 2013 at 07:55 PM Report #529291 Posted October 16, 2013 at 07:55 PM antes de pensar em gravar os dados em ficheiros, podes responder a esta questão : - onde estão guardados os dados dos jogadores da equipa ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Psycop Posted October 16, 2013 at 08:10 PM Author Report #529293 Posted October 16, 2013 at 08:10 PM Pois, essa é uma das minhas dúvidas também! Em teoria estariam a ser recolhidos pelas variáveis implementadas na classe jogador.cpp... Mas quando faço: Jogador J[11]; //Equipa Composta por 11 Jogadores for(int i = 0; i < 2; i++) { J[i].criar_jogador(); } } Não estou a criar um objecto para cada jogador que fica afecto a classe equipa?
HappyHippyHippo Posted October 16, 2013 at 08:40 PM Report #529297 Posted October 16, 2013 at 08:40 PM um objecto é como uma variável: int main() { for (int i = 0; i < 10; i++) { int j = i + 1; cout << "i : " << i; cout << " | j : " << j << endl; } cout << "i : " << i; // a variável i está "morta" cout << " | j : " << j << endl; // a variável j está "morta" return 0; } pensa bem no código que tens IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Psycop Posted October 16, 2013 at 09:23 PM Author Report #529306 Posted October 16, 2013 at 09:23 PM Desculpa parecer muito burro, mas não consegui perceber ainda! xD
HappyHippyHippo Posted October 16, 2013 at 09:35 PM Report #529309 Posted October 16, 2013 at 09:35 PM void Equipa::criar_equipa(void) { cout << "Insira o Nome da Equipa: "; cin >> nome_equipa; Jogador J[11]; // <------------- crias um array de objectos "jogador" for(int i = 0; i < 2; i++) { J[i].criar_jogador(); } // <--------------------------- a função termmina, puf ... o array desaparece } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Psycop Posted October 16, 2013 at 09:38 PM Author Report #529312 Posted October 16, 2013 at 09:38 PM Humm, e como posso guardar esse array? Cumps
HappyHippyHippo Posted October 16, 2013 at 09:52 PM Report #529318 Posted October 16, 2013 at 09:52 PM uma classe é praticamente uma estrutura com algumas nuances por outras palavras, um objecto/classe é um conjunto de dados aos quais existe um conjunto de métodos associados qual a informação que define uma equipa ? - nome da equipa - conjunto de jogadores - ... etc ... imagina que estarias a programar em C: struct Jogador { char nome[64]; // ... por ai adiante ... }; struct Equipa { char nome[64]; Jogador jogadores[11]; // ... por ai a diante ... }; o mesmo é necessário fazer com uma classe: class Jogador { std::string nome; // ... por ai a diante ... }; class Equipa { std:string nome; std::vector<Jogador> jogadores; // ... por ai a diante ... }; deste modo, a informação da equipa persiste enquanto a classe "existe" IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Psycop Posted October 16, 2013 at 10:08 PM Author Report #529322 Posted October 16, 2013 at 10:08 PM Mas agora fico com problemas no: //Implementação do Método Criar Equipa void Equipa::criar_equipa(void) { cout << "Insira o Nome da Equipa: "; cin >> nome_equipa; vector<Jogador> J[11]; //Equipa Composta por 11 Jogadores for(int i = 0; i < 2; i++) { J[i].criar_jogador(); } } Não deveria ser igual ao que tinha anterior? Porquê agora o erro no método criar_jogador(); Cumps
HappyHippyHippo Posted October 17, 2013 at 09:39 AM Report #529351 Posted October 17, 2013 at 09:39 AM o que tens está mal a tantos níveis que não sei por onde começar. gostava que daqui a uns meses viesses ver este post para veres o que estás a escrever ... o problema demonstra uma falta clara de conhecimento de conceitos básicos de programação como o scope e local variables e variable lifetime, coisas que deveriam ser ensinadas na primeira meia dúzia de aulas de programação. para não falar de que tens um array de vectores de jogadores, código que apresentas com total falta de conhecimento do que escreveste. por isso mesmo, ao não saber se o problema é tu não estudares ou o teu professor ser um incompetente, será impossível determinar qual a acção a tomar que não seja : vai ler sobre os assuntos descritos no parágrafo anterior IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Rui Carlos Posted October 18, 2013 at 09:33 AM Report #529561 Posted October 18, 2013 at 09:33 AM Mas agora fico com problemas no: //Implementação do Método Criar Equipa void Equipa::criar_equipa(void) { cout << "Insira o Nome da Equipa: "; cin >> nome_equipa; vector<Jogador> J[11]; //Equipa Composta por 11 Jogadores for(int i = 0; i < 2; i++) { J[i].criar_jogador(); } } Não deveria ser igual ao que tinha anterior? Porquê agora o erro no método criar_jogador(); Cumps Nesse caso, o teu problema está na inicialização do vector, que devia ser vector<Jogador> J(11); (por exemplo). De todo o modo, continuas com uma série de problemas no teu código, já mencionados pelo HappyHippyHippo. Rui Carlos Gonçalves
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now