Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Hokutoy on December 24, 2009, 12:59:49 AM

Title: Tabla de records (Highscore)
Post by: Hokutoy on December 24, 2009, 12:59:49 AM
Buenas!
Me ha surgido un problema con un trozo de codigo (creo recordar que lo saque de Fenixonfire) que no me funciona como es debido y no entiendo el porque... a ver si alguien encuentra el fallo

import "mod_video";
import "mod_text";
import "mod_file";

GLOBAL
struct highscore[10];hscore; end
END

BEGIN
set_mode(320,240,16);
initHighscore();
addHighscore(555);

LOOP
printHighscore();
FRAME;
END
END



process initHighscore()

private
string fileName = "highscore.file";
i;

begin

if(file_exists(fileName)) //File exists and can be loaded:
load(fileName, highscore);
else //File does not exist, fill the highscore table with standard values:
for(i = 0;i < 10; i++ ) //Fill in a generated score(lower index means higher score)
highscore[i].hscore = (10-i)*100;
end
end

end


process addHighscore(int newScore)

private
int i, newScorePosition;
string fileName = "highscore.file";

begin
for( i = 0; i < 10; i++ )
if(highscore[i].hscore < newScore)
break;
end
end

if(i == 10) //If i equals 10 all scores in the table were higher than the new one.
return;
else //If lower, the score on place 'i' is the first one to be lower than the new score.
newScorePosition = i; //Save which position the new score is coming
for(;i<9;i++) //And move everything one place down, starting with 'i'
highscore[i+1].hscore = highscore[i].hscore;
end
highscore[newScorePosition].hscore = newScore; //Add in the new score
end
end

//-----------------------------------------------

process printHighscore()

private
i;

begin

for( i = 0; i < 10; i++ )
write(0,90,77+i*16,0,i);
write_int(0, 140,77+i*16,2,&highscore[i].hscore);
end

end


Por lo que yo entiendo, el programa debería generar una tabla de recors tal que:
0 1000
1  900
2  800
3  700
4  600
5  555
6  500
7  400
8  300
9  200

pero se genera la siguiente tabla 0 1000
1  900
2  800
3  700
4  600
5  555
6  500
7  500
8  500
9  500

Alguna pista?
Title: Re: Tabla de records (Highscore)
Post by: Drumpi on December 24, 2009, 02:44:22 AM
Si: recorre la tabla en sentido ascendente en llugar de descendente.

Al añadir la puntuación, buscas del primero al último, cuando encuentras la posición, la 5 escribes el dato en la posición 6, por lo tanto 6 pasa de valer 400 a 500, pero luego escribes la posición 6 en la 7, y AHORA el 6 vale 500 en lugar de los 400 de ANTES, y así sucesivamente. No se si se entiende. Prueba a seguir el código escribiendo en un papel, linea por linea, sin suponer nada.

Debes buscar la posición como haces, y luego escribir los valores del último al primero, para no alterar los valores antes de leerlos ^^U
Title: Re: Tabla de records (Highscore)
Post by: Hokutoy on December 24, 2009, 08:02:08 AM
Quote from: Drumpi on December 24, 2009, 02:44:22 AM
Si: recorre la tabla en sentido ascendente en llugar de descendente.

Al añadir la puntuación, buscas del primero al último, cuando encuentras la posición, la 5 escribes el dato en la posición 6, por lo tanto 6 pasa de valer 400 a 500, pero luego escribes la posición 6 en la 7, y AHORA el 6 vale 500 en lugar de los 400 de ANTES, y así sucesivamente. No se si se entiende. Prueba a seguir el código escribiendo en un papel, linea por linea, sin suponer nada.

Debes buscar la posición como haces, y luego escribir los valores del último al primero, para no alterar los valores antes de leerlos ^^U

Se entiende se entiende... sera que ayer era tarde porque mira que le di vueltas y no habia manera... cuelgo la variacion necesaria para que funcione.

process addHighscore(int newScore)

private
int i, newScorePosition;
string fileName = "highscore.file";

begin
for( i = 0; i < 10; i++ )
if(highscore[i].hscore < newScore)
break;
end
end

if(i == 10) //If i equals 10 all scores in the table were higher than the new one.
return;
else //If lower, the score on place 'i' is the first one to be lower than the new score.
newScorePosition = i; //Save which position the new score is coming
for(i=10;i>newScorePosition;i--) //And move everything one place down, starting with 'i'
highscore[i].hscore=highscore[i-1].hscore;
end
highscore[newScorePosition].hscore = newScore; //Add in the new score
end
end


Saludos!
Title: Re: Tabla de records (Highscore)
Post by: l1nk3rn3l on December 24, 2009, 08:40:32 PM
usa mejor XML o sqlite3 para guardar datos..

esta en DLL en el bennupack
Title: Re: Tabla de records (Highscore)
Post by: Hokutoy on December 25, 2009, 12:35:21 AM
Quote from: l1nk3rn3l on December 24, 2009, 08:40:32 PM
usa mejor XML o sqlite3 para guardar datos..

esta en DLL en el bennupack

Ahora le hecharé un vistazo pero soy muy novato y lo que me dices me suena a chino... algun ejemplo?
Title: Re: Tabla de records (Highscore)
Post by: Drumpi on December 25, 2009, 01:59:39 AM
Hombre, Linkernel, está muy bien que patrocines el BennuPack, pero creo que para una tabla de hi-scores se puede usar ficheros ;D
XML o sqlite es matar moscas a cañonazos, creo yo :)

Son librerías para trabajar con bases de datos y ficheros con formato (el xml es como el lenguaje de scripts de html de páginas webs, solo que es mucho más ámplio, si no estoy mal informado).
Title: Re: Tabla de records (Highscore)
Post by: SplinterGU on December 25, 2009, 02:11:54 AM
hacelo mas facil, ponelo en el ultimo lugar y ordena el array con algunas de las funciones de ordenamiento... y ya esta.
Title: Re: Tabla de records (Highscore)
Post by: Hokutoy on December 25, 2009, 10:32:01 AM
Quote from: SplinterGU on December 25, 2009, 02:11:54 AM
hacelo mas facil, ponelo en el ultimo lugar y ordena el array con algunas de las funciones de ordenamiento... y ya esta.

Esto suena muy bien... ahora mismo miro la wiki a ver que hay.
Gracias!
Title: Re: Tabla de records (Highscore)
Post by: Hokutoy on December 25, 2009, 11:46:40 AM
Bueno al final me he cargado el proceso addhighscore porque con un simple sort(highscore); ya se te ordena solito, como bien dice SplinterGU.

Una pregunta... con sort siempre se ordena de menor a mayor. Hay alguna manera de cambiar el orden de ordenado? NO es que me haga falta... simple curiosidad.

Gracias!
Title: Re: Tabla de records (Highscore)
Post by: SplinterGU on December 25, 2009, 03:39:13 PM
creo que si, no lo recuerdo ahora mismo...
Title: Re: Tabla de records (Highscore)
Post by: Windgate on December 25, 2009, 08:41:12 PM
Puedes recorrer la lista, multiplicarla por -1, ordenar y luego volver a recorrer y multiplicar por -1, es una cerdada muy cerda pero en fin xD

Personalmente nunca he tenido necesidad de ordenar un vector en Bennu :P
Title: Re: Tabla de records (Highscore)
Post by: SplinterGU on December 25, 2009, 11:11:24 PM
creo que no se puede, pero al ser un array, lo puedes leer de atras hacia adelante o como quieras.