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.
Download

1º Trabalho