diff --git a/models/Application_examples/Tic_tac_toe.mp b/models/Application_examples/Tic_tac_toe.mp new file mode 100644 index 0000000000000000000000000000000000000000..afd394834ae411d394651fd46183363bdd3e90a8 --- /dev/null +++ b/models/Application_examples/Tic_tac_toe.mp @@ -0,0 +1,205 @@ +/*┬────────────────────────────────────────────────────────┠+│*│ ┌─[ Title and Authors ]──────────────────────────────┠│ +│*│ │ Model of Tic Tac Toe │ │ +│*│ │ Created by Michael Collins in December, 2021. │ │ +│*│ │ Modified by Michael Collins and Pamela Dyer │ │ +│*│ │ in January through May, 2022. │ │ +│*│ │ | | +│*│ │ Thanks to Emma Werking for her contributions. │ │ +│*│ └────────────────────────────────────────────────────┘ │ +│*│ │ +│*│ ┌─[ Purpose ]────────────────────────────────────────┠│ +│*│ │ To demonstrate using MP to model simple strategies │ │ +│*│ │ in the context of a game of Tic-tac-toe. │ │ +│*│ └────────────────────────────────────────────────────┘ │ +│*│ │ +│*│ ┌─[ Description ]────────────────────────────────────┠│ +│*│ │ How to play Tic-tac-toe: | | +│*│ │ The game board is a 3 by 3 grid of cells. | | +│*│ │ The player who goes first is known as 'X'. | | +│*│ │ The player who goes second is known as 'O'. | | +│*│ │ The players alternate placing Xs and Os on the | | +│*│ │ board until either one of the players has three in| | +│*│ │ a line or until all cells on the grid are filled. | | +│*│ │ | | +│*│ │ The goal is to never lose a game of Tic-Tac-Toe. | | +|*| | | | +│*│ │ The following rules simplify the strategy: | | +│*│ │ 1) X never makes any mistakes. │ │ +|*| | 2) O makes at most one mistake. | | +│*│ │ 3) X always chooses a corner on the first move | | +|*| | of the game. | | +|*| | | | +│*│ │ Strategy: List all possible 2nd moves of the | | +|*| | game. Show how X can win or play to a | | +|*| | draw in each case by listing every move. | | +|*| | When playing the game as X, use these | | +|*| | predetermined games as your directions | | +|*| | for how to play. | | +│*│ └────────────────────────────────────────────────────┘ │ +│*│ │ +│*│ ┌─[ References ]─────────────────────────────────────┠│ +│*│ │ Yates, James. "Tic Tac Toe Strategy Guide." │ │ +│*│ │ Chess and Poker Dot Com. Accessed April 6, 2022. │ │ +│*│ │https://www.chessandpoker.com/tic_tac_toe_strategy.html +│*│ └────────────────────────────────────────────────────┘ │ +│*│ │ +│*│ ┌─[ Search Terms ]───────────────────────────────────┠│ +│*│ │ tic-tac-toe, behavior; strategy; assertion checking│ │ +│*│ └────────────────────────────────────────────────────┘ │ +│*│ │ +│*│ ┌─[ Instructions ]───────────────────────────────────┠│ +│*│ │ Run for Scope 1. │ │ +│*│ ├─[ Run Statistics ]─────────────────────────────────┤ │ +│*│ │ Scope 1: 5 traces in less than 1 sec. │ │ +│*│ └────────────────────────────────────────────────────┘ │ +└*┴───────────────────────────────────────────────────────*/ + +SCHEMA Tic_tac_toe; +/* +Explanation: + + The 3x3 board with definitions for all cells: + + Corner | Remnant | Corner + ---------------------------- + Remnant| Center | Remnant + ---------------------------- + Corner | Remnant | Corner + + The center cell has 0-outer edges. + A remnant cell has 1-outer edge. ( corners are also edge cells ) + A corner cell has 2-outer edges. +*/ + +ROOT Strategy_based_on_2nd_move_of_the_game: +( + choosing_remnant_next_to_X_on_2nd_move |/* Mistake, X wins */ + choosing_remnant_NOT_beside_an_X_on_2nd_move |/* Mistake, X wins */ + choosing_a_corner_on_2nd_move |/* Mistake, X wins */ + choosing_center_on_2nd_Move_and_any_corner_on_4th_move |/* Mistake, X wins */ + choosing_center_on_2nd_Move_and_any_remnant_on_4th_move /* No mistakes,Draw */ +); + +/* Player going second makes mistake on second move of the game */ +choosing_remnant_next_to_X_on_2nd_move : + /* first move */ X_chooses_corner + /* second move - mistake */ O_chooses_remnant_next_to_X_on_first_turn + /* third move */ X_chooses_center + /* fourth move */ O_blocks_ + /* fifth move */ X_chooses_corner_NOT_beside_any_O + /* sixth move */ O_blocks + /* seventh move */ X_wins; + +/* Player going second makes mistake on second move of the game */ +choosing_remnant_NOT_beside_an_X_on_2nd_move : + /* first move */ X_chooses_corner + /* second move - mistake */ O_chooses_remnant_NOT_beside_an_X_on_first_turn + /* third move */ X_chooses_center + /* fourth move */ O_blocks_ + /* fifth move */ X_blocks + /* sixth move */ O_blocks + /* seventh move */ X_wins; + + +/* Player going second makes mistake on second move of the game */ +choosing_a_corner_on_2nd_move : + /* first move */ X_chooses_corner + /* second move - mistake */ O_chooses_corner + /* third move */ X_chooses_any_corner + /* fourth move */ O_blocks_ + /* fifth move */ X_chooses_last_corner + /* sixth move */ O_blocks_one_path + /* seventh move */ X_wins; + + +/* Player going second makes mistake on fourth move of the game */ +choosing_center_on_2nd_Move_and_any_corner_on_4th_move : + /* first move */ X_chooses_corner + /* second move */ O_chooses_center + /* third move */ X_chooses_corner_opposite_previous_X + /* fourth move - mistake */ O_chooses_any_corner + /* fifth move */ X_blocks + /* sixth move */ O_blocks + /* seventh move */ X_wins; + + +/* No mistakes made by either player */ +choosing_center_on_2nd_Move_and_any_remnant_on_4th_move : + /* first move */ X_chooses_corner + /* second move */ O_chooses_center + /* third move */ X_chooses_corner_opposite_previous_X + /* fourth move */ O_chooses_any_remnant + /* fifth move */ X_blocks + /* sixth move */ O_blocks + /* seventh move */ X_blocks + /* eighth move */ O_blocks + /* ninth move */ STALEMATE; + +CHECK #X_wins == 1 OR #STALEMATE == 1 +ONFAIL SAY ("X LOST!"); + + + + + + + + + + + +/*----------------COORDINATION SOLELY FOR VISUAL AID ___ */ +/*NONE OF THIS COORDINATION CONSTRAINS OR INFLUENCES THE STRATEGY */ +/* JUST VISUAL COMMENTARY FOR THE VIEWER */ +COORDINATE $XEE_XEO: ( choosing_remnant_next_to_X_on_2nd_move | + choosing_remnant_NOT_beside_an_X_on_2nd_move ) +DO + ADD SAY("O chooses a remnant on second move.") PRECEDES $XEE_XEO; +OD; +COORDINATE $XEE_XEO: choosing_a_corner_on_2nd_move +DO + ADD SAY("O chooses any corner on second move. ") PRECEDES $XEE_XEO; +OD; +COORDINATE $XOE: ( + choosing_center_on_2nd_Move_and_any_corner_on_4th_move | + choosing_center_on_2nd_Move_and_any_remnant_on_4th_move + ) +DO + ADD SAY("O chooses center on second move.") PRECEDES $XOE; +OD; +COORDINATE $first_move: X_chooses_corner +DO + ADD SAY("FIRST MOVE OF THE GAME.") PRECEDES $first_move; +OD; +COORDINATE $second_move: + ( + O_chooses_remnant_next_to_X_on_first_turn | + O_chooses_remnant_NOT_beside_an_X_on_first_turn | + O_chooses_corner | + O_chooses_center + ) +DO + ADD SAY("SECOND MOVE OF THE GAME.") PRECEDES $second_move; +OD; +COORDINATE $third_move: + ( + X_chooses_center | + X_chooses_any_corner | + X_chooses_corner_opposite_previous_X + ) +DO + ADD SAY("THIRD MOVE OF THE GAME.") PRECEDES $third_move; +OD; +COORDINATE $fourth_move: + ( O_blocks_ | O_chooses_any_corner ) +DO + ADD SAY("FOURTH MOVE OF THE GAME." ) PRECEDES $fourth_move; + ADD SAY("X is now guaranteed to win") PRECEDES $fourth_move; +OD; +COORDINATE $fourth_move: O_chooses_any_remnant +DO + ADD SAY("FOURTH MOVE OF THE GAME." ) PRECEDES $fourth_move; + ADD SAY("STALEMATE IS NOW GUARANTEED ") PRECEDES $fourth_move; +OD; +/******************************************************************/