Pong 1. Este guião é sobre o primeiro jogo electrónico (video game em Inglês), o antepassado remoto (milénio anterior ☺) dos jogos de computador actuais. Podem ver um pouco da história dos jogos de vídeo em http://www.pong-story.com/. O Pong é inspirado obviamente no Ping-Pong, mas joga-se numa mesa com paredes, ou seja, a bola nunca sai fora do recinto rectangular, pelo que se aproxima mais de outros jogos como o Bilhar ou o Squash. Na versão mais simples do Pong, aquela que queremos que você recrie usando Java, há apenas um jogador que joga com uma raquete que se move apenas na horizontal, ao longo da “parede” inferior do recinto (ou seja, paralelamente ao eixo dos xx). Se, quando a bola vem na direcção da parede inferior, não conseguir bater-lhe com a raquete, o jogo termina. O objectivo do jogo é maximizar o tempo de jogo. A bola é lançada inicialmente da posição da raquete por aplicação de uma dada força (para simular o lançamento) e com um ângulo tal que não a faça ir directamente contra a parede inferior. O movimento é uniformemente desacelerado para simular o atrito da bola com a mesa. A bola, por sua vez, tem obviamente componentes de velocidade segundo xx e yy. Repare que quando a bola bate numa parede, a única coisa que faz é mudar o sinal de uma dessas componentes. No caso extremo de bater em ambas as paredes simultaneamente (canto do recinto), então ambas as componentes mudam também simultaneamente de sinal. Considera-se que uma bola bate numa parede quando a distância do seu centro à parede for igual ao raio. 2. Na primeira linha do ficheiro de dados vêm quatro números reais representando as coordenadas (x e y) dos dois cantos na extremidade da diagonal principal do recinto, seguidos de um quinto que representa uma força não nula de atrito da mesa, que tem a mesma direcção e o sentido oposto ao do movimento da bola. Este atrito, que para simplificar se considera constante, provoca um movimento uniformemente desacelerado. Na segunda linha do ficheiro de dados vem a posição inicial (coordenadas x e y), a massa e o raio da bola, tudo números reais. Na terceira e última linha temos dois números reais: a força aplicada e a direcção da mesma em graus (zero graus é o sentido do semi-eixo positivo dos x e os graus crescem no sentido contrário ao dos ponteiros do relógio). Note que, para garantir as regras do jogo indicadas no ponto anterior, este ângulo pertence ao intervalo ]0º, 180º[. Considere, que a velocidade inicial é a que resultaria da aplicação da força de lançamento indicada durante 1 segundo. Este ficheiro de dados é utilizado em todas as tarefas que se seguem. 3. A tarefa A tem como objectivo representar apenas o “filme” do movimento de uma bola no recinto de jogo, sem raquete. Para representar a bola aconselhamos que utilize a classe Ball que herda de MovingParticle (desenvolvida no guião anterior). Não considere o atrito nesta primeira tarefa, ou seja, considere que o movimento é uniforme. Assim sendo, a bola nunca pára. O ficheiro de saída deverá ser constituído por 10 linhas, cada uma correspondendo às coordenadas x e y da bola ao fim, sucessivamente, do 1º, 2º,…, 10º segundos, separadas com um espaço e com duas casas decimais. 4. Na tarefa B o ficheiro de saída deverá conter 10 linhas, cada uma com três números reais separados com um espaço e com duas casas decimais, representando, respectivamente, as coordenadas x e y da bola e o momento (em segundos) dos primeiros 10 impactos da mesma com as paredes. 5. Na tarefa C e em todas as que se seguem considere o atrito. Para já ainda não temos uma raquete e a bola pode bater em todas as paredes livremente. O ficheiro de saída deve ter apenas uma linha, representando as coordenadas x e y da bola, separadas por um espaço, no momento em que ela pára, com duas casas decimais. 6. Na tarefa D o ficheiro de saída tem apenas uma linha contendo o tempo (em segundos, com duas casas decimais) que demora até que a bola bata na parede inferior, ou seja, até acabar o jogo. Caso a bola fique parada antes de atingir a parede inferior, deverá ser escrito o tempo até à imobilização, seguido, com um espaço, da string “STOPPED”. 7. Na tarefa E adicionamos a raquete. Note que a raquete também poderá ser representada pela classe MovingParticle, mas não tem componente de velocidade segundo o eixo dos yy. A raquete desloca-se sobre a parede inferior, ou seja, tem a mesma coordenada y que esta. A nossa raquete é para já controlada automaticamente pelo computador e nunca “falha” ou seja, está sempre à espera da bola no ponto de impacto desta com a parede inferior. Inicialmente está colocada na posição intermédia desta. Quando bate numa bola a raquete fica imediatamente parada. Só inicia o seu deslocamento, uniformemente acelerado, para a posição seguinte (aquela em que “apanha” a bola) no momento em que ocorre a última colisão da bola antes desta se dirigir para a parede inferior. Pode deduzirse que a aceleração da raquete é dada por a = 2d/t2 e que a velocidade que ela tem no momento do impacto é v = 2d/t, onde d é a distância, na horizontal, entre a posição inicial da raquete e o ponto de impacto da bola na raquete e t o tempo que a bola demora desde o último impacto na parede antes de atingir a raquete. Quando a raquete bate na bola esta altera a sua velocidade. Considere o ângulo alfa de impacto da bola na raquete (pertencente ao intervalo ]0º, 90º]). A componente de velocidade segundo xx da raquete vezes o co-seno de alfa é adicionada à componente segundo xx da bola (note que a bola até pode inverter o sentido segundo este eixo). A componente de velocidade segundo yy da raquete vezes o seno de alfa é adicionada à componente segundo yy da bola. 8. A tarefa F é o seu trabalho para as férias de Natal e não implica submissão no mooshak. Pretende-se que, com recurso à biblioteca Swing do Java, substitua a raquete automática por uma manual controlada por duas teclas, para a mover para a esquerda e para a direita, visualizando o jogo. Na 1ª aula prática de Janeiro deverá fazer uma demonstração do jogo. Pode usar a sua imaginação na representação gráfica, permitir que o utilizador escolha cores, alterar os parâmetros carregados do ficheiro de dados, guardar recordes e o que mais lhe der prazer. Bom jogo!