Ir ao conteúdo
  • Cadastre-se

C++ Salvar o progresso feito em uma compilação até a próxima


Posts recomendados

Oi eu estava fazendo um jogo e queria salvar o progresso feito em uma compilação até as próximas. Primeiramente queria salvar as coordenadas do personagem em um arquivo txt e quando o usuário entrasse no programa, e a cada vez que mudasse a coordenada, mudasse a que estava no arquivo também, desse jeito:

FILE *coordpers[90000]; 
coordpers[1]= fopen("xy.txt","r+");
fscanf(coordpers[1],"%d %d ",y,x);
for(;;){
tecla=getch();
    if(tecla=='M')x++;
    if(tecla=='K')x--;
    if(tecla=='P')y++;
    if(tecla=='H')y--;
    fprintf(coordpers[1],"\b\b\b\b\b%d %d",x,y);
}

Mas parece que simplesmente foi ignorado pois fiz várias vezes e nunca mudou nada.

até fiz outro programa

int main()
{
	FILE * arquivo;
	arquivo = fopen("xy.txt","r+");
	fprintf(arquivo,"\b\b\b\b\b\b\b\b\b26 12");
	fclose(arquivo);
}

nesse outro até mudou mas,

image.thumb.png.38f43efd12edb93e042b2e4084be4f14.png

  enfim, se alguém tiver uma ideia, por favor comente aqui

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

19 minutos atrás, Daniel Bittencourt disse:

Mas parece que simplesmente foi ignorado pois fiz várias vezes e nunca mudou nada.

até fiz outro programa

 

O que está tentando fazer? Não entendi.

 

20 minutos atrás, Daniel Bittencourt disse:

FILE *coordpers[90000];

 

Recomendo sempre, em especial para quem está começando e ainda não tem vícios, declarar as variáveis SEPARADAS do tipo. Esse aí é um exemplo do problema:

 

  • As declarações em C++ são lidas da direta para esquerda.
  • [90000] indica que está declarando 90.000 de algo. Um array. Um vetor.
  • coordpers é o que está declarando
  • FILE* é o tipo. ENTENDA: FILE*.
    você declara uma variável. coordpers é a variável. Está declarando 90.000 arquivos. Não 90000 coordenadas para algo.

O mais claro:

	FILE*       coordpers [90'000];
  • você pode usar as pas como separador de dígitos em C++ 
  • coordpers é FILE*, um ponteiro para arquivo, um Handle na terminologia do Windows.
  • são 90 mil deles

Não entendi o exemplo seguinte

Link para o comentário
Compartilhar em outros sites

@arfneto eu pus 90.000 arquivos por que um dia eu ainda vou terminar esse jogo e deixá-lo online, então já declarei um tanto dessas coordenadas para facilitar na criação de outros personagens mas vou tentar sem o vetor

adicionado 2 minutos depois

tirei o vetor mas continua na mesma

adicionado 4 minutos depois

e praticamente sempre que eu mexo com arquivos nos programas ocorre uma "corrupção" e aparecem aqueles sinaizinhos da foto, no código fonte, ou no arquivo

adicionado 5 minutos depois

testarei com as aspas

adicionado 7 minutos depois

definitivamente aspas não funcionam

Link para o comentário
Compartilhar em outros sites

10 minutos atrás, Daniel Bittencourt disse:

eu pus 90.000 arquivos por que um dia eu ainda vou terminar esse jogo e deixá-lo online, então já declarei um tanto dessas coordenadas para facilitar na criação de outros personagens mas vou tentar sem o vetor

 

Acho que não entendeu. Ou eu não entendi :) Você não quer 90.000 arquivos de coordenadas. Você quer UM arquivo com 90.000 coordenadas.

 

Entendeu o que eu expliquei sobre a declaração?

 

12 minutos atrás, Daniel Bittencourt disse:

e praticamente sempre que eu mexo com arquivos nos programas ocorre uma "corrupção" e aparecem aqueles sinaizinhos da foto, no código fonte, ou no arquivo

 

Não é corrupção. Apenas é o que está lá. Aqueles sinais se referentes a coisas que não era para serem mostradas. Você está gravando algo para você mesmo ler, então pode definir o formato como for mais prático. E econômico. Sempre pode usar texto, mas se não vai editar não precisa disso.

Você quer gravar 90.000 coordenadas e ler uma a uma? quer gravar um bloco delas e ler aos poucos? quer gravar um vetor com um certo número delas e carregar tudo de novo? Me explique o que quer e eu te ajudo a escrever.
 

15 minutos atrás, Daniel Bittencourt disse:

estarei com as aspas


Que significa?
 

15 minutos atrás, Daniel Bittencourt disse:

definitivamente aspas não funcionam

 

Talvez "definitivamente" seja uma escolha exagerada de expressão ;) 

Link para o comentário
Compartilhar em outros sites

Na verdade é assim o que eu quis fazer colocando o vetor: quando o jogador 1 estivesse em x12 e y30 seria registrado lá no arquivo, e se ele deslogasse e depois logasse, o programa iria no arquivo do coordpers[1] , pegaria a coordenada e colocaria o player lá, se o jogador 4567 estivesse em x4 e y 46 seria registrado no arquivo coordpers[4567] a coordenada e quando deslogasse e depois logasse de novo iria estar nessa coordenada  

adicionado 0 minutos depois

estarei com as aspas é testarei com as aspas, faltou um t :D

adicionado 3 minutos depois

resumo: 

preciso pegar a coordenada do jogador e regitrá-la em um arquivo, mudando a coordenada anterior que lá estava

depois disso, pode deixar comigo

Link para o comentário
Compartilhar em outros sites

5 minutos atrás, Daniel Bittencourt disse:

Na verdade é assim o que eu quis fazer colocando o vetor: quando o jogador 1 estivesse em x12 e y30 seria registrado lá no arquivo, e se ele deslogasse e depois logasse, o programa iria no arquivo do coordpers[1] , pegaria a coordenada e colocaria o player lá, se o jogador 4567 estivesse em x4 e y 46 seria registrado no arquivo coordpers[4567] a coordenada e quando deslogasse e depois logasse de novo iria estar nessa coordenada

 

Pois é: um arquivo e um certo número de coordenadas. Não 90.000 arquivos de uma coordenada. Imagine listar esse diretório :) com 90.000 arquivos...

 

Não conseguiu responder se entendeu o que eu te expliquei sobre as declarações e os arquivos....

 

Entenda que se as coordenadas são apenas dois números isso pode ser algo como um short int, de -32768 a 32767, ou um sem sinal, de 0 a 65.536. E a id do jogador a própria posição no vetor, algo como essa estrutura

typedef struct _COORD {
  SHORT X;
  SHORT Y;
} COORD, *PCOORD;

Do próprio windows :) 

 

Por outro lado veja esse exemplo

class Jogo
{
public:
	struct coord
	{
		short X;
		short Y;
	};
	struct coord  pl[90'000];
};

Essa classe tem pouco mais de 350K então não seria nada especial para as máquinas de hoje em dia, mas talvez você melhor salvar apenas os caras que estão mesmo jogando e ter uma estrutura com id e coordenadas e o total de jogadores...

 

adicionado 1 minuto depois

E o que quer salvar de todo modo é uma classe em disco e ler de vota

Link para o comentário
Compartilhar em outros sites

3 minutos atrás, Daniel Bittencourt disse:

mas enfim, você tem alguma ideia de como fazer eu mudar o xy no arquivo, porque não está funcionando bem 

 

Você está entendendo o que eu te explico afinal? Leu a classe? entendeu o que eu expliqei sobre as declarações? Entende que o que quer é apenas gravar uma instância da classe no disco ao final (e ler no início) do programa?

Link para o comentário
Compartilhar em outros sites

@arfneto sim eu entendo mas fiz isso e não mudou absolutamente nada

adicionado 1 minuto depois

 

FILE *coordpers; 
coordpers = fopen("xy.txt","r+");
fscanf(coordpers,"%d %d ",y,x);
fprintf(coordpers,"\b\b\b\b\b%d %d",y,x);

 

adicionado 2 minutos depois

escrevi assim só que em partes diferentes do programa

e não mudou nada

 

adicionado 2 minutos depois
2 minutos atrás, Daniel Bittencourt disse:

FILE *coordpers; coordpers = fopen("xy.txt","r+"); fscanf(coordpers,"%d %d ",y,x); fprintf(coordpers,"\b\b\b\b\b%d %d",y,x);

e pus o 

	fclose(coordpers);

 

adicionado 3 minutos depois

sabia o que tinha que fazer até antes de perguntar, mas fazia várias vezes e não mudou nada

adicionado 4 minutos depois

sim eu li e entendi tudo

Link para o comentário
Compartilhar em outros sites

16 minutos atrás, Daniel Bittencourt disse:

sim eu entendo mas fiz isso e não mudou absolutamente nada

 

Você não responde a uma única palavra do que eu pergunto. 

Assim não há progresso.

 

17 minutos atrás, Daniel Bittencourt disse:

sim eu li e entendi tudo

 

Sei. Mais um caso em que devia esperar um pouco antes de dizer que entendeu tudo. Não entendi o que tem a ver o que você fez com o que eu disse. E nem com o que pretende fazer.

 

59 minutos atrás, Daniel Bittencourt disse:

preciso pegar a coordenada do jogador e regitrá-la em um arquivo, mudando a coordenada anterior que lá estava

depois disso, pode deixar comigo

 

Sei...

 

EXEMPLO de um programa "complicado"

#include <iostream>
#include "Jogo.h"

int main(void)
{
    Jogo um;

    um.pl[0].X = 1234;
    um.pl[0].Y = 5678;
    um.pl[7999].X = 8765;
    um.pl[7999].Y = 4321;
    cout << "coord[0] = (" << um.pl[0].X << "," << um.pl[0].Y << ")" << endl;
    cout << "coord[7999] = (" << um.pl[7999].X << "," << um.pl[7999].Y << ")" << endl;

    // agora muda dois e mostra
    um.grava(&um, "saindo.txt");
    std::cout << "\ngravou tudo. agora muda as coordenadas" << std::endl;
    std::cout << "do jogador [0] e do [7999] para 2020" << std::endl;
    um.pl[0].X = 2020;
    um.pl[0].Y = 2020;
    um.pl[7999].X = 2020;
    um.pl[7999].Y = 2020;
    cout << "coord[0] = (" << um.pl[0].X << "," << um.pl[0].Y << ")" << endl;
    cout << "coord[7999] = (" << um.pl[7999].X << "," << um.pl[7999].Y << ")" << endl;

    //agora le tudo de novo e mostra os dois
    um.le(&um, "saindo.txt");
    std::cout << "\nleu de novo: mostra primeiro e ultimo" << std::endl;
    cout << "coord[0] = (" << um.pl[0].X << "," << um.pl[0].Y << ")" << endl;
    cout << "coord[7999] = (" << um.pl[7999].X << "," << um.pl[7999].Y << ")" << endl;
    return 0;
}

Esse programa cria um jogo com 8000 caras e marca o primeiro e o ultimo com umas coordenadas e mostra

  • marca as coordenadas do primeiro e do último e mostra
  • grava no disco
  • muda as coordenadas do primeiro e do último para 2020
  • mostra na tela
  • le do disco tudo de volta
  • e mostra de volta e elas estão como quando gravou.

 

Eis o que sai na tela

 

coord[0] = (1234,5678)
coord[7999] = (8765,4321)

gravou tudo. agora muda as coordenadas
do jogador [0] e do [7999] para 2020
coord[0] = (2020,2020)
coord[7999] = (2020,2020)

leu de novo: mostra primeiro e ultimo
coord[0] = (1234,5678)
coord[7999] = (8765,4321)

Eis as linhas que procura:

    um.grava(&um, "saindo.txt");
    um.le(&um, "saindo.txt");

Ou seja: endereço da estrutura e o nome do arquivo

 

Eis a classe

using namespace std;
class Jogo
{
public:
	struct coord
	{
		short X;
		short Y;
	};
	struct coord  pl[9'000];

	int le(Jogo* J, const char* arquivo)
	{
		FILE* entrada = fopen(arquivo, "rb");
		int tam = sizeof(J->pl);
		int res = fread( (void *) J->pl, 1, tam, entrada);
		fclose(entrada);
		return 0;
	};

	int grava(Jogo* J, const char* arquivo)
	{
		FILE* saida = fopen(arquivo, "wb");
		int tam = sizeof(J->pl);
		int res = fwrite( (void*) J->pl, 1, tam, saida);
		fclose(saida);
		return 0;
	};
};

Pois é: 5 linhas pra ler, 5 linhas pra gravar

 

 

adicionado 10 minutos depois

Se marcou errado a linguagem e está programando em C é a mesma coisa. fread() e fwrite() a partir no inicio do vetor.

 

 

adicionado 46 minutos depois

Em C, o mesmo caso

#include <stdio.h>

typedef struct
{
    short X;
    short Y;
}   Coord;

typedef struct
{
    Coord  pl[9000];
}   Jogo;

int grava(Jogo*, const char*);
int le(Jogo*, const char*);

int main(void)
{
    Jogo um;

    um.pl[0].X = 1234;
    um.pl[0].Y = 5678;
    um.pl[7999].X = 8765;
    um.pl[7999].Y = 4321;
    printf("coord[0] = (%d,%d)\n", um.pl[0].X, um.pl[0].Y);
    printf("coord[7999] = (%d,%d)\n", um.pl[7999].X, um.pl[0].Y);
    grava(&um, "saindo.txt");
    printf("\ngravou tudo. agora muda as coordenadas\n");
    printf("do jogador [0] e do [7999] para 2020\n");

    // agora muda dois e mostra
    um.pl[0].X = 2020;
    um.pl[0].Y = 2020;
    um.pl[7999].X = 2020;
    um.pl[7999].Y = 2020;
    printf("coord[0] = (%d,%d)\n", um.pl[0].X, um.pl[0].Y);
    printf("coord[7999] = (%d,%d)\n", um.pl[7999].X, um.pl[0].Y);

    //agora le tudo de novo e mostra os dois
    le(&um, "saindo.txt");
    printf("\nleu de novo do disco\n");
    printf("coord[0] = (%d,%d)\n", um.pl[0].X, um.pl[0].Y);
    printf("coord[7999] = (%d,%d)\n", um.pl[7999].X, um.pl[0].Y);

    return 0;
}

int le(Jogo* J, const char* arquivo)
{
    FILE* entrada = fopen(arquivo, "rb");
    int tam = sizeof(J->pl);
    int res = fread((void*)J->pl, 1, tam, entrada);
    fclose(entrada);
    return 0;
};

int grava(Jogo* J, const char* arquivo)
{
    FILE* saida = fopen(arquivo, "wb");
    int tam = sizeof(J->pl);
    int res = fwrite((void*)J->pl, 1, tam, saida);
    fclose(saida);
    return 0;
};

Que mostraria 

coord[0] = (1234,5678)
coord[7999] = (8765,5678)

gravou tudo. agora muda as coordenadas
do jogador [0] e do [7999] para 2020
coord[0] = (2020,2020)
coord[7999] = (2020,2020)

leu de novo do disco
coord[0] = (1234,5678)
coord[7999] = (8765,5678)

 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...