riabayonaor commited on
Commit
5facbbe
1 Parent(s): 2a34526

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +31 -22
app.py CHANGED
@@ -12,6 +12,7 @@ genai.configure(api_key=gemini_api_key)
12
  model = genai.GenerativeModel('gemini-pro')
13
 
14
  def get_game_state():
 
15
  if 'aciertos' not in st.session_state:
16
  st.session_state.aciertos = 0
17
  if 'errores' not in st.session_state:
@@ -24,10 +25,10 @@ def get_game_state():
24
  st.session_state.respuestas = None
25
  if 'respuesta_correcta' not in st.session_state:
26
  st.session_state.respuesta_correcta = None
27
- return (st.session_state.aciertos, st.session_state.errores, st.session_state.nivel,
28
- st.session_state.problema, st.session_state.respuestas, st.session_state.respuesta_correcta)
29
 
30
  def update_game_state(aciertos, errores, nivel, problema, respuestas, respuesta_correcta):
 
31
  st.session_state.aciertos = aciertos
32
  st.session_state.errores = errores
33
  st.session_state.nivel = nivel
@@ -36,6 +37,7 @@ def update_game_state(aciertos, errores, nivel, problema, respuestas, respuesta_
36
  st.session_state.respuesta_correcta = respuesta_correcta
37
 
38
  def chat_with_model(user_input):
 
39
  try:
40
  response = model.generate_content(user_input)
41
  return response.text
@@ -43,6 +45,7 @@ def chat_with_model(user_input):
43
  return f"Error al generar contenido: {e}"
44
 
45
  def tiene_solucion_unica(matriz_coeficientes, matriz_resultados):
 
46
  try:
47
  np.linalg.solve(matriz_coeficientes, matriz_resultados)
48
  return True
@@ -71,16 +74,14 @@ def generar_sistema_ecuaciones_2x2_y_respuestas():
71
  c, d, f = random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
72
  if tiene_solucion_unica(np.array([[a, b], [c, d]]), np.array([e, f])):
73
  break
74
- matriz_coeficientes = np.array([[a, b], [c, d]])
75
- matriz_resultados = np.array([e, f])
76
- soluciones = np.linalg.solve(matriz_coeficientes, matriz_resultados)
77
  respuestas_incorrectas = {(round(soluciones[0] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
78
  round(soluciones[1] + random.choice([-2, -1, 1, 2]) * random.random(), 2))
79
  for _ in range(3)}
80
  respuestas_correctas = (round(soluciones[0], 2), round(soluciones[1], 2))
81
  respuestas = list(respuestas_incorrectas) + [respuestas_correctas]
82
  random.shuffle(respuestas)
83
- sistema = f"{a}x + {b}y = {e}\n\n\n{c}x + {d}y = {f}"
84
  return sistema, respuestas, respuestas_correctas
85
 
86
  def generar_sistema_ecuaciones_3x3_y_respuestas():
@@ -89,49 +90,57 @@ def generar_sistema_ecuaciones_3x3_y_respuestas():
89
  a, b, c, e = random.randint(1, 10), random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
90
  d, f, g, h = random.randint(1, 10), random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
91
  i, j, k, l = random.randint(1, 10), random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
92
- matriz_coeficientes = np.array([[a, b, c], [d, f, g], [i, j, k]])
93
- matriz_resultados = np.array([e, h, l])
94
- if tiene_solucion_unica(matriz_coeficientes, matriz_resultados):
95
  break
96
- soluciones = np.linalg.solve(matriz_coeficientes, matriz_resultados)
97
  respuestas_incorrectas = {(round(soluciones[0] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
98
  round(soluciones[1] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
99
- round(soluciones[2] + random.choice([-2, -1, 1, 2]) * random.random(), 2))
100
  for _ in range(3)}
101
  respuestas_correctas = (round(soluciones[0], 2), round(soluciones[1], 2), round(soluciones[2], 2))
102
  respuestas = list(respuestas_incorrectas) + [respuestas_correctas]
103
  random.shuffle(respuestas)
104
- sistema = f"{a}x + {b}y + {c}z = {e}\n\n\n{d}x + {f}y + {g}z = {h}\n\n\n{i}x + {j}y + {k}z = {l}"
105
  return sistema, respuestas, respuestas_correctas
106
 
107
  def get_ui_elements():
 
108
  nivel = st.session_state.nivel
109
- if nivel == 2:
 
110
  problema, respuestas, respuesta_correcta = generar_sistema_ecuaciones_3x3_y_respuestas()
111
- elif nivel == 1:
112
  problema, respuestas, respuesta_correcta = generar_sistema_ecuaciones_2x2_y_respuestas()
113
- else:
114
  problema, respuestas, respuesta_correcta = generar_ecuacion_y_respuestas()
115
  opciones = [", ".join(map(str, r)) if isinstance(r, tuple) else str(r) for r in respuestas]
116
  return problema, opciones, respuesta_correcta
117
 
118
  def manejar_respuesta(respuesta_elegida, respuesta_correcta, nivel, problema):
 
119
  tolerancia = 1e-9
120
  correcto = False
121
- if nivel in [1, 2]:
122
  correcto = all(abs(e - c) < tolerancia for e, c in zip(respuesta_elegida, respuesta_correcta))
123
- else:
124
  correcto = abs(respuesta_elegida - respuesta_correcta) < tolerancia
125
 
126
  resultado = "¡Correcto! +1 punto." if correcto else "Incorrecto, sigue practicando."
127
  explicacion = chat_with_model(f"Explica el problema '{problema}' y por qué la respuesta {respuesta_elegida} es {'correcta' if correcto else 'incorrecta'}.")
128
 
129
- # Actualiza el estado del juego aquí
130
-
 
 
 
 
 
 
 
 
 
131
  return f"{resultado} La explicación es: {explicacion}"
132
 
133
-
134
-
135
  # Interfaz de usuario y lógica de la aplicación
136
  st.title("Desafío de Matemáticas")
137
  st.markdown("Intenta resolver el problema y selecciona tu respuesta.")
@@ -153,7 +162,7 @@ seleccion = st.radio("Elige tu respuesta", respuestas, key="opciones")
153
  respuesta_elegida = tuple(map(float, seleccion.split(', '))) if "," in seleccion else float(seleccion)
154
 
155
  if st.button("Enviar"):
156
- resultado = manejar_respuesta(respuesta_elegida, respuesta_correcta, nivel)
157
  st.write(resultado)
158
 
159
  boton_nuevo_problema = st.button("Generar Nuevo Problema")
 
12
  model = genai.GenerativeModel('gemini-pro')
13
 
14
  def get_game_state():
15
+ """Obtiene el estado actual del juego."""
16
  if 'aciertos' not in st.session_state:
17
  st.session_state.aciertos = 0
18
  if 'errores' not in st.session_state:
 
25
  st.session_state.respuestas = None
26
  if 'respuesta_correcta' not in st.session_state:
27
  st.session_state.respuesta_correcta = None
28
+ return (st.session_state.aciertos, st.session_state.errores, st.session_state.nivel, st.session_state.problema, st.session_state.respuestas, st.session_state.respuesta_correcta)
 
29
 
30
  def update_game_state(aciertos, errores, nivel, problema, respuestas, respuesta_correcta):
31
+ """Actualiza el estado del juego."""
32
  st.session_state.aciertos = aciertos
33
  st.session_state.errores = errores
34
  st.session_state.nivel = nivel
 
37
  st.session_state.respuesta_correcta = respuesta_correcta
38
 
39
  def chat_with_model(user_input):
40
+ """Envía una pregunta al modelo de IA y obtiene una respuesta."""
41
  try:
42
  response = model.generate_content(user_input)
43
  return response.text
 
45
  return f"Error al generar contenido: {e}"
46
 
47
  def tiene_solucion_unica(matriz_coeficientes, matriz_resultados):
48
+ """Determina si un sistema de ecuaciones tiene solución única."""
49
  try:
50
  np.linalg.solve(matriz_coeficientes, matriz_resultados)
51
  return True
 
74
  c, d, f = random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
75
  if tiene_solucion_unica(np.array([[a, b], [c, d]]), np.array([e, f])):
76
  break
77
+ soluciones = np.linalg.solve(np.array([[a, b], [c, d]]), np.array([e, f]))
 
 
78
  respuestas_incorrectas = {(round(soluciones[0] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
79
  round(soluciones[1] + random.choice([-2, -1, 1, 2]) * random.random(), 2))
80
  for _ in range(3)}
81
  respuestas_correctas = (round(soluciones[0], 2), round(soluciones[1], 2))
82
  respuestas = list(respuestas_incorrectas) + [respuestas_correctas]
83
  random.shuffle(respuestas)
84
+ sistema = f"{a}x + {b}y = {e}\n{c}x + {d}y = {f}"
85
  return sistema, respuestas, respuestas_correctas
86
 
87
  def generar_sistema_ecuaciones_3x3_y_respuestas():
 
90
  a, b, c, e = random.randint(1, 10), random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
91
  d, f, g, h = random.randint(1, 10), random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
92
  i, j, k, l = random.randint(1, 10), random.randint(1, 10), random.randint(1, 10), random.randint(-10, 10)
93
+ if tiene_solucion_unica(np.array([[a, b, c], [d, f, g], [i, j, k]]), np.array([e, h, l])):
 
 
94
  break
95
+ soluciones = np.linalg.solve(np.array([[a, b, c], [d, f, g], [i, j, k]]), np.array([e, h, l]))
96
  respuestas_incorrectas = {(round(soluciones[0] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
97
  round(soluciones[1] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
98
+ round(soluciones[2] + random.choice([-2, -1, 1, 2]) * random.random(), 2))
99
  for _ in range(3)}
100
  respuestas_correctas = (round(soluciones[0], 2), round(soluciones[1], 2), round(soluciones[2], 2))
101
  respuestas = list(respuestas_incorrectas) + [respuestas_correctas]
102
  random.shuffle(respuestas)
103
+ sistema = f"{a}x + {b}y + {c}z = {e}\n{d}x + {f}y + {g}z = {h}\n{i}x + {j}y + {k}z = {l}"
104
  return sistema, respuestas, respuestas_correctas
105
 
106
  def get_ui_elements():
107
+ """Genera los elementos de la interfaz de usuario según el nivel actual"""
108
  nivel = st.session_state.nivel
109
+ problema, respuestas, respuesta_correcta = None, None, None
110
+ if nivel == 2: # Sistema 3x3
111
  problema, respuestas, respuesta_correcta = generar_sistema_ecuaciones_3x3_y_respuestas()
112
+ elif nivel == 1: # Sistema 2x2
113
  problema, respuestas, respuesta_correcta = generar_sistema_ecuaciones_2x2_y_respuestas()
114
+ else: # Ecuación lineal
115
  problema, respuestas, respuesta_correcta = generar_ecuacion_y_respuestas()
116
  opciones = [", ".join(map(str, r)) if isinstance(r, tuple) else str(r) for r in respuestas]
117
  return problema, opciones, respuesta_correcta
118
 
119
  def manejar_respuesta(respuesta_elegida, respuesta_correcta, nivel, problema):
120
+ """Evalúa la respuesta del usuario, proporcionando retroalimentación y una explicación detallada."""
121
  tolerancia = 1e-9
122
  correcto = False
123
+ if nivel in [1, 2]: # Para sistemas de ecuaciones 2x2 y 3x3
124
  correcto = all(abs(e - c) < tolerancia for e, c in zip(respuesta_elegida, respuesta_correcta))
125
+ else: # Para ecuaciones lineales
126
  correcto = abs(respuesta_elegida - respuesta_correcta) < tolerancia
127
 
128
  resultado = "¡Correcto! +1 punto." if correcto else "Incorrecto, sigue practicando."
129
  explicacion = chat_with_model(f"Explica el problema '{problema}' y por qué la respuesta {respuesta_elegida} es {'correcta' if correcto else 'incorrecta'}.")
130
 
131
+ aciertos, errores, nivel_actual, _, _, _ = get_game_state()
132
+ if correcto:
133
+ aciertos += 1
134
+ if (aciertos == 5 and nivel_actual == 0) or (aciertos == 10 and nivel_actual == 1):
135
+ nivel_actual += 1
136
+ nivel_mensaje = ["Principiante", "Intermedio", "Difícil"][nivel_actual]
137
+ st.success(f"¡Felicitaciones, has pasado al nivel {nivel_mensaje}!")
138
+ else:
139
+ errores += 1
140
+
141
+ update_game_state(aciertos, errores, nivel_actual, None, None, None)
142
  return f"{resultado} La explicación es: {explicacion}"
143
 
 
 
144
  # Interfaz de usuario y lógica de la aplicación
145
  st.title("Desafío de Matemáticas")
146
  st.markdown("Intenta resolver el problema y selecciona tu respuesta.")
 
162
  respuesta_elegida = tuple(map(float, seleccion.split(', '))) if "," in seleccion else float(seleccion)
163
 
164
  if st.button("Enviar"):
165
+ resultado = manejar_respuesta(respuesta_elegida, respuesta_correcta, nivel, problema)
166
  st.write(resultado)
167
 
168
  boton_nuevo_problema = st.button("Generar Nuevo Problema")