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().