Anuncios Google

Problema con un fichero (LUA)

Pues esto desarrollando lo que será el motor "Aleatorio" de las nuevas versiones de El Ahogado, pero me da un error con un fichero.

Aquí el código:

--Color--
blanco = Color.new(255,255,255,255)
 
 
--Variables--
i = 0
Generathor = io.open("Semilla.txt","r") --Semilla generadora de los numeros--
line1 = Generathor:read()
Generathor:close()
Generathor = nil
 
 
--Temporizador para que cambie de letra--
temporizador = Timer.new()
temporizador:start()
 
 
--Abrimos el archivo "Palabras.txt"--
Palabras = io.open("Palabras.txt","r")
 
 
--[[Tabla que contiene las palabras escritas en el archivo "Palabras.txt", las seleccionará de manera
aleatoria de una en una.]]--
Lineas = { Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read(), 
Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read(), 
Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read(), 
Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read() }  
 
 
--Función de la aleatoriedad--
function Aleatorio()
--Aquí comienza todo el rollo de la Aleatoriedad xD--
math.randomseed(line1)
i = math.random(1,table.getn(Lineas))
Palabraelegida = tostring(Lineas[i])
expalabra = string.len(Palabraelegida)
TrueExtension = expalabra - 1
end
 
 
--Bucle Principal--
while true do
screen:clear()
tiempo = temporizador:time()
Aleatorio()
if tiempo < 1000 then
     screen:print(30,30,Lineas[i],blanco)
	 screen:print(30,50,TrueExtension,blanco)
   elseif tiempo > 1000 then
     local file = io.open("Semilla.txt","w")
	 file:read()
	 file:write(os.time())
	 file:close()
	 file = nil
     dofile("WGF.lua")
   end
screen.waitVblankStart()
screen.flip()
end 

Bien, pues primero les felicito si le entienden al pedazo de código que está arriba jeje xD.

Segundo, les comento lo que me pasa:

Lo que hace el código anterior es mostrar una palabra diferente y la extensión de esta cada segundo, como pueden ver en esta parte:

local file = io.open("Semilla.txt","w")
	 file:read()
	 file:write(os.time())
	 file:close()
	 file = nil
     dofile("WGF.lua")
   end
 
 
--[[Se abre el archivo llamado semilla (que contiene el numero
que arroja las palabras aleatoriamente) y escribe un numero nuevo
para que la palabra no sea la misma.]]--
 
--[[Pero solo se abre 11 veces, al intentar abrirlo por doceava 
ocación me da el error:]]--
 
--Error: WGF.lua:51: ettempt to index local 'file' (a nil value)
--Press start to restart

Espero me ayuden y gracias de antemano.

PD: Evitar comentarios tontos y/o que no tengan relación con el tema.


Tutorial: Fabricando nuestro propio micrófono para la PSP.

Exclusivo de PSP.Scenebeta.com


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de trom_us

aver

Lineas = { Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read(),
Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read(),
Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read(),
Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read(), Palabras:read() }  

 
primero cambia esto por un for nil, o un while nil
asi no dependeras por el numero de palabras y podras actualizar.
por otro lado falto cerrar el archivo palabras...

--Función de la aleatoriedad--
function Aleatorio()
--Aquí comienza todo el rollo de la Aleatoriedad xD--
math.randomseed(line1)
i = math.random(1,table.getn(Lineas))
Palabraelegida = tostring(Lineas[i])
expalabra = string.len(Palabraelegida)
TrueExtension = expalabra - 1
end

segundo, si tus palabras no van a ser mayor a len(a-z) osea como 26 palabras
usa una lista ="ABCD....Z" y la revuelvez,
ahora la A=1,b=2, para mas facil char("A")=65-64=1
entonces ya revuelvta la abecedario, por cada letra que escojas
esta la sustituyes por la ultma o la primera, segun. y devuevleves una nueva
lista = listaanterior -1
si antes len(lista)=26 ahora sera 25, y el random actuara en base a 25
y asi sucesivamente hasta ser random(1)...
como lo vas a escribir sera cosa tuya. ahorita no tengo a la mano como escribirlo.

en el random utiliza math.randomseed (x) donde x usaras el relog del psp para activar una semilla aleatoria
eso no tiene nada que ver  con las letras, es solo un nuero, ya sabras como usarlo.
enotnces usas math.random ([m [, n]]) asi m=1,n=len(lista) o alreves, pero asi delimitas el rango del numero devuelto

he son varias cosas...
reduce el codigo, muchos dicen que no, pero es bueno reducir lo que no es necesariamente deva ser largo
y a larga el codigo que mejorara la aplicacion o el resultado de la misma
es decir , un codigo de 1000 lineas podria ser mejor que uno de 10 y viceversa.
solo hay que fijaros bien e cual es el que hay que reducir por obvias razones
y cual hay que escribir mucho para un optimo funcionamiento.

     local file = io.open("Semilla.txt","w")
     file:read()
     file:write(os.time())
     file:close()
     file = nil
 
     aqui te recomiendo uses
     local file
     file = io.open("Semilla.txt","w")

por fallo del mismo lua

hay funciones agregadas como ifexist or direxits, que igual dejan
abierto el file e impide mas uso de memoria o archivos
recomiendo no usarlas.

local file = io.open("Semilla.txt","w")
     file:read()   <-------??????? creo que esta demas.....
     file:write(os.time())
     file:close()
     file = nil
     dofile("WGF.lua")
   end

al final, usa una variable, no un archivo.

----
--Error: WGF.lua:51: ettempt to index local 'file' (a nil value)
--Press start to restart

eso es porque usaste LOCAL para file sabiendo que la ocuparas
en un archivo separado ademas que la pusiste a nil...

i = 0
Generathor = io.open("Semilla.txt","r") --Semilla generadora de los numeros--
line1 = Generathor:read()
Generathor:close()
Generathor = nil

pero creo que tu error es pedir a os.time el nombre de archivo
sabras que no devuelve 1,2,3,4 por eso te marca error, ya que
utilizas su resultado para saber el nombre, por eso mejor usa mi ejemplo de lista="AB..."
creo "y va para DeViaNTe jeje" puedes fijarte en el codigo de "Number Whah?" pues creo escribi algo parecido.

saludos.

Imagen de DeViaNTe

trom...

no me tiro el dia mirando todos y cada uno de los posts de los demás usuarios, y menos aún todos y cada uno de los códigos que éstos postean...

Solo le hice un pequeño código para generar aleatoriedad... en serio... deja de decir, DeV, tus códigos se parecen a los mios! Y dí mas bien: DeV, scripteamos de la misma forma :) (reconozco un mérito por tu parte, pues llevo años en el scripting..., no en Lua, pero sí en este estilo de programación...)


Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es

Imagen de trom_us

spam

sorry no entendi, pero ya no te voy a vacilar...jeje

Imagen de DeViaNTe

Repasillo

Viendo que no encuentras respuesta, te hago un repaso rápido al código:

--Color--
blanco = Color.new(255,255,255,255);
 
CAMBIASCREEN = 0;
 
math.randomseed(os.time()); -- Con hacerlo al inicio basta.
 
--Vale, he borrado MUCHAS variables... para que tanto uso de recursos?
Lineas = { } -- limpiamos variable lineas,
for l in io.lines(s) do
	table.insert(Lineas,l); -- introducimos linea...
end
 
-- Bien, tu antiguo cargador de archivos, leía un número DEFINIDO de lineas,
-- y si tenia mas o menos, error. Por que no leer todas las lineas en una tabla?
 
 
--Función de la aleatoriedad--
function Aleatorio()
   numaleatorio = math.random(1,(table.getn(Lineas) + 0.90)); -- 1 a X+0.9
   numaleatorio = math.floor(numaleatorio) -- Redondear al inferior, 1 - num - X.
   Palabraelegida = Lineas[numaleatorio]; -- YA es un STRING.
   expalabra = Palabraelegida:len; -- A que asi mola mas? (funciona igual)
 
   Palabraelegida = string.sub(Palabraelegida,1,#Palabraelegida -1 );
   expalabra = Palabraelegida:len; -- Ahora no necesitas truextension...
 
end
 
--Bucle Principal--
while true do
	screen:clear()
	Aleatorio()
 
	if CAMBIASCREEN <= 1000 then
     		screen:print(30,30,Palabraelegida,blanco)
	 	screen:print(30,50,expalabra,blanco)
		CAMBIASCREEN = CAMBIASCREEN + 1;
  	else
		CAMBIASCREEN = 0;
   	end
	screen.waitVblankStart()
	screen.flip()
end 

 


Actualmente desarrollando nuestra web y UXCode : http://www.gcrew.es

Imagen de moikop

si en vez de file =

si en vez de file = io.open(), file:read(), file:close(), etc. lo cambias por: archivo = io.open() o fichero = io.open(). fichero:read() o archivo:read()? yo cuando necesite leer txt no me funcionaba con file.

un saludo!

P.D: a, y DDB, no es lua HMv2 porque puso screen.flip() cuando en HMv2 es screen.flipscreen()


Para recibir ayuda por parte de otros usuarios más rápidamente, recomendamos que pongas títulos descriptivos y no utilices abreviaturas (estilo MSN) en tus post de los foros. Recuerda que accediendo al Manual del perfecto forero y las Normas de la Comunidad aprenderas trucos para resolver tus dudas antes.

No preguntes por MP, mejor pregunta aquí.

Es cierto xDDD

Es cierto xDDD

Imagen de el__QAT

No..

Es un problema con la memoria o algo así, ya que si hiciera lo que me dices quedaría prácticamente igual.

Imagen de jesuRule

eso no tiene nada que ver

puedes poner lo que quieras

Imagen de moikop

pues no se si tiene o no que

pues no se si tiene o no que ver, pero a mi con file, no me funciono.

Imagen de xXgRaFtSXx

Man no es

Blanco = Color.new (255,255,255)?? Creo q lo pusiste 4 veces! XD

Imagen de el__QAT

Porfavor....

Abstenerse de este tipo de comentarios, y como dice DDB en el valor alpha del color.

sAlud0s!

Porque está escho en lua

Porque está escho en lua HMv2 y el cuarto valor es la transparencia de trexto -.-"

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.