Tuesday, October 25, 2011

Teste para game developer

Pessoal,

estou refazendo o teste para desenvolvedores de games da Manifesto e por isso, resolvi publicar o antigo. O teste funciona da seguinte maneira:

  1. Marco a entrevista e falo para o candidato ir preparado para pelo menos 1h, provavelmente mais de 2h, de entrevista e teste
  2. Entrevista rápida, nos moldes de templates do gamasutra, como: http://www.gamecareerguide.com/features/739/game_job_interview_questions_and_.php . Essa parte deve continuar mais ou menos como tá no link e como era antes, não faz muito sentido mudar. E aí é seguir os conselhos diversos que existem por aí tanto na formatação de currículo quanto nas respostas das entrevistas. Uma coisa importantíssimas é: se for fazer entrevista, na Manifesto inclusive, trate de aprender bem o que fazemos! Quem somos, com o que trabalhamos, o que fazemos ultimamente, tudo isso pode ser encontrado aqui, no sem cassis, e no blog da manifesto.
  3. A entrevista tem 3 partes. De acordo com o tempo que o candidato vai respondendo as outras partes são reveladas. Se o candidato fizer duas partes, tá no páreo. Se fizer as três bem, tá contratado. Essa dinâmica deve persistir, mudaremos mais o foco das perguntas um pouco. A primeira parte, chamada de estágio, é obrigatória para qualquer programador que queira ser levado a sério. A segunda deve ser respondida por alguém com um pouco de experiência em sistemas interativos. A terceira normalmente só o pessoal que já trabalhou com jogos ou os muito experientes.
  4. Não existem respostas certas ou erradas. O contexto normalmente produz respostas bem diferentes então faz sentido perguntar se o código deve ser otimizado, modularizado, para plataformas com restrições memória (como celular), se será multi-plataforma, etc... A linguagem nunca foi obrigatória, o candidato pode escolher qualquer uma (exceto as perguntas específicas).

Abaixo as perguntas, boa lida.

Game e Test Developers (estágio)

1. Escreva um programa, em qualquer linguagem, que escreve números de 1 a 100. Mas para múltiplos de três, escreve "Fizz" ao invés do número e para múltiplos de cinco escreve "Buzz". Para números que são múltiplos de três e cinco, escreve "FizzBuzz".

2. Implemente um método que retorna um booleano indicando se o parâmetro recebido é um palíndromo.

Um palíndromo é uma string que pode ser lida da esquerda para a direita como da direita para a esquerda. Por exemplo, "abcba" é um palíndromo, "abab" não é. 

3. O que você entende por arquitetura em camadas e como você organizaria, se possível utilizando UML, as classes de um jogo como o breakout. Indique em que camada ficaria cada classe.


Game e Test Developers (júnior)
1.  Imagine que você está implementando um sistema de combates. A regra de combate é dada abaixo:

5% de chance de errar o ataque 10% de chance do oponente desviar o ataque, 5% de chance do oponente bloquear o atack, 12% de acertar um crítico e o restante de acertar.

Como você faria essa implementação para maximizar performance? (descreva em palavras usando código se achar conveniente)

2. Como funciona uma tabela Hash? Dê um exemplo desenhando a seqüência de tabelas Hash obtidas numa tabela de tamanho 13, cuja função hash é dada por H(chave) = chave mod 13, e colisões são resolvidas usando listas, pela inserção das chaves: 52, 78, 48, 61, 81, 120, 79, 121, 92.

3. Em que sentido o FPS impacta na simulação de física, comente os problemas na colisão.


4. Qual a diferença entre um loop frame-based e time-based e quais os impactos (prós e contras) na escolha de um deles.

When we say frame based the code and/or animation is dependent solely on how fast the FPS was set to, with a steady code, reducing the FPS rate will slow down the game and increasing it will hasten it. Time based coding can manage this quite well since everything can be dependent on time so frame rate doesn’t affect it that much.

5. Que problemas de encapsulamento que dificultariam um refactoring no código abaixo:


/**
* From time to time party satisfaction must be calculated
* and the apropriate ajustment made to maintain the desired 
* satisfation value
*/
if(mTimeSinceLastGuest >= mTimeForNextGuest)
{
// reset timer every time the guest number is reviewed
mTimeSinceLastGuest = 0;
mTimeForNextGuest = 15;
if (mGuestManager->isPartyEmpty())
{
// not enough people in the party (didn't met the minimum number of guests)
    mGuestManager->addGuest();
}
}
else
{
mTimeSinceLastGuest += dt;
}

Game e Test Developers (sênior)
1. Explique por que uma pilha é a maneira mais usual de implementar o fluxo de telas em um jogo.


Representação Exemplo de uma pilha

A stack is a last in, first out(LIFO) abstract data type and data structure. A stack can have any abstract data type as an element, but is characterized by only two fundamental operations, the push and the pop. The push operation adds to the top of the list, hiding any items already on the stack, or initializing the stack if it is empty. The pop operation removes an item from the top of the list, and returns this value to the caller. A pop either reveals previously concealed items, or results in an empty list.

2. Qual a melhor maneira de representar uma estrutura de levels de um jogo. Assuma que cada level pode ser: um conjunto de levels (sublevels) ou um level jogável. Explique também como seria a melhor maneira de saber qual o level atual e o próximo a ser jogado.

3. Escreva um código, em qualquer linguagem, para imprimir os nomes dos irmãos e primos de um nó em uma árvore AVL binária balanceada.


Exemplo de árvore AVL balanceada.

Árvore AVL (ou árvore balanceada pela altura) é uma árvore de busca binária auto-balanceada. Uma árvore AVL é dita balanceada quando, para cada nó da árvore, a diferença entre as alturas das suas sub-árvores (direita e esquerda) não é maior do que um. 

4. Descreva, de preferência em UML com pouco código auxiliar, a implementação de um mapa de tiles simples e qual a melhor maneira de fazer a câmera (com zoom e scrool).

5. Em que situações um trecho de código deve ser repassado a uma linguagem de script, como Lua, e não em código baixo nível como C++? DÊ exemplos.

6. [C++]

Quais dessas linhas, comentadas com números, são construções legais em C++ e qual o resultado de cada uma delas:

int arr[10] = {};
int* p0 = arr + 1; // 1
int* p1 = arr + 10; // 2
int* p2 = arr + 11; // 3
int v0 = arr[11]; // 4

int arr2[5];
int* p3 = arr2 + 2;
int diff = p0 - p3; // 5
float* fp = reinterpret_cast<float*>(p0); // 6

int i = 42;
int j = i++ + ++i; // 7

7. [C++]

Você conhece a biblioteca C++ boost? O que você poderia falar sobre smart_pointers ?