Programação I Engenharia de Computação Prof.ª Claudia Boeres e Prof. Estefhan Dazzi Wandekoken 2010/1 RESOLVENDO PROBLEMAS – Os movimentos do cavalo no xadrez Considere o jogo de xadrez, onde peças são movimentadas em um tabuleiro dividido em 8 linhas e oito colunas. Considere ainda os movimentos do cavalo, a partir de uma dada posição, conforme diagrama a seguir, onde cada possível movimento é designado por mi. No esquema, o cavalo localizado na posição (5, 4) pode fazer oito movimentos, onde o primeiro deles, m1, levaria o cavalo para a posição (7,5). Os movimentos do cavalo 8 7 6 m3 5 m2 m4 m1 4 C 3 m5 2 m8 m6 m7 1 1 2 3 4 5 6 7 8 PROBLEMA 1 Escreva uma função que determina se, a partir de uma dada posição, o cavalo pode ou não realizar o primeiro movimento. Vamos chamá-la de pmov, e denominar seu parâmetro (a posição corrente), de (x, y). Instâncias de pmov INSTÂNCIA RESULTADO pmov (5, 4) True pmov (8, 1) False pmov (1, 1) True pmov (1, 8) False Solução pmov (x, y) = (x + 2 <= 8 ) && (y + 1 <= 8) Testando a solução 8 7 6 5 4 3 2 1 1 2 3 4 5 6 7 8 Estendendo o problema pmov (x, y) = (x + 2 <= 8 ) && (y + 1 <= 8) smov (x, y) = (x + 1 <= 8 ) && (y + 2 <= 8) tmov (x,y) = (x - 1 >= 1 ) && (y + 2 <= 8) qmov (x,y) = (x - 2 >= 1 ) && (y + 1 <= 8) qtmov (x,y) = (x - 2 >=1 ) && (y - 1 >= 1) sxmov (x,y) = (x - 1 >= 1 ) && (y - 2 >= 1) stmov (x,y) = (x + 1 <= 8 ) && (y - 2 >= 1) omov (x,y) = (x + 2 <= 8 ) && (y - 1 >= 1) Identificando abstrações pmov (x,y) = f (x + 2 ) && f( y + 1) smov (x,y) = f (x + 1) && f (y + 2) tmov (x,y) = g (x - 1) && f (y + 2) qmov (x,y) = g (x - 2) && f (y + 1) qtmov (x,y) = g (x - 2) && g (y – 1) sxmov (x,y) = g (x - 1) && g (y – 2) stmov (x,y) = f (x + 1 ) && g (y – 2) omov (x,y) = f (x + 2) && g (y – 1) fw = w <= 8 gw = w >= 1 Análise da solução Clareza - Na medida em que agora está explicitado, que todas as oito funções para verificar os movimentos possuem estrutura semelhante e que todas estão usando funções para verificar a ultrapassagem das bordas; Manutenção - Se nosso tabuleiro mudasse, ou seja, passasse a ter 9 linhas por nove colunas, bastaria alterar a função f e tudo estaria modificado, ao invés de termos que alterar as oito definições. Reuso - As duas funções que testam as bordas poderiam ser usadas para construir funções para avaliar o movimento de outras peças do jogo de xadrez. PROBLEMA 2 Sabemos que para cada posição alguns movimentos podem ser realizados e outros não. Como ordenamos os movimentos no sentido anti-horário, gostaríamos de obter, para uma dada posição, dos movimentos que podem ser realizados, aquele que possui o menor índice. Qual o menor índice de movimento possível? 8 m4 m1 7 6 C3 m5 m5 5 C1 m8 m6 m6 m7 4 3 m2 2 1 m3 m1 m4 C4 1 C2 2 3 4 5 6 7 8 Instâncias de qualmov Instância resultado qualmov 8 1 3 qualmov 8 8 5 qualmov 3 7 1 qualmov 1 1 1 Solução Codificando a solução qualmov (x, y) if pmov x y then 1 else if smov x y then 2 else if tmov x y then 3 else if qmov x y then 4 = else if qtmov x y then 5 else if sxmov x y then 6 else if stmov x y then 7 else if omov x y then 8 else 0 Análise da solução qualmov (x, y) if not (pert x 1 8) || not (pert y 1 8) then 0 else if pmov x y then 1 else if smov x y then 2 else if tmov x y then 3 = else if qmov x y then 4 else if qtmov x y then 5 else if sxmov x y then 6 else 7 where pert x a b = a <= b && x >= a && x <= b REVISITANDO O PROBLEMA 1 Observando a solução encontrada para o problema 1, constatamos que embora a noção de movimento do cavalo seja única, quem precisar saber se um dado movimento é válido, precisará conhecer o nome das oito funções. Embora seja cedo para falarmos de interface homem-máquina, já dá para dizer que estamos sobrecarregando nosso usuário ao darmos oito nomes para coisas tão parecidas. Será que temos como construir uma só função para tratar o problema? Melhorando a interface pmov x y smov x y tmov x y qmov x y mov (m, x, y) qtmov x y sxmov x y stmov x y omov x y Exemplo de avaliação da função mov ? mov 7 3 4 True ? Codificação da Solução mov (m, x, y) = if not (pert m 1 8) || not (pert x 1 8) || not (pert y 1 8) then False else if m == 1 then pmov else if m == 2 then smov else if m == 3 then tmov else if m == 4 then qmov else if m == 5 then qtmov else if m == 6 then sxmov else if m == 7 then stmov else omov where pmov = ... smov = ... tmov = ... ... Análise da solução nova solução <1 1 2 3 4 5 6 7 8 >8 <1 1 2 3 4 5 6 7 8 >8 <1 1 2 3 4 5 6 7 8 >8 Codificação da solução mov (m,x,y) = if not (pert m 1 8)|| not(pert x 1 8) || not(pert y 1 8) then False else if m <= 4 then if m<= 2 then if m== 1 then pmov else smov else if m==3 then tmov else qmov else if m<= 6 then if m==5 then qtmov else sxmov else if m == 7 then stmov else omov where pmov = ... smov = ... tmov = ... ... Número de comparações número de valores esquema binário (número máximo) esquema linear (número médio) 8 4 4 100 50 7 1000 500 10 1000000 500000 20