From c117b13ddc24f4731a81913e556417851b31d55f Mon Sep 17 00:00:00 2001 From: Hymmel Date: Tue, 10 Feb 2026 14:41:19 +0100 Subject: [PATCH] w --- .../java/com/lona/tictactoe/client/Main.java | 128 ++++++++++++++++-- ai-client/target/ai-client-1.0-SNAPSHOT.jar | Bin 11313 -> 12716 bytes .../com/lona/tictactoe/client/Main.class | Bin 16615 -> 18959 bytes .../target/maven-archiver/pom.properties | 2 +- .../original-ai-client-1.0-SNAPSHOT.jar | Bin 11069 -> 12472 bytes .../src/main/resources/static/js/app.js | 40 ++++++ .../src/main/resources/templates/index.html | 6 + web-client/target/classes/static/js/app.js | 40 ++++++ .../target/classes/templates/index.html | 6 + web-client/target/web-client-1.0-SNAPSHOT.jar | Bin 22320220 -> 22320794 bytes .../web-client-1.0-SNAPSHOT.jar.original | Bin 11248 -> 11822 bytes 11 files changed, 208 insertions(+), 14 deletions(-) diff --git a/ai-client/src/main/java/com/lona/tictactoe/client/Main.java b/ai-client/src/main/java/com/lona/tictactoe/client/Main.java index b94e4d3..6fad480 100644 --- a/ai-client/src/main/java/com/lona/tictactoe/client/Main.java +++ b/ai-client/src/main/java/com/lona/tictactoe/client/Main.java @@ -279,33 +279,133 @@ public class Main extends JFrame { private void makeAiMove() { new Thread(() -> { try { - Thread.sleep(2000); // Wait 2s + Thread.sleep(1500); // Slightly faster + + // 1. Try Simple Rule-Based / Minimax first (guarantees better play) + // If we want "AI" feel, we can use LLM, but for "winning", logic is better. + // Let's mix them. Use LLM but with VERY specific instructions, + // and if it fails or returns invalid, fall back to smart move. String prompt = buildPrompt(); - System.out.println("Sending Prompt to AI:\n" + prompt); + System.out.println("Sending Prompt to AI..."); String response = callOpenRouter(prompt); System.out.println("AI Response: " + response); - // Parse response: expecting row, col - // The prompt will ask specifically for "row col" format String[] coords = parseCoordinates(response); if (coords != null) { - send("MOVE " + coords[0] + " " + coords[1]); + int r = Integer.parseInt(coords[0]); + int c = Integer.parseInt(coords[1]); + // Validate move locally before sending + if (isValidMove(r, c)) { + send("MOVE " + r + " " + c); + } else { + System.err.println("AI suggested invalid move. Using Minimax fallback."); + makeSmartMove(); + } } else { - System.err.println("Failed to parse AI move. Retrying random..."); - makeRandomMove(); + System.err.println("Failed to parse AI move. Using Minimax fallback."); + makeSmartMove(); } } catch (Exception e) { e.printStackTrace(); - makeRandomMove(); + makeSmartMove(); } }).start(); } + private boolean isValidMove(int r, int c) { + if (r < 0 || r > 2 || c < 0 || c > 2) + return false; + return boardState[r * 3 + c] == ' '; + } + + private void makeSmartMove() { + // Simple Minimax or Rule-based + int bestScore = Integer.MIN_VALUE; + int move = -1; + + // Convert boardState to something easier + char[] board = boardState.clone(); + + for (int i = 0; i < 9; i++) { + if (board[i] == ' ') { + board[i] = mySymbol; + int score = minimax(board, 0, false); + board[i] = ' '; + if (score > bestScore) { + bestScore = score; + move = i; + } + } + } + + if (move != -1) { + int r = move / 3; + int c = move % 3; + send("MOVE " + r + " " + c); + } else { + makeRandomMove(); + } + } + + private char getOpponentSymbol() { + return (mySymbol == 'X') ? 'O' : 'X'; + } + + private int minimax(char[] board, int depth, boolean isMaximizing) { + char result = checkWinner(board); + if (result == mySymbol) + return 10 - depth; + if (result == getOpponentSymbol()) + return depth - 10; + if (result == 'D') + return 0; // Draw + + if (isMaximizing) { + int bestScore = Integer.MIN_VALUE; + for (int i = 0; i < 9; i++) { + if (board[i] == ' ') { + board[i] = mySymbol; + int score = minimax(board, depth + 1, false); + board[i] = ' '; + bestScore = Math.max(score, bestScore); + } + } + return bestScore; + } else { + int bestScore = Integer.MAX_VALUE; + for (int i = 0; i < 9; i++) { + if (board[i] == ' ') { + board[i] = getOpponentSymbol(); + int score = minimax(board, depth + 1, true); + board[i] = ' '; + bestScore = Math.min(score, bestScore); + } + } + return bestScore; + } + } + + private char checkWinner(char[] b) { + int[][] wins = { + { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, // rows + { 0, 3, 6 }, { 1, 4, 7 }, { 2, 5, 8 }, // cols + { 0, 4, 8 }, { 2, 4, 6 } // diags + }; + for (int[] w : wins) { + if (b[w[0]] != ' ' && b[w[0]] == b[w[1]] && b[w[1]] == b[w[2]]) { + return b[w[0]]; + } + } + for (int i = 0; i < 9; i++) + if (b[i] == ' ') + return ' '; // Not finished + return 'D'; // Draw + } + private void makeRandomMove() { - // Fallback: pick first empty spot for (int i = 0; i < 9; i++) { if (boardState[i] == ' ') { int r = i / 3; @@ -318,17 +418,19 @@ public class Main extends JFrame { private String buildPrompt() { StringBuilder sb = new StringBuilder(); - sb.append("Play Tic-Tac-Toe as '").append(mySymbol).append("'.\n"); - sb.append("Board:\n"); + sb.append("You are an unbeatable Tic-Tac-Toe AI. You are player '").append(mySymbol).append("'.\n"); + sb.append("Current Board State (row, col):\n"); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { char c = boardState[i * 3 + j]; - sb.append(c == ' ' ? '_' : c).append(" "); + sb.append("[").append(i).append(",").append(j).append("]=").append(c == ' ' ? "EMPTY" : c).append(" "); } sb.append("\n"); } sb.append( - "Respond ONLY with the coordinates of your next move in JSON format: {\"row\": <0-2>, \"col\": <0-2>}. Do not add any other text."); + "\nYour goal is to WIN. If you cannot win immediately, BLOCK the opponent. If neither, play optimally to force a draw.\n"); + sb.append("Analyze the board carefully. Don't make random moves.\n"); + sb.append("Respond with JSON ONLY: {\"row\": , \"col\": }"); return sb.toString(); } diff --git a/ai-client/target/ai-client-1.0-SNAPSHOT.jar b/ai-client/target/ai-client-1.0-SNAPSHOT.jar index 0690cc5f09c74e0e8ff4f0155538076b11bc7920..b0f18f266a263bd100e00d0856ee5bdb5012b5a1 100644 GIT binary patch delta 10646 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

h-u&$SJcsAXSd4X`R^$dKXQsDmE3?h^;c9N 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[>Qr%LVttZWrmif9RFI&&@NlUqIF|so&GIBHS z7WVP)lAjTTUr-`~{SkcyzkBfe4fic-t5tE9tn^OH}$aqW_XFb3xhe_Dt;@Z@^L z$)2Kpqo>^WznSJzxoR1#H*<3Onlz%X=`>QlXmXhKSpOZZD z0B_nyy{QW6PihJ3E9ft(n%+`t=xxjQYt z_i3i}A%A(L`+ZvcKB*5868SwEqw;gcOw4h;2YjUDkEqf+ZNBh0PMasw7@kkryda&^ zmJeeNL2-cM;7VP~ri$(th@wwjl2jt81!k1=m`hUvd zKkOqH8qD0x0sgC?QfydD2z$O0vrxF#_oRr%twpn*a&gRNa`Rb~1qU`A3EipOP7C0K zm+?kg$(!g*K9|md|J?)!+s!t`xC^jw3*cag_V6}9y)fOyJ#-KE!p1IuBaCbD^@4Su zrW*EWsJDksSGQ^SH%Phab~pjAFn=}$I-XZ|XlLQ3XVjf)AA~!d?pI&e>F8N>iMmVO zjlNA3SKmc?^ZsfEsk1@)$|>3l08Q0GBVR`w_K!0V|-%okPLn=qd z{-WXmHK745^M(+eb<4Z~HMz0m5akw?xXMd_*wj=V0QONfP(zM7MFtHh|30$niwEdx zDc`5J)`CP}&*-Zjq+TAL20NUN=r9Ae=!bM?Q5n*)g*=C9xd4YQq!uotbv%#Oa|xZp zrEs0|Q|>a0);M-FoqtYK-#|%G8J(&QBK*2w?WVqzkkvPjV$4KgOl>myA`JhBtd$1s zF~ORLQW-_1lTmnt2d9oiQIDqf{ZWa8C#7qiBme-Nhf^#r5hIg$3NAwOz4#@D)SM(U z530HC!;OQgaKD;Ybda;qq`>C+?m@L^KN}dexc#77>NHmks(;f5)yn;<78G+-ozNLl zAJaJxM$`_d`u6%mG$|>^rj#6;_Z@zHA5E_pY&W3R4XLx8t|0)c;R`uQU9V8Bj+82a z8Hn~#4t<^G&|S2Y?uHcaK{EbLB;fbL?u$F*HgzlT*T(oLn3$d^cs`r;*az$x5zpo@11wCH>7&ILS#FLE;JZJ%_|HXOm`8 zjyhj}&{6ZR8?_lTwHeXN@9WJRN>N(tP_jU&1C#{1AAfzsJ@8|n1IMl&Mb%1CwNg}{ zR6lU2CLAX=5uj}aKwE{oXnL+Y1=~{eecBORg6E}(SszE7+?}#A%ucN_QD17XF3D;N zGkhAoNy0ovqc=Bp@KowteHbHqpY9}R1FEwDdb|Z$M-lwW*3?E^qc(Cb4tXBRn`s)I zpHe0eNq=o*dh)Os=TlFM;cI0w2@q%+>>68mCasXRr4iD`6AH;IUoag?w_ta&kGTg4 z203+5^)$>w{EF4O9VDU5xfB^elmWErr@v z!p4@RVwe}v{7!5H0E=?87n9A+b*}WKBp236_Lp$Jsrs4vsZ;tzs`Tqr>D5%}b*J=_dc&Ffl6n&*q52p7d`mz7rl0@N z&v%@0?>gh&)6f6v=ZE@vSe`CUj&r$^<6Iv7G@Vwj(>g{!$GJ`+!POo6(f6si?oquexTTJ{#}3o=jJPtH?Ev^8OD{O9u!n*NbFXA^-sAK(i$(Edv20 zlT$5Ef6WSlKo9`n`#!~hXO~?G1HnT?S%-eWeSvYEVnAnO8-?CJuODC0kx)jZ5r!Y! za3wKCSP0HEfOp_`jo&w}hT|zf<*M3XR(@gB>)0ZfabglR@0^y;CNa%+N`h87>Xs6j zmGYO9wBEY1zaO6cJ98bt8DGkhV#lBvMGzdVvxyKFy)pt zG+1Ls`Sa%TR}KCe*C5DHG)q)!hzDdp2M&krJ-^?Uy8+87j^;}j_>p`k@^Y@u*+avvEAR06SVY5Hn z5e&ow9X&yFWvH`yWdMJXpt-oA#yl~ruP3lG7&S{he2{-&@NN7QnYknqh<2H6@jyIimPI4mtIW6 z%`EK>L<601rRe;!rKcKsWMrP&=~1=QV@%a$)|^S>tZuJ2@dS1;O*j7(n?k53nfg7@ zK-AnE3G|qum>G|lYZ{ts%!WQ5DrJ;=Jrt74E6Q~yFxfv&(11yNn^{>v(0#S z(2S&wYA*=~L!d>gOr=c>#o=B(Jv$ZGO_6A4FkuGFu4rJpQrpuo(c*BRXXk}Mn^A|Y zx=vVZQ$NHMz2f9HQ#-^yN;`9A+s=MN127k_BImfex_5!0x}{qgQd zG<0Dg9*TtB{E4;Nw<_m-K5p=5{5d?ZI~eFvhHkL#&h}X^_-4-(VltLS!g2Up^~#-n zLAMB#7p~e9>a^KR*%FI{J>n3jE-piKaa#*=cDUack0F_2Soi0ght6n2vczkR_m^i$ zw)k|(QB(a)r8q{8wbj35)Qggb$QML@psdk8+>8D*v!qbQ>QZD#u|k_dd-j6dQ8jKE z&*Xu=ZP7~Vpgx&kNC~+CFrjc)a7W7~MVknkOtMxKOrdBU7w*a#v-5FwKzZGQ(P)w>V2?Nv$rk4Vfcznewa+W?llov#=&Cy7IpIa6JpUT#Cm9L9cs*hVv2hyn4+Vj_StxwaIKzOJ%43rFZ)i{Bx_|N$} z4}B(Q7;>hZ1%9!fV6YF{l`St{4Rn*`hMdg__)=y^f2gNxMKsde7k5h&Bx?h3z_-j4 zO+^6Erlv-%YB6L5*Fl6%1V;-HrZv)!XwIfFa4C$p8M2b|VAH-pG!|SMiA2E(ffrMQ zs|{Hr=VHfDY;~X~)YTN}*aon-5%N5@oX0eMaf2D_-@G{(!$HhYc$=DL$4-s8DyC#= zO5wh_3Hx^hI=9+Vtutgj&4x>=h->Q&MB_~eH@9qHnrc0rU$E-`SsO5nw+7=L>5|O`O_y%CL2>mKL$(SMf-7c^B3q;q z*U1I*)QYen5$Ut`6-;wQ)#8}-e8G6`x85rl%iFC{h2z{^veS?YWtTOhu-d&%E>^QH zvAPS3-Ep~8b-rZnDJ*n-*^u3GxpjMC314A7S6DR32ir?rzGleRZDfcd>Ka2~oFFG< zlB*2aYmFJ}KOLzqg~XxAl!li29i2gdoQk%q#WLhtwc3MJH=+SQ&&{S>`L;n5aR9t}72#GxzOSM|55?-?e><}&kLSAOHYjvyYyIMt^~!HHtDi%L+)gh+ z#8@!CIur{bA$n+!SlKY1Vz78c!-li#+u7*jz(O|5bwnyH~Dy6^53r`7pCe z^{NeRj6F6*^`;uyXuCIE^=25Fn`S34b(ZSZ8k$b|Zfy=!xHQrggcNQK0bYnmT-hHD zn`K;%*f&>phr(N-0JPoOe0b7{il{U;GS966tuj)Dl+6cNm6bZ2Ss#r?)Df}o66~9= zEj2VJ&30?>26t1->Uxva&SzTdPurHOH2`5CKq^nhQbL_=xh9shHYuT-4Q-TKy8>9! z8te>)wgtQF4O=1DDV}-CrYqIDRfd+S8E$P2%(%Rzp;_(NZe2LBX!Kf-woY5GYv-ea z)HYbROniKFz@v3&ox0X#XhCh$;q8-Z*s(R0VoI&&CQoogm?o$5O|~_*)a!s>O|lkG z&a>W{INGIa@R4zL_kz-5A3y?_EHsug)YlH;n@d+syNhDPa<@&phYID#r}Xc|{4hl@ zR!kXkLXac$AKDnPX^jF9O@*ut%HOWJY7wOa>4_m`! z1;vkmKAN=8$g86~XwfOdjd38E&39J$Veoyse8V)ww}KpW9XY`FQJe2Rc}yM$ooHX0 zuWCI^+i{jhteq7T_~_yN6~hb``>P&IC>FbE6ny}Jp1`CGdYc0B6SUk!{BD|A7QZS# zr86Kz0sm5dCQstPr}0zr6j~ac&UeVu@(cvIl^f*enCGM;JX@Yc%SCUpTb@Hp=WhCn zJdc)}W3)?Nz}gIhucuY=BAOmZ_eS+}K5FIHluQ|dSkM4|Z-sF8k(cflC8_}th{mMF z5_M&;brPzXu;k>LhoH-cDT^Ml*W^N2BJYS^yz&d%c1p_{aTXM_H_hhhnxa{XjmKW{ zIKEGu!Xk5oMP`ZxRw5-S0S*^W@o7-$wCOMQDmgdd!t^wi*ot(CN%`_i+6wEtXpT+O zMWcoCE6CxJ6;vZHVN{nZsYreenhwF_#AayO@?!NT@-loz$dC`^H<+hEXBW&s0cl-6 z<4kDonHeRC5iM{&jpBJIA?JUQ=2U`LfNxtYIzPMSdb@(0LjDs|*+V8MsnT!S| zbg!zY*0dylsn!XCH({>wJICHa8Gh${zhl8}2M-KCStK`6agnR1)=}i@t94fR9e(E! zUrvQbCG@flcX2aZyh_uK>I_O=X=(|hhoQ@Ydy?)YC{vG;M3j9v^|sY`v@R!>1_U<4&A zDwBMbGLK@OP`o`wU5C(3@-^rcc|EG(l)M{ORmon(gO25lC=p-~! z2CXb|Y_v_PgXD!pb-#0vzg6qp?SeU<@;eXt_=YcLkpK_uyQ)I*a45I<4<6q=g~y1+ zw@@LDz6l7m8R61Reh$$%-U5W%N)_A#tA}YSM_~CrTErL7SsbMmz_7I(rvUfU7SQ{6 z2gUe8O6=fWbQxbnU+0U-;!Eg8nB*3|lx_$8Fn`(BZy#mSTFSD$L8m!sOmM+N7TWf9 z(v2gdyGBNLjEq9*Bhi(#y+Ii_DSx2t2^+bR@<-Z?Fx2Tz`4gbUVH>fSJjZdkQSQ$u zlX)84cFlF4r(M%p+8vITcBiwYt=(Z$T%hQn zxIuB+l!RB&yo%^mRM*H#(481;Yu9ZO7}-lPwXNN4lbj&APb~DFTsgwbn_8;o*)(u# zs%ox&pw^+)I{i++;~*s#Rr{UO>s*xuF0BS`brY4Pn)r3p%sfB^sRn+Xs_RLO9@_1M zXFa4XELJX=Q(0_#Bz*7CZVdzPc$b}wlnSH;;w$L@?*V{ZMX&N+B)L8G4qrnbB-o|JNN;)$c*V^jn*3oYNi9!EpN(OKt&bar;%%z zZX*}M8^Nv1pYcD#*7H9i=W$~8!iKQho)Z8{2d$EsWr@peWV?GeL-b#tL^j-#vFG*3 zzx&9?`%%H)0A%|vP39Y^6!dDo*_Kz86nRLP3Ybs`A>An02BJ`-le|Uf+E*J3cv>V zG-6Iqk*m9S4UpUK807ntoOr~?k1LM0 z?e4|upV&QtIu4-sGu6ZQsr2_5`Q*Y|@6#k601W(qX7Fu* zfFIH}v@haAv>WuV@f~yx-$ncQZaT>K$T46rDVr~%*>>7@Pz^Q9+qMo%sngb>DoF;? z)_2oQ@)!9ll%{MxpIo0&sg6gaH2 zox_hKF+V}w{1in|n(g3c=&SrJ?cwKXKfge?@r!hbe}%gBC3>1)mSfh6+5W`4uvrEj zA;0_`dO6%n#aMtBxa8xC2Y8K+h_JB#G4bvX-=m}+apUyAZzpv|3sO|#_0LFbxMi8azao#m zLmm7#+RpzN!5>I3k1a~yWOmBuwyJfC$}n(K;OIRXYm%;lMyb0}xh|Eu%$htIP}GwG zL~Fv_)rrMPo(C`qWN$#@Bp9Yp`~wK}FPgv~QW?HA{BNq|k7yyj%lKnz=1)-4eQFD( zs@e&pYZ~q<4w_0iBT#tmDNvY0j?XDi*BlHsxeB5apODWh>I$6(#U3zHHSXm(vUE`D zE0WUCcn=l$q%lc8WrOA>bgPEs9H2NTRY_@Wu6}|RR%_D-33YI_!~Ukq*rcqw9+UpF zqV?WGnLcS(s}YQA2Pj22-zKQO(O8+Jz1Vu~-Ky-P9kdG$mx8`jNEHHmCLp9rV6ll* z$diyIN&$gosD#RC4p-pTS4C%YHLN#NJ#NdGx-Ys$ z0^OCme}NC)W70;fR)L4r2Vp8WS0Dc3L(-YD*fHs9KS4Z_kWKeWsNxuBf+nG)^g52n z1^2REaZKXv$7EZYyyJ*mbVL&O%4N1Qd_~!62sc6+q{&!#SyH~*-uMLNVYG5czLDAq zhuAYP{HFmbh6`n)cg>JommV6DZ>h!J$te@>rYq!XWn!yj{v!L@uROY!^0W*)wyvZC zxli-hIzD)cjx)*eDRqrsqRZ6ui#)E4{G0eq^-ZnsUAdKO6E&%pxEXlWMn z(^9%CeDYmf_fk^Xx8#(~uRX=)BjuR#H_b~7R(PLFvpOry$^fgIzzX+_E&qMUJ@D_V z0C{^);cASW(Kx|%s(J)WvyH*`rJ7WY#}MX}#;;(D6iz#6?U&o-K>D=>G2 zWv=~dqm-0uGZ%nU>Po30bEU474jcndkm>#UaSUK66+@|wNnVnao11_!x9p=)6+oQ< zxKBz=DLBZsQ^|UqDRDmD+BZ-UE}-g(L%9#Qj7UQhJQ$wpWZjB0p@ZLUQ}j0OjFW zv=?!K)7>#7ciM503WhA4#Kt>o+oIEKy{ekmgZ%p*QVxnB^4Wl+LcA3DI)<-mZ9~>h zRcSg&E8xXPnwF0t(F!zNBIz+I(9R>)#%dceQml=`pK49eO7NFzO&V#H*{y^ct{frO zq+7+>wDjU)Z6;cZ?QHvZuKhdD{#{`IE=q5=I6ZHfO+CZ@JAHWP?OqBvw8B$CX8nF$b4 zMq0$BMbw9_;J&76T>zPcP*H2uR%x|bm$tUj+G?fNU5g0jJNM2I_-Q}#oA>TL_ul_K z`#Fzo+wuKPXn*nB(E|W*mQudUzAYs+9a8Xe4RpK$A+xx?-b_n&I%_bZ;gyh$UmAgW^mLUk@$xTV=-!ZC#OrvqhS%V=W?9-S+a~;x znEcobq~%AhM^K6?>^8gsL9GjTgT7jx+=PJq+KzB}s}brC_t75z+%I^})bEQ1=__!+Kv}t)ch$^~G(?P5R0}u+JN=)i)Fb1M3QE_1V+P zXUr+n3%UZm@!7mNS5)W=1G+yD*1bNT?)4Aq0lpxphZ(IxaQ+hwe~KOiTR6}b4)*w0 z*>MN%RPj~~Z^PToyB!UwcOp=y-;NHvTf=+sUh}x4E$@Dop}>YiVyz$@QnAL458=Zq z{#?UH@KH06(T0zk&t}X>+Kqcud_u#$7`@3kcfttnQ*l(o{rC%neDj&C4D&#yYIZvp zW*k6Bo<9)o4g`BH^M-o@ej7e*KJ8p;8^K>{_$>a)%*|}C#^({V1p$B9@Q2Hn4E7r~ z{53+Vx4*x)r%N8IyfhSGeqY3wR6MBRZ}E2s#qpcG4EBnKzsFb2qO1#f@&^rH$2ZJt zvr0643;(F%pTvnjn+LKwY&-BT>=gJ{GcViF@DTn@#lLI#F8;&3A$v*$A)~mY;ZpBf zZ)LC7zpAo%#id49c$N*{L$I?IB!>mHLUI4n@B^^15A^tb#`@-!g7$Bw;fKNnPr-=U zU{-xez1Z@RhK+cI4L?CBl1A^88h(bKtN4Y6U*cEhT-VY>CLGc5 zYdmV+?wYURF+8r~w;GNSn1@}(5j;kuk%CPK39EvEfqok$AS6k^P^oy?NJW?+M$0bl z^j#FEC9+7Yb3Y4c_$m@On)sjkiXDzqvPKgqh4DhYhSAUQQ@psO-3~RBrct_Zt)vwL zJ-xn`V4$!6yl^_Cv8(W^Q=?3*<*T~9y}ix-hQBp15H^D8kRDriX*3bD*s%THV8~c- zG9oy9DTl+CauLofHV+o%njdCPFtd}jh>h|PO3(K8^cp@r9MI)aeSW=+n+m;C5c{nH6R!s}UWTBaoJJEW!M(5BXvog0JvY3zJ`B_3gUw|E3J>W4R($B+?j?+Nv+=w+|iO6}?3!Wssc-%`K) zTu%p@?@dm_wdRq@?KrrnnO!4+iw6eHX#UhapXOT;ckek;P)9_+H)l_s7@Jp-vvT&n znEgwmC!v~m9u~8IYxE1qw$Xo>+XVriQLCek=wtKEsgsw{r)-_(el9yJc9OeTh`IbV2LM{@8?Cwc*0pH*v8S_C^ zDM6TOPIFJTPiY7QRuA;6N~u}yu6A$;a}p$&go)xUgK3?6>GTkU04XeK12B=+oibm~ z`~48$wQNYF%V-1dyxctQ?!ha}Riz6&8+m08SRo&56rn3Y;du*fq95>EfkyhFzycNO zX)~;2tWuZ?L8d8C0R^y@X%@Q5{J1nLp;RI#mF;2Vr^=R37szg~z|FiPLR%#APP&?| zVLHIhII0!6q5l)pl}yYiLT(M zT`oPx@8?O}A45(WM^1_%^KLF90&vgg(;W)4qRxCxva%BFcn}Jt4y~j^Hr)cN+4NR8 zQ_@sYU=HnI_N>$b6||FARW?};-O4nT`K1$=@kolnr;pNY>@WlxeMPqm=O7_k6XcCS zKUh_$QPH6i-C-`PI)`<5Z&g91kY6L00L9P2%>K$(-vuL|DNn`7xM+8lY8^xO+9~XWG`yk*v7JfeDVjWDy1yF_y;dJ!CTs#{t;PJ({ z2v#z^7Z*bq8>BMMUl`nJpBb> z9gB3$c5t$wEnva(APJYSg)ZRK)B)4+LYR%qpbk4>FU7mn$N2FKiZEgPggQq?L1 z=?U7)s!oPpiqddA5hjCj974!O5iN7Usn3 znW=4%k2gRuzbo)YsKT3I4!;+o2~D^i&c~Z2Q#zY9pG`Kx)ye|XAY(kGU2sZD%K*!_ zkfqW-#3PV-3=ktn!I4U$sfs7JWIisevpj?BBc!>bl-jTxT&1Jr;PeX)cWIO|8ktfy zN?9>VS(LJy%AW_PyIh%3ZkaJklVqkIg4ErRBjkuuY72$;#OZk)`ZP zu{=HpQds1PoKtc*SaLa!=W)R3Y>z2WiBmbH6@mwgS?m&M#Y$L;Wzdf0a3NN3ikmi` z){@|yxbNq}OnR72Lr@8)(SEK`3be~cXN$akIb9tQHk59iDRkqJuFS>ijw7Jesj$_? z%HfVS?z)`1_>bLMXyLSzb=fN6o|7!ZYO-}a5UsH?$vE66$CX?z0)uhx*&P8FTfd)w z;ZZ7#>2p67b(|m$Q^{T`bMMC_CJ}3Tnq`>I*o&%rKUH_^r$cmY=dEAuKT875n9fDl8aT3e4bd)ZLuZ>biy!#M^aWh;^ zZNgAyi)XHEC4|TI@wd|f>HF7kEs4-mQV;i>;&Dk}`38J>bt<*FSOwfa$5pu`uF7nd zbeV%XMHq}TFoNEb%9U*bXE{6fLRm1%N{*c9e6q*2oE^KJui!R5e#K0_LhzmxyW-+_ zfW=y=n8_ZICW|#4@ivMf`12+XF+0ws&FvsA2peNuMMU=!1K56w&28h{h+g_RK!)P) zra081IF!avD;UZh#Y?{{CU3fo>W%!2aLu@q3)3cfiD(4)^!O#2veOo7%aqp3d%@{WwI0&MJ6)yzD1|GPJH{= zxnw@T8HW27aIiRA%tMQ^BBF^>fm%7eI5?z!%TuD?(aZdP5hf~W%*ZQB7O%WYuhFY= z^aj02Z^TD`8Xx^-d~|4h^lp6gD!ms!`zn3FBZ2y%d`3Q!uTSLjGx_`?e%)8`jbBUZ zH}ZL0KF7pU!Pq{9S(9_CeA?nvdz_jqsVT~27H9^i^AUVV$+IT%|BpVT=#Z!@`8+s{ Z32)&cWeOxJQ~6zFO;m~%w^9bK{{wK2)WrY* diff --git a/ai-client/target/maven-archiver/pom.properties b/ai-client/target/maven-archiver/pom.properties index a77a248..d1e84c7 100644 --- a/ai-client/target/maven-archiver/pom.properties +++ b/ai-client/target/maven-archiver/pom.properties @@ -1,5 +1,5 @@ #Generated by Maven -#Tue Feb 10 14:17:06 CET 2026 +#Tue Feb 10 14:20:59 CET 2026 artifactId=ai-client groupId=com.lona.tictactoe version=1.0-SNAPSHOT diff --git a/ai-client/target/original-ai-client-1.0-SNAPSHOT.jar b/ai-client/target/original-ai-client-1.0-SNAPSHOT.jar index fbc03a56f51938ca0e7b0a764aaaa9b6561760fc..e336dd1ba2d3511dca95838ffb2eac64d44c5b10 100644 GIT binary patch delta 10723 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[${now}] ${text}`; + console.log(text); +} + +function connect() { + const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; + const url = `${protocol}//${window.location.host}/game`; + log(`Connecting to WebSocket: ${url}`); + + ws = new WebSocket(url); + + ws.onopen = () => { + log('WebSocket: OnOpen fired. Connected.'); + statusDiv.textContent = 'Connected to Server'; + statusDiv.style.color = '#10b981'; + }; + + ws.onclose = (event) => { + log(`WebSocket: OnClose fired. Code: ${event.code}, Reason: ${event.reason}`); + statusDiv.textContent = 'Disconnected. Reconnecting...'; + statusDiv.style.color = '#ef4444'; + setTimeout(connect, 2000); + }; + + ws.onerror = (error) => { + log(`WebSocket: OnError fired. State: ${ws.readyState}`); + console.error("WebSocket Error:", error); + }; + + ws.onmessage = (event) => { + // log(`Received: ${event.data}`); // don't log every message to avoid spam + handleMessage(event.data); + }; +} + function updateBoard(boardStr) { cells.forEach((cell, i) => { if (i < boardStr.length) { diff --git a/web-client/src/main/resources/templates/index.html b/web-client/src/main/resources/templates/index.html index 89a0d3d..0fd135c 100644 --- a/web-client/src/main/resources/templates/index.html +++ b/web-client/src/main/resources/templates/index.html @@ -58,7 +58,13 @@ + +

+ +
diff --git a/web-client/target/classes/static/js/app.js b/web-client/target/classes/static/js/app.js index b3cd91f..f303fd3 100644 --- a/web-client/target/classes/static/js/app.js +++ b/web-client/target/classes/static/js/app.js @@ -113,6 +113,46 @@ function resetGame() { statusDiv.style.color = '#10b981'; } +const visibleDebug = document.getElementById('visible-debug'); + +function log(text) { + if (!visibleDebug) return; + const now = new Date().toLocaleTimeString(); + visibleDebug.innerHTML += `
[${now}] ${text}
`; + console.log(text); +} + +function connect() { + const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; + const url = `${protocol}//${window.location.host}/game`; + log(`Connecting to WebSocket: ${url}`); + + ws = new WebSocket(url); + + ws.onopen = () => { + log('WebSocket: OnOpen fired. Connected.'); + statusDiv.textContent = 'Connected to Server'; + statusDiv.style.color = '#10b981'; + }; + + ws.onclose = (event) => { + log(`WebSocket: OnClose fired. Code: ${event.code}, Reason: ${event.reason}`); + statusDiv.textContent = 'Disconnected. Reconnecting...'; + statusDiv.style.color = '#ef4444'; + setTimeout(connect, 2000); + }; + + ws.onerror = (error) => { + log(`WebSocket: OnError fired. State: ${ws.readyState}`); + console.error("WebSocket Error:", error); + }; + + ws.onmessage = (event) => { + // log(`Received: ${event.data}`); // don't log every message to avoid spam + handleMessage(event.data); + }; +} + function updateBoard(boardStr) { cells.forEach((cell, i) => { if (i < boardStr.length) { diff --git a/web-client/target/classes/templates/index.html b/web-client/target/classes/templates/index.html index 89a0d3d..0fd135c 100644 --- a/web-client/target/classes/templates/index.html +++ b/web-client/target/classes/templates/index.html @@ -58,7 +58,13 @@ + + + +
diff --git a/web-client/target/web-client-1.0-SNAPSHOT.jar b/web-client/target/web-client-1.0-SNAPSHOT.jar index 7d7de80160568f68a4a1f8a6231b640046aeea7e..44d4000ae73ea1ff488dc8ad530a9d76683e7395 100644 GIT binary patch delta 6445 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≷5Ntwc_1GYfIFZN6oF!J7u*9S;68W& z9)d^UF?a%=f>Q7dJO^c<98`cxPz9<%4X6b#Kpm(D4d5ks1zv+Upb<2Ix1brk11+Ex zya#`QHt+$ogAULMx8~6?;zz^^f zOoFLXAp=+(K!KwmqoAOehk^|SI|>dIoG7?ZaHHTs!Ha?q1wRS_6!TFCq7XtMjDm_{ z0g8nv7NMY_5J4e|LJY+pD8x}nppZnd7=;uHX%sRjWKqbWkVm0_LJ`Fh6iO(RQK+C$ zMWKd59mP@<8Yq^b&_tnyVmXQxD6~=Npje4Q7sV%u!gNutZ^nVm%6L6gDVqQP^P*;EICfZH4Re163 zO~-W5*f%Kls{Q(hn24r{5D^SIMnf&BQ0T#JIMD{hnpy6{X@qqs9b-eS8=%meTWbZh z8qBTL;ON{=AkmMw1Fb7(`Rn!fxk9V_F*-KegM@#zra-IN+-4OGqhnTcXoUs72(7xm zR$g*))dC{hL=K}6Wde0{46GRNWpB;6R^8!v6Oor(d)F`_5+ZZ?p2( zPR}Yo+lfgg!ilkJzn8k;B$5;xiKO@26oM}a$rE(UXqKgufV&goJT!^n9B-z(m$0In zaEaLtnSRwrCMzAjv6Dz4upHXIy=rIkuXzYY1Uy)qZ6fsA70@Jx`*lnoqr&>yh5z3} zTqDsT-d!`NJJf?OnC(@F5$G2ur}yA2TlZLD)?hy_P8gr0WBd~60pd?tw*4mXJ|ep4 z4W0SAa+E>Lhb~PP&j5~|KVrBr`R^x?!~+-+!&N^LEl}u?y*}bZ-D&u73Dqb%rcEvl z6P?*U0^25d**NhG3VS@tf)G7L$87K-PvQ|2RF;C536)?$senItJiX5fmrW)FqM?hd zm1n^^U0|V3B*3Nu`GSb$uW4Dle^?3-mP|UvMGU}@IQe~<=gg3Gr6>Q)(5e_1!oMjH z&QO?>jSYQRmyCUs2$fiLU@ICWOaC~5b}nGOm5JmgBw<90d`>!YdLQ8fn>u96@Y83g z@sdOZY-y9z1><2$UtgYe+f`l2Y4IhC) zijV{I%g~6@^iBnGKu*n$fMT8zK$_k3BArHn{d_q*1cwx+g{keBPp zoaxGf5h^j5fZke56=G2$9dpKY1c)Fg=y#*XK6$)n;FCw`FsEb08Y?=s;J-hawrCvBwdqHWZ%g!VPa;?7<;ygtXZ;UOP1{G$TG%~K_(#)p|OUnWlO~%Ta>k8 zWLK7~Cxe8@8oj3HJm)#@{m1>e&vo6`^*g^muKWAlxc=e>tEnL!m>B?I1OS%tsjNuQ z$u3_7TEeH!i=FHwW+0pf86b)VYoHj2iYMIxo~5A(h@{~IP=Tcy`Qyxb6-uOz^l)+&)E+YX*fqQ@qGd=t|Pb)Fnzqdaf6@ z>Tg1ay`*r%UJIh{>+ogz!Eom5Pfxwjc_`WP8?42IYH(9p;vOD!YKX?SU&)oa+&a6j zwV>dqUaKWO(&l9PEH&6JzFw>30VcXvAtCVQ!UjR3w9J1HW7)5$6u*Gntcf;XH5c_K z#t1Do?Q}127&@>t8m}9RtPP%)p?D|EiYj=m82A>bI66vF{MzXg@loQ|Oms!dB%SBaxnafkes@f0Z zVrzPu+|`~?gp}Ej3;NEkELkB-(J;WC~`ondWd>0Fy^KyUxm#D+~hrj_BpsavAk6H zJKo+2oF;q0%68}}b~_c*1+K?IN)(A{Wd@iW>dwgNH!0w$qdV3mclbmQ`TEDUvg~iZ z9tNeLnvKv*djv5JWP)f=iUrrUl2O@HwH?ph?G|Pp_EihBS3z?oHb473=PU$C*za93 zHetv1`yoW5xVmrn*un4Gp(b<0+*FME{99Gtwe0WH9|bLM>mB<`N7ThZ)hDBl+6Xg+ zMu8T!%TvP11qbZ-ICEQc>V!bLEAR`S8YRE(kt_9rjgBd z>+rkCM7msASv9PHuhw>7M1BS<$e_AxPqoUbG7t+E5K3X}rDwD7GkDBkqRf;SM_B;> z{@C$+?;#T_!#dj-&qRNT5>v~Y#>VVB`KF16W))zB^mHf3S*yYVsUBA_r}1jL`3l>l z*xTzSSI-XLi_mu(QN26rV9vX-b8rv_Vv}KBQ9&@?vnLvBU}H%~g}84iHY^h7;w2kk zc_G0|<7;bca&7tU7Jq8WDM?;}*4kGf>YuZeDYNgwj;!X#Ux)Z^h3C#>{-LA287EWB z$Ou@%lTq|%PO;NwJj0TJm8Ay&Jb6i`ED)mgztjBA4Tx|pf5h7L3Q1u`jWw}iZ@m98 zR4CzX>*7;&4x5r@58oip2>sIikg#^TBUgqy_*P4J=q45}%AM26Vkj-`+)|xqzU2N$vdl8iWplPbc4-j(6XG-{ZS^=n3^c}MIfY9WS6()J zmZrxP-kVm$^R0iR@ID{W&F+3n`i{K-aTvQvUahv z{7MX&vGq)2vSmcjB zX{XPO#jQ!zmoz3Dh8fOr8FA@5KHZ%Z+1QXUq_vn2&avnv%wohB^z>$IUq;^tTGl`RRYpY~qur^a|?*W7Eq z+0MOz%cMj)L_EYu6?=BCz)!IllbhuT4Zd-10@{r}!d<=H>>Ar0q1~4&>~rdK_D=Jv zohzSolqKj3_Yv74i+kdeH;*9e@z5&QW@M0->v7l!R$FxoaG@2Q)9>+hOw&3)Ws6L{ zUGo$Y1cMIz?)6H3?&ZHZfR0Dl3;VHbQ~z+({`q15=W81*vUQ8-%gte&HS)tOHFQAq zbRRgm3Cg6z=vjQ|KRv~9Hxf74baV8EoumfG>x-{P>4^C4kH8DAQn}}Fi?}?jpiUxW zFI~GDDfY!k(%NF^G4~la?5}DgUit@T_;cO5y==B-y4xo|?-Isz>g(iQ;b!h?hU0u? zYYVQee~!%w3GB~=Ql<{f9mF5YWgZEzxV%MJQtl-TNo2Kar82sSEj4eEH$SQ8snEwI z*7H>-^bna=s{<~6QM$f_ml5SvAP2|8*$Gs;9;haVZ?n)HD0WfUF;e)tFx1f zhoV+5q|9{P2*<^iTQW;&1!`#2rCQ$&(>HrpsYcWc418w$X*5>bfyc9aV-5t97E~Fs zEXo_)v?y#+yQIkLKvp?z@bao$6~1S1&MdO~eDFIF^;er3F^*Z?!T^u)ViPqEnQQDG z;`8mhE0w5*EP0$-y|Aq#_ayfEv9 zHir$Wdkp{S3l&e^=XeG>@t5R6?j$gcvJh298vS6EKpM}8km+bva{!S~LjY2dhBBlE z&9J7336ki=ptPf?m^=;F#gzX^D4i6O-iyi75P%dU@u380M>&)_4S19`t<7tc3Ju#R z6B;g~ZT>3Ve{PmkiB_Psn?nl%Uy+W{aM=GVAppR6;&%UCB~cWThB%DY-&tG`B*9Ip z<`y7jiHp!8%_osz-jj$ti50_2i$F1gAQyqZcWfY>?52i55HH<7x_grKKgkw|{LN;< zcu0*H*0a*-~f;n zlEJ3{W#1a*P-;lVB#M30cp!2ha1cchS0N~9W(X|~A`PMdq5z^Df&;M&(O?JDa8P9s z&QJn~T&M|!8e;0)SuyrNfCB*5xB);E006RAU~qsN*^7kxmFVdeq3TNx3@Ea*2x6%5 zHP6|X{>0L3HPH^x_i5yKNxaZsu1|9tzEX>D%EKb4)DMTTnM-6M;q&9QmY2o^!hn3y z{8A^Ad@wgBh6z-l>P@>Cs5!h7mABxmVdD{vp)UsU(MJuq}mD% zirv0mUR@+_JrHm3QL8r)F;_8(fE`TnPf(qD3|!Sw(x(J}Mxr~*<2-w+@SU?f1r?*d zN%5Vp3=)#dDpLV#=;K1Gx3a}<-sbav-mWW%xo7uBb*;9zTipd0@2hBAxT}`VTXWkU zNyVE_1MdcbUk>`kaAj8FMO%FNpidD=Cy=Fb)QaB5L%|nx&8H3@9bMd zX-2QKS2CVi?Wy-nmXpQ93O#@g^5_`kyFjRkw+f0o-t&`Bl0-Vu52eSt`e&D7 zdzX4(yUsJdCxj8|wrsfTP2OwDZneQp#D?k<4|iO()Ohv$W(uR6X^tCr7dYRtLf1Kl z@}`Eu1bx#1)f>ygl&DWLQ+Q@ni`Qk}nrGX=n;p(WW@Z7_9%fe~UMpSy(ELkrDCIGX z7nNYeO_mr`UJ_-FP|LFImh|GV6@l}6`l^wbwK@j(={WB07}Muh4y@F}3dcTwE~8l} zh{AtV3mdm@e7W?SK7yyzD@!4kOn!Z-Cx&6|$Z^Fo-;)Csk$0=Mv-<|v_@{h(X zW~}+`8h3YY&3aa^Os<^ij25ITnlgB*eN1)J@>BRUMPs>PbbF^C5^y-njI(MXkKHFV zeo0tFwTULGJpm+rhSTsS$k209>ZV(N`1l%{^k8`_a7Lr*q|WK&04YtWd~d>yr0+YL z>r;bm>6hfr<5Pc3Yp&C>+g{l`iEUD&L^hLizbd%aME%aXHJ55Ft)pa-W9;+ZN3b7T z!+9qmhD)oJo~7&QjZEE-+v8dZ`;yVF`9kHi#GvR{&Tk(#SI6q2YlOomd~p)XvlGOK zLjdefcE7;k05znli4%G3sGE|_s_bsV03cBi0EF1xL?XM9fAzrmk#KIo!K!|wW_zcg zNh8tNIeYVYQ*EoE9Ao;^9L-dCh}=`G!L0zR8oFnN;MeC5^)x(Qq93vW@LDDOC1>@b?Uk^7#N?vlX;`@J?3&vi8?DS}XINOJc_NtnYG8Qt%0 z^ej5bSE!DnTt1;NYysZT{U1P{n%oTRpJI&wnrnUjv_Iskp3gp6k2CwJxnp zFvuXYKGuK8XB^a4D_u;BU)e=zX7Mpfyn=Hn9XrRfLgU`oz!tThXy1lKXe~wR-pI{- zpJ;tNCA00D;v-`P7XQfkA(thwyA1ri(BM>5&}DxFV6y*jl#nLLg4jN)`N|@JYdeq;~e?zfxHmf#m>V6-Be`JPK zlD77NV`=Ti2svz{*7VKngWN~Cl2nyXF57=Uo|Q6Us2Va_%?jm(STm)VzO6&4`PF6O znP9G|5~pqZs1cB(EaA60ME~sW$jPmgc77+%Rh1vS2YMgYl zTdc)=RV zfUARmVm^o$idrCM6)%7bNDo?)W`LFeO;@xAh%B_uzaO;O!8A^c8i*H)k~A9(0yKj# z=Rs6p^uaWn7+nzRN|qqvl^g{AcRQgiC~1P}q?9EgNZMItIVte{|K}}xIOS zQa;LvfPT`M?3yKX35_BM0E|Kb0R5kWY(BXuD0Ad|Rz(-OD@%K