回 帖 发 新 帖 刷新版面

主题:[讨论]游戏王国

谁有游戏都加分

回复列表 (共31个回复)

21 楼

接上
SUB DrawTable (Move)
LongX = (TableSize - 1) * FootStep.X
LongY = (TableSize - 1) * FootStep.Y
VIEW SCREEN (2, 0)-(429, 319), 0, 0
RANDOMIZE TIMER: DrawDir = INT(RND * 8)
IF Move = False THEN DrawDir = -1
SELECT CASE DrawDir
   CASE -1: X = 1: Y = 1
   CASE 0: X = 1:           Y = TableHeight  '上
   CASE 1: X = -TableWidth: Y = TableHeight  '右上
   CASE 2: X = -TableWidth: Y = 1            '右
   CASE 3: X = -TableWidth: Y = -TableHeight '右下
   CASE 4: X = 1:           Y = -TableHeight '下
   CASE 5: X = TableWidth:  Y = -TableHeight '左下
   CASE 6: X = TableWidth:  Y = 1            '左
   CASE 7: X = TableWidth:  Y = TableHeight  '左上
END SELECT
DO
   IF X <> 1 THEN X = X + DirForm(DrawDir).X
   IF Y <> 1 THEN Y = Y + DirForm(DrawDir).Y
   IF INKEY$ <> "" THEN
      X = 1: Y = 1
      LINE (X - 2, Y - 2)-STEP(10, 10), 0, BF
      LINE (X + TableWidth - 2, Y - 2)-STEP(10, 10), 0, BF
      LINE (X + TableWidth - 2, Y + TableHeight - 2)-STEP(10, 10), 0, BF
   END IF
   PSET (X + 8, Y - 1), 0: DRAW "R421D311G10L421U312E10"
   FOR L = 0 TO 8
      LINE (X + 9 - L, Y + L)-STEP(TableWidth - 1, 0), 15
      LINE (X + TableWidth + 8 - L, Y + L)-STEP(0, TableHeight), 7
   NEXT
   LINE (X + 2, Y + 9)-STEP(TableWidth - 2, TableHeight - 1), TableColor, BF
   LINE (X + 1, Y + 8)-STEP(TableWidth - 1, TableHeight), 14, B
LOOP UNTIL X = 1 AND Y = 1
FOR L = 0 TO TableSize - 1
   LINE (L * FootStep.X + Debug.X, Debug.Y)-STEP(0, LongY), 8, , &H7777
   LINE (Debug.X, L * FootStep.Y + Debug.Y)-STEP(LongX, 0), 8, , &H7777
NEXT
LINE (Debug.X - 3, Debug.Y - 2)-STEP(LongX + 6, LongY + 4), 8, B
FOR Y = 1 TO TableSize
   FOR X = 1 TO TableSize
      TX = Debug.X + (X - 1) * FootStep.X
      TY = Debug.Y + (Y - 1) * FootStep.Y
      SELECT CASE Table(X, Y)
         CASE -1: PutFullCircle TX, TY, Round, -1
         CASE 1:  PutFullCircle TX, TY, Round, 1
      END SELECT
   NEXT
NEXT
HandLocation(0).X = TableSize \ 2
HandLocation(0).Y = TableSize \ 2
HandLocation(1).X = HandLocation(0).X
HandLocation(1).Y = HandLocation(0).Y
TX = TzHand.X + (HandLocation(1).X - 1) * FootStep.X
TY = TzHand.Y + (HandLocation(1).Y - 1) * FootStep.Y
PUT (TX, TY), HandFont&, XOR
MoveHand Null
VIEW: TIMER ON
END SUB

DEFSNG A-Z
'
' 显示游戏结束画面
'
SUB GameOver
DIM L%(859)
   TIMER OFF
   A! = TIMER
   RANDOMIZE A!
   COLOR INT(RND * 8 + 9)
   LOCATE 7, 32: PRINT "┏━━━━┓"
   LOCATE 8, 32: PRINT "┃游戏结束┃"
   LOCATE 9, 32: PRINT "┗━━━━┛"
   LINE (252, 88)-STEP(87, 33), INT(RND * 8), B
   GET (252, 88)-STEP(87, 33), L%
   GX = 252: GY = 88: T = .08: Inc1 = T: Inc2 = T
   WHILE INKEY$ <> "": WEND
   WHILE INKEY$ = "" AND (A! + 120 > TIMER)
        GX = GX + Inc1: GY = GY + Inc2
        IF GX < T THEN Inc1 = T
        IF GY < T THEN Inc2 = T
        IF GX > 551 THEN Inc1 = -T
        IF GY > 315 THEN Inc2 = -T
        PUT (GX, GY), L%, PSET
   WEND
   COLOR 7
   SCREEN 0, 0, 0, 0
   WIDTH 80
   LOCATE 25, 1, 1
END SUB

DEFINT A-Z
'
' 取五个同色的棋子
' StX, StY: 开始取棋子的位置
' InX, InY: 取棋子的 X 方向和 Y 方向
' 返回意义: 如果是黑棋子返回 "XXXXX-1"
'           如果是白棋子返回 "XXXXX 1"
'           如果没有棋子返回 "XXXXX 0"
'           XXXXX 为棋子有无标志
'           有: 相应的位置为 "1" 无: 相应的位置为 "0"
'

22 楼

接上
FUNCTION GetFont$ (StX, StY, InX, InY)
DIM Pt AS MAP
DIM Font(1 TO 5)
I = 1
Pt.X = StX: Pt.Y = StY
DO
   Zhi = Table(Pt.X, Pt.Y)
   Font(I) = Zhi
   IF Zhi = Null THEN
      L$ = L$ + "0"
   ELSE
      L$ = L$ + "1"
      IF Zhi = Black THEN
         bk = bk + 1
      ELSEIF Zhi = White THEN
         wt = wt + 1
      END IF
   END IF
   Pt.X = StX + I * InX
   Pt.Y = StY + I * InY
   I = I + 1
LOOP WHILE I <= 5 AND Table(Pt.X, Pt.Y) <> 2
same = (bk > 0 AND wt = 0) OR (wt > 0 AND bk = 0) OR (bk = 0 AND wt = 0)
IF LEN(L$) = 5 AND same THEN
   IF bk > 0 THEN
      L$ = L$ + "-1"
   ELSEIF wt > 0 THEN
      L$ = L$ + " 1"
   ELSE
      L$ = L$ + " 0"
   END IF
   GetFont = L$
END IF
END FUNCTION

'
' 设置游戏参数
' 玩家姓名, 棋盘尺寸, 游戏次数, 手光标颜色
'
FUNCTION GetSomeVar$
DIM Prompt$(4)
Prompt$(0) = "玩家一( ):"
Prompt$(1) = "玩家二( ):"
Prompt$(2) = "尺  寸( ):"
Prompt$(3) = "局  数( ):"
Prompt$(4) = "光标颜色 ( )"
C = 8
VIEW PRINT 14 TO 25
CLS 2
FOR I = 0 TO 9
   LINE (470 - I, 203 - I)-STEP(0, 130), 7
   LINE (160 - I, 333 - I)-STEP(310, 0), 8
NEXT
LINE (150, 193)-STEP(310, 130), 15, BF
LINE (155, 198)-STEP(300, 120), 0, BF
FOR I = 5 TO 8
   LINE (150 + I + 1, 193 + I)-STEP(308 - I * 2, 0), 7
   LINE (150 + I, 193 + I + 1)-STEP(0, 128 - I * 2), 7
   LINE (150 + I + 1, 323 - I)-STEP(308 - I * 2, 0), 7
   LINE (460 - I, 193 + I + 1)-STEP(0, 128 - I * 2), 7
NEXT
LINE (155, 198)-STEP(300, 120), 8, B
LINE (160, 203)-STEP(290, 110), 7, BF
COLOR 11
FOR I = 0 TO 3
   LOCATE 16 + I * 2, 22
   PRINT Prompt$(I);
NEXT
LOCATE 22, 43: PRINT Prompt$(4)
COLOR 12
LOCATE 16, 29: PRINT "1";
LOCATE 18, 29: PRINT "2";
LOCATE 20, 29: PRINT "S";
LOCATE 22, 29: PRINT "T";
LOCATE 22, 53: PRINT "H";
PutFullCircle 388, 218, 10, Black
PutFullCircle 388, 246, 10, White
LOCATE , , 0
DO
   COLOR 11
   kbd$ = INKEY$
   SELECT CASE UCASE$(kbd$)
          CASE "1": LOCATE 16, 29: PRINT "1";
                    PlayName$(0) = ReadStr(16, 33, 10)
                    COLOR 12: LOCATE 16, 29: PRINT "1";
          CASE "2": LOCATE 18, 29: PRINT "2";
                    PlayName$(1) = ReadStr(18, 33, 10)
                    COLOR 12: LOCATE 18, 29: PRINT "2";
          CASE "S": LOCATE 20, 29: PRINT "S";
                    TableSize = VAL(LEFT$(ReadStr(20, 33, 10), 2))
                    IF TableSize < 5 THEN TableSize = 5
                    IF TableSize > 20 THEN TableSize = 20
                    LOCATE 20, 33: PRINT USING "  ## X ##"; TableSize; TableSize;
                    COLOR 12: LOCATE 20, 29: PRINT "S";
          CASE "T": LOCATE 22, 29: PRINT "T";
                    Times = VAL(ReadStr(22, 33, 8))
                    IF Times = 0 THEN Times = 1
                    LOCATE 22, 33: PRINT USING "########"; Times;
                    COLOR 12: LOCATE 22, 29: PRINT "T";
          CASE "H": C = (C + 1) MOD 16: DrawHand 372, 264, C
   END SELECT
LOOP UNTIL kbd$ = CHR$(0) + ";" OR kbd$ = CHR$(0) + "?" OR kbd$ = CHR$(27)
GetStepSize TableSize
REDIM Table(0 TO TableSize + 1, 0 TO TableSize + 1) AS INTEGER
CLS 2
VIEW PRINT
COLOR 10: LOCATE , , 0, 0, 0: LOCATE 14, 1: PRINT STRING$(80, "_");
GetSomeVar = kbd$
END FUNCTION

'
' 计算手光标移动步长
' X: 棋盘尺寸
'
SUB GetStepSize (X)
   FootStep.X = INT(MAXX \ (X - 1))
   FootStep.Y = INT(MAXY \ (X - 1))
   Round = INT(FootStep.Y \ 2)
END SUB

'
' 电脑提示如何走

23 楼

接上
'
SUB HelpForPlay
  IF ComputerGo(Player) THEN MoveHand True ELSE SOUND 200, 1
END SUB

'
' 设置默认的参数
'
SUB Initialize
   ErrorCode = Null
   RESTORE DirData
   FOR I = 0 TO 7
      READ DirForm(I).X, DirForm(I).Y
   NEXT
   RESTORE LeanData
   FOR I = 0 TO 31
      READ PowerTab(I).Power, PowerTab(I).Location
   NEXT
   PlayName$(0) = ""
   PlayName$(1) = ""
   TableSize = 9
   Before = Forget
   Times = 1
   GetStepSize TableSize
   REDIM Table(0 TO TableSize + 1, 0 TO TableSize + 1) AS INTEGER
END SUB

'
' 居中显示字符串
' T$: 要显示的字符串
' L:  要显示字符串的所在行数
' C:  要显示字符串的颜色
'
SUB MidSet (T$, L, C)
   COLOR C
   LOCATE L, (80 - LEN(LEFT$(T$, 80))) \ 2 + 1
   PRINT LEFT$(T$, 80);
END SUB

'
' 移动手光标
' 将手光标移动到当前位置
' F: 是否有声音
'
SUB MoveHand (F)
    FOR I = 0 TO 1
       TX = TzHand.X + (HandLocation(I).X - 1) * FootStep.X
       TY = TzHand.Y + (HandLocation(I).Y - 1) * FootStep.Y
       PUT (TX, TY), HandFont&, XOR
       IF F THEN
          SOUND 750, 3: T! = TIMER
          WHILE TIMER - T! < .4: WEND
       END IF
    NEXT I
    HandLocation(0).X = HandLocation(1).X
    HandLocation(0).Y = HandLocation(1).Y
END SUB

'
' 显示信息
' 玩家姓名, 获胜次数, 可悔次数, 剩余局数, 小红旗
'
SUB OutInfo
LINE (639, 320)-STEP(-205, -320), 1, BF
DrawComputer 516, 145, Null
COLOR 14
FOR I = 0 TO 1
   PutFullCircle 460, I * 253 + 35, 9, I * 2 - 1
   LOCATE I * 18 + 2, 61
   IF PlayName$(I) <> "" THEN
      PRINT "玩家" + STR$(I + 1) + ":" + SPACE$(10 - LEN(PlayName$(I))) + PlayName$(I);
   ELSE
      PRINT "玩家" + STR$(I + 1) + ":    计算机";
   END IF
   LOCATE I * 18 + 4, 61
   PRINT USING "获 胜 次 数: ####"; Level(I);
   FOR j = 0 TO Level(I) - 1
      ex = 460 + (j \ 5) * 10
      IF I = 0 THEN
         ey = 62 + I * 124 + (j MOD 5) * 16
      ELSE
         ey = 62 + I * 124 + (I * 4 - j MOD 5) * 16
      END IF
      PSET (ex, ey), 12: DRAW Win$
   NEXT
NEXT
DrawComputer 516, 145, 1
COLOR 12:
LOCATE 11, 56: PRINT USING "可悔##次"; Before
LOCATE 12, 56: PRINT "剩余局数"
LOCATE 13, 56: PRINT USING "########"; Times;
LOCATE 1, 1, 0
END SUB

'
' 暂停游戏
' P$: 按 P$ 解除暂停
'

24 楼

接上
SUB Pause (P$)
DIM P%(6027)
   GET (440, 100)-STEP(180, 130), P%
   FOR I = 0 TO 14
      LINE (440 + I, 100 + I)-STEP(180 - I * 2, 130 - I * 2), 15 - I, B
   NEXT
   LINE STEP(-1, -1)-STEP(I * 2 - 180, I * 2 - 130), 8, BF
   DRAW "bf10c11"
   FOR I = 25 TO 0 STEP -7
      N$ = LTRIM$(STR$(I))
      DRAW "R" + N$ + "G" + N$ + "R" + N$ + "BM+6,-4"
   NEXT
   DrawComputer 550, 162, 7
   WHILE I$ <> UCASE$(P$) AND I$ <> LCASE$(P$)
      I$ = INKEY$
   WEND
   PUT (440, 100), P%, PSET
END SUB

'
' 玩家走棋
'
FUNCTION PlayerGo
WHILE INKEY$ <> "": WEND
DO
   MoveEsc = False
   kd$ = INKEY$
   SELECT CASE kd$
          CASE CHR$(0) + ";"
              IF ComputerGo(Player) THEN HelpForPlay
          CASE CHR$(0) + "H"
              IF HandLocation(1).Y > 1 THEN HandLocation(1).Y = HandLocation(1).Y - 1
              MoveHand Null
          CASE CHR$(0) + "P"
              IF HandLocation(1).Y < TableSize THEN HandLocation(1).Y = HandLocation(1).Y + 1
              MoveHand Null
          CASE CHR$(0) + "K"
              IF HandLocation(1).X > 1 THEN HandLocation(1).X = HandLocation(1).X - 1
              MoveHand Null
          CASE CHR$(0) + "M"
              IF HandLocation(1).X < TableSize THEN HandLocation(1).X = HandLocation(1).X + 1
              MoveHand Null
          CASE CHR$(0) + "G"
              IF HandLocation(1).X > 1 THEN
                 HandLocation(1).X = 1
              ELSEIF HandLocation(1).Y > 1 THEN
                 HandLocation(1).Y = 1
              END IF
              MoveHand Null
          CASE CHR$(0) + "O"
              IF HandLocation(1).X < TableSize THEN
                 HandLocation(1).X = TableSize
              ELSEIF HandLocation(1).Y < TableSize THEN
                 HandLocation(1).Y = TableSize
              END IF
              MoveHand Null
          CASE CHR$(27): PlayerGo = False: MoveEsc = True
          CASE "P", "p": Pause "P"
          CASE CHR$(13)
              IF Table(HandLocation(1).X, HandLocation(1).Y) = Null THEN
                 PlayerGo = True
                 MoveEsc = True
              ELSE
                 SOUND 200, 4
              END IF
          CASE CHR$(8), CHR$(0) + "S"   '悔棋
              IF (Before > 0) AND (GroupPtr > 0) THEN
                 FOR B = 0 TO 1
                    HandLocation(1).X = Grop(GroupPtr).X
                    HandLocation(1).Y = Grop(GroupPtr).Y
                    Table(HandLocation(1).X, HandLocation(1).Y) = 0
                    GroupPtr = GroupPtr - 1
                    IF GroupPtr = Null THEN GroupPtr = Forget * 2
                 NEXT B
                 Before = Before - 1
                 IF HandLocation(1).X = 0 THEN
                    HandLocation(1).X = TableSize \ 2
                    HandLocation(1).Y = TableSize \ 2

25 楼

接上
                 END IF
                 OutInfo
                 DrawTable False
              ELSE
                 SOUND 200, 4
              END IF
   END SELECT
LOOP UNTIL MoveEsc
END FUNCTION

'
' 玩游戏
' T%: 游戏局数
'
SUB PlayTimes (T%)
Level(0) = Null
Level(1) = Null
CLS
FOR Times = T% TO 1 STEP -1
   FOR I = 0 TO TableSize
      FOR j = 1 TO TableSize
         Table(I, j) = Null
      NEXT j
      Table(0, I) = 2: Table(TableSize + 1, I) = 2
      Table(I, 0) = 2: Table(I, TableSize + 1) = 2
   NEXT I
   Table(TableSize + 1, TableSize + 1) = 2
   HandLocation(0).X = TableSize \ 2
   HandLocation(0).Y = TableSize \ 2
   HandLocation(1).X = TableSize \ 2
   HandLocation(1).Y = TableSize \ 2
   Turn = (Times + 1) MOD 2
   GroupPtr = Null
   Esc = False
   OutInfo
   DrawTable True
   RANDOMIZE TIMER
   DO
      SELECT CASE Turn
             CASE 0: Player = Black
             CASE 1: Player = White
      END SELECT
      IF PlayName$(Turn) = "" THEN
         IF ComputerGo(Player) THEN
            GroupPtr = GroupPtr MOD (Forget * 2) + 1
            Grop(GroupPtr).X = HandLocation(1).X
            Grop(GroupPtr).Y = HandLocation(1).Y
            Table(HandLocation(1).X, HandLocation(1).Y) = Player
            CPTMoveHand
            PutBody HandLocation(1).X, HandLocation(1).Y, Player
            SOUND 100, 1
         ELSE
            Esc = True
         END IF
      ELSEIF PlayerGo THEN
         GroupPtr = GroupPtr MOD (Forget * 2) + 1
         Grop(GroupPtr).X = HandLocation(1).X
         Grop(GroupPtr).Y = HandLocation(1).Y
         Table(HandLocation(1).X, HandLocation(1).Y) = Player
         PutBody HandLocation(1).X, HandLocation(1).Y, Player
         SOUND 100, 1
      ELSE
         Esc = True
      END IF
      Turn = (Turn + 1) MOD 2
      DrawComputer 516, 145, INT(RND * 7) + 1
   LOOP UNTIL Esc OR Wing
NEXT Times
END SUB

'

26 楼

接上
' 放棋子
' X, Y: 棋子位置
' B:    棋子颜色
'
SUB PutBody (X, Y, B)
    hx = (X - 1) * FootStep.X + TzHand.X
    hy = (Y - 1) * FootStep.Y + TzHand.Y
    bx = (X - 1) * FootStep.X + Debug.X
    by = (Y - 1) * FootStep.Y + Debug.Y
    PUT (hx, hy), HandFont&, XOR
    PutFullCircle bx, by, Round, B
    PUT (hx, hy), HandFont&, XOR
END SUB

'
' 画棋子
' X, Y: 棋子位置
' R:    棋子半径
' B:    棋子颜色(黑白两种)
'
SUB PutFullCircle (X, Y, R, B)
   IF B = Black THEN
      C = 0: c1 = 15
   ELSEIF B = White THEN
      C = 15: c1 = 8
   ELSE
      C = 13: c1 = 12
   END IF
   CIRCLE (X, Y), R - 1, C: PAINT (X, Y), C
   CIRCLE (X, Y), R, 7
   N = R / 4.2
   FOR I = 1 TO N
      CIRCLE (X, Y), R - N - I, c1, 1.8 + I / 35, 3 - I / 30
   NEXT
END SUB

'
' 查看 README 文件
'
SUB Readme
L = Null
VIEW PRINT 15 TO 25
CLS 2
OPEN "readme" FOR INPUT AS #1
IF ErrorCode = 53 THEN EXIT SUB
COLOR 14
DO WHILE NOT EOF(1)
   LINE INPUT #1, A$
   LOCATE L + 15, 1
   PRINT LEFT$(A$, 80);
   L = (L + 1) MOD 11
   IF L = 10 THEN
      L = Null: COLOR 11: LOCATE 25, 2, 0
      PRINT "按任意键继续 ......";
      A$ = INPUT$(1): CLS 2
      COLOR 14
      IF A$ = CHR$(27) THEN EXIT DO
   END IF
LOOP
CLOSE
CLS 2
VIEW PRINT
END SUB

'
' 从键盘读一个字符串
' X, Y: 显示字符串的位置
' Lng:  读入字符串的最大长度
'
FUNCTION ReadStr$ (X, Y, Lng)
PL$ = ""
A$ = "\" + SPACE$(Lng - 2) + "\"
LOCATE X, Y: PRINT USING A$; PL$;
DO
   LOCATE X, Y
   kd$ = INKEY$

27 楼

SELECT CASE kd$
          CASE CHR$(32) TO CHR$(254)
             QuitSUB = False
             IF L < Lng THEN
                L = L + 1
                PL$ = PL$ + kd$
                SOUND ((ASC(kd$) - 32) * 80) MOD 1500 + 80, 1
             ELSE
                SOUND 800, 1
             END IF
             PRINT PL$
          CASE CHR$(27)
              IF PL$ <> "" THEN
                 QuitSUB = False
                 L = Null: PL$ = ""
                 PRINT USING A$; PL$
              ELSE
                 QuitSUB = True
              END IF
          CASE CHR$(13): QuitSUB = True
          CASE CHR$(8), CHR$(0) + "S"
             IF L < 1 THEN
                SOUND 800, 1
             ELSE
                L = L - 1
                PL$ = LEFT$(PL$, L)
                PRINT PL$; " "
             END IF
   END SELECT
LOOP UNTIL QuitSUB
ReadStr$ = PL$
END FUNCTION

' 扫描棋盘的一行或一列
' S():    棋盘数组
' SX, SY: 开始扫描的位置
' IX, IY: 扫描的 X 方向和 Y 方向
FUNCTION ScanLine (S(), SX, SY, IX, IY)
DIM P1, P2 AS MAP
Zhi = Null
Length = 0
LineFull = True
unEmpty = False  '如果此行为空, 则 unempty 为假
ScanLine = False '如果此行能放棋子, 则函数返回假
DO
  P1.X = SX + Length * IX
  P1.Y = SY + Length * IY
  Zhi = Table(P1.X, P1.Y)
  unEmpty = unEmpty OR Zhi
  LineFull = LineFull * Zhi
  IF Zhi <> 2 THEN Length = Length + 1
LOOP UNTIL Zhi = 2
IF LineFull THEN
   ScanLine = True
ELSEIF unEmpty THEN
   FOR I = 0 TO Length - 5
      P1.X = SX + I * IX
      P1.Y = SY + I * IY
      FT$ = GetFont$(P1.X, P1.Y, IX, IY)
      F = BinToDec(FT$, Null)
      BorW = SGN(BinToDec(FT$, 1) + 1)
      T = LEN(RTRIM$(PowerTab(F).Location))

28 楼

FOR A = 1 TO T
         LX = P1.X + VAL(MID$(PowerTab(F).Location, A, 1)) * IX
         LY = P1.Y + VAL(MID$(PowerTab(F).Location, A, 1)) * IY
         S(BorW, LX, LY) = S(BorW, LX, LY) + PowerTab(F).Power
      NEXT A
   NEXT I
END IF
END FUNCTION

'
' 扫描棋盘
' BW:
'
FUNCTION ScanTable (BW)
DIM Team(0 TO TableSize * 4) AS MAP
DIM ScanPower(0 TO 1, 1 TO TableSize, 1 TO TableSize)
ScanPower(0, TableSize / 2 + .5, TableSize / 2 + .5) = 1
ScanPower(1, TableSize / 2 + .5, TableSize / 2 + .5) = 1
'第一遍扫描
FOR Dir = 1 TO 2
   Full = 0
   FOR Scan = 1 TO TableSize
      SELECT CASE Dir
             CASE 1: StartX = 1: StartY = Scan: IncX = 1: IncY = 0
             CASE 2: StartX = Scan: StartY = 1: IncX = 0: IncY = 1
      END SELECT
      IF ScanLine(ScanPower(), StartX, StartY, IncX, IncY) THEN
         Full = Full + 1
      END IF
      IF Full >= TableSize OR (INKEY$ <> "" AND PlayName$(0) = "" AND PlayName$(1) = "") THEN
         ScanTable = True
         EXIT FUNCTION
      END IF
   NEXT Scan
NEXT Dir
' 第二遍扫描
FOR Dir = 1 TO 2
   Full = 0: Record = TableSize * 2 - 10
   FOR Scan = 0 TO Record
      SELECT CASE Dir
             CASE 1: IncX = 1: IncY = 1
                 IF Scan * 2 <= Record THEN
                    StartX = Scan + 1: StartY = 1
                 ELSE
                    StartX = 1: StartY = TableSize - 4 - Scan MOD (Record / 2 + 1)
                 END IF
             CASE 2: IncX = 1: IncY = -1
                 IF Scan * 2 <= Record THEN
                    StartX = 1: StartY = Scan + 5
                 ELSE
                    StartX = TableSize - 4 - Scan MOD (Record / 2 + 1): StartY = TableSize
                 END IF
      END SELECT
      IF ScanLine(ScanPower(), StartX, StartY, IncX, IncY) THEN
         Full = Full + 1
      END IF
      IF Full > TableSize * 2 - 10 OR (INKEY$ <> "" AND PlayName$(0) = "" AND PlayName$(1) = "") THEN
         ScanTable = True
         EXIT FUNCTION
      END IF
   NEXT Scan
NEXT Dir

29 楼

' 第三遍扫描
FOR I = 1 TO TableSize
   FOR j = 1 TO TableSize
      ScanPower(SGN(BW + 1), j, I) = ScanPower(SGN(BW + 1), j, I) * 1.5
   NEXT
NEXT
' 第四遍扫描
Ptr = -1
MaxPower = 0
Bow = BW
FOR Body = 0 TO 1
   FOR Y = 1 TO TableSize
      FOR X = 1 TO TableSize
         IF Table(X, Y) = 0 AND ScanPower(Body, X, Y) > 0 THEN
            SELECT CASE ScanPower(Body, X, Y)
                   CASE MaxPower
                       IF Body = Bow THEN
                          Ptr = Ptr + 1
                          Team(Ptr).X = X
                          Team(Ptr).Y = Y
                       END IF
                   CASE IS > MaxPower
                       MaxPower = ScanPower(Body, X, Y)
                       Bow = Body: Ptr = 0
                       Team(Ptr).X = X
                       Team(Ptr).Y = Y
            END SELECT
         END IF
      NEXT X
   NEXT Y
NEXT Body
' 最后一遍扫描
Pointer = 0
IF Ptr >= Null THEN
   IF Bow * 2 - 1 = Black THEN P = 1 ELSE P = 0
   FOR A = 0 TO Ptr - 1
      FOR B = A + 1 TO Ptr
         IF ScanPower(P, Team(A).X, Team(A).Y) < ScanPower(P, Team(B).X, Team(B).Y) THEN SWAP Team(A), Team(B)
      NEXT B
   NEXT A
   DO WHILE A > B AND Pointer < Ptr AND Ptr > 0
      A = ScanPower(P, Team(Pointer).X, Team(Pointer).Y)
      B = ScanPower(P, Team(Pointer + 1).X, Team(Pointer + 1).Y)
      Pointer = Pointer + 1
   LOOP
END IF
TP = INT(RND * (Pointer + 1))
HandLocation(1).X = Team(TP).X
HandLocation(1).Y = Team(TP).Y
END FUNCTION

'

30 楼


' 游戏开始序幕
'
FUNCTION Welcome
DIM W$(11)
W$(0) = SPACE$(80)
W$(1) = SPACE$(20) + "☆☆☆ 欢 迎 来 到 五 子 棋 游 戏 ☆☆☆" + SPACE$(20)
W$(2) = SPACE$(80)
W$(3) = SPACE$(8) + "●●● ○ ●  ● ○○○    ●●●  ○  ○ ●●● ○○○  ●●● " + SPACE$(7)
W$(4) = SPACE$(8) + "●     ○ ●  ● ○       ●    ● ○  ○ ●    ○      ●      " + SPACE$(7)
W$(5) = SPACE$(8) + "●●● ○ ●  ● ○○     ●       ○○○ ●●   ○○○  ●●● " + SPACE$(7)
W$(6) = SPACE$(8) + "●     ○  ●●  ○       ●    ● ○  ○ ●          ○      ●" + SPACE$(7)
W$(7) = SPACE$(8) + "●     ○   ●   ○○○    ●●●  ○  ○ ●●● ○○○  ●●● " + SPACE$(7)
W$(8) = SPACE$(80)
W$(9) = SPACE$(18) + "按 <F1>  键 查看游戏说明" + SPACE$(37)
W$(10) = SPACE$(18) + "按 <F5>  键 开        始" + SPACE$(37)
W$(11) = SPACE$(18) + "按 <F10> 键 设置游戏参数" + SPACE$(37)
SCREEN 9: COLOR 10
LOCATE , , 0, 0, 0: CLS
LOCATE 14, 1: PRINT STRING$(80, "_");
FOR I = 13 TO 79
   IF INKEY$ <> "" THEN I = 79
   FOR j = 0 TO 10 STEP 2
      LOCATE j + 2, 80 - I: PRINT LEFT$(W$(j), I);
      LOCATE j + 3, 1: PRINT RIGHT$(W$(j + 1), I);
   NEXT
NEXT
DrawComputer 400, 145, 1
DrawHand 500, 150, 10
SLEEP 2
QuitSUB = False
DO
  DrawComputer 400, 145, INT(RND * 7) + 1
  PALETTE 10, INT(RND * 6) + 58
  kd$ = INKEY$
  SELECT CASE kd$
         CASE CHR$(0) + ";" '<F1>  key
             Readme
         CASE CHR$(0) + "D" '<F10> key
             kd$ = GetSomeVar
             IF kd$ = CHR$(0) + "?" THEN
                QuitSUB = True
             ELSEIF kd$ = CHR$(0) + ";" THEN
                Readme
             END IF
         CASE CHR$(0) + "?" '<F5>  key
              QuitSUB = True

我来回复

您尚未登录,请登录后再回复。点此登录或注册