fundamentos da programação · •se o tabuleiro for inválido, gera um erro com a mensagem...

36
Fundamentos da Programação Projeto 1

Upload: others

Post on 27-Jan-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

  • Fundamentos da Programação

    Projeto 1

  • Jogo do galo

  • Jogo do galo

    X

  • Jogo do galo

    X X O

  • Jogo do galo

    X O

    X

  • Jogo do galo

    X O

    X

    X O

    X

    O

  • Jogo do galo

    X O

    X

    X O

    X

    O

    X O

    X

    O

    X

  • Jogo do galo

    X O

    X

    O

    X

    O

  • Jogo do galo

    X O

    X

    O

    X

    O

    X

    X O

    X

    O

    X

    O

  • VitóriaSe o jogador tiver duas das suas peças em linha e uma posição livre nessa linha então deve jogar na posição livre (ganhando o jogo)

    BloqueioSe o adversário tiver duas peças em linha e uma posição livre nessa linha então deve jogar na posição livre (para bloquear o adversário)

    Estratégia

  • BifurcaçãoSe o jogador tiver duas linhas, colunas ou diagonais que se intersectam, onde cada uma contém uma das suas peças e se a posição de interseção estiver livre então deve jogar na posição de interseção (criando duas formas de vencer na jogada seguinte)

    Estratégia

    O

    X

    X

    O

  • Bloqueio de bifurcaçãoSe o adversário tiver apenas uma bifurcação então o jogador deve bloquear a bifurcação (jogar na posição livre da interseção) senão o jogador deve criar um dois em linha para forçar o oponente a defender, desde que a defesa não resulte na criação de uma bifurcação para o adversário

    Estratégia

    O

    X

    X

  • CentroSe a posição central estiver livre então jogar na posição centralCanto opostoSe o adversário estiver num canto e se o canto diagonalmente oposto for uma posição livre então jogar no canto opostoCanto vazioSe um canto for uma posição livre então jogar nesse cantoLateral vazioSe uma posição lateral (que nem é o centro, nem um canto) estiver livre então jogar nessa lateral

    Estratégia

  • Representação interna do jogo• Representado por um tuplo com 3 tuplos de três inteiros

    • Valores dos tuplos 1, -1, 0, representando ‘X’, ‘O’, livre

    ((1, 0, -1), (0, -1, 0), (0, 0, 1))

    • Cada uma das posições é representada internamente por um inteiro seguindo a ordem da esquerda para a direita e de cima para baixo

    ((1, 0, -1), (0, -1, 0), (0, 0, 1))

    1 2 3 4 5 6 7 8 9

    X O

    X

    O

    1 2 3

    4 5 6

    7 8 9

  • Funções a desenvolvereh_tabuleiro: universal → booleano • Recebe um argumento de qualquer tipo e devolve True apenas se o seu

    argumento corresponde a um tabuleiro • Nunca gera erros

  • Funções a desenvolvereh_posicao: universal → booleano• Recebe um argumento de qualquer tipo e devolve True apenas se o seu

    argumento corresponde a uma posição• Nunca gera erros

  • Funções a desenvolverobter_coluna: tabuleiro x inteiro → tuplo• Recebe um tabuleiro e um inteiro com valor de 1 a 3 que representa o número

    da coluna, e devolve um tuplo com os valores dessa coluna• Se algum dos argumentos dados for inválido, a função gera um erro com a

    mensagem ‘obter_coluna: algum dos argumentos e invalido’

  • Funções a desenvolverobter_linha: tabuleiro x inteiro → tuplo• Recebe um tabuleiro e um inteiro com valor de 1 a 3 que representa o número

    da linha, e devolve um tuplo com os valores dessa linha• Se algum dos argumentos dados for inválido, a função gera um erro com a

    mensagem ’obter_linha: algum dos argumentos e invalido’

  • Funções a desenvolverobter_diagonal: tabuleiro x inteiro → tuplo• Recebe um tabuleiro e um inteiro que representa a direção da diagonal, 1 para

    descendente da esquerda para a direita e 2 para ascendente da esquerda para a direita, e devolve um tuplo com os valores dessa diagonal

    • Se algum dos argumentos dados for inválido, a função gera um erro com a mensagem ’obter_diagonal: algum dos argumentos e invalido’

  • Funções a desenvolvertabuleiro_str: tabuleiro → cadeia de carateres• Recebe um tabuleiro e devolve a cadeia de caracteres que o representa (a

    representação externa)• Se o argumento for inválido, gera um erro com a mensagem ’tabuleiro_str: o argumento e invalido’

  • Funções a desenvolvereh-posicao_livre: tabuleiro x posicao → booleano• Recebe um tabuleiro e uma posição, e devolve True apenas se a posição

    corresponde a uma posição livre do tabuleiro • Se algum dos argumentos for inválido, gera um erro com a mensagem ’eh_posicao livre: algum dos argumentos e invalido’

  • Funções a desenvolverobter_posições_livres: tabuleiro → tuplo• Recebe um tabuleiro e devolve o tuplo ordenado por posição com todas as

    posições livres do tabuleiro• Se o argumento for inválido, gera um erro com a mensagem ’obter_posições_livres: o argumento e invalido’

  • Funções a desenvolverjogador_ganhador: tabuleiro → inteiro• Recebe um tabuleiro e devolve um inteiro que indica o jogador que ganhou: 1

    se ganhou o jogador ’X’, -1 o jogador ’O’, ou 0 se não houve vencedor• Se o argumento for inválido, gera um erro com a mensagem ’jogador_ganhador: o argumento e invalido’

  • Funções a desenvolvermarcar_posicao: tabuleiro x inteiro x posicao → tabuleiro• Recebe um tabuleiro, um inteiro identificando um jogador (1 para ’X’ ou -1 ’O’) e uma posição livre, e devolve o tabuleiro modificado com a marca do jogador nessa posição

    • Se algum dos argumentos for inválido, gera um erro com a mensagem ’marcar_posicao: algum dos argumentos e invalido’

  • Funções a desenvolverescolher_posição_manual: tabuleiro → posicao• Lê uma posição introduzida manualmente pelo jogador humano e devolve essa

    posição• Se o tabuleiro for inválido, gera um erro com a mensagem ’escolher_posição_manual: o argumento e invalido’

    • A função apresenta a mensagem ’Turno do jogador. Escolha uma posicao livre: ’, para pedir ao utilizador para introduzir uma posição livre

    • Assuma que o utilizador introduz sempre um inteiro. Se o valor introduzido não corresponder a uma posição livre, gera um erro com a mensagem ’escolher_posição_manual: a posicao escolhida e invalida’

  • Funções a desenvolverescolher_posição_manual: tabuleiro → posicao

  • Funções a desenvolverescolher_posicao_auto: tabuleiro x inteiro x cadeia de carateres → posicao• Recebe um tabuleiro, um inteiro identificando um jogador (1 para ’X’ ou -1

    para ’O’) e uma cadeia de carateres correspondente a uma estratégia, e devolve a posição escolhida automaticamente de acordo com a estratégia selecionada

    • Se algum dos argumentos for inválido, gera um erro com a mensagem ’escolher_posicao_auto: algum dos argumentos e invalido’

  • Funções a desenvolverescolher_posicao_auto: tabuleiro x inteiro x cadeia de carateres → posicaoEstratégias:• ’basico’: considera, por ordem, os critérios 5, 7 e 8 descritos nas secção 1.2• ’normal’: considera, por ordem, os critérios 1, 2, 5, 6, 7 e 8 descritos nas

    secção 1.2• ’perfeito’: segue uma abordagem perfeita, de acordo com a estratégia

    completa descrita na secção 1.2Sempre que houver mais do que uma posição que cumpra um dos critérios, escolhe a primeira posição seguindo a numeração das posições

  • Funções a desenvolver

  • Funções a desenvolverjogo_do_galo: cadeia de carateres2 → cadeia de carateres• Permite jogar um jogo completo do Galo com um jogador contra o computador• O jogo começa sempre com o jogador ’X’ a marcar uma posição livre e

    termina quando um dos jogadores vence ou não existem posições livres no tabuleiro

    • Recebe duas cadeias de caracteres e devolve o identificador do jogador ganhador (’X’ ou ’O’). Em caso de empate, devolve ’EMPATE’

  • Funções a desenvolverjogo_do_galo: cadeia de carateres2 → cadeia de carateres• O primeiro argumento corresponde à marca (’X’ ou ’O’) que o jogador

    humano deseja utilizar• O segundo argumento seleciona a estratégia utilizada pelo computador• Se algum dos argumentos for inválido, gera um erro com a mensagem ’jogo_do_galo: algum dos argumentos e invalido’

    • Quando for o turno do computador, a função apresenta a mensagem ’Turno do computador ()’

    • corresponde à cadeia de caracteres passada como argumento

  • Condições de realização e prazos• A entrega efetuada exclusivamente por via eletrónica através do Mooshak, até

    às 17:00 do dia 23 de Novembro de 2020• Deverá submeter um único ficheiro com extensão .py contendo todo o código

    do projeto. A primeira linha deve conter um comentário com o número e o nome do aluno

    • No seu ficheiro não podem ser utilizados caracteres acentuados ou qualquer outro não pertencente à tabela ASCII. Programas que não cumpram este requisito serão penalizados em três valores

    • Não é permitida a utilização de qualquer módulo ou função não disponível built-in no Python 3

  • Condições de realização e prazos• Pode haver uma discussão oral do trabalho e/ou uma demonstração do

    funcionamento do programa (será decidido caso a caso)• No Técnico, a fraude académica é levada muito a sério e a cópia numa prova

    (projetos incluídos) leva à reprovação na disciplina e o levantamento de um processo disciplinar• Todos os projetos são comparados automaticamente para a deteção de fraudes (incluindo

    Alameda e Tagus)

    • O corpo docente é́ o único juiz do que se considera ou não copiar num projeto

  • Recomendações e aspetos a evitar• Leia todo o enunciado, procurando perceber o objetivo das várias funções• No desenvolvimento, comece por escrever as funções pela ordem apresentada

    no enunciado• Teste as suas funções com os exemplos fornecidos como casos de teste• Não se esqueça da Lei de Murphy

    • Todos os problemas são mais difíceis do que parecem• Tudo demora mais tempo do que nós pensamos• Se alguma coisa puder correr mal, ela vai correr mal, na pior das alturas

    possíveis

  • Recomendações e aspetos a evitar• Não duplique código

    • Se duas funções são muito semelhantes é natural que estas possam ser fundidas numa única, eventualmente com mais argumentos

    • Funções excessivamente grandes são penalizadas no que respeita ao estilo de programação

    • A atitude “vou pôr agora o programa a correr de qualquer maneira e depois preocupo-me com o estilo” é totalmente errada

    • Quando o programa gerar um erro, preocupe-se em descobrir qual a causa do erro• As “marteladas” no código têm o efeito de distorcer cada vez mais o código