Tabla de records (Highscore)

Started by Hokutoy, December 24, 2009, 12:59:49 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Hokutoy

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?

Drumpi

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
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Hokutoy

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!

l1nk3rn3l

usa mejor XML o sqlite3 para guardar datos..

esta en DLL en el bennupack

Hokutoy

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?

Drumpi

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).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

hacelo mas facil, ponelo en el ultimo lugar y ordena el array con algunas de las funciones de ordenamiento... y ya esta.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Hokutoy

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!

Hokutoy

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!

SplinterGU

creo que si, no lo recuerdo ahora mismo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

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
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

creo que no se puede, pero al ser un array, lo puedes leer de atras hacia adelante o como quieras.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2