Você está na página 1de 17

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

Linguagem de Programao Segundo Trabalho Prtico - Haskell

O JOGO CRIPTO GAME

Alunos: Janniele Soares Israel Emerick Correa Thiago Lage Professor: Rodrigo Geraldo Ribeiro

Joo Monlevade Novembro 2010

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

1. INTRODUO

O trabalho descreve um jogo Cripto Game na qual o jogador dever descobrir qual cdigo foi gerado pelo computador no menor nmero de rodadas possveis. No jogo possvel que o jogador desista e visualize a quantidade de tentativas. Em cada jogo o
computador gera um cdigo de quatro dgitos, onde cada um destes dgitos deve ser um valor de um a seis, o jogo trata as possibilidades de o jogador fazer uma tentativa com nmeros ou quantidades invlidas. A cada rodada, o decifrador devera adivinhar qual foi o cdigo produzido pelo computador. Ao final de uma rodada, o computador informa uma pontuao que permite ao decifrador determinar o quanto sua tentativa esta prxima do cdigo produzido pelo computador. A pontuao composta de dois valores: Acertos Completos: indicam a quantidade de dgitos corretos na posio correta informada pelo decifrador. Acertos Parciais: indicam a quantidade de dgitos corretos, mas que no esto na posio correta no palpite do decifrador. De acordo com o que est definido, o jogo termina quando o nmero de acertos completos igual a quatro ou quando o decifrador desiste.

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

2. DESCRIO DOS MDULOS E SUAS INTERDEPENDNCIAS

O bloco MAIN composto por declaraes de constantes, nele foi importado duas bibliotecas, System.Random e System.IO uma para usar a funo randoms e a outra para usar a funo hFlush.

A funo main, ir retornar um IO String, ela depende da funo generateSolution e da funo loop.

A funo generateSolution usa a funo randoms e gera um vetor aleatrio de 1 (um) a 6 (seis) de tamanho 4 (quatro ).

A funo loop recebe uma soluo, um inteiro e retorna um IO String para a funo main. Ela tem dependncia coma funo input, report e check, ela ser responsvel para fazer a verificao se o decifrador desistir do jogo e tambm responsvel por mostrar o numero de tentativas do decifrador.

A funo input responsvel para emitir uma mensagem ao decifrador para que ele informe os 4(quatro) dgitos de 1(um) a 6(seis) para sua tentativa. Ele utiliza funo hFlush e tem dependncia com as funes chama e converte.

A funo chama responsvel para verificar a estrutura da tentativa informada pelo decifrador, se tem a quantidade de dgitos permitida e se o intervalo de nmeros vlido ou no foi digitado algum caractere invlido, essa funo tem dependncia verificaDesistencia, verificaDigitos e verificaQuantidade.

A funo verificaDesistencia, verifica se o valor digitado 0 (zero), pois caso tenha mesmo estando fora do intervalo ele pode ser informado pois a nossa condio de desistncia.

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

A funo verificaDigitos, responsvel por verificar se o vetor informado contm somente dgitos de 1(um) a 6(seis). Para isso foi criado um vetor chamado lista que contm todos os nmeros vlidos e fazemos a comparao com ele. Essa funo tem dependncia com a funo ver.

A funo ver responsvel por fazer a comparao dgito a dgito e retorna para a funo verificaDigitos True ou False caso o dgito seja vlido ou no.

A funo verificaQuantidade, responsvel por verificar se o tamanho do vetor informado vlido ou no. Essa funo possui dependncia com a funo tamanho.

A funo tamanho calcula o tamanho do vetor e retorna o tamanho para a funo verificaQuantidade.

A funo converte responsvel por receber um vetor de String e retornar um vetor de inteiros. Essa funo tem dependncia com a funo readInt.

A funo readInt responsvel por pegar uma string e retorn-la como inteiro para a funo converte.

A funo report responsvel para emitir mensagens ao decifrador, como a quantidade de dgitos completos (Black), a quantidade de dgitos parciais (white), informar caso ele no tenha informado um dgito vlido ou uma quantidade vlida, e imprimir uma mensagem de vitria caso acerte. Ela tem dependncia com as funes complete, partial e show.

A funo show uma funo do haskell que mostra o valor na tela como string.

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

A funo complete responsvel por verificar a quantidade de dgitos informados na tentativa igual soluo gerada pelo sistema e est na mesma posio correspondente.

A funo partial responsvel por verificar a quantidade de dgitos informados na tentativa que igual soluo gerada pelo sistema, mas que no est na mesma posio correspondente. Ela tem dependncia com as funes, verifica1, verifica2, verifica3 e verifica4.

As funes verifica1, verifica2, verifica3 e verifica4 so responsveis por verificar se pode retornar 1(um) para a funo partial caso tenha um item que esteja na soluo gerada mas que no esteja na posio, para isso foi necessrio verificar se esse dgito j correspondeu algum outro dgito do vetor da tentativa.

A funo check responsvel por retornar para a funo uma tupla de inteiro, inteiro e bool com a quantidade de dgitos complete, partial e true caso tenha acertado todos os dgitos ou false caso contrrio, essa funo tem dependncia com a funo complete, partial e a utilizamos para retornar para a funo reporte os valores de parmetros que ela precisa.

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

3. DESCRIO DO FORMATO DE ENTRADA DE DADOS

O formato de entrada de dados para o programa inicialmente uma string, e para cada funo temos um formato de entrada.

loop: recebe uma soluo (vetor de inteiro com 4(quatro) dgitos e um inteiro chama: recebe um vetor de inteiros converte: recebe um vetor de string readInt: recebe uma string report: recebe uma tupla de inteiro, inteiro e booleano. complete: recebe dois vetores de inteiros. partial: recebe dois vetores de inteiros. verifica1, verifica2, verifica3 e verifica4: recebe dois vetores de inteiros check: recebe dois vetores de inteiros verificaDesistencia: recebe um vetor de inteiros verificaDigito: recebe um vetor de inteiros verificaQuantidade: recebe um vetor de inteiros tamanho: recebe um vetor de inteiros ver: recebe um vetor de inteiros e um inteiro input geneateSolution e main: no recebem nada s retornam

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

4. DESCRIO DO FORMATO DE SAIDA DE DADOS

O formato de sada de dados do programa uma string, atravs de uma mensagem, mas para todas funes temos o formato de sada.

main: retorna um IO String generateSolution: retorna uma soluo loop: retorna um IO String input: retorna um IO [Int] chama: retorna um IO [Int] converte: rentorna um [Int] readInt: retorna um Int report: retorna um String complete: retorna um Int partial: retorna um Int verifica1, verifica2, verifica3 e verifica4: retorna um Int check: retorna uma tupla de inteiro, inteiro e booleano. verificaDesistencia: retorna um booleano verificaDigito: retorna um booleano verificaQuantidade: retorna um booleano tamanho: retorna um Int ver: retorna um booleano

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

5. COMO UTILIZAR O PROGRAMA

O programa foi criado de forma simples, para utiliz-lo da seguinte maneira.

1 PASSO: abra o arquivo CriptoGameteste.hs e digite main. 2 PASSO: informe os 4 (quatro) dgitos separados por espao e tecle enter quantas vezes desejar at acertar ou no. 3 PASSO: voc poder desistir de decifrar informando 0 (zero) 4 PASSO: caso tenha acertado o sistema lhe informar e encerrar o loop sozinho. 5 PASSO: caso queira saber o valor gerado pelo programa digite generateSolution. 6 PASSO: para gerar uma nova seqncia recompile o programa.

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

6. FONTE -- _______________________MAIN___________________________________ module Main where import System.Random -- for randoms import System.IO type Row = [Int] type Guess = Row type Solution = Row values = 6 c=1 width = 4 -- for hFlush

main :: IO String main = do s <- generateSolution -- initialization loop s c -- game loop

generateSolution = do g <- getStdGen let rs = take width (randoms g) return (map ((+1) . (`mod` values)) rs)

--Faz o controle do loop das tentativas do decifrador e encerra o jogo. loop :: Solution -> Int -> IO String loop s c= do i <- input -- read (and parse) the user input

putStr(report(check s i) ++ " Tentativas: " ++show(c))

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

if(i == [0]) then return("O usuario Desistiu do jogo!") else do if ((check s i) == (4,0,True)) then return(report(check s i)) else do a <- loop s (c+1) return(a) --____________________________INPUT______________________________ --exibe mensagem ao decifrador, recebe as tentativas e converte para inteiro input :: IO [Int] input = do putStr "\nInforme os valores separados por espaco. " hFlush stdout l <- getLine chama(converte (words l))

--reponsavel por verificar validade do vetor informado chama :: [Int] -> IO [Int] chama l | verificaDesistencia(l) = return(l) |(verificaDigitos(l) && verificaQuantidade(l)) = return(l) |otherwise = return([])

--reponsavel pela conversao do vetor de string em inteiros converte :: [String] -> [Int] converte [] = [] converte (x:xs) = (readInt x ):(converte(xs))

readInt :: String -> Int readInt x = case reads x of

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

[(n, "")] -> n _ -> -1

--____________________________REPORT____________________________ --remete ao usuario a informao da pontuao de sua tentativa report :: (Int, Int, Bool) -> String report (0,0,True) = "Ou voce informou numero incorretos 1 a 6 ou a quantidade de digitos esta invalida!!!" report (complete, partial, correct) |correct == True = show(complete) ++ " black " ++ show(partial) ++ " white Congratulations!!!" |otherwise = show(complete) ++ " black " ++ show(partial) ++ " white "

--________________________COMPLETE______________________________ -- retorna a quantidade de dgitos completos complete :: [Int] -> [Int] -> Int complete [] _ = 0 complete _ [] = 0 complete (x:xs) (y:ys) | x == y = 1+ complete xs ys | otherwise = 0 + complete xs ys

--_______________________PARTIAL_________________________________ --retorna a quantidade de dgitos parciais partial :: [Int] -> [Int] -> Int partial [] _ = 0 partial _ [] = 0 partial _ [0] = 0

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

partial (x:y:w:z:[]) (a:b:c:d:[]) = (verifica1 (x:y:w:z:[]) (a:b:c:d:[]) ) + (verifica2 (x:y:w:z:[]) (a:b:c:d:[]) ) + (verifica3 (x:y:w:z:[]) (a:b:c:d:[]) ) + (verifica4 (x:y:w:z:[]) (a:b:c:d:[]) )

verifica1 :: [Int] -> [Int] -> Int verifica1 (x:y:w:z:[]) (a:b:c:d:[]) | (x/=a) && (((x==b) && (y/=b)) || ((x==c) && (w/=c)) || ((x==d) && (z/=d))) = 1 | otherwise = 0

verifica2 :: [Int] -> [Int] -> Int verifica2 (x:y:w:z:[]) (a:b:c:d:[]) | (y/=b) && (((y==a) && (x/=a)) || ((y==c) && (w/=c) && ((x/=c) || (x==a) || (x==b) || (x==d))) || ((y==d) && (z/=d) && ((x/=d) || (x==a) || (x==b) || (x==c))) ) = 1 | otherwise = 0

verifica3 :: [Int] -> [Int] -> Int verifica3 (x:y:w:z:[]) (a:b:c:d:[]) | (w/=c) && (((w==a) && (x/=a) && ((y/=a) || (y==b) || (y==c) || (y==d))) || ((w==b) && ((x/=b) || (x==a) || (x==b) || (x==c)) && (y/=b)) || ( (w==d) && ((x/=d) || (x==a) || (x==c) || (x==b)) && ((y/=d) || (y==b) || (y==a) || (y==c)) && (z/=d))) = 1 | otherwise = 0

verifica4 :: [Int] -> [Int] -> Int verifica4 (x:y:w:z:[]) (a:b:c:d:[]) | (z/=d) && ( ( (z==a) && ( (x/=a) && ((y/=a) || (y==b) || (y==d) || (y==c)) && ((w/=a) || (w==c) || (w==b) || (w==d)) )) || ( (z==b) && (

((x/=b) || (x==a)) && (y/=b) && ((w/=b) || (w==c) || (w==a)) ) ) || ( (z==c)

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

&& ( ((x/=c) || (x==a) || (x==b) || (x==c)) && ((y/=c) || (y==b) || (y==a) || (y==d)) && (w/=c)))) = 1 | otherwise = 0

--_____________________________CHECK_____________________________ -- retorna uma tupla com a verificao de dgitos completos e parciais da tentativa check :: [Int] -> [Int] -> (Int, -- number of complete points, Int, -- number of partial points Bool) -- all-correct guess? check (x:xs) [] = (0,0,True) check (x:xs) (y:ys) | complete (x:xs) (y:ys) == 4 = (complete (x:xs) (y:ys) , 0 , True) | otherwise = (complete (x:xs) (y:ys), partial (x:xs) (y:ys) , False)

--_______________________VERIFICACOES_____________________________ --verifica desistencia, quantidade e validade dos dgitos verificaDesistencia :: [Int] -> Bool verificaDesistencia (x:xs) | x == 0 = True | otherwise = False

verificaDigitos :: [Int] -> Bool verificaDigitos [] = True verificaDigitos (x:xs) | True /= (ver lista x) = False | otherwise = verificaDigitos xs

verificaQuantidade :: [Int] ->Bool verificaQuantidade [] = False

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

verificaQuantidade (x:xs) | tamanho(x:xs) /= 4 = False | otherwise = True

tamanho :: [Int] -> Int tamanho [] = 0 tamanho(x:xs) = 1+(tamanho xs)

lista = [1,2,3,4,5,6]

ver ::[Int] -> Int -> Bool ver [] y = False ver (x:xs) y | y == x = True | y /= x = ver xs y | otherwise = False -- ______________________________________________________________

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

7. TESTES REALIZADOS

TESTE 1
Informe os valores separados por espaco. 1 2 3 1 black 0 white Tentativas: 0 Informe os valores separados por espaco. 1 1 1 0 black 0 white Tentativas: 0 Informe os valores separados por espaco. 2 2 2 3 black 0 white Tentativas: 0 Informe os valores separados por espaco. 3 3 3 0 black 0 white Tentativas: 0 Informe os valores separados por espaco. 4 4 4 0 black 0 white Tentativas: 0 Informe os valores separados por espaco. 5 5 5 1 black 0 white Tentativas: 0 Informe os valores separados por espaco. 1 3 3 0 black 0 white Tentativas: 0 Informe os valores separados por espaco. 3 5 3 0 black 1 white Tentativas: 0 Informe os valores separados por espaco. 2 2 2 3 black 0 white Tentativas: 0 Informe os valores separados por espaco. 5 2 2 2 black 2 white Tentativas: 0 Informe os valores separados por espaco. 2 5 2 2 black 2 white Tentativas: 0 Informe os valores separados por espaco. 2 2 5 4 black 0 white Congratulations!!! Tentativas: Congratulations!!!" 4 1 2 3 4 5 3 3 2 2 2 2 0"4 black 0 white

TESTE2
Informe 0 black Informe 1 black Informe 0 black Informe 1 black Informe 0 black Informe 0 black Informe 1 black Informe 1 black os valores separados 1 white Tentativas: os valores separados 0 white Tentativas: os valores separados 0 white Tentativas: os valores separados 0 white Tentativas: os valores separados 0 white Tentativas: os valores separados 3 white Tentativas: os valores separados 2 white Tentativas: os valores separados 2 white Tentativas: por 0 por 0 por 0 por 0 por 0 por 0 por 0 por 0 espaco. 1 2 3 4 espaco. 4 3 2 1 espaco. 1 1 1 1 espaco. 2 2 2 2 espaco. 3 3 3 3 espaco. 2 5 6 2 espaco. 2 6 5 3 espaco. 2 5 4 6

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

Informe os valores separados por espaco. 5 2 6 1 black 2 white Tentativas: 0 Informe os valores separados por espaco. 5 5 5 1 black 0 white Tentativas: 0 Informe os valores separados por espaco. 6 6 6 2 black 0 white Tentativas: 0 Informe os valores separados por espaco. 4 4 4 0 black 0 white Tentativas: 0 Informe os valores separados por espaco. 3 3 3 0 black 0 white Tentativas: 0 Informe os valores separados por espaco. 2 5 6 1 black 3 white Tentativas: 0 Informe os valores separados por espaco. 5 2 6 2 black 2 white Tentativas: 0 Informe os valores separados por espaco. 6 2 6 0 black 4 white Tentativas: 0 Informe os valores separados por espaco. 5 6 2 4 black 0 white Congratulations!!! Tentativas: Congratulations!!!"

4 5 6 4 3 6 6 5 6 0"4 black 0 white

TESTE 3
Informe os valores separados por espaco. Ou voce informou numero incorretos 1 a 6 esta invalida!!! Tentativas: 0 Informe os valores separados por espaco. 0 black 2 white Tentativas: 0 Informe os valores separados por espaco. 1 black 0 white Tentativas: 0 Informe os valores separados por espaco. 0 black 0 white Tentativas: 0 Informe os valores separados por espaco. 1 black 0 white Tentativas: 0 Informe os valores separados por espaco. 1 black 0 white Tentativas: 0 Informe os valores separados por espaco. 1 black 0 white Tentativas: 0 Informe os valores separados por espaco. 0 black 4 white Tentativas: 0 Informe os valores separados por espaco. 2 black 2 white Tentativas: 0 Informe os valores separados por espaco. 1 black 3 white Tentativas: 0 Informe os valores separados por espaco. 1 black 3 white Tentativas: 0 Informe os valores separados por espaco. 1 black 3 white Tentativas: 0 Informe os valores separados por espaco. 1 black 3 white Tentativas: 0 Informe os valores separados por espaco. 4 5 6 7 ou a quantidade de digitos 4 5 6 3 3 3 3 3 4 4 4 4 5 5 5 5 1 1 1 1 2 2 2 2 3 5 1 2 5 3 2 1 5 3 1 2 3 5 2 1 5 3 1 2 5 2 3 1 5 3 2 1

UNIVERSIDADE FEDERAL DE OURO PRETO Campus Joo Monlevade

2 black Informe 1 black Informe 1 black Informe 2 black Informe 4 black

2 white Tentativas: 0 os valores separados por espaco. 1 3 2 3 white Tentativas: 0 os valores separados por espaco. 5 3 3 1 white Tentativas: 0 os valores separados por espaco. 2 3 3 0 white Tentativas: 0 os valores separados por espaco. 2 3 5 0 white Congratulations!!! Tentativas:

5 3 3 1 0"4 black 0 white

Congratulations!!!"

Você também pode gostar