' Wendel Scardua's Goban ' ' Programa para duas pessoas jogarem Go ' DECLARE SUB restoreState () DECLARE FUNCTION emptyGroup% () DECLARE SUB drawGoban () DECLARE SUB initialize () DECLARE SUB getCommand () DECLARE SUB saveState () DECLARE SUB doTheMove () DEFINT A-Z WIDTH 40 CLS CONST upleft = "Ú" CONST downleft = "À" CONST upright = "¿" CONST downright = "Ù" CONST up = "Â", down = "Á", left = "Ã", right = "´", center = "Å" CONST none = 0, black = 1, white = 2 TYPE GroupType gColor AS INTEGER gFreedom AS INTEGER END TYPE DIM SHARED table(1 TO 19, 1 TO 19) AS INTEGER DIM SHARED group(1 TO 361) AS GroupType DIM SHARED oldTable(1 TO 19, 1 TO 19) AS INTEGER DIM SHARED oldGroup(1 TO 361) AS GroupType DIM SHARED Player AS INTEGER DIM SHARED PlayAtRow AS INTEGER, PlayAtCol AS INTEGER DIM SHARED Score(1 TO 2) AS INTEGER initialize DO drawGoban getCommand IF PlayAtRow < 20 THEN saveState doTheMove END IF Player = black + white - Player LOOP SUB doTheMove ' Poe a propria pedra aGroup = emptyGroup table(PlayAtRow, PlayAtCol) = aGroup group(aGroup).gColor = Player aFreedom = 4 'atualiza liberdade dela, isolada IF PlayAtRow = 1 OR PlayAtRow = 19 THEN aFreedom = aFreedom - 1 IF PlayAtCol = 1 OR PlayAtCol = 19 THEN aFreedom = aFreedom - 1 group(aGroup).gFreedom = aFreedom ' atualiza possiveis proprios grupos FOR i = PlayAtRow - 1 TO PlayAtRow + 1 IF i > 0 AND i < 20 THEN FOR j = PlayAtCol - 1 TO PlayAtCol + 1 IF j > 0 AND j < 20 THEN IF (i = PlayAtRow XOR j = PlayAtCol) AND table(i, j) THEN otherGroup = table(i, j) IF otherGroup <> aGroup AND group(aGroup).gColor = group(otherGroup).gColor THEN FOR xi = 1 TO 19 FOR xj = 1 TO 19 IF table(xi, xj) = otherGroup THEN table(xi, xj) = aGroup NEXT NEXT group(otherGroup).gColor = none group(aGroup).gFreedom = group(aGroup).gFreedom + group(otherGroup).gFreedom - 2 group(otherGroup).gFreedom = 0 ELSE group(otherGroup).gFreedom = group(otherGroup).gFreedom - 1 group(aGroup).gFreedom = group(aGroup).gFreedom - 1 IF group(otherGroup).gFreedom = 0 THEN FOR xi = 1 TO 19 FOR xj = 1 TO 19 IF table(xi, xj) = otherGroup THEN table(xi, xj) = 0 Score(Player) = Score(Player) + 1 FOR yi = xi - 1 TO xi + 1 IF yi > 0 AND yi < 20 THEN FOR yj = xj - 1 TO xj + 1 IF yj > 0 AND yj < 20 THEN anotherGroup = table(yi, yj) IF anotherGroup THEN IF group(anotherGroup).gColor = Player THEN group(anotherGroup).gFreedom = group(anotherGroup).gFreedom + 1 END IF END IF END IF NEXT END IF NEXT END IF NEXT NEXT group(otherGroup).gColor = none END IF END IF END IF END IF NEXT END IF NEXT IF group(aGroup).gFreedom = 0 THEN ' movimento invalido, suicidio BEEP restoreState Player = black + white - Player EXIT SUB END IF END SUB SUB drawGoban LOCATE 1, 1 PRINT " "; FOR i = 1 TO 19 PRINT CHR$(ASC("0") + (i MOD 10)); NEXT PRINT PRINT "9"; upleft; FOR i = 2 TO 18 PRINT up; NEXT PRINT upright; "9" FOR j = 2 TO 18 PRINT CHR$(ASC("0") + ((20 - j) MOD 10)); left; FOR i = 2 TO 18 PRINT center; NEXT PRINT right; CHR$(ASC("0") + ((20 - j) MOD 10)) NEXT PRINT "1"; downleft; FOR i = 2 TO 18 PRINT down; NEXT PRINT downright; "1" PRINT " "; FOR i = 1 TO 19 PRINT CHR$(ASC("0") + (i MOD 10)); NEXT PRINT COLOR 14, 0 LOCATE 5, 5: PRINT center; LOCATE 5, 11: PRINT center; LOCATE 5, 17: PRINT center; LOCATE 11, 5: PRINT center; LOCATE 11, 11: PRINT center; LOCATE 11, 17: PRINT center; LOCATE 17, 5: PRINT center; LOCATE 17, 11: PRINT center; LOCATE 17, 17: PRINT center; COLOR 7, 0 FOR i = 1 TO 19 LOCATE i + 1, 2 FOR j = 1 TO 19 IF table(i, j) THEN LOCATE , j + 1 IF group(table(i, j)).gColor = black THEN ' PRINT ""; PRINT CHR$(ASC("0") + group(table(i, j)).gFreedom); ELSE ' PRINT ""; COLOR 15, 0 PRINT CHR$(ASC("0") + group(table(i, j)).gFreedom); COLOR 7, 0 END IF END IF NEXT NEXT LOCATE 4, 30: PRINT "Black"; LOCATE 5, 30: PRINT ScoreBlack; LOCATE 6, 30: PRINT "White"; LOCATE 7, 30: PRINT ScoreWhite; END SUB FUNCTION emptyGroup FOR i = 1 TO 316 IF group(i).gColor = none THEN emptyGroup = i EXIT FUNCTION END IF NEXT END FUNCTION SUB getCommand DO DO LOCATE 22, 1: PRINT SPACE$(39); : LOCATE 22, 1 PRINT "Player "; IF Player = black THEN PRINT "black"; ELSE PRINT "white"; INPUT " : ", PlayAtCol, PlayAtRow IF PlayAtCol = 0 THEN SYSTEM LOOP UNTIL PlayAtCol >= 0 AND PlayAtCol < 20 AND PlayAtRow >= 0 AND PlayAtRow < 20 PlayAtRow = 20 - PlayAtRow IF PlayAtRow = 20 THEN EXIT DO IF table(PlayAtRow, PlayAtCol) = 0 THEN EXIT DO BEEP LOOP END SUB SUB initialize LOCATE 24, 1: PRINT "*** Wendel's Goban 0.1 ***"; Player = black Score(black) = 0 Score(white) = 0 FOR i = 1 TO 361 group(i).gColor = none group(i).gFreedom = 0 NEXT FOR i = 1 TO 19 FOR j = 1 TO 19 table(i, j) = 0 NEXT NEXT END SUB SUB restoreState FOR i = 1 TO 361 group(i) = oldGroup(i) NEXT FOR i = 1 TO 19 FOR j = 1 TO 19 table(i, j) = oldTable(i, j) NEXT NEXT END SUB SUB saveState FOR i = 1 TO 361 oldGroup(i) = group(i) NEXT FOR i = 1 TO 19 FOR j = 1 TO 19 oldTable(i, j) = table(i, j) NEXT NEXT END SUB