Projecto 1

Q1. Porque é que no enunciado é dito que, em caso de vitória sobre o jogador automático, a mensagem a escrever é "Parabens, ganhou ao jogador automatico.", mas no teste respectivo aparece um ponto de exclamação?

De facto, trata-se de uma gralha no enunciado. Onde está "Parabens, ganhou ao jogador automatico." deverá ler-se "Parabens, ganhou ao jogador automatico!".

Projecto 2

Q1. Porque é que o meu projecto falha alguns testes devido à representação gráfica?

De facto, trata-se de uma gralha no ficheiro auxiliar fornecido, em particular na função desenha_tabuleiro. O código referente a essa função deverá ser substituído pelo código:

# -- Transformador de saida -- #

def desenha_tabuleiro(t):
    ''' desenha_tabuleiro : tabuleiro -> {}
        desenha_tabuleiro(t) desenha o tabuleiro de jogo t para o ecra.'''
    
    DESENHOS = {'TOPO'     : ('+---+','|   |','|   |'),
                'FUNDO'    : ('|   |','|   |','+---+'),
                'ESQUERDA' : ('+----','|    ','+----'),
                'DIREITA'  : ('----+','    |','----+'),
                'TOPOESQ'  : ('+----','|    ','|    '),
                'TOPODIR'  : ('----+','    |','    |'),
                'FUNDOESQ' : ('|    ','|    ','+----'),
                'FUNDODIR' : ('    |','    |','----+'),
                'CENTRO'   : ('+---+','|   |','+---+'),
                'ESPACO'   : ('     ','     ','     ')}    
    
    desenho = [[0] * 4, [0] * 4, [0] * 4, [0] * 4, [0] * 4]

    print('\n      1    2    3    4    ')
    print('   ---------------------- ')
    
    for l in range(N_LINHAS):
        s1 = ''
        s2 = ''
        s3 = ''
        
        for c in range(N_COLUNAS):
            
            if desenho[l][c] == 0:
                p = tabuleiro_posicao(t, cria_coordenada(l + 1, c + 1))
                                
                if p == ESPACO:
                    desenho[l][c] = 'ESPACO'
                elif peca_tipo(p) == PECA_I:
                    desenho[l][c] = 'TOPO'
                    desenho[l+1][c] = 'FUNDO'
                elif peca_tipo(p) == PECA_U:
                    desenho[l][c]     = 'ESQUERDA'
                    desenho[l][c+1]   = 'DIREITA'
                elif peca_tipo(p) == PECA_O:
                    desenho[l][c]     = 'TOPOESQ'
                    desenho[l+1][c]   = 'FUNDOESQ'
                    desenho[l][c+1]   = 'TOPODIR'
                    desenho[l+1][c+1] = 'FUNDODIR'
                elif peca_tipo(p) == PECA_S:
                    desenho[l][c]     = 'CENTRO'
                else:
                    raise ValueError ('desenha_tabuleiro: problema a aceder a tabuleiro')
                    
            s1 = s1 + DESENHOS[desenho[l][c]][0]
            s2 = s2 + DESENHOS[desenho[l][c]][1]
            s3 = s3 + DESENHOS[desenho[l][c]][2]

        print('  |', s1, '| ')
        print(l+1, '|', s2, '|', l+1)
        print('  |', s3, '|')    
    
    print('   ------          ------ ')
    print('      1    2    3    4    ')
    
# - Fim: desenha_tabuleiro

Em alternativa, pode descarregar o ficheiro auxiliar corrigido na Secção Projecto.

Q2. O que é que a função cria_tabuleiro deve devolver?

O que a função cria_tabuleiro deve devolver depende da representação interna escolhida para o tipo tabuleiro.

De salientar, no entanto, que a manipulação dos elementos do tipo tabuleiro (quer em termos de operações básicas, quer em termos das demais funções do projecto) fica significativamente facilitada se puder tirar partido das funções do tipo peca para manipular as peças num tabuleiro. Assim, poderá ser útil (embora, claro, não obrigatório) escolher uma representação interna para o tipo tabuleiro em termos de peças, e não em termos do conteúdo do ficheiro correspondente.