Detección de victorias y empates

I made some edits to include the word "possible" more. I'm not sure I didn't make it more confusing. Need to look again another day. --MF, 6/13/18

PG: I haven't thought deeply (haven't even read carefully!) but would want to check carefully to make sure this is /developmentally/ helpful. Maybe it already is.

BH: Super important: Make the empty squares have the square number.

En esta página, programará su proyecto Tic Tac Toe para detectar y reportar victorias y empates.

Almacenamiento de todas las formas de ganar

Para programar una forma de detectar una ganancia, necesitamos determinar qué cuenta como una ganancia. Guardaremos cada posible triple ganador como una lista de tres números de posición (un triple). Por ejemplo, este triple ganador podría representarse como list{3, 5, 7} porque la ganancia está en las posiciones 3rd, 5th y 7th:
diagonal win bottom left to top right

  1. Talk with Your Partner
    1. ¿Cuántos triples ganadores son posibles?
    2. Anota cada uno de los posibles triples ganadores.

A continuación, crearemos una lista para almacenar todos los posibles triples ganadores para que podamos compararla con el estado actual del juego almacenado por tablero.

  1. Abre tu proyecto U3L2-TicTacToe si aún no está abierto.
  2. Save Your Work
  3. Cree un reportero que genere una lista de todos los posibles triples ganadores. Se verá algo como esto:
    winning triples partial block definition showing a list with at least two lists inside it: {1,2,3} and {2,5,8}

Comprobación de una forma de ganar

Necesitamos una forma de averiguar si realmente ha ocurrido un triple ganador. Podemos usar map para verificar cada posición en un triple para ver si algún jugador ha ganado con ese triple.

Aprendiste sobre map en Unidad 3 Práctica de laboratorio 2, página 5: Transformación de todos los elementos de la lista.

Map aplica la función del anillo gris a cada elemento de la lista de entrada e informa una lista de todos los resultados.
map (join( )(s)) over (list {cat, dog, bird}) reporting {cats, dogs, birds}

Recuerde que la ranura de entrada en blanco en la función dentro del anillo gris es donde va un elemento de la lista cada vez que se realiza la función.

  1. Haz clic en botón de bandera verde para comenzar un nuevo juego. Juega un juego, dejando deliberadamente que x gane.
  2. Luego construya esta expresión y vea lo que informa:
    map (item ( ) of (board)) over (list{1, 2, 3})
    How does map work here?

    Esta expresión map funciona de la misma manera que el ejemplo anterior de join, pero es un poco más complejo de pensar. Como antes, map inserta cada elemento de la lista en el espacio en blanco de la función dentro del anillo gris e informa una lista de los resultados.

    Pero aquí, la función en el anillo gris es elemento () de (tablero), por lo que map comprueba elementos 1, 2 y 3 de la lista almacenada en la variable tablero, y reporta una lista de lo que está en esas tres posiciones (X, O o Vacío).

    Si no puede ver lo que hay dentro de la variable tablero, asegúrese de que su casilla esté marcada en la paleta Variables y expanda su observador para ver los elementos de la lista como se muestra en la imagen a continuación.
    picture of: watcher of board variable showing {X, O, Empty, Empty, X, Empty, Empty, Empty, O}; and Tic Tac Toe game with X in upper left and center and O in upper middle and lower right map (item ( ) of (board)) over (list{1, 2, 3}) reporting {X, Empty, Empty}

  3. Talk with Your Partner ¿Qué te dice el resultado de esa expresión sobre el estado del juego?
  4. Si {1, 2, 3} no es el triple en el que x ganó el juego, reemplace la lista en la expresión map con el ganando el triple y haga clic en la expresión de nuevo.
  5. Usa esta idea para hacer un bloque status of triple ( ) eso toma un posible triple ganador (un triple como list{1, 2, 3}) como entrada e informa una lista de lo que está en esas tres posiciones (X, O o Vacío).
    Aprendió a especificar el tipo de entrada de lista (tipo de entrada de lista: rectángulo con dos rectángulos naranjas más pequeños dentro) en Unidad 2 Práctica de laboratorio 2 Página 2: Planificación de una prueba aplicación.
  6. Save Your Work Juega otro juego en el que el jugador O gane y prueba tu bloque status of triple con el triple ganador. Solucione cualquier error.

Comprobando todas las formas de ganar

Acabas de construir un bloque que marcará un triple para mostrar si algún jugador ha elegido los tres cuadrados. Ahora, construirá un bloque, estado de todos los triples ganadores para realizar la misma verificación para todos los triples que hacen una ganancia. Luego, usará ese bloque para verificar si alguno de los triples ganadores en realidad contiene tres movimientos del mismo jugador.

Por ejemplo, el jugador O ha ganado este juego y el bloque status of all winner triples contiene el estado de cada triple. La computadora puede usar este bloque para buscar un triple ganador que tenga todo X o todo O.
Tic Tac Toe game where Player O has won down the middle column. In row one, there is X, O, and X. In row two, there is X, O, and an empty square. In row three, there is an empty square, O, and an empty square. The status of all winning triples block is reporting a list of lists (a table). There are three columns and eight rows, and each cell contains either a X, an O, or Empty. There is text to the right of each row listing the corresponding triple and where it appears on the board (such as 1, 5, 9 being the top-left to bottom-right diagonal). The triple in which Player O has won this game (2, 5, 8) shows O, O, O in the table. That is the only row with either all O or all X.

El orden de sus triples y/o la numeración de las posiciones en su proyecto pueden ser diferentes. Esto está bien siempre que su proyecto funcione.
  1. Use map junto con algunos de los otros bloques que ha creado para construir el bloque estado de todos los triples ganadores. Debe informar el estado de todos los triples ganadores como una lista de listas, como se muestra arriba.
  2. Haga clic para obtener una sugerencia sobre cómo usar map.
    Cuando uses map piensa:
    1. ¿Cuál es la función que está realizando? Eso va en el anillo gris.
    2. ¿En qué datos estás realizando esa función? Esa es la lista sobre la que está mapeando.
    Aquí, desea conocer el estado de cada triple ganador.
    Haga clic para obtener una pista sobre el edificio won?.

    Póngalo en palabras: ¿Qué es lo que quiere comprobar?

    ¿Hay algún bloque que pueda ser útil para eso?

    Haga clic para obtener otra pista.

    ( ) contains ( )

  3. Ahora haga un bloque won? ( ) que tome la letra X o O como entrada y reporta true si y solo si ese jugador ha ganado el juego.
  4. Save Your Work
  5. Modifique su programa para que cuando un jugador gane el juego, el programa notifique a los jugadores.
  6. Juega el juego varias veces para comprobar que funciona y corregir cualquier error. Asegúrese de dejar que cada jugador gane al menos una vez.

Comprobación de lazos

La definición de un juego empatado es que no hay más casillas vacías y ningún jugador ha ganado.

    This hint won't work when we change "Empty" to numbers. -bh

    I don't want to do that until we need it--in U5. --MF, 6/8/18

    One reason to do it from the beginning is that as it is now, the student has to remember where in the program it assumes "Empty," otherwise the project won't work. --bh

  1. Desarrolle una forma de determinar si el juego ha empatado y, de ser así, haga que el programa notifique a los jugadores.
  2. Juegue un par de juegos para probar la función de verificación de empates y corrija cualquier error.
  3. Puedes trabajar en este proyecto más en Unidad 5 Projecto Opcional: Tic-Tac-Toe.

  4. ¿Por qué es importante el orden de las pruebas (para victorias o empates)? Talk with Your Partner
  5. Save. You will use this later.
  1. Hay muchas pequeñas mejoras que podrías hacer. Por un lado, cuando un jugador gana, es posible que desee evitar más movimientos. ¿Qué más le gustaría cambiar o mejorar?
Tough Stuff
  1. Su programa puede ser más inteligente a la hora de detectar vínculos. Si solo hay un cuadrado vacío en el tablero y llenar ese cuadrado con el jugador cuyo turno es el siguiente no causaría una victoria, entonces el juego ya está empatado. El desafío aquí es que tendrás que probar para ganar en un tablero que no es el tablero actual.
  2. En lugar de que el sprite diga algo como "X gana", sería más satisfactorio para los jugadores dibujar una línea gruesa a través de los tres cuadrados que generan una ganancia. Esto es un poco complicado porque cuando sabes que hay una victoria, ya no sabes qué triple la activó. Asegúrese de que su código permanezca legible para otro programador.