Game Programmer

Los postulantes para el área de programación deben poder resolver algunos de los problemas enunciados en esta página.  No es necesario resolver todos los problemas.

Envía tus respuestas con los archivos requeridos en el formulario en https://www.bamtang.com/jobs 

Sobre el Examen

Sobre la Evaluación


1. Cipher

Desencripta el siguiente mensaje:

Bgc-bfufb tegaedppqna ql aggv zge xof tegaedppfe'l lgjb.

Xof adpf vflqanfe logjbvn'x hf pdwqna d cgebv qn coqro xof tbdkfe ql mjlx d lpdbb tdex. Xof tbdkfe QL XOF HGLL; qx'l kgje vjxk xg fnxfexdqn oqp ge ofe.

Zgrjl ql d pdxxfe gz vfrqvqna codx xoqnal kgj def ngx agqna xg vg.

Xof rglx gz dvvqna d zfdxjef qln'x mjlx xof xqpf qx xdwfl xg rgvf qx. Xof rglx dblg qnrbjvfl xof dvvqxqgn gz dn ghlxdrbf xg zjxjef fstdnlqgn. Xof xeqrw ql xg tqrw xof zfdxjefl xodx vgn'x zqaox fdro gxofe. - Mgon Rdepdrw.

(ccc.adpdljxed.rgp/uqfc/nfcl/234346?utkjpvbjr)

(ccc.hedqnkijgxf.rgp/ijgxfl/djxogel/m/mgon_rdepdrw.oxpb)

Si se sabe que solo se han encriptado las letras del alfabeto (a - z).

Para ello ordena las letras del mensaje encriptado de acuerdo al numero de veces que se repiten (de mayor a menor) y compáralo con la tabla de frecuencia de caracteres del lenguaje en que esta escrito este mensaje, que para este caso es:

freqLang = "TEOAISRHNUCMDLGWFPYKJBVQX" (de mas frecuente a menos frecuente)

Implementar la función: decryptMessage( message, freqLang )

Tu programa debe imprimir el texto desencriptado en pantalla.

No uses archivos ni pidas ingresar datos.

Mantener las mayúsculas y minúsculas del mensaje, así como los saltos de linea.

(4 PUNTOS)

2. Laberinto

Crear un generador de laberintos aleatorios de dos dimensiones de tamaño 'n' (n: impar > 3). El punto inicial A siempre se encontrará en la esquina superior izquierda. El punto final B deberá encontrarse al final de la ruta mas larga dentro de tu laberinto generado (que no necesariamente será la esquina superior derecha). El laberinto solo debe tener caminos horizontales y verticales, no diagonales.

Ademas para ir de A a B deberá existir solo un camino posible

Ejemplo:

n = 11 (* = muro, A = inicio, B = fin)  


***********

*A  *    B*

*** * *****

* * * *   *

* * * * * *

*   *   * *

* *** *** *

*   * *   *

*** *** * *

*       * *

***********

Implementar la función: createMaze2D( n ) 

No generar cualquier laberinto, recuerda que se pide un laberinto de un solo camino posible entre A y B.

No se considerán soluciones que generen laberintos con múltiples caminos entre A y B.

(4 PUNTOS)

3. LABERINTO 2D

Usando la solución del problema 3 dibujar el laberinto 2D usando una librería de gráficos en C++ como OpenGL, DirectX, SDL o similares.

No se aceptarán soluciones que usen librerías para interfaces de usuario como: Qt, wxWidgets, MFC, Windows Forms, etc.

(3 PUNTOS)

Agregar la navegación de un carácter de forma circular en el laberinto controlable por el usuario usando las teclas AWSD.

(2 PUNTOS)

Implementar la función: drawMaze2D() 




4. Física

Cree un simulador para disparar pelotas circulares. Considerar por simplicidad un cuarto rectangular cerrado y de gravedad G. Las pelotas son círculos que deben de chocar contra las paredes y entre ellas, luego de un tiempo de estar inmóviles deben desaparecer. 

Para este problema considere coeficientes de fricción y elasticidad convenientes y demás suposiciones que cree necesarias y comentarlas en su código. Su programa debe permitir mover el origen de disparo O y la velocidad y angulo inicial de disparo V. Las pelotas deben ser lanzadas al apretar la tecla de espacio. No usar librerías físicas existentes, pero puedes usar cualquier librería de gráficos realtime existente, como SDL2, SFML, OpenGL, etc. 

Implementar la función: shootBall() 

(7 PUNTOS)

4. Laberinto 3D

Implementar un visor 3D que permita visualizar y navegar los laberintos generados por el problema 3 (Reemplazar cada carácter * de la solución por un cubo y asignarle una textura arbitraria). 

En caso tuvieras experiencia previa programando gráficos puedes considerar agregar funcionalidades para puntaje adicional como movimiento de cámara, colisiones, modelos navegando el laberinto, etc.

Puedes utilizar librerías basadas en OpenGL o DirectX para resolver este problema. Si usas motores gráficos completos para el render (como Unreal, Godot, etc) solo se considerará tu puntaje en base a los adicionales y si está en C++. El objetivo de este problema es hacer el render tu mismo a bajo nivel.

Implementar la función: render3D() 

(11+ PUNTOS)