0% encontró este documento útil (0 votos)
23 vistas11 páginas

Código de Juego Seaquest en Python

El documento describe un juego llamado 'Seaquest' donde el jugador controla un submarino que debe rescatar personas y destruir enemigos disparando torpedos. Incluye el código fuente en Python utilizando OpenGL para la representación gráfica y la lógica del juego, como el movimiento de personajes y la interacción entre el submarino, las personas y los enemigos. Se detallan las propiedades visuales y de movimiento de los elementos del juego, así como las funciones para dibujar y actualizar el estado del juego.

Cargado por

Emilio Chávez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
23 vistas11 páginas

Código de Juego Seaquest en Python

El documento describe un juego llamado 'Seaquest' donde el jugador controla un submarino que debe rescatar personas y destruir enemigos disparando torpedos. Incluye el código fuente en Python utilizando OpenGL para la representación gráfica y la lógica del juego, como el movimiento de personajes y la interacción entre el submarino, las personas y los enemigos. Se detallan las propiedades visuales y de movimiento de los elementos del juego, así como las funciones para dibujar y actualizar el estado del juego.

Cargado por

Emilio Chávez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

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()

También podría gustarte