Buenas programadores y no tan programadores,
Bueno, dudo que el titulo diga mucho, pero ahora os explico para que quede claro, seguramente sea algo relativamente sencillo, pero por mucho que le doy al coco no consigo hallar una manera de hacerlo. Bueno vamos a ello:
Quiero permitir una función que permita al usuario crear su propia pregunta, y guardarlo en un .ini, mas o menos en esta estructura;
[1] -- Esto seria la ID de la pregunta
p="¿Eres mayor de edad?" -- La pregunta
r1= "Si"
r2="No"
Bueno, hacer que creen la pregunta es fácil, la duda viene cuando el usuario quiera eliminar una pregunta, pongamos que crea 4 preguntas, por lo que habrán 4 ids, entonces al mostrar las preguntas solo tengo que poner un:
while ini_section_exists(ii) {
//Código
ii++;
}
Pero si elimina una pregunta, por ejemplo la 3, al llegar al 2, el código verá que no hay 3 y parará, no llegará al 4. Mientras escribía se me ha ocurrido poner en cada pregunta un "eliminado=false" y así en el while, si esta eliminado, ignorarlo, pero no seria muy limpio. Alguien sabría una solución mejor?
Gracias,
Un saludo
Creo que para eso sería mejor que usaras estructuras de datos en vez de simplemente archivos INI. Guardar las preguntas y respuestas en una lista (donde solucionarías el problema que tienes), y dentro de ella un arreglo o mapa con la pregunta y las respuestas.
El problema es que nunca he llegado a usar los ds_list y todo eso, ya que nunca me he visto en la obligación de usarlos, supongo que ahora si😅
Había pensado algo así:
Primero crea un
script llamado
array así:
[gml]
///array(val1, ..., valN);
var n = argument_count;
var s;
for(var i = 0; i < n; i++)
s
= argument;
return s;
[/gml]
Ahora, en cada evento que requieras:
[gml]
///Evento create de algún controlador
globalvar preguntas;
preguntas = ds_list_create();
[/gml]
[gml]
///Donde quieras añadir las preguntas
//Añade un arreglo a la lista, que contendrá una pregunta.
ds_list_add(preguntas,
array(
"La pregunta",
1, //La respuesta correcta
"Respuesta 1",
"Respuesta 2",
"Respuesta 3"
/*
Estos arreglos que se guardan en cada índice de la lista
guardan los datos de la pregunta: El índice - sería el
texto de la pregunta, el índice [1] sería la respuesta
correcta (siendo el número 1 el índice [2]), y del índice
[2] hacia adelante son las posibles respuestas.
*/
));
/*
Repite todo este código con tantas preguntas como necesites,
obviamente modificando los datos de cada pregunta.
*/
[/gml]
[gml]
///Y cuando queras borrar una pregunta
ds_list_delete(preguntas, 0); //Borramos la primera pregunta
[/gml]
La lista se usaría algo así:
[gml]
///Por ejemplo, un ciclo que recorra todas las preguntas
for(var i = 0; i < ds_list_size(preguntas); i++)
{
var pregunta = preguntas[| i];
var respuestas = "";
for(var j = 2; j < array_length_1d(pregunta); j++)
{
/*
Recorremos las respuestas, que se encuentran desde el
índice [2] hasta el último.
*/
respuestas += string(j - 1) + ". " + pregunta[j] + "#";
/*
Añadimos cada respuesta en una línea, de la forma:
1. respuesta 1
2. respuesta 2
etc.
*/
}
show_message(
"La pregunta es: " + pregunta[0] + "#" +
"La respuesta es la número " + string(pregunta[1]) + "#" +
"Las respuestas son:#" + respuestas
/*
Mostramos un mensaje que debería verse así:
La pregunta es: La pregunta
La respuesta es la número 1
Las respuestas son:
1. Respuesta 1
2. Respuesta 2
3. Respuesta 3
*/
);
}
[/gml]
Tal vez te sirva revisar las funciones de listas para entenderlas mejor:
http://docs-gamemaker-es.blogspot.com.co/2017/09/estructuras-de-datos.html
El código podría tener errores, no lo he probado aún.