3 5Yv@sddlZddlZdaetadZetadZda d&Z ddZ dd Z d d Z d d ZddZddZddZddZeegZddZddZddZddZddZd d!Zd"d#Zd$d%ZedS)'NcCslxftdtD]X}tjtjd|ttjt|tjttjtj|tdtj|ttjtq WdS)z&Draw the horizontal and vertical linesrrN) range BOARDSIZEzgLinePointPPS WINDOWSIZEdrawwin)ir./TicTacToe6.pydrawGrids*rcCs$tjt|tdt|tdS)zcoordinates of center of square)rr r )rowcolrrr rectCentersrcCstjt|tt|tS)z'coordinates of top left of inset X or O)rr r INSET)rrrrr rectUpperLeft srcCs$tjt|dtt|dtS)z+coordinates of bottom right of inset X or Or)rr r r)rrrrrrectLowerRight$srcCs tjt|dtt|tS)z(coordinates of top right of inset X or Or)rr r r)rrrrrrectUpperRight(srcCs tjt|tt|dtS)z*coordinates of bottom left of inset X or Or)rr r r)rrrrr rectLowerLeft,srcCs@tjt||t||jttjt||t||jtdS)zDraw an X in the given squareN)rr rrr rrr)rrrrrdrawX2srcCs$tjt||tdtjtdS)zDraw an O in the given squarerN)rZCirclerr rr r)rrrrrdrawO7srcCs|tS)zFFind out row or colum number that corresponds to this pixel coordinate)r )Z pixelCoordrrr boardCoord>srcCst||}t||r.t|dt|tdgSt||rPtd|ttd|gS||kr|t|r|tddttdtdgS||tdkrt|rtdtdt tddgSdS)z1Check to see if the latest move resulted in a winrrF) squareStatecheckRowrrrcheckColcheckMainDiagonalcheckOtherDiagonalrr)rrxorrr checkWinnerEs   r%cCst|ddd|S)Nrr) checkGeneral)rr$rrrr Rsr cCstd|dd|S)Nrr)r&)rr$rrrr!Tsr!cCstdddd|S)Nrr)r&)r$rrrr"Vsr"cCstdtddd|S)Nrr)r&r)r$rrrr#Xsr#cCs6x0tD](}t|||krdS||7}||7}qWdS)NFT) BOARDRANGEr)rrZ rowIncrementZ colIncrementr$rrrrr&[s   r&cCs td}|dkr(t|attattatjdtta ddtDa t d}x|ttkr t j }t |jt |j}}t ||tkrPt|d|||dt ||<|d}t||}|rPtj|d|d}|jd |jd |jd d|jt PqPWt j t jdS) Nz&Enter board size (Press Enter for 3): zTicTacToe version 6cSsg|]}ddtDqS)cSsg|]}tqSr)EMPTY).0jrrr osz#main...)r()r+rrrrr-oszmain..rrrZred)inputintrrr(r r rZGraphWinrrrZgetMouserZgetYZgetXr*drawListr%r Z setOutlineZsetWidthmover close)ZuserSizeZ turnCountZ clickPointrrwinnerZwinLinerrrmaincs4     r6r')Z zellegraphicsrtimerrr(r r rrr*rrrrrrrrr2rr%r r!r"r#r&r6rrrrs4 %