<snapdata remixID="12074139"><project name="U3L3-TicTacToe" app="Snap! 9.0, https://snap.berkeley.edu" version="2"><notes></notes><thumbnail>data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKAAAAB4CAYAAAB1ovlvAAAAAXNSR0IArs4c6QAAAiVJREFUeF7t0sEJACAAAzHdf+gKLnGfdIHCkbttxxSIClwAo/JufwEAQUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrfOYAMpAUATPM7B5CBtACAaX7nADKQFgAwze8cQAbSAgCm+Z0DyEBaAMA0v3MAGUgLAJjmdw4gA2kBANP8zgFkIC0AYJrf+QOC496obByqTwAAAABJRU5ErkJggg==</thumbnail><scenes select="1"><scene name="U3L3-TicTacToe"><notes></notes><hidden></hidden><headers></headers><code></code><blocks><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="reportVariadicGreaterThan"><list><block var="start"/><block var="end"/></list></block><script><block s="doSetVar"><l>step</l><l>-1</l></block><block s="doSetVar"><l>tester</l><block s="reifyReporter"><autolambda><block s="reportVariadicLessThan"><list><block var="i"/><block var="end"/></list></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="reportVariadicGreaterThan"><list><block var="i"/><block var="end"/></list></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"><block s="errorObsolete"></block><script><block s="doReport"><block s="reportListItem"><l>1</l><block var="words"/></block></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><l></l><block s="reportListItem"><l>1</l><block var="words"/></block></list></block><script><block s="doReport"><custom-block s="join words %mult%txt"><block s="reportCDR"><block var="words"/></block></custom-block></block></script><list></list></block><block s="doIf"><block s="reportVariadicEquals"><list><l></l><block s="reportListItem"><l>2</l><block var="words"/></block></list></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><list></list></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.77778077777776"><block s="reportJoinWords"><list><l></l><l></l></list></block></script></scripts></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="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></block><block s="setScale"><l>125</l></block><block s="doSetVar"><l>position number</l><l>1</l></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="reportVariadicSum"><list><l>-100</l><block s="reportVariadicProduct"><list><l>50</l><block var="j"/></list></block></list></block><block s="reportDifference"><l>100</l><block s="reportVariadicProduct"><list><l>50</l><block var="i"/></list></block></block></block><block s="createClone"><l><option>myself</option></l></block><block s="doChangeVar"><l>position number</l><l>1</l></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"><block s="reportMap"><block s="reifyReporter"><autolambda><block s="reportListItem"><l></l><block var="board"/></block></autolambda><list></list></block><block var="triple"/></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="reportVariadicEquals"><list><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></list></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="reportVariadicOr"><list><block s="reportVariadicEquals"><list><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></list></block><block s="reportVariadicEquals"><list><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></list></block></list></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><list></list></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><block-definition s="Player Win? %&apos;Player&apos;" type="command" category="variables"><header></header><code></code><translations></translations><inputs><input type="%s"></input></inputs><script><block s="doIf"><custom-block s="won? %s"><block var="Player"/></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></block><block s="doSayFor"><block s="reportJoinWords"><list><block var="Player"/><l> won!</l></list></block><l>5</l></block><block s="doSetVar"><l>playing</l><block s="reportBoolean"><l><bool>false</bool></l></block></block><block s="doBroadcast"><l>Game Start</l><list></list></block></script><list></list></block></script></block-definition><block-definition s="Last Move" type="command" category="variables"><header></header><code></code><translations></translations><inputs></inputs><script><block s="doIf"><block s="reportVariadicAnd"><list><block var="playing"/><block s="reportVariadicEquals"><list><block s="reportListAttribute"><l><option>length</option></l><block var="Available Squares"/></block><l>1</l></list></block></list></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="doSayFor"><l>It&apos;s a tie.</l><l>5</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><block s="doBroadcast"><l>Game Start</l><list></list></block></script><list></list></block></script><list></list></block></script></block-definition><block-definition s="AI Logic %&apos;Player&apos; %&apos;Opponent&apos;" type="reporter" category="variables"><header></header><code></code><translations></translations><inputs><input type="%s"></input><input type="%s"></input></inputs><script><block s="doIfElse"><block s="reportVariadicEquals"><list><block s="reportListAttribute"><l><option>length</option></l><block var="Available Squares"/></block><l>9</l></list></block><script><block s="doIfElse"><block s="reportVariadicLessThan"><list><block s="reportRandom"><l>1</l><l>10</l></block><l>7</l></list></block><script><block s="doReport"><l>5</l></block></script><script><block s="doReport"><block s="reportListItem"><l><option>random</option></l><block var="Available Squares"/></block></block></script></block></script><script><block s="doIfElse"><block s="reportVariadicEquals"><list><block s="reportListAttribute"><l><option>length</option></l><block var="Available Squares"/></block><l>8</l></list></block><script><block s="doIfElse"><block s="reportIsA"><block s="reportListItem"><l>5</l><block var="board"/></block><l><option>number</option></l></block><script><block s="doReport"><l>5</l></block></script><script><block s="doReport"><block s="reportListItem"><l><option>random</option></l><block var="Available Squares"/></block></block></script></block></script><script><block s="doForEach"><l>item</l><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><script><block s="doIf"><block s="reportNot"><block s="reportListContainsItem"><block var="item"/><block var="Opponent"/></block></block><script><block s="doReport"><block s="reportListItem"><l><option>random</option></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="item"/></block></block></block></script><list></list></block></script></block><block s="doReport"><block s="reportListItem"><l><option>random</option></l><block var="Available Squares"/></block></block></script></block></script></block></script></block-definition></blocks><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" id="623"><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="624"></list></costumes><sounds><list struct="atomic" id="625"></list></sounds><variables></variables><blocks></blocks><scripts></scripts><sprites select="1"><sprite name="Square" idx="1" x="50.000000000000064" y="-49.999999999999986" heading="90" scale="1.25" volume="100" pan="0" rotation="1" draggable="false" hidden="true" costume="1" color="80,80,80,1" pen="tip" id="630"><costumes><list id="631"><item><ref mediaID="Square_cst_Empty"></ref></item><item><ref mediaID="Square_cst_Xplayer"></ref></item><item><ref mediaID="Square_cst_Oplayer"></ref></item></list></costumes><sounds><list struct="atomic" id="632"></list></sounds><blocks></blocks><variables><variable name="position number"><l>10</l></variable><variable name="TempBoard"><list struct="atomic" id="635">X,2,3,4,X,6,7,O,9</list></variable></variables><scripts><script x="18.999999999999915" y="10"><block s="receiveGo"></block><block s="clear"></block><custom-block s="makeBoard"></custom-block><block s="doSetVar"><l>players</l><l>4</l></block><block s="doUntil"><block s="reportVariadicOr"><list><block s="reportVariadicEquals"><list><block var="players"/><l>0</l></list></block><block s="reportVariadicOr"><list><block s="reportVariadicEquals"><list><block var="players"/><l>1</l></list></block><block s="reportVariadicEquals"><list><block var="players"/><l>2</l></list></block></list></block></list></block><script><block s="doAsk"><l>How many players? (0, 1 or 2)</l></block><block s="doSetVar"><l>players</l><block s="getLastAnswer"></block></block></script></block><block s="doBroadcast"><l>Game Start</l><list></list></block></script><script x="366.2972972972973" y="285.68491132642"><block s="receiveMessage"><l>AI Turn</l><list></list></block><block s="doSetVar"><l>AI Move</l><custom-block s="AI Logic %s %s"><l>O</l><l>X</l></custom-block></block><block s="doIf"><block s="reportVariadicAnd"><list><block var="playing"/><block s="reportVariadicEquals"><list><block var="position number"/><block var="AI Move"/></list></block></list></block><script><block s="doSwitchToCostume"><l>Oplayer</l></block><block s="doReplaceInList"><block var="position number"/><block var="board"/><l>O</l></block><custom-block s="Player Win? %s"><l>O</l></custom-block><custom-block s="Last Move"></custom-block><block s="doIf"><block var="playing"/><script><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="doIfElse"><block s="reportVariadicEquals"><list><block var="players"/><l>1</l></list></block><script><block s="doSetVar"><l>X&apos;s turn?</l><block s="reportBoolean"><l><bool>true</bool></l></block></block><block s="doSayFor"><l>Your turn...</l><l>2</l></block></script><script><block s="doBroadcast"><l>AI 2 Turn</l><list></list></block></script></block></script><list></list></block></script><list></list></block></script><script x="760" y="240.30188679245242"><block s="receiveInteraction"><l><option>clicked</option></l></block><block s="doIf"><block s="reportVariadicEquals"><list><block var="players"/><l>2</l></list></block><script><block s="doIf"><block s="reportVariadicAnd"><list><block var="playing"/><block s="reportVariadicEquals"><list><block s="getCostumeIdx"></block><l>1</l></list></block></list></block><script><block s="doIfElse"><block var="X&apos;s turn?"/><script><block s="doSwitchToCostume"><l>Xplayer</l></block><block s="doReplaceInList"><block var="position number"/><block var="board"/><l>X</l></block><custom-block s="Player Win? %s"><l>X</l></custom-block></script><script><block s="doSwitchToCostume"><l>Oplayer</l></block><block s="doReplaceInList"><block var="position number"/><block var="board"/><l>O</l></block><custom-block s="Player Win? %s"><l>O</l></custom-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="reportVariadicAnd"><list><block var="playing"/><custom-block s="tied?"></custom-block></list></block><script><block s="bubble"><l>It&apos;s a tie.</l></block><block s="goToLayer"><l><option>front</option></l></block></script><list></list></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><custom-block s="Last Move"></custom-block></script><list></list></block></script><list></list></block></script><script x="533.9999999999999" y="689.7127882599564"><block s="receiveMessage"><l>AI 2 Turn</l><list></list></block><block s="doSetVar"><l>AI Move</l><custom-block s="AI Logic %s %s"><l>X</l><l>O</l></custom-block></block><block s="doIf"><block s="reportVariadicAnd"><list><block var="playing"/><block s="reportVariadicEquals"><list><block var="position number"/><block var="AI Move"/></list></block></list></block><script><block s="doSwitchToCostume"><l>Xplayer</l></block><block s="doReplaceInList"><block var="position number"/><block var="board"/><l>X</l></block><custom-block s="Player Win? %s"><l>X</l></custom-block><custom-block s="Last Move"></custom-block><block s="doIf"><block var="playing"/><script><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="doBroadcast"><l>AI Turn</l><list></list></block></script><list></list></block></script><list></list></block></script><script x="10" y="362.8553459119492"><block s="receiveInteraction"><l><option>clicked</option></l></block><block s="doIf"><block s="reportVariadicEquals"><list><block var="players"/><l>1</l></list></block><script><block s="doIf"><block s="reportVariadicAnd"><list><block var="playing"/><block s="reportVariadicEquals"><list><block s="getCostumeIdx"></block><l>1</l></list></block></list></block><script><block s="doIf"><block var="X&apos;s turn?"/><script><block s="doSwitchToCostume"><l>Xplayer</l></block><block s="doReplaceInList"><block var="position number"/><block var="board"/><l>X</l></block><custom-block s="Player Win? %s"><l>X</l></custom-block></script><list></list></block></script><list></list></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="reportVariadicAnd"><list><block var="playing"/><custom-block s="tied?"></custom-block></list></block><script><block s="bubble"><l>It&apos;s a tie.</l></block><block s="goToLayer"><l><option>front</option></l></block></script><list></list></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><custom-block s="Last Move"></custom-block><block s="doBroadcast"><l>AI Turn</l><list></list></block></script><list></list></block></script><script x="528" y="15.046121593291275"><block s="receiveMessage"><l>Game Start</l><list></list></block><block s="clear"></block><block s="doSwitchToCostume"><l>Empty</l></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></block></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="doSetVar"><l>playing</l><block s="reportBoolean"><l><bool>true</bool></l></block></block><block s="doIf"><block s="reportVariadicEquals"><list><block var="players"/><l>0</l></list></block><script><block s="doBroadcast"><l>AI 2 Turn</l><list></list></block></script><list></list></block></script></scripts></sprite><sprite name="Sprite" idx="2" x="99.99999999999991" y="0" heading="90" scale="1" volume="100" pan="0" rotation="1" draggable="true" hidden="true" costume="0" color="255,32,0,1" pen="tip" id="1043"><costumes><list struct="atomic" id="1044"></list></costumes><sounds><list struct="atomic" id="1045"></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 var="playing" style="normal" x="9.999999999999714" y="325.49999599999984" color="243,118,29" hidden="true"/><watcher var="win lines" style="normal" x="9.999999999999714" y="177.99999799999986" color="243,118,29" hidden="true"/><watcher var="players" style="normal" x="13.25966850828727" y="13.259668508287284" color="243,118,29" hidden="true"/><watcher scope="Stage" s="getLastAnswer" style="normal" x="13.25966850828727" y="306.39116552486155" color="4,148,220" hidden="true"/><watcher var="AI Move" style="normal" x="18.563535911602862" y="19.027621657458695" color="243,118,29" hidden="true"/><watcher scope="Square" var="position number" style="normal" x="12.651933701657937" y="258.7209964751379" color="243,118,29" hidden="true"/><watcher var="Available Squares" style="normal" x="257.7651847375692" y="17.4364667403315" color="243,118,29" hidden="true"/><watcher var="board" style="normal" x="1.3259668508291114" y="58.82320441988952" color="243,118,29" hidden="true"/><watcher scope="Square" var="TempBoard" style="normal" x="25.630802528906788" y="212.30437736743175" color="243,118,29" hidden="true"/></sprites></stage><variables><variable name="X&apos;s turn?"><bool>true</bool></variable><variable name="board"><list struct="atomic" id="1065">X,2,X,O,O,O,X,8,9</list></variable><variable name="playing"><bool>false</bool></variable><variable name="win lines"><list id="1066"><item><list id="1067"><item><list struct="atomic" id="1068">-100,50</list></item><item><list struct="atomic" id="1069">100,50</list></item></list></item><item><list id="1070"><item><list struct="atomic" id="1071">-100,0</list></item><item><list struct="atomic" id="1072">100,0</list></item></list></item><item><list id="1073"><item><list struct="atomic" id="1074">-100,-50</list></item><item><list struct="atomic" id="1075">100,-50</list></item></list></item><item><list id="1076"><item><list struct="atomic" id="1077">-50,100</list></item><item><list struct="atomic" id="1078">-50,-100</list></item></list></item><item><list id="1079"><item><list struct="atomic" id="1080">0,100</list></item><item><list struct="atomic" id="1081">0,-100</list></item></list></item><item><list id="1082"><item><list struct="atomic" id="1083">50,100</list></item><item><list struct="atomic" id="1084">50,-100</list></item></list></item><item><list id="1085"><item><list struct="atomic" id="1086">-100,100</list></item><item><list struct="atomic" id="1087">100,-100</list></item></list></item><item><list id="1088"><item><list struct="atomic" id="1089">-100,-100</list></item><item><list struct="atomic" id="1090">100,100</list></item></list></item></list></variable><variable name="players"><l>0</l></variable><variable name="Available Squares"><list struct="atomic" id="1091">2,4,8,9</list></variable><variable name="AI Move"><l>2</l></variable></variables></scene></scenes></project><media name="U3L3-TicTacToe" app="Snap! 9.0, https://snap.berkeley.edu" version="2"><costume name="Empty" center-x="21" center-y="20" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACoAAAAoCAYAAACIC2hQAAAAAXNSR0IArs4c6QAAAJtJREFUWEft2dEKgCAMheGzN+v9X8oI8iKFlkwYi9/rQevzTLBM0qECyyS1An2KRnfvUm3R1nJja3b5Pdckmt1kb29slkajw4RoVHAanmGgyGhUmIxGBcnobkFEEb0FOJ52RwFRRPtwjfd6riKL2WCYFsHcckRdosUCRBfB3PL/iF6vmn3of/pI5u5JUkHt76NJaK+PLSVa4vfNCWotgIPIhqnOAAAAAElFTkSuQmCC" mediaID="Square_cst_Empty"/><costume name="Xplayer" center-x="22" center-y="20" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAoCAYAAACFFRgXAAAAAXNSR0IArs4c6QAAA0tJREFUWEfVmU1oE0EYht+Jprai0RL/TnpohUC12Zt6MqeCaYJWkNYfbHoQPKkH0YMI/pwUDz14EBRsta0oiCltIngqXqSeNkFpxVb0oD3YoiliIdGMTLpbN8nMziTdtMleFrIz3zz7zew737whWLwCxr3ab2PEIKTVTmrwESFwc/NuTE19XPH3YOOySzA2H5h1ar2qoeF7AwYvPlox6LbDh+Dqqof360bRuHzgo/3HMO39nQNt+dyIt73jFc82g13odmO+7m9u3D2TXh50MfDJO6fxzjeXl9WdqXW/vtyaSiSTyT+VSPeJy6d2fNqfalpwZ9da47e8bsTQ7QHrT/nAneeOY7JtXsSUIIRG9Pa47iS0FgtGKCUPeTE96TWYuTRhnV21DFuCpQihAaegtViwl1JyXgTb0J/Bq+GX4gybTySZThHqiujhkehyMt062t5HgG5BjMT2+1l/ASxrKpY1LRbsEU3VYk/ao7fH+0qF1l4c2ZytS0cJJQdFsCTjDugd0R+c52JgxqTFghqlZAzAJl5wQsl1PTx6TRWawVJ3hsXz8/pQYNiVcUf0juhPALzNzB6YBZVBU6A/GYpFZNBGHLaMdglgC+OUB5yDLi0zRTyylxbMVPnAKtAAEsbaY9O5dBmy1StcVuJvYXnAJoHs67ZqtZ3GApCpjTPADFwCndNqAGxD4GpsDlau584BGx+jcIcCkAZQJ5QttR3TWWAFaB4vd50LXsx5YBXZM2EKNFamgux5ZYBZZP9IqBOEDgFwcTcYYFoPxZpVKC1tKgMs09iqyrBMYzkZXb01LNHY6lIJuzrW1NgsJRdsyseV0+Ga2elKqGN5tQT3CMTWuE1dXb5K1FS1VkYdy5Vbmfxx6urSMywbpKpOHJU809kdkyx1tfqZrqZOzTznx7IoVfRTuWSwk0hmokh9CQnsqjg/2+L1eP7gmZmE/6dm07E0TcCCNJVSAyhn2Gxot83vTXgxcGXJQc0/5vOgfd88sxN333+olBFoQoc6wxtmu+C3GoK+GQ+ennliTUCxL2G1PQWWZ8kZVO1gHbtpbj2SN/VCm5dvpLCOW/1bMHjjsepYjrVjs7zv7AGM33vD86RtnR/HIBwMVLvANfO31z+tiDFH0FjEagAAAABJRU5ErkJggg==" mediaID="Square_cst_Xplayer"/><costume name="Oplayer" center-x="22" center-y="20" image="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAoCAYAAACFFRgXAAAAAXNSR0IArs4c6QAAAu9JREFUWEfdmT9oU0Ecx79XNOqSBKRVEOoNSSgaagVFwaEJQmKhSHUQRzs4Oeji4mJcurjo4ORQR3HQIoWaB9J0EBQFa4lSkgzXgqAtQpJFjZKr1/zp63v3/ibanFne8O5397nvfXO/390jaPwSzWevP3KkSch7nbTJRzoGHj11EvH+ICh+IFz7iVD1O0Jfapv9Vw4GUAnuQzmwBwx7kV+vYuHN20608Q98bfwsRmoVDBYqngBWYyEsBkJ4MPvSU5xvhS+nErhYXW+r6GfUlvpPg/14rOW8dGGr8IK+pyNDQ7smI/vpcH7tkJcRnNouxQc+T5e+sU/Ly78NbUclsbbALX9jntJwDbuFFMecAHy+/xDAr0SSsbIuXrYROAO7gSUgK3XwGQKSI+AsxYqLYmCNRkc4COXgiT6QCQ5+2GZCRmjvwE6wAhTgmRQrPnKjrEajVwCSsQHXQ3sHfkGj9whwXQ5D7qRZIeMG1NgmS2MZgN+WxXLg/jlWvIE/Snjy8ByNJPtA5mWdEmDSrapWExJqc2Ba9r4OnhxjJdnY1h7WaGxFtnTdgG1BWkELq6VYQeZ3ObBICufzq7IV8W0DK6Wt7PE8PihLLnLgh6kTpgzWnDX141mnGI3GmHE1RUa8qr0zhpqBRW1w66t+O2zEdNMKRgora0wdCBtrDzOwzA5/U90tP5tVltjCDHx3/AyG82vbRNBtNU6r6/u9bAtdig/g5uwrfZ9mYJl/AXIhzQozvmlcBGZpbALgz/RNJT42Az85fdRUiRHgeCvduhjbV5NGGsd7fbCopy+9/mivcJZGTQOmWbFdCPmicRmUpVFTdkuz4n8GvFOWmKMRUdFtS8euLKHcn065bU25xKFcahZ7iFLFjwBWrrwU0EoV8AJYuSOSKIGVOoQKYOWO+cIaTtCN08jWRUod9fIYK21emP3zi5RWmeQG2mVBZtWsK1dVyl0GStXo5etW21VW5kLbOAtlPhl0+CfzG94+hCrz2WsDsGj4OBOBsF0AAAAASUVORK5CYII=" mediaID="Square_cst_Oplayer"/></media></snapdata>