EXAMEN 2DA UNIDAD “SEAQUEST”
EMILIO SEBASTIÁN CHÁVEZ VEGA
Ventana inicial:
Movimiento:
Al pasar sobre las personas, desaparecen, las rescatamos:
Disparando los torpedos:
Al impactar con los submarinos, ambos desaparecen, los destruimos:
Ganar:
CÓDIGO FUENTE:
from OpenGL.GLUT import *
from OpenGL.GL import *
import numpy as np
import random
ancho_ventana = 800
alto_ventana = 600
contador = 0
frecuencia = 8.5
# Propiedades del mar
mar_min_y = -0.9
mar_max_y = 0.9
mar_color = (0.0, 0.0, 1.0) # Azul
# Propiedades submarino
submarino_x = 0.0
submarino_y = -0.8
submarino_ancho = 0.2
submarino_alto = 0.1
submarino_color = (1.0, 1.0, 0.0) # Amarillo
submarino_salto = 0.1
# Propiedades tordpedo
torpedo_direccion = 1
torpedos = []
torpedo_color = (1.0, 0.5, 0.0)
torpedo_ancho = 0.05
torpedo_alto = 0.02
torpedo_velocidad = 0.04
# Propiedades de las personas
personas_posicion = [
[-0.5, 0.5],
[0.5, 0.5]
]
personas_color = (1.0, 0.0, 0.0) # Rojo
personas_lado = 0.08
personas_rescatadas = 0
# Propiedades de los enemigos
enemigos = [
{'pos': [-0.8, 0.7], 'ancho': 0.15, 'alto': 0.08},
{'pos': [0.8, 0.6], 'ancho': 0.18, 'alto': 0.09},
{'pos': [-0.2, 0.8], 'ancho': 0.12, 'alto': 0.07}
]
enemigo_color = (1.0, 1.0, 1.0) # Blanco
def dibujar():
glClear(GL_COLOR_BUFFER_BIT)
dibujar_mar()
dibujar_submarino()
dibujar_torpedos()
for persona_pos in personas_posicion:
dibujar_persona(persona_pos[0], persona_pos[1])
for enemigo in enemigos:
dibujar_enemigo(enemigo)
glutSwapBuffers()
def dibujar_mar():
glColor3fv(mar_color)
glBegin(GL_TRIANGLES)
glVertex2f(-1.0, mar_min_y)
glVertex2f(1.0, mar_min_y)
glVertex2f(1.0, mar_max_y)
glVertex2f(1.0, mar_max_y)
glVertex2f(-1.0, mar_max_y)
glVertex2f(-1.0, mar_min_y)
glEnd()
def dibujar_submarino():
glColor3fv(submarino_color)
glBegin(GL_TRIANGLES)
glVertex2f(submarino_x - submarino_ancho / 2, submarino_y -
submarino_alto / 2)
glVertex2f(submarino_x + submarino_ancho / 2, submarino_y -
submarino_alto / 2)
glVertex2f(submarino_x + submarino_ancho / 2, submarino_y +
submarino_alto / 2)
glVertex2f(submarino_x + submarino_ancho / 2, submarino_y +
submarino_alto / 2)
glVertex2f(submarino_x - submarino_ancho / 2, submarino_y +
submarino_alto / 2)
glVertex2f(submarino_x - submarino_ancho / 2, submarino_y -
submarino_alto / 2)
glEnd()
def dibujar_torpedos():
glColor3fv(torpedo_color)
glBegin(GL_TRIANGLES)
for torpedo in torpedos:
x = torpedo['x']
y = torpedo['y']
glVertex2f(x - torpedo_ancho / 2, y - torpedo_alto / 2)
glVertex2f(x + torpedo_ancho / 2, y - torpedo_alto / 2)
glVertex2f(x + torpedo_ancho / 2, y + torpedo_alto / 2)
glVertex2f(x + torpedo_ancho / 2, y + torpedo_alto / 2)
glVertex2f(x - torpedo_ancho / 2, y + torpedo_alto / 2)
glVertex2f(x - torpedo_ancho / 2, y - torpedo_alto / 2)
glEnd()
glColor3f(0.0, 0.0, 0.0) # Negro
glPointSize(5.0)
glBegin(GL_POINTS)
if torpedo_direccion == 1:
glVertex2f(submarino_x + submarino_ancho / 2.5, submarino_y)
elif torpedo_direccion == -1:
glVertex2f(submarino_x - submarino_ancho / 2.5, submarino_y)
glEnd()
def dibujar_persona(x, y):
glColor3fv(personas_color)
glBegin(GL_TRIANGLES)
glVertex2f(x, y + personas_lado * (np.sqrt(3)/3)) # Vértice superior
glVertex2f(x - personas_lado / 2, y - personas_lado * (np.sqrt(3)/6))
glVertex2f(x + personas_lado / 2, y - personas_lado * (np.sqrt(3)/6))
glEnd()
def dibujar_enemigo(enemigo):
glColor3fv(enemigo_color)
x = enemigo['pos'][0]
y = enemigo['pos'][1]
ancho = enemigo['ancho']
alto = enemigo['alto']
glBegin(GL_TRIANGLES)
glVertex2f(x - ancho / 2, y - alto / 2)
glVertex2f(x + ancho / 2, y - alto / 2)
glVertex2f(x + ancho / 2, y + alto / 2)
glVertex2f(x + ancho / 2, y + alto / 2)
glVertex2f(x - ancho / 2, y + alto / 2)
glVertex2f(x - ancho / 2, y - alto / 2)
glEnd()
def actualizar_estado(value):
global torpedos, torpedo_velocidad, personas_posicion, submarino_salto,
mar_min_y, mar_max_y, enemigos, contador, frecuencia,
personas_rescatadas, submarino_x, submarino_y, submarino_ancho,
submarino_alto, personas_lado, torpedo_ancho, torpedo_alto
nuevos_torpedos = []
for torpedo in torpedos:
torpedo['x'] += torpedo_velocidad * torpedo['direccion']
if -1.1 < torpedo['x'] < 1.1:
nuevos_torpedos.append(torpedo)
torpedos = nuevos_torpedos
contador += 1
if contador >= frecuencia:
contador = 0
for i in range(len(personas_posicion)):
direccion = random.choice(['arriba', 'abajo', 'izquierda', 'derecha'])
nueva_x = personas_posicion[i][0]
nueva_y = personas_posicion[i][1]
if direccion == 'arriba':
nueva_y += submarino_salto
elif direccion == 'abajo':
nueva_y -= submarino_salto
elif direccion == 'izquierda':
nueva_x -= submarino_salto
elif direccion == 'derecha':
nueva_x += submarino_salto
if -1.0 < nueva_x < 1.0 and mar_min_y + 0.1 < nueva_y <
mar_max_y - 0.1:
personas_posicion[i] = [nueva_x, nueva_y]
for enemigo in enemigos:
direccion = random.choice(['arriba', 'abajo', 'izquierda', 'derecha'])
nueva_x = enemigo['pos'][0]
nueva_y = enemigo['pos'][1]
if direccion == 'arriba':
nueva_y += submarino_salto
elif direccion == 'abajo':
nueva_y -= submarino_salto
elif direccion == 'izquierda':
nueva_x -= submarino_salto
elif direccion == 'derecha':
nueva_x += submarino_salto
ancho_enemigo = enemigo['ancho']
alto_enemigo = enemigo['alto']
if -1.0 + ancho_enemigo / 2 < nueva_x < 1.0 - ancho_enemigo / 2
and \
mar_min_y + alto_enemigo / 2 < nueva_y < mar_max_y -
alto_enemigo / 2:
enemigo['pos'] = [nueva_x, nueva_y]
personas_a_rescatar = list(personas_posicion)
for persona_pos in personas_a_rescatar:
persona_x = persona_pos[0]
persona_y = persona_pos[1]
distancia_x = abs(submarino_x - persona_x)
distancia_y = abs(submarino_y - persona_y)
if distancia_x < submarino_ancho / 2 + personas_lado / 2 and
distancia_y < submarino_alto / 2 + personas_lado / 2:
print("¡Persona rescatada!")
personas_rescatadas += 1
if persona_pos in personas_posicion:
personas_posicion.remove(persona_pos)
torpedos_a_eliminar = []
enemigos_a_eliminar = []
for i, torpedo in enumerate(torpedos):
torpedo_x = torpedo['x']
torpedo_y = torpedo['y']
for j, enemigo in enumerate(enemigos):
enemigo_x = enemigo['pos'][0]
enemigo_y = enemigo['pos'][1]
enemigo_ancho = enemigo['ancho']
enemigo_alto = enemigo['alto']
distancia_x = abs(torpedo_x - enemigo_x)
distancia_y = abs(torpedo_y - enemigo_y)
if distancia_x < torpedo_ancho / 2 + enemigo_ancho / 2 and
distancia_y < torpedo_alto / 2 + enemigo_alto / 2:
print("Enemigo destruido")
if i not in torpedos_a_eliminar:
torpedos_a_eliminar.append(i)
if j not in enemigos_a_eliminar:
enemigos_a_eliminar.append(j)
nuevos_torpedos = [torpedo for i, torpedo in enumerate(torpedos) if i not
in torpedos_a_eliminar]
enemigos_restantes = [enemigo for i, enemigo in enumerate(enemigos) if
i not in enemigos_a_eliminar]
torpedos = nuevos_torpedos
enemigos = enemigos_restantes
glutPostRedisplay()
glutTimerFunc(30, actualizar_estado, 0)
def manejar_teclas(key, x, y):
global submarino_x, submarino_y, submarino_salto, mar_min_y,
mar_max_y, torpedo_direccion, torpedos
if key == b'w' or key == b'W':
nueva_y = submarino_y + submarino_salto + submarino_alto / 2
if nueva_y < mar_max_y:
submarino_y += submarino_salto
elif key == b's' or key == b'S':
nueva_y = submarino_y - submarino_salto - submarino_alto / 2
if nueva_y > mar_min_y:
submarino_y -= submarino_salto
elif key == b'a' or key == b'A':
nueva_x = submarino_x - submarino_salto - submarino_ancho / 2
if nueva_x > -1.0:
submarino_x -= submarino_salto
torpedo_direccion = -1
elif key == b'd' or key == b'D':
nueva_x = submarino_x + submarino_salto + submarino_ancho / 2
if nueva_x < 1.0:
submarino_x += submarino_salto
torpedo_direccion = 1
elif key == b' ':
torpedo = {
'x': submarino_x + (submarino_ancho / 2 + torpedo_ancho / 2) *
torpedo_direccion,
'y': submarino_y,
'direccion': torpedo_direccion
}
torpedos.append(torpedo)
glutPostRedisplay()
def main():
glutInit()
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB) # Doble buffering
glutInitWindowSize(ancho_ventana, alto_ventana)
glutCreateWindow(b"Seaquest")
glutDisplayFunc(dibujar)
glutKeyboardFunc(manejar_teclas)
glutTimerFunc(30, actualizar_estado, 0)
glutMainLoop()
if __name__ == "__main__":
main()