Subdomain Posts
QBasic | 603 days ago
QBasic | 742 days ago
QBasic | 912 days ago
Recent Posts
C | 1 min ago
None | 2 min ago
None | 2 min ago
PHP | 5 min ago
None | 5 min ago
PHP | 6 min ago
None | 6 min ago
None | 7 min ago
XML | 8 min ago
None | 8 min ago
Sitereport
Find cool info about any domain on the internet?
visit sitereport
Free Subdomains
Want a pastebin.com sub-domain for your community?
learn more...
What is pastebin?
Pastebin is a website that hosts all your text & code on dedicated servers for easy sharing.
learn more...
Learn a little bit about the new Pastebin.com on our help page. hide message
By Dean Menezes on the 10th of Mar 2008 12:18:20 AM Download | Raw | Embed | Report
  1. DEFINT A-Z
  2. DECLARE SUB SQUARE (A, B, C)
  3. DECLARE SUB SHOWMAN (A, B, FLAG)
  4. DECLARE SUB SHOWBD ()
  5. DECLARE SUB IO (A, B, X, Y, RESULT)
  6. DECLARE FUNCTION INCHECK (X)
  7. DECLARE SUB MAKEMOVE (A, B, X, Y)
  8. DECLARE SUB KNIGHT (A, B, XX(), YY(), NDX)
  9. DECLARE SUB KING (A, B, XX(), YY(), NDX)
  10. DECLARE SUB QUEEN (A, B, XX(), YY(), NDX)
  11. DECLARE SUB ROOK (A, B, XX(), YY(), NDX)
  12. DECLARE SUB BISHOP (A, B, XX(), YY(), NDX)
  13. DECLARE SUB MOVELIST (A, B, XX(), YY(), NDX)
  14. DECLARE SUB PAWN (A, B, XX(), YY(), NDX)
  15. DECLARE FUNCTION EVALUATE (ID, PRUNE)
  16. DIM SHARED BOARD(0 TO 7, 0 TO 7)
  17. DIM SHARED BESTA(0 TO 7), BESTB(0 TO 7), BESTX(0 TO 7), BESTY(0 TO 7)
  18. DIM SHARED LEVEL, MAXLEVEL, SCORE, CFLAG
  19. CFLAG = 0
  20. LEVEL = 0
  21. MAXLEVEL = 5
  22. DATA -500,-270,-300,-900,-7500,-300,-270,-500
  23. DATA -100,-100,-100,-100, -100,-100,-100,-100
  24. DATA 0, 0, 0, 0, 0, 0, 0, 0
  25. DATA 0, 0, 0, 0, 0, 0, 0, 0
  26. DATA 0, 0, 0, 0, 0, 0, 0, 0
  27. DATA 0, 0, 0, 0, 0, 0, 0, 0
  28. DATA 100, 100, 100, 100, 100, 100, 100, 100
  29. DATA 500, 270, 300, 900, 5000, 300, 270, 500
  30. FOR X = 0 TO 7
  31.   FOR Y = 0 TO 7
  32.     READ Z
  33.     BOARD(X, Y) = Z
  34.   NEXT Y
  35. NEXT X
  36. A = -1
  37. RESULT = 0
  38. DO
  39.   SCORE = 0
  40.   CALL IO(A, B, X, Y, RESULT)
  41.   CLS
  42.   CALL SHOWBD
  43.   RESULT = EVALUATE(-1, 10000)
  44.   A = BESTA(1)
  45.   B = BESTB(1)
  46.   X = BESTX(1)
  47.   Y = BESTY(1)
  48. LOOP
  49.  
  50. SUB BISHOP (A, B, XX(), YY(), NDX)
  51.   ID = SGN(BOARD(B, A))
  52.   FOR DXY = 1 TO 7
  53.     X = A - DXY
  54.     Y = B + DXY
  55.     IF X < 0 OR X > 7 OR Y < 0 OR Y > 7 THEN EXIT FOR
  56.     GOSUB 3
  57.     IF BOARD(Y, X) THEN EXIT FOR
  58.   NEXT
  59.   FOR DXY = 1 TO 7
  60.     X = A + DXY
  61.     Y = B + DXY
  62.     IF X < 0 OR X > 7 OR Y < 0 OR Y > 7 THEN EXIT FOR
  63.     GOSUB 3
  64.     IF BOARD(Y, X) THEN EXIT FOR
  65.   NEXT
  66.   FOR DXY = 1 TO 7
  67.     X = A - DXY
  68.     Y = B - DXY
  69.     IF X < 0 OR X > 7 OR Y < 0 OR Y > 7 THEN EXIT FOR
  70.     GOSUB 3
  71.     IF BOARD(Y, X) THEN EXIT FOR
  72.   NEXT
  73.   FOR DXY = 1 TO 7
  74.     X = A + DXY
  75.     Y = B - DXY
  76.     IF X < 0 OR X > 7 OR Y < 0 OR Y > 7 THEN EXIT FOR
  77.     GOSUB 3
  78.     IF BOARD(Y, X) THEN EXIT FOR
  79.   NEXT
  80.   EXIT SUB
  81. 3 REM
  82.   IF ID <> SGN(BOARD(Y, X)) THEN
  83.     NDX = NDX + 1
  84.     XX(NDX) = X
  85.     YY(NDX) = Y
  86.   END IF
  87.   RETURN
  88. END SUB
  89.  
  90. FUNCTION EVALUATE (ID, PRUNE)
  91.   DIM XX(0 TO 26), YY(0 TO 26)
  92.   LEVEL = LEVEL + 1
  93.   BESTSCORE = 10000 * ID
  94.   FOR B = 7 TO 0 STEP -1
  95.     FOR A = 7 TO 0 STEP -1
  96.       IF SGN(BOARD(B, A)) <> ID THEN GOTO 1
  97.       IF (LEVEL = 1) THEN CALL SHOWMAN(A, B, 8)
  98.       CALL MOVELIST(A, B, XX(), YY(), NDX)
  99.       FOR I = 0 TO NDX
  100.         X = XX(I)
  101.         Y = YY(I)
  102.         IF LEVEL = 1 THEN
  103.           LOCATE 1, 1
  104.           PRINT "TRYING: "; CHR$(65 + A); 8 - B; "-"; CHR$(65 + X); 8 - Y
  105.           CALL SHOWMAN(X, Y, 8)
  106.         END IF
  107.         OLDSCORE = SCORE
  108.         MOVER = BOARD(B, A)
  109.         TARGET = BOARD(Y, X)
  110.         CALL MAKEMOVE(A, B, X, Y)
  111.         IF (LEVEL < MAXLEVEL) THEN SCORE = SCORE + EVALUATE(-ID, BESTSCORE - TARGET + ID * (8 - ABS(4 - X) - ABS(4 - Y)))
  112.         SCORE = SCORE + TARGET - ID * (8 - ABS(4 - X) - ABS(4 - Y))
  113.         IF (ID < 0 AND SCORE > BESTSCORE) OR (ID > 0 AND SCORE < BESTSCORE) THEN
  114.           BESTA(LEVEL) = A
  115.           BESTB(LEVEL) = B
  116.           BESTX(LEVEL) = X
  117.           BESTY(LEVEL) = Y
  118.           BESTSCORE = SCORE
  119.           IF (ID < 0 AND BESTSCORE >= PRUNE) OR (ID > 0 AND BESTSCORE <= PRUNE) THEN
  120.             BOARD(B, A) = MOVER
  121.             BOARD(Y, X) = TARGET
  122.             SCORE = OLDSCORE
  123.             IF (LEVEL = 1) THEN CALL SHOWMAN(X, Y, 0)
  124.             IF (LEVEL = 1) THEN CALL SHOWMAN(A, B, 0)
  125.             LEVEL = LEVEL - 1
  126.             EVALUATE = BESTSCORE
  127.             EXIT FUNCTION
  128.           END IF
  129.         END IF
  130.         BOARD(B, A) = MOVER
  131.         BOARD(Y, X) = TARGET
  132.         SCORE = OLDSCORE
  133.         IF (LEVEL = 1) THEN CALL SHOWMAN(X, Y, 0)
  134. 1   NEXT
  135.       IF (LEVEL = 1) THEN CALL SHOWMAN(A, B, 0)
  136.    NEXT
  137.     NEXT
  138.     LEVEL = LEVEL - 1
  139.     EVALUATE = BESTSCORE
  140.   END FUNCTION
  141.  
  142. FUNCTION INCHECK (X)
  143.   DIM XX(0 TO 26), YY(0 TO 26), NDX
  144.   FOR B = 0 TO 7
  145.     FOR A = 0 TO 7
  146.       IF BOARD(B, A) >= 0 THEN GOTO 6
  147.       CALL MOVELIST(A, B, XX(), YY(), NDX)
  148.       FOR I = 0 TO NDX STEP 1
  149.         X = XX(I)
  150.         Y = YY(I)
  151.         IF BOARD(Y, X) = 5000 THEN
  152.           PRINT "YOU ARE IN CHECK!"
  153.           PRINT " "
  154.           PRINT " "
  155.           INCHECK = 1
  156.           EXIT FUNCTION
  157.         END IF
  158.       NEXT
  159. 6 NEXT
  160.     NEXT
  161.     INCHECK = 0
  162.   END FUNCTION
  163.  
  164. SUB IO (A, B, X, Y, RESULT)
  165.   DIM XX(0 TO 26), YY(0 TO 26)
  166.   CLS
  167.   IF A >= 0 THEN
  168.     IF RESULT < -2500 THEN
  169.       PRINT "I RESIGN"
  170.       SLEEP
  171.       SYSTEM
  172.     END IF
  173.     PIECE = BOARD(Y, X)
  174.     CALL MAKEMOVE(A, B, X, Y)
  175.     PRINT "MY MOVE: "; CHR$(65 + A); 8 - B; "-"; CHR$(65 + X); 8 - Y
  176.     IF PIECE THEN
  177.       PRINT "I TOOK YOUR ";
  178.       IF PIECE = 100 THEN PRINT "PAWN"
  179.       IF PIECE = 270 THEN PRINT "KNIGHT"
  180.       IF PIECE = 300 THEN PRINT "BISHOP"
  181.       IF PIECE = 500 THEN PRINT "ROOK"
  182.       IF PIECE = 900 THEN PRINT "QUEEN"
  183.       IF PIECE = 5000 THEN PRINT "KING"
  184.     END IF
  185.     NULL = INCHECK(0)
  186.   END IF
  187.   DO
  188.     CALL SHOWBD
  189.     LOCATE 24, 1
  190.     INPUT "YOUR MOVE: ", IN$
  191.     IF UCASE$(IN$) = "QUIT" THEN CLS : END
  192.     IF UCASE$(IN$) = "O-O" OR IN$ = "0-0" THEN
  193.       IF CFLAG THEN GOTO 16
  194.       IF BOARD(7, 7) <> 500 THEN GOTO 16
  195.       IF BOARD(7, 6) OR BOARD(7, 5) THEN GOTO 16
  196.       BOARD(7, 6) = 5000
  197.       BOARD(7, 4) = 0
  198.       BOARD(7, 5) = 500
  199.       BOARD(7, 7) = 0
  200.       CFLAG = 1
  201.       EXIT SUB
  202.     END IF
  203.     IF UCASE$(IN$) = "O-O-O" OR IN$ = "0-0-0" THEN
  204.       IF CFLAG THEN GOTO 16
  205.       IF BOARD(7, 0) <> 500 THEN GOTO 16
  206.       IF BOARD(7, 1) OR BOARD(7, 2) OR BOARD(7, 3) THEN GOTO 16
  207.       BOARD(7, 2) = 5000
  208.       BOARD(7, 4) = 0
  209.       BOARD(7, 3) = 500
  210.       BOARD(7, 0) = 0
  211.       CFLAG = 1
  212.       EXIT SUB
  213.     END IF
  214.     IF LEN(IN$) < 5 THEN GOTO 16
  215.     B = 8 - (ASC(MID$(IN$, 2, 1)) - 48)
  216.     A = ASC(UCASE$(MID$(IN$, 1, 1))) - 65
  217.     X = ASC(UCASE$(MID$(IN$, 4, 1))) - 65
  218.     Y = 8 - (ASC(MID$(IN$, 5, 1)) - 48)
  219.     IF B > 7 OR B < 0 OR A > 7 OR A < 0 OR X > 7 OR X < 0 OR Y > 7 OR Y < 0 THEN GOTO 16
  220.     IF BOARD(B, A) <= 0 THEN GOTO 16
  221.     CALL MOVELIST(A, B, XX(), YY(), NDX)
  222.     FOR K = 0 TO NDX STEP 1
  223.       IF X = XX(K) AND Y = YY(K) THEN
  224.         MOVER = BOARD(B, A)
  225.         TARGET = BOARD(Y, X)
  226.         CALL MAKEMOVE(A, B, X, Y)
  227.         LOCATE 1, 1
  228.         IF INCHECK(0) = 0 THEN EXIT SUB
  229.         BOARD(B, A) = MOVER
  230.         BOARD(Y, X) = TARGET
  231.         GOTO 16
  232.       END IF
  233.     NEXT
  234. 16 CLS
  235.   LOOP
  236. END SUB
  237.  
  238. SUB KING (A, B, XX(), YY(), NDX)
  239.   ID = SGN(BOARD(B, A))
  240.   FOR DY = -1 TO 1
  241.     IF B + DY < 0 OR B + DY > 7 THEN GOTO 12
  242.     FOR DX = -1 TO 1
  243.       IF A + DX < 0 OR A + DX > 7 THEN GOTO 11
  244.       IF ID <> SGN(BOARD(B + DY, A + DX)) THEN
  245.         NDX = NDX + 1
  246.         XX(NDX) = A + DX
  247.         YY(NDX) = B + DY
  248.       END IF
  249. 11 NEXT
  250. 12 NEXT
  251.     END SUB
  252.  
  253. SUB KNIGHT (A, B, XX(), YY(), NDX)
  254.   ID = SGN(BOARD(B, A))
  255.   X = A - 1
  256.   Y = B - 2
  257.   GOSUB 5
  258.   X = A - 2
  259.   Y = B - 1
  260.   GOSUB 5
  261.   X = A + 1
  262.   Y = B - 2
  263.   GOSUB 5
  264.   X = A + 2
  265.   Y = B - 1
  266.   GOSUB 5
  267.   X = A - 1
  268.   Y = B + 2
  269.   GOSUB 5
  270.   X = A - 2
  271.   Y = B + 1
  272.   GOSUB 5
  273.   X = A + 1
  274.   Y = B + 2
  275.   GOSUB 5
  276.   X = A + 2
  277.   Y = B + 1
  278.   GOSUB 5
  279.   EXIT SUB
  280. 5 IF X < 0 OR X > 7 OR Y < 0 OR Y > 7 THEN RETURN
  281.   IF ID <> SGN(BOARD(Y, X)) THEN NDX = NDX + 1: XX(NDX) = X: YY(NDX) = Y
  282.   RETURN
  283. END SUB
  284.  
  285. SUB MAKEMOVE (A, B, X, Y)
  286.   BOARD(Y, X) = BOARD(B, A)
  287.   BOARD(B, A) = 0
  288.   IF Y = 0 AND BOARD(Y, X) = 100 THEN BOARD(Y, X) = 900
  289.   IF Y = 7 AND BOARD(Y, X) = -100 THEN BOARD(Y, X) = -900
  290. END SUB
  291.  
  292. SUB MOVELIST (A, B, XX(), YY(), NDX)
  293.   PIECE = INT(ABS(BOARD(B, A)))
  294.   NDX = -1
  295.   IF PIECE = 100 THEN
  296.     CALL PAWN(A, B, XX(), YY(), NDX)
  297.   ELSEIF PIECE = 270 THEN CALL KNIGHT(A, B, XX(), YY(), NDX)
  298.   ELSEIF PIECE = 300 THEN CALL BISHOP(A, B, XX(), YY(), NDX)
  299.   ELSEIF PIECE = 500 THEN CALL ROOK(A, B, XX(), YY(), NDX)
  300.   ELSEIF PIECE = 900 THEN CALL QUEEN(A, B, XX(), YY(), NDX)
  301.   ELSE CALL KING(A, B, XX(), YY(), NDX)
  302.   END IF
  303.  
  304. END SUB
  305.  
  306. SUB PAWN (A, B, XX(), YY(), NDX)
  307.   ID = SGN(BOARD(B, A))
  308.   IF (A - 1) >= 0 AND (A - 1) <= 7 AND (B - ID) >= 0 AND (B - ID) <= 7 THEN
  309.     IF SGN(BOARD((B - ID), (A - 1))) = -ID THEN
  310.       NDX = NDX + 1
  311.       XX(NDX) = A - 1
  312.       YY(NDX) = B - ID
  313.     END IF
  314.   END IF
  315.   IF (A + 1) >= 0 AND (A + 1) <= 7 AND (B - ID) >= 0 AND (B - ID) <= 7 THEN
  316.     IF SGN(BOARD((B - ID), (A + 1))) = -ID THEN
  317.       NDX = NDX + 1
  318.       XX(NDX) = A + 1
  319.       YY(NDX) = B - ID
  320.     END IF
  321.   END IF
  322.   IF A >= 0 AND A <= 7 AND (B - ID) >= 0 AND (B - ID) <= 7 THEN
  323.     IF BOARD((B - ID), A) = 0 THEN
  324.       NDX = NDX + 1
  325.       XX(NDX) = A
  326.       YY(NDX) = B - ID
  327.       IF (ID < 0 AND B = 1) OR (ID > 0 AND B = 6) THEN
  328.         IF BOARD((B - ID - ID), A) = 0 THEN
  329.           NDX = NDX + 1
  330.           XX(NDX) = A
  331.           YY(NDX) = B - 2 * ID
  332.         END IF
  333.       END IF
  334.     END IF
  335.   END IF
  336.  
  337. END SUB
  338.  
  339. SUB QUEEN (A, B, XX(), YY(), NDX)
  340.   CALL BISHOP(A, B, XX(), YY(), NDX)
  341.   CALL ROOK(A, B, XX(), YY(), NDX)
  342. END SUB
  343.  
  344. SUB ROOK (A, B, XX(), YY(), NDX)
  345.   ID = SGN(BOARD(B, A))
  346.   FOR X = A - 1 TO 0 STEP -1
  347.     IF ID <> SGN(BOARD(B, X)) THEN
  348.       NDX = NDX + 1
  349.       XX(NDX) = X
  350.       YY(NDX) = B
  351.     END IF
  352.     IF (BOARD(B, X)) THEN EXIT FOR
  353.   NEXT
  354.   FOR X = A + 1 TO 7 STEP 1
  355.     IF ID <> SGN(BOARD(B, X)) THEN
  356.       NDX = NDX + 1
  357.       XX(NDX) = X
  358.       YY(NDX) = B
  359.     END IF
  360.     IF (BOARD(B, X)) THEN EXIT FOR
  361.   NEXT
  362.   FOR Y = B - 1 TO 0 STEP -1
  363.     IF ID <> SGN(BOARD(Y, A)) THEN
  364.       NDX = NDX + 1
  365.       XX(NDX) = A
  366.       YY(NDX) = Y
  367.     END IF
  368.     IF (BOARD(Y, A)) THEN EXIT FOR
  369.   NEXT
  370.   FOR Y = B + 1 TO 7 STEP 1
  371.     IF ID <> SGN(BOARD(Y, A)) THEN
  372.       NDX = NDX + 1
  373.       XX(NDX) = A
  374.       YY(NDX) = Y
  375.     END IF
  376.     IF (BOARD(Y, A)) THEN EXIT FOR
  377.   NEXT
  378. END SUB
  379.  
  380. SUB SHOWBD
  381.   LOCATE 3, 30
  382.   COLOR 7, 0
  383.   PRINT "A  B  C  D  E  F  G  H"
  384.   FOR K = 0 TO 25
  385.     LOCATE 4, 28 + K
  386.     COLOR 6, 0
  387.     PRINT CHR$(220)
  388.   NEXT
  389.   FOR B = 0 TO 7
  390.     LOCATE 2 * B + 5, 26
  391.     COLOR 7, 0
  392.     PRINT CHR$(56 - B)
  393.     LOCATE 2 * B + 5, 28
  394.     COLOR 6, 0
  395.     PRINT CHR$(219)
  396.     LOCATE 2 * B + 6, 28
  397.     COLOR 6, 0
  398.     PRINT CHR$(219)
  399.     FOR A = 0 TO 7
  400.       IF ((A + B) MOD 2) THEN
  401.         COLOUR = 8
  402.       ELSE COLOUR = 12
  403.       END IF
  404.       CALL SQUARE(3 * A + 31, 2 * B + 5, COLOUR)
  405.     NEXT
  406.     LOCATE 2 * B + 5, 53
  407.     COLOR 6, 0
  408.     PRINT CHR$(219)
  409.     LOCATE 2 * B + 6, 53
  410.     COLOR 6, 0
  411.     PRINT CHR$(219)
  412.     LOCATE 2 * B + 6, 55
  413.     COLOR 7, 0
  414.     PRINT CHR$(56 - B)
  415.   NEXT
  416.   FOR K = 0 TO 25
  417.     LOCATE 21, 28 + K
  418.     COLOR 6, 0
  419.     PRINT CHR$(223)
  420.   NEXT
  421.   LOCATE 22, 30
  422.   COLOR 7, 0
  423.   PRINT "A  B  C  D  E  F  G  H"
  424.   FOR B = 0 TO 7
  425.     FOR A = 0 TO 7
  426.       CALL SHOWMAN(A, B, 0)
  427.     NEXT
  428.   NEXT
  429.   COLOR 7, 0
  430. END SUB
  431.  
  432. SUB SHOWMAN (A, B, FLAG)
  433.   IF BOARD(B, A) < 0 THEN BACK = 0
  434.   IF BOARD(B, A) > 0 THEN BACK = 7
  435.   FORE = 7 - BACK + FLAG
  436.   IF BOARD(B, A) = 0 THEN
  437.     IF (A + B) AND 1 THEN BACK = 8 ELSE BACK = 12
  438.     FORE = BACK - (FLAG > 0)
  439.   END IF
  440.   N$ = " "
  441.   PIECE = INT(ABS(BOARD(B, A)))
  442.   IF PIECE = 0 THEN N$ = CHR$(219)
  443.   IF PIECE = 100 THEN N$ = "P"
  444.   IF PIECE = 270 THEN N$ = "N"
  445.   IF PIECE = 300 THEN N$ = "B"
  446.   IF PIECE = 500 THEN N$ = "R"
  447.   IF PIECE = 900 THEN N$ = "Q"
  448.   IF PIECE = 5000 OR PIECE = 7500 THEN N$ = "K"
  449.   LOCATE 2 * B + 5 - (BOARD(B, A) > 0), 3 * A + 30
  450.   COLOR FORE, BACK
  451.   PRINT N$
  452.   LOCATE 1, 1
  453.   COLOR 7, 0
  454. END SUB
  455.  
  456. SUB SQUARE (A, B, C)
  457.   MT$ = CHR$(219)
  458.   MT$ = MT$ + MT$ + MT$
  459.   LOCATE B, A - 2
  460.   COLOR C, C
  461.   PRINT MT$
  462.   LOCATE B + 1, A - 2
  463.   COLOR C, C
  464.   PRINT MT$
  465.   COLOR 7, 0
  466. END SUB
Submit a correction or amendment below. Make A New Post
To highlight particular lines, prefix each line with @h@
Syntax highlighting:
Post expiration:
Post exposure:
Name / Title:
Email: