<snapdata remixID="10728649"><project name="U3L3-TicTacToe" app="Snap! 6, https://snap.berkeley.edu" version="1"><notes></notes><thumbnail>data:image/png;base64,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</thumbnail><stage name="Stage" width="480" height="360" costume="0" color="255,255,255,1" tempo="60" threadsafe="false" penlog="false" volume="100" pan="0" lines="round" ternary="true" hyperops="true" codify="false" inheritance="false" sublistIDs="false" scheduled="false" id="1"><pentrails>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeAAAAFoCAYAAACPNyggAAAAAXNSR0IArs4c6QAADoVJREFUeF7t1cEJAAAIxDDdf2m3sJ+4wEEQuuMIECBAgACBd4F9XzRIgAABAgQIjAB7AgIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECAiwHyBAgAABAoGAAAfoJgkQIECAgAD7AQIECBAgEAgIcIBukgABAgQICLAfIECAAAECgYAAB+gmCRAgQICAAPsBAgQIECAQCAhwgG6SAAECBAgIsB8gQIAAAQKBgAAH6CYJECBAgIAA+wECBAgQIBAICHCAbpIAAQIECByxcQFpoRMBzwAAAABJRU5ErkJggg==</pentrails><costumes><list struct="atomic" id="2"></list></costumes><sounds><list struct="atomic" id="3"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites><sprite name="Sprite" idx="2" x="-50" y="-100" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" hidden="true" costume="0" color="255,32,0,1" pen="tip" id="8"><costumes><list struct="atomic" id="9"></list></costumes><sounds><list struct="atomic" id="10"></list></sounds><blocks></blocks><variables></variables><scripts><script x="27" y="23.66666666666667"><block s="receiveGo"></block><block s="hide"></block><block s="setSize"><l>5</l></block><block s="setColor"><color>255,32,0,1</color></block></script></scripts></sprite><watcher scope="Square" var="position number" style="normal" x="10" y="298.500002" color="243,118,29" hidden="true"/><watcher var="playing" style="normal" x="10" y="325.49999600000007" color="243,118,29" hidden="true"/><watcher var="win lines" style="normal" x="10" y="329.999998" color="243,118,29" hidden="true"/><watcher var="board" style="normal" x="0" y="27" color="243,118,29" extX="80" extY="70"/><sprite name="Square" idx="1" x="50" y="-50" heading="90" scale="0.95" volume="100" pan="0" rotation="1" draggable="false" hidden="true" costume="1" color="80,80,80,1" pen="tip" id="24"><costumes><list id="25"><item><costume name="Empty" center-x="29" center-y="28" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA5CAYAAACMGIOFAAAAAXNSR0IArs4c6QAAAShJREFUaEPtmyEOg0AQRT836A1ag24TBIakFWv2Fr0BFgc4LKdZs6ICgyCpx9AbcIRmG0LS0lbPbj4nmDf/v4xZIgAVgCOAE8L87tECeQZwCZMRt0/ISWuNNE0PPgP3fT8ZYxyC43iH1FpPbdsijmOvIcdxnPI8hzFmC1lVFcqy9DnEdfa6ruF4NkkS0rN8mSSd9KiyrCvryrrK2gCdpJOyGvl3GtaVdWVdZW2ATtJJWY3kCaGTdJJOytoAnaSTshrJO0kn6SSdlLUBOkknZTWSd5JO0kk6KWsDdJJOymok7ySdpJMhOKmUmpumQZIkO494NqMOwzAXRQFrrePYPM+elVLIssxryK7rZmutg/8K6XOAv2Z/JXldHqTvQyQE8HCQof4qsWb2BLkbqAIXp3YbAAAAAElFTkSuQmCC" id="26"/></item><item><costume name="X" center-x="29" center-y="29" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA6CAYAAAAKjPErAAAAAXNSR0IArs4c6QAAA8NJREFUaEPd271P20AYBvCHVkIMlmDokA2GbgwJeyFBXegE/AWEjSEDqEu2wMYIAwsMwMYGY5cKBsaqAkG2DrBlqCqQGBBSpepxOcs57LN9H3ack1hiB/t373vvmTszguFsEwAeBG0EwCaAKoDakHjfAagAeAHwB8BPgawDaAwJUmZcyMgXz/PQarVGx8bGSmV+fn7G0dERer1eItI/oVar4fz8HBMTTO1ytOXlZZydnQU3Oz09/bvb7X4A8CaSwUllgq6urvpRFO3w8BD39/fY3GS5kZBLS0t9vVEGqAzsdDo+bmtrKxrJg5OTk+AXRRtkqAxcWVkJIqpEsicY+kGHqoAMUCKSJ0VBmeuMbNEtCZgaGQVltWXVLRKaBpgJ6ZemiwuwID0+PvoBLBIqZ1d4DMrZlSpdw1+6urpCo9EoFJoFmDmSAlskVAbW63U/w1QtcySLhMrAarXqA5OexrSRxOYZUV2gdrrmPUZNgFaQriNqCrSGdAXlcJifn8fDw/8/7NOOQeMpRFXFbI5RW0CrkbRZdWXg+Pi4X+Smpqa0niKNqmvcFU0iGgXkNGHy+OgEGTdG+VDPx0JV54THICNoCnSSrqrphccIbTabb5wuIigu4iyS4gJ3d3d+9K6vrwOYDOU5MzMzQRW1FcHckLwQpwA+1EdBeYwpykiy2QY6T9dwTkZB9/b2cHBw4BSYKzIuouGOOD09VRYmrfkj7fKH7i+P+h4jOjs7i9vb277DcQXJxrWdFx75Jomcm5vDzc3NcCLlIiN3gKto5hpJThOiihLIwrO/v6+cXkqVrlHL93woUE0vNoC5Vdc4oEC4hjpP17Rroy6hTpFpgaqIck+G2xUmzRkyK1AF5dhl5dVtTpC6wDB0fX0dx8fHgcsEah0p9gPF3amW75MiQ5gNqFVk1uX7JCSP24BaQ7oAik4whVpB2lgbTYqqCdQYmQfQNKJGyDyBJlBtZBFAXagWksuEXJcRTXf5Pmkcqo5nGaOZkTaX702QWaaXTEgZyPd8+FnSJqgpxjSiqZEuF39NO0FOXa7z8llXdH4q5CAD44pR+O2xRGQZgAK6s7ODjY2NIDEEdHd3N/7dusXFxb5NUBer26apKn8/6u2xhYUFbG9v89T+V0Hb7TZOTk7AfQq2MgAFWIZWKhXxgm8/0vO8v09PT+/LBoyDvn5+KV7P/gzgUzgN1tbWwN4oW2M9Cb/BzL0ngfwKwCsbKOX9/iCSu6PcCv4CYBTAJYBfKX/BIJ/28fXmvhMp/lWCH/Ln2yDfuc69/QO8JTdw9aXwqAAAAABJRU5ErkJggg==" id="27"/></item><item><costume name="O" center-x="28" center-y="28" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA5CAYAAACMGIOFAAAAAXNSR0IArs4c6QAABF9JREFUaEPtmos1LEEQhnsiQARsBIgAEbARIAJEsLsRIAI2AkRgNwJEgAgQwdzzzbm1p7bNo7rnsWupc5z7MNPdf/1Vf1dXT+KcGzrn9tzq2jT5D3Kwuhjd6FeCHKVp+uNZTZJk5JwTHPNMpmm6MlGbJARpZt2BfHt7c+/v79msm5ubbmtrq1WHtg5yOp26+/t7N5lM3PPzcymYnZ0dt7+/746OjtzeXnMi3wpImBqNRhm4z8/PKJbW19czsIPBoDbTjYIE0PX1tRsO2W6LTYeoDt2iNxjv7OzMATzGGgN5e3vrLi4uvjEHIBiRMCxbpIQ1f0rOyvMAvLy8dCcnJ8E4GwEJuKurq7nJySkYAFyMkcO8T05rOz8/z8CGWC2QhOfp6WmWe2IwB2DYa8IYG2CaWca+ubkxh280SAAeHBzMKebx8XEGMDZ3ipzCXAAdj8ezR1Dix8dH01zRIGGQPBRDBasEpy6zjI9qi5GfMFplUSD9yZgoRhCqFpf3exyLg0OcGwySHOn3+7NJkHZfdGIWH/IOoctWJXZ3d1eqAcEge72eY2/DDg8P50QnZKF1n0V8Hh4esmEoC19fXwuHDAIJY2wX2NraWga2aZGxgkeMAPf19ZW9wrYCw3lmBsmgsChlWtmg1oXWfU47HWfDZp7TzSD1gOyFErJ1F1r3fdiUPbTI8WaQu7u7sz2xSzWtcoJWW6osKiXfTCAJ0Y2Njdm7Hx8fC8tFH4BlbSaQFm9VebzN31P9vLy8ZFPkRZkJJBu9lFTLIDi+w7ReUFrqSoxnTSA5SchpgHox9mTRFpvkIXU0lpeXfyDF84iO7I/LJDqyPi0+7JOsUZuJSfWQW9ZWZdka/0AK5Vqin56eHP9eJqPVSbGCbW9vf2t9mphcIXUdzl346NzTIKvObotgWJ9xo7cQ3QnI22wXAUzPqYuVvDaMCtdiJnXMVx1QFwFYb3F5mmHKSRbO/iMH1GUSH01A0RHQDFKHxDKFrGVdZpC6PoRZTuFtX7lVhT4Hd7oVYkV1tRkkA2mV5e8MukijKJdDctGB2XwKESC+5xa5nfj917LICmISsDoHECPY7LoCQmxgUQ4NVRoRDJKBCVU5iZOXqG1XrUm/a0gZR8iWzR8MEjbxJEBlSwm5fKmTw6QL3Xu5lqf3C8CqSIoCyUJ9tW07dP0QZQ3WLkU0SCbxkx+gcvVdhzH/Xe49/O54SFu0Fsi80OX/CB8aXnV7QUQL1xL6qxFriAZ3BqpYIVe4gBExkucBiRqzh1kLB8aiaUaU+I1iRIYTh3UsWUdtJmUgVI/WID8iSNo5sCtX7CxSFgoouXIAQN63PrBHuPITo+KNgdRg/avvqkgo+30TV/SNg9TVkXyyIveIVrDce8onMaGhmTdHayD1ZISy/uxMh6gOXfnsLCYkyxzYCUgrg209Z+oMtDV5V+P+Nia/fZ49SdM07puxrigyzJMkCbeyguN3foNu8NOPeyRrSf748Kxy+z+VzUmjGHSyOAAAAABJRU5ErkJggg==" id="28"/></item></list></costumes><sounds><list struct="atomic" id="29"></list></sounds><blocks></blocks><variables><variable name="position number"><l>10</l></variable></variables><scripts><script x="14.999999000000003" y="10.000000000000014"><block s="receiveGo"></block><block s="clear"></block><custom-block s="makeBoard"><comment w="143.99999999999997" collapsed="true">3.3.1.4 and TIF B inside</comment></custom-block><block s="doSetVar"><l>X&apos;s turn?</l><block s="reportBoolean"><l><bool>true</bool></l></block></block><block s="doSetVar"><l>board</l><block s="reportNumbers"><l>1</l><l>9</l><comment w="53.333333333333336" collapsed="true">3.3.1.2</comment></block></block><block s="doSetVar"><l>playing</l><block s="reportBoolean"><l><bool>true</bool></l><comment w="130.66666666666666" collapsed="true">3.3.2.18, more below.</comment></block></block></script><script x="13.66666566666666" y="364.66666666666697"><block s="receiveInteraction"><l><option>clicked</option></l></block><block s="doIf"><block s="reportAnd"><block var="playing"/><block s="reportEquals"><block s="getCostumeIdx"></block><l>1</l></block><comment w="121.33333333333333" collapsed="true">3.3.3.5, more below.</comment></block><script><block s="doIfElse"><block var="X&apos;s turn?"/><script><block s="doSwitchToCostume"><l>X</l></block><block s="doReplaceInList"><block var="position number"/><block var="board"/><l>X</l><comment w="53.333333333333336" collapsed="true">3.3.1.5</comment></block><block s="doIf"><custom-block s="won? %s"><l>X</l><comment w="53.333333333333336" collapsed="true">3.3.2.9</comment></custom-block><script><block s="goToLayer"><l><option>front</option></l></block><block s="doTellTo"><l>Sprite</l><block s="reifyScript"><script><custom-block s="draw win line"></custom-block></script><list></list></block><list></list><comment w="108.66666666666667" collapsed="true">TIF B.  See below.</comment></block><block s="doSetVar"><l>playing</l><block s="reportBoolean"><l><bool>false</bool></l></block><comment w="53.333333333333336" collapsed="true">3.3.3.5</comment></block></script></block></script><script><block s="doSwitchToCostume"><l>O</l></block><block s="doReplaceInList"><block var="position number"/><block var="board"/><l>O</l><comment w="53.333333333333336" collapsed="true">3.3.1.5</comment></block><block s="doIf"><custom-block s="won? %s"><l>O</l><comment w="53.333333333333336" collapsed="true">3.3.2.9</comment></custom-block><script><block s="goToLayer"><l><option>front</option></l></block><block s="doTellTo"><l>Sprite</l><block s="reifyScript"><script><custom-block s="draw win line"></custom-block></script><list></list></block><list></list><comment w="108.66666666666667" collapsed="true">TIF B.  See below.</comment></block><block s="doSetVar"><l>playing</l><block s="reportBoolean"><l><bool>false</bool></l></block><comment w="53.333333333333336" collapsed="true">3.3.3.5</comment></block></script></block></script></block><block s="doSetVar"><l>X&apos;s turn?</l><block s="reportNot"><block var="X&apos;s turn?"/></block></block><block s="doIf"><block s="reportAnd"><block var="playing"/><custom-block s="tied?"><comment w="135.33333333333334" collapsed="true">3.3.3.1 and 3.3.3.5&#xD;See 3.3.3.3 above for why we have to test PLAYING.</comment></custom-block></block><script><block s="goToLayer"><l><option>front</option></l></block></script></block><block s="doDeclareVariables"><list><l>available squares</l></list><comment w="252.66666666666666" collapsed="true">3.3.3 TIF A, here on down.  See comment below.</comment></block><block s="doSetVar"><l>available squares</l><block s="reportKeep"><block s="reifyPredicate"><autolambda><block s="reportIsA"><l></l><l><option>number</option></l></block></autolambda><list></list></block><block var="board"/></block></block><block s="doIf"><block s="reportAnd"><block var="playing"/><block s="reportEquals"><block s="reportListAttribute"><l><option>length</option></l><block var="available squares"/></block><l>1</l></block></block><script><block s="doReplaceInList"><block s="reportListItem"><l>1</l><block var="available squares"/></block><block var="board"/><l>X</l></block><block s="doIf"><block s="reportNot"><custom-block s="won? %s"><l>X</l></custom-block></block><script><block s="bubble"><l>It&apos;s a tie.</l></block><block s="goToLayer"><l><option>front</option></l></block><block s="doSetVar"><l>playing</l><block s="reportBoolean"><l><bool>false</bool></l></block></block></script></block></script></block></script></block></script><script x="10.333332333333317" y="1648.3333333333355"><block s="doSetVar"><l>win lines</l><block s="reportNewList"><list><block s="reportNewList"><list><block s="reportNewList"><list><l>-100</l><l>50</l></list></block><block s="reportNewList"><list><l>100</l><l>50</l></list></block></list></block><block s="reportNewList"><list><block s="reportNewList"><list><l>-100</l><l>0</l></list></block><block s="reportNewList"><list><l>100</l><l>0</l></list></block></list></block><block s="reportNewList"><list><block s="reportNewList"><list><l>-100</l><l>-50</l></list></block><block s="reportNewList"><list><l>100</l><l>-50</l></list></block></list></block><block s="reportNewList"><list><block s="reportNewList"><list><l>-50</l><l>100</l></list></block><block s="reportNewList"><list><l>-50</l><l>-100</l></list></block></list></block><block s="reportNewList"><list><block s="reportNewList"><list><l>0</l><l>100</l></list></block><block s="reportNewList"><list><l>0</l><l>-100</l></list></block></list></block><block s="reportNewList"><list><block s="reportNewList"><list><l>50</l><l>100</l></list></block><block s="reportNewList"><list><l>50</l><l>-100</l></list></block></list></block><block s="reportNewList"><list><block s="reportNewList"><list><l>-100</l><l>100</l></list></block><block s="reportNewList"><list><l>100</l><l>-100</l></list></block></list></block><block s="reportNewList"><list><block s="reportNewList"><list><l>-100</l><l>-100</l></list></block><block s="reportNewList"><list><l>100</l><l>100</l></list></block></list></block></list></block></block></script><comment x="10" y="1569.3333333333344" w="356" collapsed="false">TIF B starts here.  The instruction below only needs to be run once.  It makes a list of the two endpoints of each of the lines to mark a win.  It must be in the same order as POSSIBLE WINNING TRIPLES. </comment><comment x="12" y="1846.3333333333346" w="363.3333333333333" collapsed="false">TIF B:  First of all, we don&apos;t want Square, the sprite with nine clones to show the board, to move around.  So I added another sprite, named Sprite.  It&apos;s hidden, but can draw lines with its thick red pen.  (Click on Sprite at the right to see its code.)  The actual work is done in procedure DRAW WIN LINE.  But instead of running DRAW WIN LINE in the Square sprite (this one), we TELL Sprite TO do it. </comment><script x="16.333333333333314" y="1945.6666666666692"><custom-block s="draw win line"><comment w="90" collapsed="true">TIF B inside.</comment></custom-block></script><comment x="14.666666666666657" y="1970.6666666666695" w="358" collapsed="false">We modify makeBoard for TIF B because drawn lines are behind sprites on the stage, so the win line is hidden by the board.  To fix that, we apply a ghost effect (transparency) to the board sprites.  The value 30 for the ghost effect was found by experiment.  Any more and the board is too faint; any less and the line is.</comment><script x="15.666666666666657" y="2056.666666666667"><custom-block s="makeBoard"><comment w="90" collapsed="true">TIF B inside.</comment></custom-block></script><script x="15.333332333333317" y="312.3333333333336"><custom-block s="won? %s"><l></l><comment w="90" collapsed="true">3.3.2.8 inside</comment></custom-block></script><script x="15.333332333333317" y="281.0000000000002"><custom-block s="status of all winning triples"><comment w="90" collapsed="true">3.3.2.7 inside</comment></custom-block></script><script x="15.999999000000003" y="164.33333333333343"><custom-block s="possible winning triples"><comment w="90" collapsed="true">3.3.1.8 inside</comment></custom-block></script><script x="19" y="242.66666666666677"><block s="reportEquals"><custom-block s="status of triple %l"><block s="reportNewList"><list><l>1</l><l>2</l><l>3</l></list></block></custom-block><block s="reportNewList"><list><l>X</l><l>X</l><l>X</l></list></block><comment w="77.33333333333333" collapsed="true">more 3.3.2.5</comment></block></script><script x="18.66666566666666" y="217.9999999999998"><custom-block s="status of triple %l"><l/><comment w="90" collapsed="true">3.3.2.5 inside</comment></custom-block></script><script x="20.333333333333314" y="186.88888888888903"><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><block s="reportListItem"><l></l><block var="board"/></block></autolambda><list></list></block><list><block s="reportNewList"><list><l>1</l><l>2</l><l>3</l></list></block></list><comment w="53.333333333333336" collapsed="true">3.3.2.2</comment></custom-block></script><script x="21.333332333333317" y="338.3333333333337"><custom-block s="tied?"><comment w="90" collapsed="true">3.3.3.1 inside</comment></custom-block></script><comment x="343.6666656666664" y="94.66666666666643" w="179.33333333333334" collapsed="false">3.3.3.3:  If the ninth move, the one that fills the board, causes a win, then the game isn&apos;t a tie even though no more moves are possible.</comment><comment x="342.9999989999999" y="298.0000000000002" w="174.66666666666666" collapsed="false">3.3.3.5:  There are many ways to do this.  The way shown here uses a /flag variable/, i.e., a variable whose value is true or false.  In this case, PLAYING is true if further moves are allowed.</comment><comment x="11.333333333333314" y="1184.6666666666672" w="358.6666666666667" collapsed="false">3.3.2 TIF A&#xD;This is quite complicated!&#xD;We are asked to make a check, never mind details yet, after the eighth move, because that&apos;s when the last move is forced.  But if the eighth move causes O to win (it has to be O because odd numbered moves are X and even numbered moves are O), then we shouldn&apos;t do this.  That&apos;s why the IF around this code has to include a check of PLAYING.&#xD;&#xD;If O didn&apos;t just win, then we are going to imagine filling the final square with X (because move 9, an odd-numbered move, is always X).  But we&apos;re not really going to change what&apos;s on the board, just what&apos;s in the BOARD list.  (Really we shouldn&apos;t even do that; we should copy the list and change the copy.  But if the eighth move has just happened and X can win on the next move, it&apos;s okay that we&apos;ve already marked that square as belonging to X; we&apos;ll do it again when player X actually clicks the square.)&#xD;&#xD;It&apos;s just after the eighth move if there&apos;s exactly one number left in BOARD.  We compute the list of numbers in BOARD, for two purposes:  First we see if there&apos;s exactly one number.  If so, we change that item of BOARD to X.  Then, if X didn&apos;t win, we can announce a tie. &#xD;&#xD;Note: The code from 3.3.3.1 that checks for a tie on the ninth move is now never going to succeed, because we&apos;re catching ties early.  But there&apos;s no need to remove it, just in case a player manages to click the ninth square before we locate it.  Maybe mark it as obsolete in a comment.  </comment><script x="497.66666566666663" y="633.6666666666662"><block s="bubble"><l>O won!</l></block></script><script x="592.6666656666666" y="584.1666666666662"><block s="bubble"><l>X won!</l></block></script><script x="640.6666656666666" y="770.1666666666664"><block s="bubble"><l>It&apos;s a tie.</l></block></script></scripts></sprite><sprite name="Sprite(2)" idx="3" x="-175" y="-106" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" costume="1" color="131.78399999999996,0,193.8,1" pen="tip" id="386"><costumes><list id="387"><item><costume name="alonzo" center-x="45" center-y="60" image="data:image/png;base64,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" id="388"/></item></list></costumes><sounds><list struct="atomic" id="389"></list></sounds><blocks></blocks><variables></variables><scripts><script x="161" y="100.83333333333303"><block s="receiveGo"></block><block s="doForever"><script><block s="doIfElse"><block var="X&apos;s turn?"/><script><block s="bubble"><l>X&apos;s Turn!</l></block></script><script><block s="bubble"><l>O&apos;s Turn!</l></block></script></block><block s="doIf"><custom-block s="won? %s"><l>O</l><comment w="53.333333333333336" collapsed="true">3.3.2.9</comment></custom-block><script><block s="bubble"><l>O wins!</l></block></script></block><block s="doIf"><custom-block s="won? %s"><l>X</l><comment w="53.333333333333336" collapsed="true">3.3.2.9</comment></custom-block><script><block s="bubble"><l>X wins!</l></block></script></block><block s="doIf"><block s="reportAnd"><block var="playing"/><custom-block s="tied?"><comment w="135.33333333333334" collapsed="true">3.3.3.1 and 3.3.3.5&#xD;See 3.3.3.3 above for why we have to test PLAYING.</comment></custom-block></block><script><block s="goToLayer"><l><option>front</option></l></block><block s="bubble"><l>It&apos;s a tie.</l></block></script></block></script></block></script></scripts></sprite></sprites></stage><hidden></hidden><headers></headers><code></code><blocks><block-definition s="label %&apos;text&apos; of size %&apos;size&apos;" type="command" category="pen"><comment x="0" y="0" w="90" collapsed="false">LABEL will stamp text on the stage at the given font size. The direction of the text is the direction the sprite is facing, and color will match the pen color.</comment><header></header><code></code><translations></translations><inputs><input type="%txt">Hello!</input><input type="%n">12</input></inputs><script><block s="doRun"><block s="reportJSFunction"><list><l>text</l><l>size</l></list><l>var stage = this.parentThatIsA(StageMorph),&#xD;    context = stage.penTrails().getContext(&apos;2d&apos;),&#xD;    rotation = radians(this.direction() - 90),&#xD;    trans = new Point(&#xD;      this.center().x - stage.left(),&#xD;      this.center().y - stage.top()&#xD;    ),&#xD;    isWarped = this.Warped,&#xD;    len,&#xD;    pos;&#xD;&#xD;if (isWarped) {endWarp(); }&#xD;context.save();&#xD;context.font = size + &apos;px monospace&apos;;&#xD;context.textAlign = &apos;left&apos;;&#xD;context.textBaseline = &apos;alphabetic&apos;;&#xD;context.fillStyle = this.color.toString();&#xD;len = context.measureText(text).width;&#xD;trans = trans.multiplyBy(1 / stage.scale);&#xD;context.translate(trans.x, trans.y);&#xD;context.rotate(rotation);&#xD;context.fillText(text, 0, 0);&#xD;context.translate(-trans.x, -trans.y);&#xD;context.restore();&#xD;pos = new Point(&#xD;  len * Math.sin(radians(this.direction())),&#xD;  len * Math.cos(radians(this.direction())));&#xD;pos = pos.add(new Point(this.xPosition(), this.yPosition()));&#xD;this.gotoXY(pos.x, pos.y, false);&#xD;this.changed();&#xD;if (isWarped) {this.startWarp(); }&#xD;stage.changed();</l></block><list><block var="text"/><block var="size"/></list></block></script></block-definition><block-definition s="map %&apos;function&apos; over %&apos;lists&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input><input type="%mult%l"></input></inputs><script><block s="doWarp"><script><block s="doDeclareVariables"><list><l>mapone</l><l>mapmany</l></list></block><block s="doSetVar"><l>mapone</l><block s="reifyScript"><script><block s="doIf"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportCONS"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><block s="evaluate"><block var="mapone"/><list><block s="reportCDR"><block var="data"/></block></list></block></block></block></script><list><l>data</l></list></block></block><block s="doSetVar"><l>mapmany</l><block s="reifyScript"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportListItem"><l>1</l><block var="data lists"/></block></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doReport"><block s="reportCONS"><block s="evaluate"><block var="function"/><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><block s="reportListItem"><l>1</l><l/></block></autolambda><list></list></block><list><block var="data lists"/></list></custom-block></block><block s="evaluate"><block var="mapmany"/><list><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><block s="reportCDR"><l/></block></autolambda><list></list></block><list><block var="data lists"/></list></custom-block></list></block></block></block></script><list><l>data lists</l></list></block></block><block s="doIfElse"><custom-block s="empty? %l"><block s="reportCDR"><block var="lists"/></block></custom-block><script><block s="doReport"><block s="evaluate"><block var="mapone"/><list><block s="reportListItem"><l>1</l><block var="lists"/></block></list></block></block></script><script><block s="doReport"><block s="evaluate"><block var="mapmany"/><list><block var="lists"/></list></block></block></script></block></script></block></script></block-definition><block-definition s="empty? %&apos;data&apos;" type="predicate" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><block s="reportEquals"><block var="data"/><block s="reportNewList"><list></list></block></block></block></script></block-definition><block-definition s="keep items such that %&apos;pred&apos; from %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%predRing"></input><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doReport"><block s="reportNewList"><list></list></block></block></script></block><block s="doIfElse"><block s="evaluate"><block var="pred"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><script><block s="doReport"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="keep items such that %predRing from %l"><block var="pred"/><block s="reportCDR"><block var="data"/></block></custom-block></block></block></script><script><block s="doReport"><custom-block s="keep items such that %predRing from %l"><block var="pred"/><block s="reportCDR"><block var="data"/></block></custom-block></block></script></block></script></block></script></block-definition><block-definition s="combine with %&apos;function&apos; items of %&apos;data&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%repRing"></input><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportCDR"><block var="data"/></block></custom-block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="data"/></block></block></script></block><block s="doReport"><block s="evaluate"><block var="function"/><list><block s="reportListItem"><l>1</l><block var="data"/></block><custom-block s="combine with %repRing items of %l"><block var="function"/><block s="reportCDR"><block var="data"/></block></custom-block></list></block></block></script></block></script></block-definition><block-definition s="if %&apos;test&apos; then %&apos;true&apos; else %&apos;false&apos;" type="reporter" category="control"><header></header><code></code><translations></translations><inputs><input type="%b"></input><input type="%anyUE"></input><input type="%anyUE"></input></inputs><script><block s="doIfElse"><block var="test"/><script><block s="doReport"><block s="evaluate"><block var="true"/><list></list></block></block></script><script><block s="doReport"><block s="evaluate"><block var="false"/><list></list></block></block></script></block></script></block-definition><block-definition s="for %&apos;i&apos; = %&apos;start&apos; to %&apos;end&apos; %&apos;action&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%n">1</input><input type="%n">10</input><input type="%cs"></input></inputs><script><block s="doDeclareVariables"><list><l>step</l><l>tester</l></list></block><block s="doIfElse"><block s="reportGreaterThan"><block var="start"/><block var="end"/></block><script><block s="doSetVar"><l>step</l><l>-1</l></block><block s="doSetVar"><l>tester</l><block s="reifyReporter"><autolambda><block s="reportLessThan"><block var="i"/><block var="end"/></block></autolambda><list></list></block></block></script><script><block s="doSetVar"><l>step</l><l>1</l></block><block s="doSetVar"><l>tester</l><block s="reifyReporter"><autolambda><block s="reportGreaterThan"><block var="i"/><block var="end"/></block></autolambda><list></list></block></block></script></block><block s="doSetVar"><l>i</l><block var="start"/></block><block s="doUntil"><block s="evaluate"><block var="tester"/><list></list></block><script><block s="doRun"><block var="action"/><list></list></block><block s="doChangeVar"><l>i</l><block var="step"/></block></script></block></script></block-definition><block-definition s="join words %&apos;words&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%mult%txt"></input></inputs><script><block s="doWarp"><script><block s="doIf"><custom-block s="empty? %l"><block s="reportCDR"><block var="words"/></block></custom-block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="words"/></block></block></script></block><block s="doIf"><block s="reportEquals"><l></l><block s="reportListItem"><l>1</l><block var="words"/></block></block><script><block s="doReport"><custom-block s="join words %mult%txt"><block s="reportCDR"><block var="words"/></block></custom-block></block></script></block><block s="doIf"><block s="reportEquals"><l></l><block s="reportListItem"><l>2</l><block var="words"/></block></block><script><block s="doReport"><custom-block s="join words %mult%txt"><block s="reportCONS"><block s="reportListItem"><l>1</l><block var="words"/></block><block s="reportCDR"><block s="reportCDR"><block var="words"/></block></block></block></custom-block></block></script></block><block s="doReport"><block s="reportJoinWords"><list><block s="reportListItem"><l>1</l><block var="words"/></block><l> </l><custom-block s="join words %mult%txt"><block s="reportCDR"><block var="words"/></block></custom-block></list></block></block></script></block></script><scripts><script x="229.00000300000002" y="196.77778077777774"><block s="reportJoinWords"><list><l></l><l></l></list></block></script></scripts></block-definition><block-definition s="list $arrowRight sentence %&apos;data&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doReport"><custom-block s="join words %mult%txt"><block var="data"/></custom-block></block></script></block></script></block-definition><block-definition s="sentence $arrowRight list %&apos;text&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs><script><block s="doWarp"><script><block s="doReport"><block s="reportTextSplit"><block var="text"/><l><option>whitespace</option></l></block></block></script></block></script></block-definition><block-definition s="catch %&apos;tag&apos; %&apos;action&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%cs"></input></inputs><script><block s="doCallCC"><block s="reifyScript"><script><block s="doSetVar"><l>tag</l><block var="cont"/></block><block s="doRun"><block var="action"/><list></list></block></script><list><l>cont</l></list></block></block><custom-block s="ignore %s"><l>3</l></custom-block></script></block-definition><block-definition s="throw %&apos;cont&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%s">catchtag</input></inputs><script><block s="doRun"><block var="cont"/><list></list></block></script></block-definition><block-definition s="catch %&apos;tag&apos; %&apos;value&apos;" type="reporter" category="control"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%anyUE"></input></inputs><script><block s="doCallCC"><block s="reifyScript"><script><block s="doSetVar"><l>tag</l><block var="cont"/></block><block s="doReport"><block s="evaluate"><block var="value"/><list></list></block></block></script><list><l>cont</l></list></block></block></script></block-definition><block-definition s="throw %&apos;tag&apos; %&apos;value&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%s">catchtag</input><input type="%s"></input></inputs><script><block s="doRun"><block var="tag"/><list><block var="value"/></list></block></script></block-definition><block-definition s="for each %&apos;item&apos; of %&apos;data&apos; %&apos;action&apos;" type="command" category="lists"><header></header><code></code><translations></translations><inputs><input type="%upvar"></input><input type="%l"></input><input type="%cs"></input></inputs><script><block s="doUntil"><custom-block s="empty? %l"><block var="data"/></custom-block><script><block s="doSetVar"><l>item</l><block s="reportListItem"><l>1</l><block var="data"/></block></block><block s="doRun"><block var="action"/><list><block s="reportListItem"><l>1</l><block var="data"/></block></list></block><block s="doSetVar"><l>data</l><block s="reportCDR"><block var="data"/></block></block></script></block></script></block-definition><block-definition s="if %&apos;test&apos; do %&apos;action&apos; and pause all $pause-1-255-220-0" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%boolUE"></input><input type="%cs"></input></inputs><script><block s="doDeclareVariables"><list><l>breakpoint</l></list></block><block s="doIf"><block s="evaluate"><block var="test"/><list></list></block><script><block s="doSetVar"><l>breakpoint</l><block var="test"/></block><block s="doShowVar"><l>breakpoint</l></block><block s="doRun"><block var="action"/><list></list></block><block s="doPauseAll"></block><block s="doHideVar"><l></l></block></script></block></script></block-definition><block-definition s="word $arrowRight list %&apos;word&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%txt"></input></inputs><script><block s="doWarp"><script><block s="doReport"><block s="reportTextSplit"><block var="word"/><l><option>letter</option></l></block></block></script></block></script></block-definition><block-definition s="ignore %&apos;x&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs></block-definition><block-definition s="tell %&apos;sprite&apos; to %&apos;action&apos;" type="command" category="control"><header></header><code></code><translations></translations><inputs><input type="%s">Sprite</input><input type="%cs"></input></inputs><script><block s="doRun"><block s="reportAttributeOf"><block var="action"/><block var="sprite"/></block><list></list></block></script></block-definition><block-definition s="ask %&apos;sprite&apos; for %&apos;expression&apos;" type="reporter" category="control"><header></header><code></code><translations></translations><inputs><input type="%s">Sprite</input><input type="%repRing"></input></inputs><script><block s="doReport"><block s="evaluate"><block s="reportAttributeOf"><block var="expression"/><block var="sprite"/></block><list></list></block></block></script></block-definition><block-definition s="list $arrowRight word %&apos;list&apos;" type="reporter" category="operators"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doWarp"><script><block s="doReport"><block s="reportJoinWords"><block var="list"/></block></block></script></block></script></block-definition><block-definition s="makeBoard" type="command" category="other"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doSwitchToCostume"><l>Empty</l></block><block s="show"></block><block s="setEffect"><l><option>ghost</option></l><l>30</l><comment w="78" collapsed="true">3.3.3 TIF B</comment></block><block s="setScale"><l>95</l><comment w="190" collapsed="true">Oops costumes are a bit too big.</comment></block><block s="doSetVar"><l>position number</l><l>1</l><comment w="53.333333333333336" collapsed="true">3.3.1.4</comment></block><custom-block s="for %upvar = %n to %n %cs"><l>i</l><l>1</l><l>3</l><script><custom-block s="for %upvar = %n to %n %cs"><l>j</l><l>1</l><l>3</l><script><block s="gotoXY"><block s="reportSum"><l>-100</l><block s="reportProduct"><l>50</l><block var="j"/></block></block><block s="reportDifference"><l>100</l><block s="reportProduct"><l>50</l><block var="i"/></block></block></block><block s="createClone"><l><option>myself</option></l></block><block s="doChangeVar"><l>position number</l><l>1</l><comment w="53.333333333333336" collapsed="true">3.3.1.4</comment></block></script></custom-block></script></custom-block><block s="hide"></block></script></block-definition><block-definition s="possible winning triples" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportNewList"><list><block s="reportNewList"><list><l>1</l><l>2</l><l>3</l></list></block><block s="reportNewList"><list><l>4</l><l>5</l><l>6</l></list></block><block s="reportNewList"><list><l>7</l><l>8</l><l>9</l></list></block><block s="reportNewList"><list><l>1</l><l>4</l><l>7</l></list></block><block s="reportNewList"><list><l>2</l><l>5</l><l>8</l></list></block><block s="reportNewList"><list><l>3</l><l>6</l><l>9</l></list></block><block s="reportNewList"><list><l>1</l><l>5</l><l>9</l></list></block><block s="reportNewList"><list><l>3</l><l>5</l><l>7</l></list></block></list></block></block></script></block-definition><block-definition s="status of triple %&apos;triple&apos;" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs><input type="%l"></input></inputs><script><block s="doReport"><custom-block s="map %repRing over %mult%l"><block s="reifyReporter"><autolambda><block s="reportListItem"><l></l><block var="board"/></block></autolambda><list></list></block><list><block var="triple"/></list></custom-block></block></script></block-definition><block-definition s="status of all winning triples" type="reporter" category="lists"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportMap"><block s="reifyReporter"><autolambda><custom-block s="status of triple %l"><l/></custom-block></autolambda><list></list></block><custom-block s="possible winning triples"></custom-block></block></block></script></block-definition><block-definition s="won? %&apos;who&apos;" type="predicate" category="operators"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doReport"><block s="reportListContainsItem"><custom-block s="status of all winning triples"></custom-block><block s="reportNewList"><list><block var="who"/><block var="who"/><block var="who"/></list></block></block></block></script></block-definition><block-definition s="tied?" type="predicate" category="operators"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doReport"><block s="reportEquals"><block s="reportFindFirst"><block s="reifyPredicate"><autolambda><block s="reportIsA"><l></l><l><option>number</option></l></block></autolambda><list></list></block><block var="board"/></block><l></l></block></block></script></block-definition><block-definition s="draw win line" type="command" category="lists"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doFor"><l>i</l><l>1</l><l>8</l><script><block s="doDeclareVariables"><list><l>line</l></list></block><block s="doIf"><block s="reportOr"><block s="reportEquals"><block s="reportListItem"><block var="i"/><custom-block s="status of all winning triples"></custom-block></block><block s="reportNewList"><list><l>X</l><l>X</l><l>X</l></list></block></block><block s="reportEquals"><block s="reportListItem"><block var="i"/><custom-block s="status of all winning triples"></custom-block></block><block s="reportNewList"><list><l>O</l><l>O</l><l>O</l></list></block></block></block><script><block s="doSetVar"><l>line</l><block s="reportListItem"><block var="i"/><block var="win lines"/></block></block><block s="up"></block><block s="doGotoObject"><block s="reportListItem"><l>1</l><block var="line"/><comment w="137.33333333333334" collapsed="false">This is why each line in WIN LINES is a list of points, each of which is a list of x,y coordinates:  It allows us to use the endpoints, as points, in the GO TO block.</comment></block></block><block s="down"></block><block s="doGotoObject"><block s="reportListItem"><l>2</l><block var="line"/></block></block><block s="up"></block></script></block></script></block></script><scripts><comment x="174" y="6.666666666666667" w="244" collapsed="false">I&apos;m kind of bummed that I didn&apos;t find a beautiful one-line solution using FIND FIRST, but it just gives the value it finds, not the position in the list, which is what we need to find the line endpoints in WIN LINES. So it&apos;s a plain old fashioned FOR loop.</comment></scripts></block-definition></blocks><variables><variable name="X&apos;s turn?"><bool>true</bool></variable><variable name="board"><list struct="atomic" id="1249">1,2,3,4,5,6,7,8,9</list></variable><variable name="playing"><bool>true</bool></variable><variable name="win lines"><list id="1250"><item><list id="1251"><item><list struct="atomic" id="1252">-100,50</list></item><item><list struct="atomic" id="1253">100,50</list></item></list></item><item><list id="1254"><item><list struct="atomic" id="1255">-100,0</list></item><item><list struct="atomic" id="1256">100,0</list></item></list></item><item><list id="1257"><item><list struct="atomic" id="1258">-100,-50</list></item><item><list struct="atomic" id="1259">100,-50</list></item></list></item><item><list id="1260"><item><list struct="atomic" id="1261">-50,100</list></item><item><list struct="atomic" id="1262">-50,-100</list></item></list></item><item><list id="1263"><item><list struct="atomic" id="1264">0,100</list></item><item><list struct="atomic" id="1265">0,-100</list></item></list></item><item><list id="1266"><item><list struct="atomic" id="1267">50,100</list></item><item><list struct="atomic" id="1268">50,-100</list></item></list></item><item><list id="1269"><item><list struct="atomic" id="1270">-100,100</list></item><item><list struct="atomic" id="1271">100,-100</list></item></list></item><item><list id="1272"><item><list struct="atomic" id="1273">-100,-100</list></item><item><list struct="atomic" id="1274">100,100</list></item></list></item></list></variable></variables></project><media name="U3L3-TicTacToe" app="Snap! 6, https://snap.berkeley.edu" version="1"></media></snapdata>