Samples Gallery & Reference > Games
Tic Tac Toe in 3D by qbguy
(1/1)
The Librarian:
Tic Tac Toe in 3D
Author: @qbguy
Source: [abandoned, outdated and now likely malicious qb64 dot net website - don’t go there] Forum
URL: /forum/index.php?topic=56.0]http://www.[abandoned, outdated and now likely malicious qb64 dot net website - don’t go there]/forum/index.php?topic=56.0
Version: 2008
Tags: [3d], [game], [ai], [mouse]
Description:
The goal is to get four in a row while preventing the computer from doing the same. Move by clicking the mouse.
Source Code:
--- Code: QB64: ---DECLARE SUB SHOWWIN (C%, R%, p%, COLOUR%)DECLARE SUB MAKEMOVE (X%, Y%, Z%, COLOUR%)DECLARE SUB GETMOVE (X%, Y%, Z%)DEFINT A-ZDIM E(7), PEEKB(1999)RANDOMIZE TIMERCLSGOSUB INITE(1) = 254: E(2) = 18: E(3) = 2: E(4) = 1: E(5) = 2: E(6) = 66: E(7) = 255Q = 564: G = 628: L = 768FOR K = G TO G + 63 PEEKB(K) = 128NEXTFOR K = S TO S + 75 PEEKB(K) = 128NEXT100 CALL GETMOVE(C, R, p)X = 16 * (p - 1) + 4 * (R - 1) + C - 1IF PEEKB(G + X) <> 128 THEN GOTO 100CALL MAKEMOVE(C, R, p, 1)M = -1: GOSUB 1000GOSUB 2000IF W THEN CALL SHOWWIN(C, R, p, 1): ENDIF T THEN LOCATE 15, 33: PRINT " --- Tie game --- ": ENDGOSUB 3000M = 1: GOSUB 1000GOSUB 2000GOSUB 7000IF W THEN CALL SHOWWIN(C, R, p, 4): ENDIF T THEN LOCATE 15, 33: PRINT " --- Tie game --- ": ENDGOTO 100 1000PEEKB(G + X) = 128 + MFOR K = L TO L + 303 IF PEEKB(K) <> X THEN GOTO 1001 Y = S + (K - L) \ 4: V = PEEKB(Y) IF V = 0 THEN GOTO 1001 V = V - 128 IF V = 0 THEN V = M + 128 ELSE IF (SGN(V) = SGN(M)) THEN V = V + M + 128 ELSE V = 0 END IF END IF PEEKB(Y) = V1001 NEXTRETURN 2000W = 0: T = 1FOR K = S TO S + 75 V = PEEKB(K) IF V THEN T = 0 IF ABS(V - 128) = 4 THEN W = 1NEXTRETURN 3000FOR K = Q TO Q + 63 PEEKB(K) = 0NEXTFOR K = S TO S + 75 N = PEEKB(K) - 128 IF N = -128 THEN GOTO 3002 Z = E(N + 4) F = L + 4 * (K - S) FOR J = F TO F + 3 X = PEEKB(J) IF PEEKB(G + X) <> 128 THEN GOTO 3001 V = PEEKB(Q + X) IF V >= 254 THEN GOTO 3001 V = V + Z: IF Z >= 254 THEN V = Z IF V > 255 THEN V = 255 PEEKB(Q + X) = V 3001 NEXT3002 NEXTV9 = 0FOR K = 0 TO 63 V = PEEKB(Q + K) IF V > 64 AND V < 128 THEN V = V - 64 IF V > 16 AND V < 32 THEN V = V - 16 IF V > V9 THEN V9 = V PEEKB(Q + K) = VNEXTIF V9 < 32 THEN GOTO 40003800 X = 0DO IF PEEKB(Q + X) = V9 THEN RETURN X = X + 1LOOP4000 P4 = 16FOR K = L TO L + 287 STEP 16 p = 0 FOR J = K TO K + 15 p = p + PEEKB(PEEKB(J) + G) - 128 NEXT IF p > P4 THEN GOTO 4002 IF p < P4 THEN P4 = p: V4 = 0: N4 = 0 END IF FOR J = K TO K + 15 X1 = PEEKB(J) V = PEEKB(Q + X1) IF V = 0 THEN GOTO 4001 IF V < V4 THEN GOTO 4001 IF V > V4 THEN V4 = V: N4 = 1 ELSE N4 = N4 + 1 IF INT(RND(1) * N4) <> 0 THEN GOTO 4001 END IF X = X1 4001 NEXT4002 NEXTIF V4 = 0 THEN GOTO 3800RETURN 7000p = X \ 16 + 1X = X - 16 * (p - 1)R = X \ 4 + 1C = (X MOD 4) + 1CALL MAKEMOVE(C, R, p, 4)RETURN INIT:L = 768FOR K = 0 TO 63 PEEKB(L + K) = KNEXTL = L + 64a = 4: B = 16FOR S = 1 TO 4 GOSUB 19000NEXTa = 16: B = 1FOR S = 1 TO 13 STEP 4 GOSUB 19000NEXTS = 1: a = 5: B = 16: GOSUB 19000S = 13: a = -3: B = 16: GOSUB 19000S = 1: a = 20: B = 1: GOSUB 19000S = 49: a = -12: B = 1: GOSUB 19000S = 1: a = 17: B = 4: GOSUB 19000S = 49: a = -15: B = 4: GOSUB 19000S = 1: D = 21: GOSUB 18000S = 16: D = 11: GOSUB 18000S = 4: D = 19: GOSUB 18000S = 13: D = 13: GOSUB 18000GOSUB DRAWBDRETURN 18000FOR K = S TO S + 3 * D STEP D PEEKB(L) = K - 1: L = L + 1NEXTRETURN 19000FOR J = S TO S + 3 * B STEP B FOR K = J TO J + 3 * a STEP a PEEKB(L) = K - 1: L = L + 1 NEXTNEXTRETURN DRAWBD:SCREEN 12LINE (0, 0)-(639, 479), 7, BFLINE (23, 23)-(616, 456), 0, BLINE (24, 24)-(615, 455), 14, BFY = 130: GOSUB GRIDY = 230: GOSUB GRIDY = 330: GOSUB GRIDY = 430: GOSUB GRIDPAINT (24, 24), 3, 0RETURN GRID:FOR K = 0 TO 4 LINE (120 + 20 * K, Y - 20 * K)-(440 + 20 * K, Y - 20 * K), 0 LINE (120 + 80 * K, Y)-(200 + 80 * K, Y - 80), 0 LINE (117 - K, Y + 2)-(201 - K, Y - 82), 0 LINE (437 + K, Y + 2)-(521 + K, Y - 82), 0NEXTFOR K = 0 TO 1 LINE (117 - K, Y + K + 1)-(437 + K, Y + K + 1), 0 LINE (201 - K, Y - 81 - K)-(521 + K, Y - 81 - K), 0NEXTRETURN SUB GETMOVE (X, Y, Z) GETPOS: IF INKEY$ = CHR$(27) THEN END CALL getmouse(XX, YY, ZZ) Z = (YY - 30) \ 100 + 1 IF Z < 1 OR Z > 4 THEN GOTO GETPOS Y = ((YY - 30) \ 20) MOD 5 IF Y < 1 OR Y > 4 THEN GOTO GETPOS IF XX + YY - 150 - 100 * Z < 0 THEN GOTO GETPOS X = (XX + YY - 150 - 100 * Z) \ 80 + 1 IF X < 1 OR X > 4 THEN GOTO GETPOS IF ZZ = 0 THEN GOTO GETPOSEND SUB SUB MAKEMOVE (X, Y, Z, COLOUR) CIRCLE (80 * X - 20 * Y + 170, 100 * Z + 20 * Y - 60), 35, 8, , , 4 * (8 / 35) / 3 PAINT STEP(0, 0), COLOUR, 8 CIRCLE (80 * X - 20 * Y + 170, 100 * Z + 20 * Y - 60), 15, 8, , , 4 * (3 / 15) / 3 PAINT STEP(0, 0), COLOUR + 8, 8END SUB SUB SHOWWIN (C, R, p, COLOUR) DIM CC(0 TO 3), RR(0 TO 3), PP(0 TO 3) FOR DC = -1 TO 1 FOR DR = -1 TO 1 FOR DP = -1 TO 1 IF DC <> 0 OR DR <> 0 OR DP <> 0 THEN NDX = 0 FOR K = -3 TO 3 IF C + K * DC < 1 OR C + K * DC > 4 THEN GOTO 1 IF R + K * DR < 1 OR R + K * DR > 4 THEN GOTO 1 IF p + K * DP < 1 OR p + K * DP > 4 THEN GOTO 1 ID = POINT(80 * (C + K * DC) - 20 * (R + K * DR) + 170, 100 * (p + K * DP) + 20 * (R + K * DR) - 60) IF ID <> COLOUR + 8 THEN EXIT FOR CC(NDX) = C + K * DC RR(NDX) = R + K * DR PP(NDX) = p + K * DP NDX = NDX + 1 IF NDX = 4 THEN GOTO SHOW 1 NEXT END IF NEXT NEXT NEXT SHOW: FOR K = 0 TO 3 CIRCLE (80 * CC(K) - 20 * RR(K) + 170, 100 * PP(K) + 20 * RR(K) - 60), 35, COLOUR + 8, , , 4 * (8 / 35) / 3 PAINT STEP(0, 0), COLOUR + 8 CIRCLE STEP(0, 0), 15, 15, , , 4 * (3 / 15) / 3 PAINT STEP(0, 0), 15 NEXTEND SUB SUB getmouse (x%, y%, b%) b% = 0 wheel% = 0 DO IF _MOUSEBUTTON(1) THEN b% = b% OR 1 IF _MOUSEBUTTON(2) THEN b% = b% OR 2 IF _MOUSEBUTTON(3) THEN b% = b% OR 4 LOOP UNTIL _MOUSEINPUT = 0 x% = _MOUSEX y% = _MOUSEYEND SUB
Navigation
[0] Message Index
Go to full version