From bef3053f6f71f04bf2c87f1835227176d4026470 Mon Sep 17 00:00:00 2001 From: simon Date: Mon, 13 Jul 2020 02:15:33 +0200 Subject: [PATCH] basic game tic tac toe --- TicTacToe - MinMax/src/Board.java | 93 +++++++++++++++++- TicTacToe - MinMax/src/Executor.java | 21 +++- TicTacToe - MinMax/src/Game.java | 53 ++++++++++ TicTacToe - MinMax/src/Painter.java | 48 +++++++++ .../TicTacToe - MinMax/Board$MAdapter.class | Bin 0 -> 789 bytes out/production/TicTacToe - MinMax/Board.class | Bin 0 -> 2894 bytes .../TicTacToe - MinMax/Executor.class | Bin 0 -> 915 bytes out/production/TicTacToe - MinMax/Game.class | Bin 0 -> 1473 bytes .../TicTacToe - MinMax/Painter.class | Bin 0 -> 1626 bytes 9 files changed, 213 insertions(+), 2 deletions(-) create mode 100644 TicTacToe - MinMax/src/Game.java create mode 100644 TicTacToe - MinMax/src/Painter.java create mode 100644 out/production/TicTacToe - MinMax/Board$MAdapter.class create mode 100644 out/production/TicTacToe - MinMax/Board.class create mode 100644 out/production/TicTacToe - MinMax/Executor.class create mode 100644 out/production/TicTacToe - MinMax/Game.class create mode 100644 out/production/TicTacToe - MinMax/Painter.class diff --git a/TicTacToe - MinMax/src/Board.java b/TicTacToe - MinMax/src/Board.java index edb598b..41c250a 100644 --- a/TicTacToe - MinMax/src/Board.java +++ b/TicTacToe - MinMax/src/Board.java @@ -1,2 +1,93 @@ -public class Board { +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.Arrays; + +public class Board extends JPanel implements ActionListener { + + private final int B_WIDTH = 900; + private final int B_HEIGHT = 900; + private final int TILE_X = 300; + private final int TILE_Y = 300; + private final int DELAY = 50; + + private boolean gameWon = false; + private boolean initialized = false; + + int[] oldPlayfield; + + private Timer timer; + private Game game; + private Painter painter; + + public Board(){ + initBoard(); + } + + private void initBoard(){ + painter = new Painter(B_WIDTH,B_HEIGHT); + + addMouseListener(new MAdapter()); + setBackground(Color.BLACK); + setFocusable(true); + setPreferredSize(new Dimension(B_WIDTH,B_HEIGHT)); + + initGame(); + } + + private void initGame(){ + game = new Game(); + oldPlayfield = game.getPlayfield().clone(); + timer = new Timer(DELAY, this); + timer.start(); + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + painter.paintGrid(g); + updateBoard(g); + } + + private void updateBoard(Graphics g){ + int actions = 0; + for (int column = 0; column < 3; column++) { + for (int row = 0; row < 3; row++) { + if (game.getPlayfield()[actions] == 1) { + painter.drawX(g, column, row); + } else if (game.getPlayfield()[actions] == -1) { + painter.drawO(g, column, row); + } + actions++; + } + } + } + + @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(); + } + } + + 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 9699cfc..7734b07 100644 --- a/TicTacToe - MinMax/src/Executor.java +++ b/TicTacToe - MinMax/src/Executor.java @@ -1,2 +1,21 @@ -public class Executor { +import javax.swing.*; + +public class Executor extends JFrame { + public Executor(){ + initUI(); + } + + private void initUI(){ + Board board = new Board(); + setTitle("TicTacToe - MinMax"); + add(board); + pack(); + setDefaultCloseOperation(EXIT_ON_CLOSE); + setLocationRelativeTo(null); + } + + public static void main(String[] args) { + Executor exc = new Executor(); + exc.setVisible(true); + } } diff --git a/TicTacToe - MinMax/src/Game.java b/TicTacToe - MinMax/src/Game.java new file mode 100644 index 0000000..45c6d72 --- /dev/null +++ b/TicTacToe - MinMax/src/Game.java @@ -0,0 +1,53 @@ +import javax.swing.*; + +public class Game { + + int[] playfield; + + public Game(){ + playfield = new int[9]; + } + + public void place(int player, int position){ + if (playfield[position] == -1){ + playfield[position] = player; + } else { + JOptionPane.showConfirmDialog(null,"Tile is already taken"); + } + } + + public boolean checkWin() { + 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"); + return true; + } else if ((playfield[i * 3] == playfield[i * 3 + 1]) && (playfield[i * 3] == playfield[i * 3 + 2])) { + System.out.println("horizontal"); + return true; + } + } + return (playfield[2] == playfield[4]) && (playfield[2] == playfield[6]) || (playfield[0] == playfield[4]) && (playfield[0] == playfield[8]); + } else { + return false; + } + } + + public int emptyTiles(){ + int n = 9; + for (int i = 0; i < playfield.length; i++){ + if (playfield[i] != 0){ + n -= 1; + } + } + return n; + } + + public void setPlayfield(int position, int value) { + playfield[position] = value; + } + + public int[] getPlayfield() { + return playfield; + } +} diff --git a/TicTacToe - MinMax/src/Painter.java b/TicTacToe - MinMax/src/Painter.java new file mode 100644 index 0000000..1229a36 --- /dev/null +++ b/TicTacToe - MinMax/src/Painter.java @@ -0,0 +1,48 @@ +import java.awt.*; + +public class Painter { + + private final int TILE_X; + private final int TILE_Y; + + public Painter(int boardWidth, int boardHeight){ + TILE_X = boardWidth/3; + TILE_Y = boardWidth/3; + } + + public void drawX(Graphics g, int column, int row) { + Graphics2D g2d = (Graphics2D) g; + + int nextColumn = column + 1; + int nextRow = row + 1; + int x1 = column * TILE_X + 25; + int x2 = nextColumn * TILE_Y - 25; + int y1 = row * TILE_X + 25; + int y2 = nextRow * TILE_Y - 25; + + g2d.setColor(Color.WHITE); + g2d.setStroke(new BasicStroke(5)); + g2d.drawLine(x1, y1, x2, y2); + g2d.drawLine(x1, y2, x2, y1); + } + + public void drawO(Graphics g, int column, int row){ + int x = column * TILE_X + 25; + int y = row * TILE_Y + 25; + g.drawOval(x,y,250,250); + } + + public void paintGrid(Graphics g){ + Graphics2D g2d = (Graphics2D)g; + g2d.setColor(Color.WHITE); + g2d.setStroke(new BasicStroke(10)); + //horizontal + for (int i = 1; i < 3; i++) { + g2d.drawLine(0, TILE_Y*i, TILE_X*3, TILE_Y*i); + } + //vertical + for (int i = 1; i < 3; i++){ + g2d.drawLine(TILE_X*i, 0, TILE_X*i, TILE_Y*3); + } + } +} diff --git a/out/production/TicTacToe - MinMax/Board$MAdapter.class b/out/production/TicTacToe - MinMax/Board$MAdapter.class new file mode 100644 index 0000000000000000000000000000000000000000..27fad55d9b9ea867daaf02ae0d555a0024098f6e GIT binary patch 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+MlG8w;b*Gk5O&?)~n)^UweO z5{u;wBObZD==;x?$b2UL7p2Io|T%`5DWzT?6eW9M1_)8HlI*<~z}WP7_Im zZBPc<#(XO%8ZgJMUCy1In>1kLL}a_d4ms}_yEZwVo0y!F&2EL1Y_`wk^5fU8$X1WS z?&j8lZ0%KeM5{hKo*&gak10HkeKfLcmF&yDM~ zTB}-1KL$n1GX|3BygnT1n-}{-3eREKz)q`JoboGWJMWZ3+p_}$2hw>7@u0O94%)YD zFC2V8fC@VCJU(pV1%(%JoK_p+S>N@kp=~Tbn!P~fO-1@-L@b|BI0-Vy zgu*0pM8eB6fxTo0fnA&>2?qAI*lS#@N9Teo@E|I3lL5DSRA@ROq|KhC&n94Rp5_!yMgb=2$2S=Tvwwoog}>Q8`)& z8J{h(HJ2S&R#<^UAfad=75dgzjcK)X%)(6tSHjX(4y_=Ry7Ux$tTF|3MrQreDn0Q+ z1AAJcI}uo`D^8)TgL@ExLRs!~>N^vGqYI*-e0MU^%%^DvWfNaf_$t1}tkQ|E*_yr0@+ncdU!nKAqp&;v;7q`J zo(%)rDlvrLz&A~NOX1u24x_AZKPV%$EjL`^Or*6}-^2G!+)=oTA8c8ygpNBn8U)tu zG84~!rDD1KFo|8zoA{A|-bPJ6jCWRF*7wMw7tUL5#f}592Mp16)-N)FcH|w; zp01Rx+reB^cB#Byu-thoaAaNIOoS_r0H}8u_P*tE|Ve#nO=C65iif6M^J z@Dr~2xID1tyV6+S<2fId2iAO18tb1@2j3H|i|+?#NDI(wma3lFee}#HfwRfGd>=W! z!_}J_7jP`I2_w@TU$4T9rmjr4(O<>RXxf$8IaI}-OuULmW$4Y+u>W1H_GcV3NOF7( z2|6e4rO<^(u^s#A++lRna0<^5=rAGvoRZ=Ijp7&hCFhttadkj%5S*Ny&ioYz7YK;| zO?;?|G&lMe2y>u@XEXP4tcHhqt<9M9F zPT}bmIHwzM*wgE9+&Y{gTAy0j#KkIRGMV==Q^Q;hSN@KLDqiN9wXk!D*a}rF@pP$% z8%+dzs6#@ujbYe_etsRrvlwWxJXE)wkS1BTJj<}ecyCwc$RfqkK%O-4k7{tECcb;8#=}lipc3@GssKV3*=2eRN3na@-aPumddyf)7#sil$9kOOdjc^INsR&e4ZJ|pFQSuC zPho^?oL~%2a&-#hIK!v+IHq|%$LCnmW0=4c#_(&73I1mA8-7X4xzup!Qp2TL{FbLN z{Ep|l(EcAJ4CCK0js1H+K*tAEW#IStL*45;6qK-LBS&7pi=)El%QbxV4xVD_e7;HV z+Y!C@@x`_pzP_PDLE>M(!y2Jr)5j>sCRnMHO#2)eK2IMm(7Qanm~NpY+rXd2AMq!G z64VLAhPw!h&rBWW7W+N*cpv#QzIzvDVgre|+=yZ;Sqi+=qQ9r1zX$KK4@COg5KEn5 bPsM$T$M7EB*G3H{W0hY?iuJQa)e!qXAURy< literal 0 HcmV?d00001 diff --git a/out/production/TicTacToe - MinMax/Executor.class b/out/production/TicTacToe - MinMax/Executor.class new file mode 100644 index 0000000000000000000000000000000000000000..0e3030bebb24c25306a7fdb5b0cbe39f643d699b GIT binary patch literal 915 zcmZvaYflqF6o%iWOSdgc(Q;J+a`DnGLcQN={9u&?vS=c;MEx{uM;vW;$nF;UxBOBP zN&Er+DC0ZZ5-=f~?BvXx^FHsHGk^a6`VHU(o)<8Jj04-nD6$qx-^G#WRpVn79#pqC zBhir-vM*Jrl2;ZoCvBsH9EUblEo^s%=3ByGcYNwE=a;#VqFNLbO^I zykVX=PO5d?In<#HlUij^{QssQU3W2W{Mv^i_~Br|!u-Wn_f*)@$8{aXi3pR}RNQc} zgk=kJ^!7%672S4HZ|hjTKa`P3lnyCY-Wph2b#W87Xr8&g4$|Wfvd#5KHnfG=%gv^j znK7`kiwZmo1qw7(toF@S*yYcaCYQQyF`DpIDBpEE`!Z^X^t@zH?WTy7iHDnZ@=e7Q z^3MiS<23foG%PrNIu`EO9iiC3O!>=Yx6N}A9Z+TRl4A})_5u=ibvFv+rZQH?&uAOw zRMM)<&h42VaT|20N6t`^t4cLK}n!}-Zz1b6u_G8M4-jj}k4bw=(W85^jkd3$dJD^2uq)m!UhdXK`_ylfwfp4G?7IbsnGOY)R25I2S?0_HG|1x72F zNRcxG*&#B=M{^JN3C-gH9uDE#LwNBNIl^!IYjz)Z&N+itO5{vZed>a45s&bg9!!Hz N*p#`Ar)g`?{sFi>v*7>$ literal 0 HcmV?d00001 diff --git a/out/production/TicTacToe - MinMax/Game.class b/out/production/TicTacToe - MinMax/Game.class new file mode 100644 index 0000000000000000000000000000000000000000..296314f18bb3422eae6027d1582ae226f5fe106c GIT binary patch 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- literal 0 HcmV?d00001 diff --git a/out/production/TicTacToe - MinMax/Painter.class b/out/production/TicTacToe - MinMax/Painter.class new file mode 100644 index 0000000000000000000000000000000000000000..78f64096ecf321b429c13dd89bee163ca7e55074 GIT binary patch literal 1626 zcmZuxU2_^$7=8{cyRd8$0@*g0(2^=G5Lyh@R7(@v<`X52V;E}3aoXi$!nTyn5Yi;~ z-ufRLZ@kvgbjHp&Ui&Zn3Ep;E^*Ot+)Q^0e^PY3w^PJ~--WPuR^XFdx+{CVq0D>A6 z10kpavB%aktJt-A`^DYH<92f(px&~3_Fz>Yn9bEA2qU6FHxPv(pnYoDy+OOrtXieI z@$hp2QIR>52Bu_!xBWoFv_QhewvGqIt-f{8v73jb^#~G}(O?=lhw}oHe#)BDbqE`} zzg?+qkXQAeCuJQmBn`ZUIf3wDdoavTWdEI*t7}LJ%=q{3T8DOXZ_sz1w3XZ606ON8 zmhu+_lE3)9Ti(zAe|o zO=Zxr56QPWtVmfvZ#Y)Jb>D6cIs#F5vE8=!JFIC)GG(!5-;gw7RQ8@1`>fd5O#hTM zZ93hfr#&`A-#O;EUup@M|4l8eOA@{Ii7bwLL6eKmluogYA4 zb}*y3Y*fyQv>xwrT;l3W1o;aj^3Ngib87b|Xx=pOJ+}iWag6g42&f=JFx`cGk2`7a zDz4*wt_XrkEc@Rfk)ey>G1oc?8xjEMk?`YxXVc6o7-4p6z0n-SZ5UBy(Mfg(uut}vJGDoK_!dK z*d|36|Rrty-0XULDmdNsR18W;JMljf&gryjP3O@EKia&@YJEI{hx>NA#QgF*s^va^FrqpkdE(9gvR7X}+l_O)8=BuFi z?yuiRIr1>ok(r!ijylefx`J*m=4lV8CWH+6TxO}VRF}gI&MPR;%B%Q-vxTCo_c}A@ wa0#C