From 68fbb6531c0e798d13f6ffa880cc8002f0e1276a Mon Sep 17 00:00:00 2001 From: simon Date: Wed, 15 Jul 2020 01:14:07 +0200 Subject: [PATCH] trying to draw a red line through all winning entries --- TicTacToe - MinMax/src/Board.java | 86 ++++++++++++++---- TicTacToe - MinMax/src/Executor.java | 9 +- TicTacToe - MinMax/src/Game.java | 79 +++++++++++++--- TicTacToe - MinMax/src/Painter.java | 28 +++++- .../TicTacToe - MinMax/Board$1.class | Bin 0 -> 1066 bytes .../TicTacToe - MinMax/Board$2.class | Bin 0 -> 1843 bytes .../TicTacToe - MinMax/Board$MAdapter.class | Bin 789 -> 0 bytes out/production/TicTacToe - MinMax/Board.class | Bin 2894 -> 3388 bytes .../TicTacToe - MinMax/Executor$1.class | Bin 0 -> 556 bytes .../TicTacToe - MinMax/Executor.class | Bin 915 -> 1015 bytes out/production/TicTacToe - MinMax/Game.class | Bin 1473 -> 2648 bytes .../TicTacToe - MinMax/Painter.class | Bin 1626 -> 2930 bytes 12 files changed, 170 insertions(+), 32 deletions(-) create mode 100644 out/production/TicTacToe - MinMax/Board$1.class create mode 100644 out/production/TicTacToe - MinMax/Board$2.class delete mode 100644 out/production/TicTacToe - MinMax/Board$MAdapter.class create mode 100644 out/production/TicTacToe - MinMax/Executor$1.class diff --git a/TicTacToe - MinMax/src/Board.java b/TicTacToe - MinMax/src/Board.java index 41c250a..0bf8df0 100644 --- a/TicTacToe - MinMax/src/Board.java +++ b/TicTacToe - MinMax/src/Board.java @@ -30,7 +30,17 @@ public class Board extends JPanel implements ActionListener { private void initBoard(){ painter = new Painter(B_WIDTH,B_HEIGHT); - addMouseListener(new MAdapter()); + addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + super.mouseClicked(e); + int column = e.getX()/TILE_X; + int row = e.getY()/TILE_Y; + game.place(column * 3 + row, 1); + System.out.println(Arrays.toString(game.getPlayfield())); + } + }); + setBackground(Color.BLACK); setFocusable(true); setPreferredSize(new Dimension(B_WIDTH,B_HEIGHT)); @@ -64,30 +74,70 @@ public class Board extends JPanel implements ActionListener { actions++; } } + painter.paintWinnerLine(g); } + public void resetBoard(){ + for (int i = 0; i < game.getPlayfield().length; i++){ + game.setPlayfield(i, 0); + timer.start(); + oldPlayfield = game.getPlayfield().clone(); + game.setTurnTaken(false); + } + repaint(); + } + + public void setWinningLine(){ + painter.setWinningX1(game.getWinningX1()); + painter.setWinningY1(game.getWinningY1()); + painter.setWinningX2(game.getWinningX2()); + painter.setWinningY2(game.getWinningY2()); + } + + //game controlling method @Override public void actionPerformed(ActionEvent e) { - if (!game.checkWin() && isChanged(oldPlayfield)){ - repaint(); - oldPlayfield = game.getPlayfield().clone(); - System.out.println(2); - } else if (game.checkWin()){ - repaint(); - } + Thread actionThread = new Thread(){ + @Override + public void run() { + //check if game state evaluation needs to be done + if (isChanged(oldPlayfield)) { + gameWon = game.checkWin(); + //repaint board if not won + if (!gameWon) { + repaint(); + oldPlayfield = game.getPlayfield().clone(); + } + //stop timer if game won + else if (gameWon || game.emptyTiles() == 0) { + setWinningLine(); + repaint(); + timer.stop(); + System.out.println("Game ended"); + try { + Thread.sleep(1000); + int n = JOptionPane.showConfirmDialog(null, "Do you want to play again?"); + if (n == 0){ + resetBoard(); + } else { + System.exit(0); + } + } catch (InterruptedException interruptedException) { + interruptedException.printStackTrace(); + } + } + } + //check if computer needs to take a turn + if (game.isTurnTaken() && game.emptyTiles() != 0){ + game.setTurnTaken(false); + game.computersTurn(); + } + } + }; + actionThread.start(); } private boolean isChanged(int[] playfield){ return !Arrays.equals(game.getPlayfield(), playfield); } - - private class MAdapter extends MouseAdapter{ - @Override - public void mouseClicked(MouseEvent e) { - super.mouseClicked(e); - int column = e.getX()/TILE_X; - int row = e.getY()/TILE_Y; - game.setPlayfield(column * 3 + row, 1); - } - } } diff --git a/TicTacToe - MinMax/src/Executor.java b/TicTacToe - MinMax/src/Executor.java index 7734b07..881fc69 100644 --- a/TicTacToe - MinMax/src/Executor.java +++ b/TicTacToe - MinMax/src/Executor.java @@ -15,7 +15,12 @@ public class Executor extends JFrame { } public static void main(String[] args) { - Executor exc = new Executor(); - exc.setVisible(true); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + Executor exc = new Executor(); + exc.setVisible(true); + } + }); } } diff --git a/TicTacToe - MinMax/src/Game.java b/TicTacToe - MinMax/src/Game.java index 45c6d72..8eec455 100644 --- a/TicTacToe - MinMax/src/Game.java +++ b/TicTacToe - MinMax/src/Game.java @@ -1,36 +1,69 @@ import javax.swing.*; +import java.awt.*; public class Game { - int[] playfield; + private int[] playfield; + private boolean turnTaken = false; + private int winningX1,winningY1,winningX2,winningY2; public Game(){ playfield = new int[9]; } - public void place(int player, int position){ - if (playfield[position] == -1){ + public void place(int position, int player){ + if (playfield[position] == 0){ playfield[position] = player; + if (player == 1) { + turnTaken = true; + } } else { - JOptionPane.showConfirmDialog(null,"Tile is already taken"); + JOptionPane.showInternalMessageDialog(null,"Tile is already taken"); + } + } + + public void computersTurn(){ + boolean isPlaced = false; + try { + Thread.sleep(750); + } catch (InterruptedException e) { + e.printStackTrace(); + } + while(!isPlaced){ + int random = (int) (Math.random() * (8 - 0 + 1) + 0); + System.out.println(random); + // if field is free + if (playfield[random] == 0) { + place(random, -1); + isPlaced = true; + } } } public boolean checkWin() { + //only check if winning is possible if (emptyTiles() < 5) { for (int i = 0; i < 3; i++) { - if ((playfield[i] == playfield[i + 3]) && (playfield[i] == playfield[i + 6])) { - System.out.println("vertical"); + //horizontal + if ((playfield[i] == playfield[i + 3] && playfield[i] != 0) && (playfield[i] == playfield[i + 6])) { + winningX1 = 0; + winningX2 = 3; + winningY1 = winningY2 = i; return true; - } else if ((playfield[i * 3] == playfield[i * 3 + 1]) && (playfield[i * 3] == playfield[i * 3 + 2])) { - System.out.println("horizontal"); + } + //vertical + else if ((playfield[i * 3] == playfield[i * 3 + 1] && playfield[i * 3] != 0) && (playfield[i * 3] == playfield[i * 3 + 2])) { + winningX1 = winningX2 = i; + winningY1 = 0; + winningY2 = 3; return true; } } - return (playfield[2] == playfield[4]) && (playfield[2] == playfield[6]) || (playfield[0] == playfield[4]) && (playfield[0] == playfield[8]); - } else { - return false; + //diagonal + return (playfield[2] == playfield[4] && playfield[2] != 0) && (playfield[2] == playfield[6]) || + (playfield[0] == playfield[4] && playfield[0] != 0) && (playfield[0] == playfield[8]); } + return false; } public int emptyTiles(){ @@ -43,6 +76,14 @@ public class Game { return n; } + public boolean isTurnTaken() { + return turnTaken; + } + + public void setTurnTaken(boolean turnTaken) { + this.turnTaken = turnTaken; + } + public void setPlayfield(int position, int value) { playfield[position] = value; } @@ -50,4 +91,20 @@ public class Game { public int[] getPlayfield() { return playfield; } + + public int getWinningX1() { + return winningX1; + } + + public int getWinningX2() { + return winningX2; + } + + public int getWinningY1() { + return winningY1; + } + + public int getWinningY2() { + return winningY2; + } } diff --git a/TicTacToe - MinMax/src/Painter.java b/TicTacToe - MinMax/src/Painter.java index 1229a36..362be4d 100644 --- a/TicTacToe - MinMax/src/Painter.java +++ b/TicTacToe - MinMax/src/Painter.java @@ -5,9 +5,11 @@ public class Painter { private final int TILE_X; private final int TILE_Y; + private int winningX1, winningY1, winningX2, winningY2; + public Painter(int boardWidth, int boardHeight){ TILE_X = boardWidth/3; - TILE_Y = boardWidth/3; + TILE_Y = boardHeight/3; } public void drawX(Graphics g, int column, int row) { @@ -45,4 +47,28 @@ public class Painter { g2d.drawLine(TILE_X*i, 0, TILE_X*i, TILE_Y*3); } } + + public void paintWinnerLine(Graphics g){ + Graphics2D g2d = (Graphics2D) g; + g2d.setColor(Color.RED); + g2d.setStroke(new BasicStroke(40)); + System.out.println(winningX1 + ", " + winningY1 + ", " + winningX2 + ", " + winningY2); + g2d.drawLine(winningX1 * 300 + 150, winningY1 * 300 + 150, winningX2 * 300 + 150, winningY2 * 300 + 150); + } + + public void setWinningX1(int winningX1) { + this.winningX1 = winningX1; + } + + public void setWinningX2(int winningX2) { + this.winningX2 = winningX2; + } + + public void setWinningY1(int winningY1) { + this.winningY1 = winningY1; + } + + public void setWinningY2(int winningY2) { + this.winningY2 = winningY2; + } } diff --git a/out/production/TicTacToe - MinMax/Board$1.class b/out/production/TicTacToe - MinMax/Board$1.class new file mode 100644 index 0000000000000000000000000000000000000000..9068526e6b589eb45e8b7a16b8c56184d873deaf GIT binary patch literal 1066 zcmaJ=+fvg|6kUgwhSmTD1mr4efnI=ucP&(*a)}m(8Jvy|FNXFA(KKO_6oxPHJ9Mx( zKKKECl;b*Sz0IhZNzOj2`?B`lt6#r;{sQ13b~JPdbgsFkSBoQxP7N^~8oC6u5KJuz z#DXKsPc0HEhgczj1TJaNb#$XgVC;=~V&=`$ATLj(6XdtuhA&rZ=5ZiBMlV~A6%+*` z=}bjMCUx|oUqG)bzmjcL-^!Z6WV-yfJnJfDK}BB1poSqG!?+?a@=srZ=%EZ=g!K#+ zHL7Dwg(&!C90C(MCUI2(W?hnCd6Orbx`yi-Zsqn=Yj~h@ zxdnlNkl~*^xW{9~%63S!J@nsGWGVuQbbHn65-qtkj-a<}IdZ2_Kak#Y^S~z3Uv{ge zT`@gN-P>SPsYM{(N|0J23qjwp|7@2#sJeEePC~-q3_bUh6!zSPSCt!SBdfk#~h8vbm3lWG@hZANmyejnM~G$s>M;T3&dJRo>_yW+Q*4?RKtrh_D(^ z$mTB4n`>gAPt4gXG)9zB%$_51j`8u>(Zs806H^~B(}tRu`-H_N?*1x1%JQHzJ28zO z%mwct+{<6y*>R*yfoa IqKNbP4(l@7dH?_b literal 0 HcmV?d00001 diff --git a/out/production/TicTacToe - MinMax/Board$2.class b/out/production/TicTacToe - MinMax/Board$2.class new file mode 100644 index 0000000000000000000000000000000000000000..354d8c295a169501fa55a7f794aac4e89203d1da GIT binary patch literal 1843 zcmZuxNpl-T6#mANGq&8`mxKfoB^Z$G#DcKLCLvyu$jA#=$Y8ULrM5KoXhxYCc>%Hj zhE#E&DhCdB6~%!neBczy7A_7H7cQJQlRv<30E*)4k;<_Pq?+lT*RQ|#z3;v5U;p{> zCjb|4rxA4s=?Dwd(N$h1xWqJ~f`o@qo2T6MGuw4*~qeE_0CI96`jGS(MOX>m*4d@@4EE`e_J zXlOLOkpdwlm+E8l$@rXtIVSKBj%x_#jiO|j)K!k;^DrLKaZ=zEqFhu)4Gr0X%r4KG zcEBRoen#L?^fD2(eb(WMHm8CVXzh3rjNV2jtERJdI~GL}an#ucu8*dI6~*65K( z+WC}eOO@`6f`u7m0N*T1S3_q2zn1V;>6Az-Bk^CtMIDy}UREgWiohWc3gY=rsS(2% z(J?A8hAW4PHnZ;evPeQs+1JorO~G^$(=Mf$@mbO0U<0m^z7jSn?VQX-FpgJrqy#1~ zNn%0Thxbsd)OVsKHciyXvrv~Jcmr?hm=l=CTN;iYOn!W-WAVmXp^IuaPoV{ltht%C8OOz#N1s|1d?l7$L-I6_GcfdynqSFV{< zFC0t8GddXY68j4(?p!>h)~^e=3bQ%OjLM7~Y$xql?eNB_Xn4fQkz%Xr zv&nLCLAq&U!J?%j0+4rpSe-hLXJs{=( zNkE+DAn6ICR0|cEamsF1Uf~HLCr6akH**s+)8)riL1t%x)2{vdpvO$rhyXd$@ zby=J`P*u6YiY6`xE@NuWrsKshDLwz1Z~&Mxv>St5P?yU_Z6fPOFVDf4}VK448(`0lBCVHIoqqJMx!t*{PJ#nQg0VcqZB zArzk-G*{5MiLV|Qj#hAD7pJSMr?=3nW)(bk$Rk$4*`IN47tPx+_FdbmGa@{-h4JdX zXRAZ7eFra8F!VhxcU-L?*@dY+ysCA)zK7YN6I*DmdcM64J+z1Sw$YI4uV8T>)7-3* z*ntYLiDR{uPzBb$Q|TU4-M}~ama>GPM4F>CV9&S1#2NPYSy;Rni@ZZh^tn!p%fE*Y zDfb4Y{G1ZrrHEfrxUca6v2GFV2DWh%-?0IHq1SKt6u;w6AbgZ@?xF+l(^sQcm`FD` z1Mb&~ag*~-=zn3N=Wkrl{zPb4M=m@-*IQhw!)<)TG0e;NV*)En3qIo*A&ja$fBynl C|E{V4 literal 0 HcmV?d00001 diff --git a/out/production/TicTacToe - MinMax/Board$MAdapter.class b/out/production/TicTacToe - MinMax/Board$MAdapter.class deleted file mode 100644 index 27fad55d9b9ea867daaf02ae0d555a0024098f6e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 789 zcmaJ3OGfR~hHIuz_@11kc{n{TtzkLVr5D!db1aeP98TE@WkTa3DVWJ>VN}bj9 zCw=)bQISAC+4th=ih$WkpPCjdoHJqD7(+>*@?IXuhCECf>OciaV?7+k>MZ(^7kJ64 zK-Q^sb!6Gb1SSRSfyT9bulGUq1s0sn-+0zEWm899z(o^NHl}e&VCJ7#0pp!YcG7%p z9W`sCqC>QMw+MlG8wdt~C~GY`RJE)^J}^6cLCucWGFLmvy{?S3NQ*!iysq>uP>T;$PFTzXG34O5hth-mC!1 zKo1V+c)J48my(D>I^OXS#gZ0Adhni(!xfOM3wdA12bD=uDn4Y5UOTyK5(y0-V~2`Q z1g_q0>@pG~hBchXY%7=syLJ?xsrX#S7x;2MzSCYBY7k%9YeVN6w1UYlyKDj?FHl3* z?*z}o{x{UWQa2u%$d6hcqd>H~GE194BtPDflw^h)!c7y3U>_PW*&?JfoW7D z%D+zg80SL4ar%oY{OAJz1mlY<{OcF^j(sJZtd5W`gfQ0`yG>m$X6@Z-qW)`UkePrL zIEhnkzD9r7CAGJGmQQYk%C!O4P~%dxq6xR68Mkp_Z^vCoqRi1=;^_7{a#bCxBu5={ z1It<03fzE|h+`FzcPzlBd~6V-7;{zrS=H1fu~7uMt|7x(T*Zu0w7a-E_6E4t$4Ton zz9CYB$ezF!=`;S+9wDZ#T!=e(wp>yp2MO4K z8a#;Wu#v}?K?0lD@C|I>X53RmU#Wiz+Hj8Ai#V^P)E;|{5 h61`gxbeWEVU-4TbjWEqgzDvK;j?!-BUH&G$+yC+LH>>~v delta 1086 zcmZ9L*-sN;6vcmEJ7wBZL<{1I3lc2_Z9s?$qClg9qSk;KB{6BFQ4}btmBbh8zVG7( z?xNzZpw=bE7$1G`@9@FD0GD{Dj9ATNZttCY&$;J(oq0d;OP>4luXi7SN?s4Ri&gfh zx@b7oTDY>dHQW`C#9mY@WlyXm;b9MZ70%6DBb&FcZ|hXpeMKAHIN9&v00$MWwjIH( z;m$3QR)xdY(lFdT?BNI*3OyF-3b%E}-E3f^i{qToIqBgPrxl~Og}cLncEJXkcI}8q zI)psBGp-ohnCgVuqJdCMz)kU3B-~Nu<}BxQ3=ikIpvXxL{W~KIyG%s82-SQIMeE#L z;<8SUhhDB2gASi|O_6WZ+VhR?jy~gK#(HD5Ub{sc{;|$l-n9Cr^vC{Jk58*_8Q=8MOkMaKWJtVi_?$~spAmHiCf$(@<|e4%F85OV3aqKO z&d}mMc`^lE;#9_n#(WAWWCleNE1Ah6X7QI}@d!tw#Zm7H&NDgkWHwOc>^pMY+@!DO{eM4dhrjGwbKRAZ>IHGf4NVV9m{I zjexs3F(8>8lXH$Jf%!7K0GBxNQY8)-imGa<7O{jH>Lptx{bquxedWUBp^gU(NlI-iDz@OxhSxTol$1T|E=|MLK|C${BG#c#OSi>~#f*-gao>6&jD stV!d~HTkRLA>=YZi?zUk&08biAA{1c@q(A~t4XtjSCY9?nUf^8-!d(~m;e9( diff --git a/out/production/TicTacToe - MinMax/Executor$1.class b/out/production/TicTacToe - MinMax/Executor$1.class new file mode 100644 index 0000000000000000000000000000000000000000..0b1bd9f1e143f469790d7578523aab7d6287223d GIT binary patch literal 556 zcmYLGT}#725S(kHsWEM}YW@DihgQMjtBNn8s6+*og8G!kLr>BR4J4&l;SD@Hv zwq2A2O8ZYT%CjW(;G$^5un!+)0nf;+t&Hl#Qow0kTSArXKf>y!i&24Ef6IBUb=Vu< zOK!=k21?7*yxWoKWe=zYNfgHIFjcnxZ93V#G6H_km)@quG}nysDdN(9h=6yIiV<7`+TT)D5KI5A4!oyhDyx%IJtMf&fCifZ-7P0;syk)@p5Znk-bQ)#lp#PCM` zk=8QZi$i0i!4fLGDv!w%7x?nBtZMvfF$>#Sdxd!ZfyWpv3=WJl`n>^6pw3EQ@}GQ6 zF)LSjhkNykpR^Uw0kfE6cK8eDY1?*O MEHitYsW9{T27xMNQ2+n{ literal 0 HcmV?d00001 diff --git a/out/production/TicTacToe - MinMax/Executor.class b/out/production/TicTacToe - MinMax/Executor.class index 0e3030bebb24c25306a7fdb5b0cbe39f643d699b..02da93f2db3e48c79ef0bdda4ac0c21f9e16aae5 100644 GIT binary patch delta 407 zcmYk0&n^Q|6vn?hEz{l^77_%@%BVr7rKlDgAt7aT z70WtSP!O2CvO9Ly3T_?m(rP4n7CNpIIurY^g0)u|=Y8a#vG^A)hXxannE4m0p~Bz5V^vudo_(A5G}{>1;ZAa= I8r<;u0t!7z761SM delta 277 zcmey)KAD~C)W2Q(7#J9=7%Vq()iEk^F>o+2g9r^C22BPnMh33p)RM5w;>@I+R7M6C zji||Q8K<%^r&c6SZeWrXV^9PtWdiDFU|?ooWME}r1CrX4FEB~z>j1_0fT9cxEI`N# zRL91k3*_+tRWLAcGUzer18F7(Zm1qfW)nu8$$rerwIEeuU{jT$syG;=84MT)+LnIzz7PTv7~Z}2+|AS z{1U)9h;BA~0Xj4A7z7fzB&^#H`;_1Xhh$QwI=*M{`fFx#_ zd0#wTy}4-M5-tmbtof3&DEX`?#A(U>RRh;>o!pbV0_nSboK>N21`XWUa?>l{4;gr; zUOK6y!v=0{kjARl&jya3BDFe%ZjXLu99`m87bb zw5XL-s+Ht%Z3YX3dIBRn-JqV}+M4_cBI#X)o(uM1(aCOQ(;o?&NFqnl*}MeEKNXp?@tkbd4E zDlnQL;|bGC2R-lM_W&o2^cQn&R{haB#u<@Be-Q6;=fMQ`8a#V^l-{bv_#0&sO`o^F z9bGRFSw>*^=o$`0o+9xAhuU#;t|j}$`5%yquHmGF8YSkYWYn{Ub6WrM`tQ$a(8H8B zG4U?g(@dm8AkHzKP=O=~$l%{?Oj3Uz zc5}u^_=H#u&V#dc4({?x7R9GBYCe3GT*HOH68`e` zNBm3p+D*Uu`tPNlxv@o3PjIB}CakWyB>7j8{#6VllaZ-aq*syAR$Sd&s=8{@%GnL! z6Ku#gR-e4@at#bfdo-GnM$_8LVK>nSc8I2F1vK# zGpfsi>kbF|z2{YoFPG3EV~8>a|6{TK*u!M}5!r<87XJYC2GPQ{>_nQ?HOOkp)QaDS zh=L@k?yf@evVJ~PFeSJqc>je@h;{-an2$Cpgk{Le;R7E*=+di4wVWIS;BK>>eO0>x z_h9l?4v7nVEq(fv5q7R@SXW#APXacfkL@Qd$h66k36Oh@6 zL`Sw;yUigpS&NwOYSsd^b`Kz{`bA&{RuyA?fX(02L4AOC8wPm4Mp(V_mF?NN*HC%3 jq4L0X<(Y=cxrWM_?aH}^%63EL^mgTZL*)l5Gjsm~@|MTk literal 1473 zcmZ8hU2oe|7=BJ1$ByT$Y1*{g656almt>GI#&^06sR)#*&`O;;iQV9)ZgX14jvTk8 zT$kT~xMJ!}Z+ZcU4K!8z0sInv0|Lf#Y}2k>_{it|c;4rI-^c#_pJ&eje1y9eGSCcU zZRp4e6t|r{r|miZR(pAU+wDaHxdrLV=&pcPZ>;5EB5%O5aS66S_A_VT3gm~LbFe90 zZ$lvSsB7Y~K>306+?pKK94~a8je}a`?6|&#BE}7rY)oKMU|N;?x;@&LEO>u;7|Fn2 zaeP9KkNUy>V&HGeaPWzAykJY9QD2JbIr~w2F&GR3-}R$TVta{lr_r@YbIQgvt_WD} zU>F@JHlw(QZXVZAF;KPf3T7^}ym~N-+ySG4T{d1$kY&(b38f#cM(ktIF;NpR_uMd& zJ;$>!hgS`}X5)3t3rxiPE@lWALzVCOgiJe#*%FX#cN%LZ>ZI8ZLitVLM~=t2E(RMM z!q}4Z-7j_r>u&hKS@&ouEd{K)=7dt+Q)4#jOZJvqQrqYV=v+sS!Fs*hZLHCu*5if( zqD$(-U?kO?1q!Q?)7$yn8KyX9ukZGD9!k2n>n|BE`S50s+-T)|#rmG(?GoSKx?s-M z8;@APS`Bu?p8F{WPGu-cEj1Nf=T0&do!~?9@XYa@s^i(?8qi;7#5HT4<+WLq@CkYV#Ku)mG*)Vbxn@`52Zc6@J6m zLxruy*d?MWGz$exVhk0G$N04bBgH2g-omZ8W)*MqErZ+4%OW$Wns^8ACe=k-+2}cK zK1JC)!V_(wk~_k-qEKnYXYQ-kW6Zu}D8`n;&$wEeeTwVZlO(L4hWE27VeWrMT^Zw? z8*$E|5XUdRQ$c#1XV5)yel6x&KO`91nR{BflWWmrxRE_ZRy)y7&Zg7iy1==ZD04Pb z?0lMkjw@KeRc!KG@;R>|eS4U}Gt}bAO|gFq9^Ommb(+pl&1)R_zqo{3xBrAbGoyXX zrSnffz(fb%GF7c^u9#oY?!*gxeuT23S#5of+@W}Jm|>fLRL&`0ql&;!P{TZha)W4f z5}S|7+@wb>QYTGCM=fS9rK4dM@5dAsu}jeYhAzY;iIL0)XKK37bVbQjBr4VAb5*L} zCm3f?8UGbx+?is`SSRd|wh!atg0t(Sttz!DpRRC!c>3NVqlo&pLET}9pb E7ot=F@c;k- diff --git a/out/production/TicTacToe - MinMax/Painter.class b/out/production/TicTacToe - MinMax/Painter.class index 78f64096ecf321b429c13dd89bee163ca7e55074..1a2512f35a82aa2a1076b95a7256b3ea379316e7 100644 GIT binary patch literal 2930 zcmaJ@TUQfT6#fpGWJnka1fwEgK}8`@DO9l%p-2Fs4QhpQscmIQreq{!(qy>xe(|-h zU4888OP}kixR$Qf)#v_;{)E1|di&1IWEc<&%$$Ap?D@|AzP-;Ge*fpmuK8v7F4tg9P{5F*DGdr&MsT)hBEd8 z5JMX}B>heSrF*JpK|-I^a1LDpQ9`@1ga}}}zLXn$K|?osm`ARxZ)eP+L1DUQ_#+?p zqEE#u8ZOF+CO?a+1m0V>w)BE>y#tVf3}_gXYJ~1gPAKD!^D>51T+#44t{y1T+-}7- zHW+GcvQ!C|ylM5{F0(F7($F_jvK}c7*JM4S+h(z77T1;rq<2)q8$s`~UCWGGP!8m{$8m2KLaAHGWH_}!ytJ{mFou^f?^`c!7IO!_kX67^&(_#j!;9JP3 znALC-x2oN7Fm>u!l0*tca`V&=Li8-KLx?X&C2i#>e1p{g=H|w#QJ&XV3-rV@R#q=8 z=w(yRJ*Q&lO(qx3cnzEqh^<r*OOo942ThFe~>LpK$2Is{^Hil7lyH{h^%em7ia#uJC z2fbWBFkNO&!6~1{=B&+f)|fJ72{cdTi?aRMzvGr=S8N^vvxc3wa+QV%wqw}Au8NOk zLwzD}&e$p6}` zrLN*@fz$sV$}V$xqLW*-h8r`2xICh1#pOxNu|}Q%&d5FQjNIkU$bHQ*3icFk^Zqtx z?<2%tpgH*%BH0=#Jc62RlSBQ_&P#WAk3-=-#(SN!SRD13qo>1t74vw9GlF1&O9;nW zq*X(E3Cr$MqKC`Y@tM{88ybg|Hf3cf+|FC1E%^)7d}GVXkeUe7uBV+Fs%`h((L}^| z$6Az!i0|QKi}Dn0%kk5X@$w$dv?vKR5lz%4VtY96Ok$iwIoYQ%=+QlvCeB`VmP zP!i!LJmcRUlKW)cnsqSsPSQKW&)ivu%%}_Ilj-uwbopeuJTi3@V~q(ZL});sR+y=o zxbIdJe-cY}#;UC7Y@b_~KBp}GZdsJk_Q;Ru=nKh&+w-!b5qYQ0(mV)>pZ@)$8Y3UJ z=Vc@Z857x$k-S2Xy_lptz)ad*+J=HTeBUZ@x<}$vyjBhSeG8fZPE8=&=kdVG-&SH&q^QMFFm3dRQ^bvnh ztZ~})j85rwF{YfQM_zl`S3aiCI2hJsnpQS69nk522=czGe92XiL-QV+O=(o(e3K55 Tv_5J1!m^6n5jV7@j?MNjK7Kb`