Python 06: Adiviña o número
Neste apartado imos facer un programiña que se basea no aprendido anteriormente e o leva un paso máis alá. Imos aplicar a función randint para que o ordenador escolla un número entre 1 e 20 e imos concederlle ao usuario seis intentos para conseguir adiviñalo. Ademais, o ordenador aplicará comparacións para darlle pistas ao xogador e dicirlle se se pasa por arriba ou por abaixo do número segredo.
O código do programa:
1. #Este e un xogo de adivinhar un numero
2. import random
3.
4. intentos=0
5.
6. print('Ola! Cal é o teu nome?')
7. meuNome = input()
8.
9. numero=random.randint(1,20)
10. print('Bon, '+meuNome+', estou a pensar nun número entre 1 e 20.')
11.
12. while intentos<6:
13. print ('Adivíñao!')
14. adivinha=input()
15. adivinha=int(adivinha)
16.
17. intentos=intentos+1
18.
19. if adivinha<numero:
20. print ('Demasiado pequeno!')
21.
22. if adivinha>numero:
23. print('Demasiado grande!')
24.
25. if adivinha==numero:
26. break
27.
28. if adivinha==numero:
29. intentos=str(intentos)
30. print('Fantabuloso, '+meuNome+', acertaches o número en só '+intentos+' intentos. Estarás orgulloso-a!')
31.
32. if adivinha!=numero:
33. numero=str(numero)
34. print('Que fatalidade! Eu estaba a pensar no '+numero)
Garda o programa coa extensión .py e próbao.
O resultado:
Se escribiches todo correctamente, o resultado tivo que darche algo coma isto:
Por partes:
A primeira e segunda liñas xa as coñeces do apartado anterior, son un comentario e a sentencia de importación do módulo random. Coma sempre, deixamos liñas en branco para facilitar a lectura.
1. #Este e un xogo de adivinhar un numero
2. import random
3.
Na cuarta liña declaramos unha variable intentos e lle asignamos o valor 0. Esta variable a creamos porque precisamos levar conta dos intentos que fai o xogador, xa que só lle imos permitir 6.
4. intentos=0
As liñas 6 e 7 serven para facer a presentación, coma ti xa sabes.
6. print('Ola! Cal é o teu nome?')
7. meuNome = input()
Na liña 9 facemos que o ordenador pense un número entre 1 e 20 con random.randint(1,20) e gardamos o resultado na variable numero. Na liña 10 imprimimos o saúdo e a proposta de xogo.
9. numero=random.randint(1,20)
10. print('Bon, '+meuNome+', estou a pensar nun número entre 1 e 20.')
O bucle while:
A sentenza while que aparece na liña 12 dá comezo a un bucle, unha parte de código que se executa sempre que se cumpla unha condición. "While", en inglés, significa "mentres que", ou sexa que a liña lle indica ao ordenador que "mentres que intentos sexa menor que 6, fai todo o que ven debaixo. Se intentos é igual ou maior que 6, sáltate todo o que ven debaixo". Bon non todo o que ven debaixo senón todo o que está incluído dentro do bucle, que son as liñas que teñen indentación até a seguinte sen indentación. Velo moi ben na figura:
Se cadra ven ben que lembremos os distintos operadores de comparación:
En realidade, cada vez que facemos unha comparación empregando estes operadores, o que fai o ordenador é avaliar esa función de comparación para obter un valor que pode ser verdadeiro True ou falso False, que é o que se coñece como un tipo de dato booleano, ou Boolean.
Podes probar isto que dicimos escribindo directamente na shell (ollo, non no editor de arquivos, na shell):
>>>0<6
True
>>>0>6
False
>>>6<6
False
>>>6==6
True
>>>6!=6
False
>>>'tucho'=='tucho'
True
>>>'tucho'!='chucho'
True
>>>'tucho'==6
False
É importante sinalar que os operadores sempre avaliaran dous tipos de datos diferentes como diferentes, aínda que a nós nos poidan parecer iguais. É dicir, que non é o mesmo o enteiro 6 que a cadea '6'.
>>>6=='6'
False
>>>6!='6'
True
Xa que logo, a sentenza while compara o valor de intentos co enteiro 6, e executa o bucle (liñas 13-27) mentres esta condición sexa True.
As liñas 13 e 14 imprimen a cadea 'Adivíñao!' e recollen o que o xogador introduza na variable adivinha.
13. print ('Adivíñao!')
14. adivinha=input()
A liña 15 serve para converter o tipo de variable. Xa explicamos que, para Python, non é o mesmo o enteiro 6 que a cadea '6', e cando o xogador introduce un valor input(), este é almacenado como unha cadea. Coa función int() convertemos o valor introducido polo xogador en adivinha nun enteiro.
(P. ex. - se o xogador introduce o valor 15, a función input() o almacenará como unha cadea '15'. Coa función int() convertemos esa cadea '15' no enteiro 15.)
15. adivinha=int(adivinha)
A liña 17 fai o que se coñece como establecer un incremento de variable. É dicir, que cada vez que o ordenador execute esta instrucción, a variable intentos vai aumentar o seu valor en 1. Isto facémolo para levar conta de cantas veces ten tentado o xogador adiviñar o número, de xeito que, cando chegue ao seu sexto intento fallido, lle poidamos dar a mensaxe de consolación.
17. intentos=intentos+1
As liñas 19-26 empregan a sentencia if, que xa coñeces do apartado anterior, para avaliar se o número introducido polo xogador é maior, menor ou igual que o número secreto. Primeiro avaliará a condición que puxemos en primeiro lugar, e se esta é True, o programa executará a instrucción correspondente. Se a condición é False pasará ao seguinte if, e repetirá a operación.
Se acertamos, a liña 25 avaliará a True, e a instrucción que se executa é break. Isto indica ao programa que se debe saír do bucle no que estabamos, sen necesidade de avaliar outra vez se o número de intentos é menor que 6, como establecía a condición while intentos<6: que abría o bucle.
19. if adivinha<numero:
20. print ('Demasiado pequeno!')
21.
22. if adivinha>numero:
23. print('Demasiado grande!')
24.
25. if adivinha==numero:
26. break
Despois de que se execute a instrucción break, ou de que a condición while intentos<6 avalíe a False, saímos do bucle e chegamos á liña 28. Na liña 28 comprobamos se o número introducido polo xogador (adivinha) é igual que o número secreto. Se é así, na liña 29, convertimos en cadea o enteiro intentos mediante a función str(intentos), que funciona de xeito análogo á que xa explicamos antes, int(). Facemos isto porque a función print(), en Python, só admite variables que almacenen cadeas.
A liña 30 imprimirá o mensaxe de felicitación para o xogador/a.
As liñas 32, 33 e 34 funcionan de xeito semellante, mais recoñecendo o valor introducido como diferente ao número secreto e proporcionando, xa que logo, unha mensaxe de consolación.
28. if adivinha==numero:
29. intentos=str(intentos)
30. print('Fantabuloso, '+meuNome+', acertaches o número en só '+intentos+' intentos. Estarás orgulloso-a!')
31.
32. if adivinha!=numero:
33. numero=str(numero)
34. print('Que fatalidade! Eu estaba a pensar no '+numero)
E xa está! Parabéns, porque acabas de realizar un programiña que xa non é ningunha tontería...
Exercicios:
- Inserta unha liña de comentarios en cada parte do programa para explicar que fai.
- Cambia os parámetros do xogo, que o número elexido esté entre 5 e 30, que se permita un número maior ou menor de intentos, cambia as mensaxes de felicitación e consolación...
- Introduce as instruccións precisas para que o programa informe ao xogador/a de cantos intentos leva, cada vez que este queira adiviñar.
- Introduce unha variable puntos que comece tendo un valor determinado ao que, cada vez que o xogador/a falle, se lle reste unha cantidade concreta de puntos. Ao final do programa, a mensaxe de felicitación ou consolación debe informarlle de cantos puntos obtivo.
- Poderías facer agora un programa que calcule o índice de masa corporal (IdC) do xogador/a? tería que pedir o peso en Kg e a altura en cm, e logo calcular o índice coa fórmula: IdC=Kg/(cm/100)**2. Tes que ter moi en conta as conversións de tipos de datos coas funcións str() e int().