;;;;;;;;;;;;;;;;;;;;;;;;;;;; PRACTICA-7.TXT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Programaci\'on interactiva. Nim. Para facilitar el trabajo divide la pantalla en dos ventanas mediante CTRL-X 2 y, en una de ellas, crea un buffer para trabajar con el int\'erprete, mediante ESC-X run-scheme ENTER. Utiliza CTRL-X O para saltar de una a otra ventana, mientras haces los ejercicios. |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| | NOTA: Recuerda que no es necesario teclear en el int\'erprete | | expresiones que ya aparezcan en este fichero. Para ello primero debes | | pasar a modo scheme, tecleando (con el cursor en este buffer) | | ESC-X scheme-mode ENTER. Luego, cada vez que quieras evaluar una expresi\'on | | que ya est\'a escrita en este fichero, no tendr\'as que teclearla de nuevo | | en el buffer del int\'erprete. Bastar\'a que coloques el cursor al | | principio de la expresi\'on y teclees CTRL-C CTRL-E. | | Observar\'as que en la ventana de scheme aparece el valor de la | | expresi\'on. | |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| | NOTA: Recuerda tambi\'en que no es necesario escribir las expresiones | | pedidas en el int\'erprete. Puedes escribirlas en este buffer debajo | | de cada apartado y evaluar lo que escribes con CTRL-C CTRL-E, viendo la | | respuesta en el buffer de Scheme. As\'i, podr\'as corregir fallos | | f\'acilmente y adem\'as al final de la clase, si grabas este fichero, | | tendr\'as los ejercicios resueltos, sin necesidad de anotar en papel | | las soluciones. Al usar CTRL-C CTRL-E recuerda que la expresi\'on que | | deseas evaluar debe comenzar con par\'entesis y el primero de ellos debe | | ocupar la PRIMERA COLUMNA DE LA IZQUIERDA. | |----------------------------------------------------------------------------| |----------------------------------------------------------------------------| *************************************************************************** * EJERCICIO 1 * *************************************************************************** En esta pr\'actica vamos a desarrollar las funciones Scheme necesarias para jugar al Nim. Las reglas de este juego son las siguientes: - Se juega entre dos personas (o persona y "m\'aquina", como ya veremos). - Al comienzo del juego se colocan en la mesa un n\'umero arbitrario de palillos. - Cada jugador, por turnos, coge de la mesa 1, 2 o 3 palillos. - Gana el jugador que coge el \'ultimo. En el fichero practica-7.aux est\'an ya definidas las funciones que permiten jugar al Nim usando el ordenador, o bien jugar contra \'el. Carga el fichero practica-7.aux y prueba a jugar algunas partidas de Nim contra el ordenador. Para ello debes evaluar (load "practica-7.aux") y ejecutar (nim) en la ventana de *scheme*. NOTA: En los siguientes ejercicios intentaremos definir los procedimientos que integran el procedimiento nim que se encuentra en el fichero practica-7.aux *************************************************************************** * EJERCICIO 2 * *************************************************************************** a) Observa lo que ocurre al evaluar la siguiente expresi\'on: (begin (display "Introduce un numero:") (newline) (let ((n (read))) (display "Has introducido el numero: ") (display n) (newline))) b) Define un procedimiento lee-jugada sin par\'ametros que lea a trav\'es del teclado un n\'umero: 1, 2 o 3. Si no se introduce uno de estos n\'umeros lee-jugada escribe en pantalla un mensaje pidi\'endonos un nuevo n\'umero. Observa como se comporta el que se ha definido en practica-7.aux. Para ello eval\'ua (lee-jugada) *************************************************************************** * EJERCICIO 3 * *************************************************************************** Escribe un procedimiento nim-a-dos que tome como argumento un n\'umero entero no negativo y permita jugar una partida de nim a dos jugadores A y B que realizan sus jugadas alternativamente. Antes de empezar, observa como se comporta el procedimiento nim-a-dos que hemos definido en practica-7.aux. Para ello evalua: (nim-a-dos 23) *************************************************************************** * EJERCICIO 4 * *************************************************************************** Escribe un procedimiento jugada-inteligente que tome como argumento un n\'umero entero y devuelva como valor el resto de dividir dicho n\'umero entre 4, si este resto no es 0, y un n\'umero entero elegido aleatoriamente entre 1, 2 o 3, si el anterior resto es 0. Por ejemplo, (jugada-inteligente 23) ==> 3 (jugada-inteligente 16) ==> 1 (jugada-inteligente 10) ==> 2 (jugada-inteligente 20) ==> 3 (jugada-inteligente 20) ==> 1 *************************************************************************** * EJERCICIO 5 * *************************************************************************** El siguiente procedimiento, llamado misterio, recibe dos argumentos, un n\'umero y un valor booleano. Describe el comportamiento general de este procedimiento. (define misterio (lambda (n maq-prim) (display "Quedan ") (display n) (display " palitos.") (newline) (if maq-prim (let ((jm (jugada-inteligente n))) (display "Me toca a mi y cojo:") (newline) (if (zero? n) (begin (display "Has ganado esta vez.") (newline) (newline)) (begin (display jm) (newline) (misterio (- n jm) #f)))) (begin (display "Te toca a ti: ") (newline) (if (zero? n) (begin (display "Como era de esperar... has perdido") (newline) (newline)) (misterio (let ((jh (lee-jugada))) (if (< n jh) 0 (- n jh))) #t)))))) *************************************************************************** * EJERCICIO 6 * *************************************************************************** Teclea CTRL-X CTRL-F practica-7.aux RET para poder ver el contenido del fichero practica-7.aux. F\'ijate en como se ha definido el procedimiento nim. Intenta escribir tu propia versi\'on. *********************************************************************** * EJERCICIO 7 * *********************************************************************** Puede observarse que al ejecutar el procedimiento nim que se encuentra en el fichero practica-7.aux, el programa escribe alternativamente: "Es el turno de A" o "Es el turno de B" incluso cuando tras la \'ultima tirada quedan 0 palitos y no es posible otra jugada. Modifica el programa nim-a-dos (y el nim-maquina) para que esto no ocurra tras la \'ultima tirada . *********************************************************************** * EJERCICIO 8 * *********************************************************************** Escribe un programa similar a nim que permita jugar la siguiente variante del nim: Cada jugador puede en su turno tomar 1, 2 o 3 palitos o bien SOLTAR 1 o 2 palitos. Intenta escribir un programa que permita elegir el tipo de nim que se desea jugar, es decir, el juego original o esta variante. Si se juega contra la m\'aquina puedes considerar las estrategias que seguir\'a la m\'aquina para elegir su jugada en cada caso.