Introdução aos Computadores e à Programação 2010/2011, 2º Semestre 1º Trabalho de OCTAVE (atualizada em 4 Abril 2011) Simulação do Jogo do Bingo Introdução Pretende-se simular um torneio de Bingo, embora com algumas variações em relação aos jogos comerciais. Em particular, existem nj jogadores, com 1 cartão cada, de forma quadrada, cada um com dc×dc números (dc linhas e dc colunas). Em cada jogo do torneio, os cartões são distribuídos aleatoriamente pelos jogadores existentes. Por exemplo, um torneio com 6 encontros, pode ser jogado por 5 jogadores, com cartões de 3×3; em cada jogo são gerados 5 cartões, um para cada jogador. Neste contexto, o projeto pretende criar um programa para simular um torneio desta variante de Bingo. Mais especificamente, o programa deverá: • Para cada jogo: a) Gerar aleatoriamente os nj cartões, com números de 1 a nj*dc*dc (no exemplo, 5 cartões com números de 1 a 5*3*3 = 45); b) Gerar uma extração de números, de 1 a nj*dc*dc (no exemplo, de 1 a 45); c) Verificação da obtenção de linhas, colunas, diagonais e cartões completos e atribuir pontos ao jogador respectivo; • Para um torneio: a) Manutenção da pontuação de cada jogador no torneio ao longo dos vários jogos; b) Determinar os ganhos e perdas de cada jogador no fim de todos os jogos do torneio. Para implementar um torneio, o seu programa deverá manter um conjunto de estruturas de dados (vectores e matrizes) com o seguinte significado: Vector E : representa uma extração, sendo diferente para cada jogo; Matriz M: representa os cartões de cada jogo; igualmente diferente para cada jogo; Matriz C: representa a classificação dos jogadores. Atualizada ao longo de cada jogo e ao longo do torneio. As suas linhas representam os jogadores e as suas colunas representam o número de linhas, colunas, diagonais e cartões obtidos pelos vários jogadores em qualquer altura do torneio. A simulação de um torneio vai naturalmente ser feita através da interação de um conjunto de funções, indicadas abaixo, que deverá implementar. • • • 1. Simulação de um Torneio Um torneio é simulado através da função torneio(nj,dc,ne), especificada abaixo, em que nj representa o número de jogadores (assume-se que cada jogador tem um cartão), dc representa o número de linhas e colunas de cada cartão (no caso 3) e ne o número de extrações realizadas no torneio. A função retorna a matriz C de classificação dos vários jogadores e a matriz G dos seus ganhos. function [C,G] = torneio(nj,dc,ne); C = zeros(nj,4); for e = 1:ne [M,E] = iniciar_jogo(nj,dc); R = jogo(M,E,e); C = atualizar(C,R) endfor; G = ganhos(C); endfunction 2. Iniciar um jogo (2+2+1 = 5 val) Neste contexto, pretende implementar-se a função iniciar_jogo, utilizando duas funções auxiliares, extracao e criar_cartoes. 2a. Geração de uma extração (2 val) Uma extração é uma sequência aleatória de números de um intervalo sem repetições. Especifique a função E = extracao(s, k) que retorna um vector de k posições, cujos elementos são todos os números inteiros entre s e s+k-1, distribuídos aleatoriamente. Sugestão: Inicialize o vector E com os números de s a s+k-1 e repita “bastantes” vezes (tipicamente 3 vezes o valor de k) a seguinte operação: a) Obtenha aleatoriamente dois números inteiros i e j, entre 1 e k. c) No vector E, troque o elemento E(i) pelo elemento E(j). 2b. Geração de Cartões (2 val) Os nj cartões de dc×dc posições serão implementados através de uma matriz de dc×(nj*dc) posições (por exemplo de 3×15 para , nj = 5 e dc = 3) . As primeiras dc colunas correspondem ao primeiro cartão, as segundas dc colunas ao segundo cartão, e assim sucessivamente. Implemente a função M = criar_cartoes(nj,dc) que retorna uma matriz M de dc×(nj*dc), com números de 1 a dc*nj*dc, distribuídos aleatoriamente pelas suas posições. Sugestão: Generalize o procedimento anterior para uma matriz de dc×(nj*dc), ou obtenha um vector de dc*nj*dc elementos e transforme-o numa matriz de dc×(nj*dc). 2c. Iniciar um jogo (1 val) Implemente a função [M,E] = iniciar_jogo(nj, dc) utilizando as duas funções auxiliares definidas nos pontos anteriores. 3. Simular um jogo (1+1+1+2+2+4 = 11 val) Neste contexto, pretende implementar-se a função jogo, utilizando as funções auxiliares indicadas abaixo. 3a. Actualiza cartões (1 val) Implemente a função [M,i,j] = posicao(M, E, k) que atualiza o estado da matriz M após a saída do k-ésimo elemento do vector E (que pode ser considerado o k-ésimo número sorteado na extração E). A atualização consiste em detectar na matriz M a linha i e coluna j em se encontra o elemento com valor igual ao k-ésimo elemento do vector E e substitui-lo ( em M) por 0. 3b. Detecta coluna (1 val) Implemente a função jc = coluna(M,i,j) que verifica se a coluna que inclui a posição (i,j) da matriz M se encontra terminada (i.e. todos os elementos da coluna são zero). Se for esse o caso, a função retorna o número jc do jogador que tem esse cartão. Caso contrário a função retorna jc = 0. 3c. Detecta linha (1 val) Implemente a função jl = linha(M,i,j) que verifica se a linha que inclui a posição (i,j) da matriz M se encontra terminada (i.e. todos os elementos da linha são zero). Se for esse o caso, a função retorna o número jl do jogador que tem esse cartão. Caso contrário a função retorna jl = 0. 3d. Detecta diagonal (2 val) Implemente a função jd = diagonal(M,i,j) que verifica se uma diagonal que inclui a posição (i,j) da matriz M se encontra terminada (i.e. todos os elementos da diagonal são zero). Se for esse o caso, a função retorna o número jd do jogador que tem esse cartão. Caso contrário a função retorna jd = 0. 3e. Detecta cartão (2 val) Implemente a função jc = cartao(M,i,j) que verifica se o cartão que inclui a posição (i,j) da matriz M se encontra completo (i.e. todos os seus elementos são zero). Se for esse o caso, a função retorna o número jc do jogador que tem esse cartão. Caso contrário a função retorna jc = 0. 3f. Simula jogo (4 val) Implemente a função R = jogo(M, E, e) que simula o funcionamento do e-ésimo jogo e retorna os resultados num vector R, com 4 elementos, contendo os números dos jogadores que ganharam, respectivamente, a coluna, linha, diagonal e cartão. Utilize na sua definição as funções anteriores. Opcionalmente, e para efeitos de monitoração, utilize a função mostra(M,E,R,e,k,i,j), que mostra no terminal o estado da matriz M após ser sorteado o k-ésimo número da e-ésima extração E, colocado na posição i,j de M, bem como o resultado (provisório) R. 4. Atualizar a pontuação (2 val) Implemente a função C = atualizar(C,R) que atualiza a matriz C, cujas 4 colunas representam o número de colunas, linhas, diagonais e jogos ganhos por cada um dos nj jogadores (um por cada linha), com os resultados R de um jogo. 5. Calcular ganhos (2 val) Implemente a função G = ganhos(C) com os ganhos (e perdas), em euros, dos vários jogadores. Este cálculo deverá ser feito da seguinte forma: por cada jogo um jogador paga 5/nj euros (nj é o número de jogadores). Por cada linha, coluna, diagonal e jogo que faça, um jogador ganha respectivamente 1, 1, 1 e 2 euros. Note que estes valores garantem que um torneio é um jogo de soma 0, ou seja os ganhos de um ou mais jogadores são as perdas dos outros jogadores.