riabayonaor commited on
Commit
38897c3
1 Parent(s): 11c6ce7

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +42 -63
app.py CHANGED
@@ -11,32 +11,6 @@ if gemini_api_key is None:
11
  genai.configure(api_key=gemini_api_key)
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:
19
- st.session_state.errores = 0
20
- if 'nivel' not in st.session_state:
21
- st.session_state.nivel = 0 # 0 = Principiante, 1 = Intermedio, 2 = Difícil
22
- if 'problema' not in st.session_state:
23
- st.session_state.problema = None
24
- if 'respuestas' 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,
29
- st.session_state.problema, st.session_state.respuestas, st.session_state.respuesta_correcta)
30
-
31
- def update_game_state(aciertos, errores, nivel, problema, respuestas, respuesta_correcta):
32
- """Actualiza el estado del juego"""
33
- st.session_state.aciertos = aciertos
34
- st.session_state.errores = errores
35
- st.session_state.nivel = nivel
36
- st.session_state.problema = problema
37
- st.session_state.respuestas = respuestas
38
- st.session_state.respuesta_correcta = respuesta_correcta
39
-
40
  def chat_with_model(user_input):
41
  """Envía una pregunta al modelo de IA y obtiene una respuesta."""
42
  try:
@@ -78,8 +52,8 @@ def generar_sistema_ecuaciones_2x2_y_respuestas():
78
  matriz_coeficientes = np.array([[a, b], [c, d]])
79
  matriz_resultados = np.array([e, f])
80
  soluciones = np.linalg.solve(matriz_coeficientes, matriz_resultados)
81
- respuestas_incorrectas = {(round(soluciones[0] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
82
- round(soluciones[1] + random.choice([-2, -1, 1, 2]) * random.random(), 2))
83
  for _ in range(3)}
84
  respuestas_correctas = (round(soluciones[0], 2), round(soluciones[1], 2))
85
  respuestas = list(respuestas_incorrectas) + [respuestas_correctas]
@@ -100,7 +74,7 @@ def generar_sistema_ecuaciones_3x3_y_respuestas():
100
  soluciones = np.linalg.solve(matriz_coeficientes, matriz_resultados)
101
  respuestas_incorrectas = {(round(soluciones[0] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
102
  round(soluciones[1] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
103
- round(soluciones[2] + random.choice([-2, -1, 1, 2]) * random.random(), 2))
104
  for _ in range(3)}
105
  respuestas_correctas = (round(soluciones[0], 2), round(soluciones[1], 2), round(soluciones[2], 2))
106
  respuestas = list(respuestas_incorrectas) + [respuestas_correctas]
@@ -108,71 +82,76 @@ def generar_sistema_ecuaciones_3x3_y_respuestas():
108
  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}"
109
  return sistema, respuestas, respuestas_correctas
110
 
111
- def get_ui_elements():
112
- """Genera los elementos de la interfaz de usuario según el nivel actual"""
113
- nivel = st.session_state.nivel
114
- if nivel == 2: # Sistema 3x3
115
- problema, respuestas, respuesta_correcta = generar_sistema_ecuaciones_3x3_y_respuestas()
116
- elif nivel == 1: # Sistema 2x2
117
- problema, respuestas, respuesta_correcta = generar_sistema_ecuaciones_2x2_y_respuestas()
118
- else: # Ecuación lineal
119
- problema, respuestas, respuesta_correcta = generar_ecuacion_y_respuestas()
120
- opciones = [", ".join(map(str, r)) if isinstance(r, tuple) else str(r) for r in respuestas]
121
- return problema, opciones, respuesta_correcta
122
-
123
- def manejar_respuesta(respuesta_elegida, respuesta_correcta, nivel):
124
  """Evalúa la respuesta del usuario, proporcionando retroalimentación y una explicación."""
125
  tolerancia = 1e-9
126
  correcto = False
127
  if nivel == 2: # Sistema 3x3
128
  correcto = all(abs(e - c) < tolerancia for e, c in zip(respuesta_elegida, respuesta_correcta))
 
129
  elif nivel == 1: # Sistema 2x2
130
  correcto = all(abs(e - c) < tolerancia for e, c in zip(respuesta_elegida, respuesta_correcta))
 
131
  else: # Ecuación lineal
132
  correcto = abs(respuesta_elegida - respuesta_correcta) < tolerancia
 
 
133
  if correcto:
134
  resultado = "¡Correcto! +1 punto."
135
- aciertos, errores, nivel, _, _, _ = get_game_state()
136
- if aciertos >= 5 and nivel == 0:
137
  nivel = 1
138
  st.success("¡Felicitaciones, has pasado al nivel Intermedio: Sistemas de ecuaciones lineales 2x2!")
139
- elif aciertos >= 10 and nivel == 1:
140
  nivel = 2
141
  st.success("¡Felicitaciones, has pasado al nivel Difícil: Sistemas de ecuaciones lineales 3x3!")
142
- update_game_state(aciertos + 1, errores, nivel, None, None, None)
143
  else:
144
  resultado = "Incorrecto, sigue practicando."
145
- aciertos, errores, nivel, _, _, _ = get_game_state()
146
- update_game_state(aciertos, errores + 1, nivel, None, None, None)
147
- explicacion = chat_with_model(f"Explica el problema y por qué la respuesta {respuesta_elegida} es {'correcta' if correcto else 'incorrecta'}.")
148
- return resultado + f" Escogiste la respuesta: {respuesta_elegida}. La respuesta correcta es: {respuesta_correcta}.\n{explicacion}"
149
 
150
  # Interfaz de usuario y lógica de la aplicación
151
  st.title("Desafío de Matemáticas")
152
  st.markdown("Intenta resolver el problema y selecciona tu respuesta.")
153
 
154
- aciertos, errores, nivel, problema, respuestas, respuesta_correcta = get_game_state()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
 
156
  niveles = ["Principiante", "Intermedio", "Difícil"]
157
- nivel_actual = niveles[nivel]
158
  st.sidebar.markdown(f"Nivel: {nivel_actual}")
159
- st.sidebar.write(f"Aciertos: {aciertos}")
160
- st.sidebar.write(f"Errores: {errores}")
161
-
162
- if problema is None or respuestas is None or respuesta_correcta is None:
163
- problema, respuestas, respuesta_correcta = get_ui_elements()
164
- update_game_state(aciertos, errores, nivel, problema, respuestas, respuesta_correcta)
165
 
166
- st.write(problema)
167
- seleccion = st.radio("Elige tu respuesta", respuestas, key="opciones")
 
168
  respuesta_elegida = tuple(map(float, seleccion.split(', '))) if "," in seleccion else float(seleccion)
169
 
170
  if st.button("Enviar"):
171
- resultado = manejar_respuesta(respuesta_elegida, respuesta_correcta, nivel)
172
  st.write(resultado)
 
 
173
 
174
  boton_nuevo_problema = st.button("Generar Nuevo Problema")
175
  if boton_nuevo_problema:
176
- problema, respuestas, respuesta_correcta = get_ui_elements()
177
- update_game_state(aciertos, errores, nivel, problema, respuestas, respuesta_correcta)
178
  st.experimental_rerun()
 
11
  genai.configure(api_key=gemini_api_key)
12
  model = genai.GenerativeModel('gemini-pro')
13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  def chat_with_model(user_input):
15
  """Envía una pregunta al modelo de IA y obtiene una respuesta."""
16
  try:
 
52
  matriz_coeficientes = np.array([[a, b], [c, d]])
53
  matriz_resultados = np.array([e, f])
54
  soluciones = np.linalg.solve(matriz_coeficientes, matriz_resultados)
55
+ respuestas_incorrectas = {(round(soluciones[0] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
56
+ round(soluciones[1] + random.choice([-2, -1, 1, 2]) * random.random(), 2))
57
  for _ in range(3)}
58
  respuestas_correctas = (round(soluciones[0], 2), round(soluciones[1], 2))
59
  respuestas = list(respuestas_incorrectas) + [respuestas_correctas]
 
74
  soluciones = np.linalg.solve(matriz_coeficientes, matriz_resultados)
75
  respuestas_incorrectas = {(round(soluciones[0] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
76
  round(soluciones[1] + random.choice([-2, -1, 1, 2]) * random.random(), 2),
77
+ round(soluciones[2] + random.choice([-2, -1, 1, 2]) * random.random(), 2))
78
  for _ in range(3)}
79
  respuestas_correctas = (round(soluciones[0], 2), round(soluciones[1], 2), round(soluciones[2], 2))
80
  respuestas = list(respuestas_incorrectas) + [respuestas_correctas]
 
82
  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}"
83
  return sistema, respuestas, respuestas_correctas
84
 
85
+ def manejar_respuesta(problema, respuesta_elegida, respuesta_correcta, nivel):
 
 
 
 
 
 
 
 
 
 
 
 
86
  """Evalúa la respuesta del usuario, proporcionando retroalimentación y una explicación."""
87
  tolerancia = 1e-9
88
  correcto = False
89
  if nivel == 2: # Sistema 3x3
90
  correcto = all(abs(e - c) < tolerancia for e, c in zip(respuesta_elegida, respuesta_correcta))
91
+ explicacion = chat_with_model(f"Explica cómo resolver un sistema de ecuaciones lineales 3x3 y por qué la respuesta {respuesta_elegida} es {'correcta' if correcto else 'incorrecta'}.")
92
  elif nivel == 1: # Sistema 2x2
93
  correcto = all(abs(e - c) < tolerancia for e, c in zip(respuesta_elegida, respuesta_correcta))
94
+ explicacion = chat_with_model(f"Explica cómo resolver un sistema de ecuaciones lineales 2x2 y por qué la respuesta {respuesta_elegida} es {'correcta' if correcto else 'incorrecta'}.")
95
  else: # Ecuación lineal
96
  correcto = abs(respuesta_elegida - respuesta_correcta) < tolerancia
97
+ explicacion = chat_with_model(f"Explica cómo resolver una ecuación lineal y por qué la respuesta {respuesta_elegida} es {'correcta' if correcto else 'incorrecta'}.")
98
+
99
  if correcto:
100
  resultado = "¡Correcto! +1 punto."
101
+ if st.session_state.aciertos >= 5 and nivel == 0:
 
102
  nivel = 1
103
  st.success("¡Felicitaciones, has pasado al nivel Intermedio: Sistemas de ecuaciones lineales 2x2!")
104
+ elif st.session_state.aciertos >= 10 and nivel == 1:
105
  nivel = 2
106
  st.success("¡Felicitaciones, has pasado al nivel Difícil: Sistemas de ecuaciones lineales 3x3!")
107
+ st.session_state.aciertos += 1
108
  else:
109
  resultado = "Incorrecto, sigue practicando."
110
+ st.session_state.errores += 1
111
+
112
+ return resultado + f" Escogiste la respuesta: {respuesta_elegida}. La respuesta correcta es: {respuesta_correcta}.\n{explicacion}", nivel
 
113
 
114
  # Interfaz de usuario y lógica de la aplicación
115
  st.title("Desafío de Matemáticas")
116
  st.markdown("Intenta resolver el problema y selecciona tu respuesta.")
117
 
118
+ if 'aciertos' not in st.session_state:
119
+ st.session_state.aciertos = 0
120
+ if 'errores' not in st.session_state:
121
+ st.session_state.errores = 0
122
+ if 'nivel' not in st.session_state:
123
+ st.session_state.nivel = 0
124
+
125
+ if 'nuevo_problema' not in st.session_state or st.session_state.nuevo_problema:
126
+ st.session_state.nuevo_problema = False
127
+ if st.session_state.nivel == 2:
128
+ problema_actual, respuestas, respuesta_correcta = generar_sistema_ecuaciones_3x3_y_respuestas()
129
+ elif st.session_state.nivel == 1:
130
+ problema_actual, respuestas, respuesta_correcta = generar_sistema_ecuaciones_2x2_y_respuestas()
131
+ else:
132
+ problema_actual, respuestas, respuesta_correcta = generar_ecuacion_y_respuestas()
133
+ st.session_state.problema = problema_actual
134
+ st.session_state.respuestas = respuestas
135
+ st.session_state.respuesta_correcta = respuesta_correcta
136
 
137
  niveles = ["Principiante", "Intermedio", "Difícil"]
138
+ nivel_actual = niveles[st.session_state.nivel]
139
  st.sidebar.markdown(f"Nivel: {nivel_actual}")
140
+ st.sidebar.write(f"Aciertos: {st.session_state.aciertos}")
141
+ st.sidebar.write(f"Errores: {st.session_state.errores}")
 
 
 
 
142
 
143
+ st.write(st.session_state.problema)
144
+ opciones = [f"{r[0]}, {r[1]}" if isinstance(r, tuple) else str(r) for r in st.session_state.respuestas]
145
+ seleccion = st.radio("Elige tu respuesta", opciones, key="opciones")
146
  respuesta_elegida = tuple(map(float, seleccion.split(', '))) if "," in seleccion else float(seleccion)
147
 
148
  if st.button("Enviar"):
149
+ resultado, nuevo_nivel = manejar_respuesta(st.session_state.problema, respuesta_elegida, st.session_state.respuesta_correcta, st.session_state.nivel)
150
  st.write(resultado)
151
+ st.session_state.nivel = nuevo_nivel
152
+ st.session_state.nuevo_problema = True
153
 
154
  boton_nuevo_problema = st.button("Generar Nuevo Problema")
155
  if boton_nuevo_problema:
156
+ st.session_state.nuevo_problema = True
 
157
  st.experimental_rerun()