回 帖 发 新 帖 刷新版面

主题:泡泡龙

问题描述:这是一个简化版的网络游戏:在一个N N方块构成的棋盘中,每个方块均涂上红、黄、蓝、绿(记为1、2、3、4)中的一种颜色,游戏者可以在最底行任意找一个方块,用鼠标双击这个方块,于是该方块及与之相邻(即在上、下、左、右四个方向上有公共边)的所有的同色方块均被消掉,而因下方失去支持的方块将会自由落下填补空位。下图左边给出一个4 4的棋盘样例,当游戏者双击最底层左边第二个方块后,将会形成右边的布局。 
你的任务是编写一个泡泡龙模拟程序,对于给定的一个初始棋盘,计算游戏者双击最底层某个方块后棋盘的布局将会如何。
输入:输入文件H.in,第一行有两个正整数N和M(1≤M≤N≤100),其中N表示棋盘的规模,而M则表示游戏者将双击最底层从左边数起的第M个方块。 
接下来的N行每行有N个1至4的整数组成,表示一个初始的棋盘,同一行相邻两个数之间用一个空格隔开。 
输出:输出文件H.out也有N行,每行用N个数给出游戏结束后棋盘的布局,没有方块的格子用0表示,同一行相邻两个数之间也用一个空格分开。 
输入输出样例: 
输入样例     输出样例 
4 2 1 2 3 4 4 2 4 4 3 4 4 3 1 4 4 3     1 0 0 0 4 0 0 3 3 2 0 3 4 2 3 3 

回复列表 (共13个回复)

11 楼

找到方法了。
DECLARE SUB delblock (x!, y!)
CLS
DIM SHARED n
OPEN "H.in" FOR INPUT AS #1
INPUT #1, n, m
DIM SHARED a(1 TO n, 1 TO n), k
FOR i = 1 TO n: FOR j = 1 TO n
    INPUT #1, a(i, j)
NEXT j, i
CLOSE #1
k = a(n, m)
CALL delblock(n, m)
FOR i = n - 1 TO 1 STEP -1
    FOR j = 1 TO n
        s = i
        DO
          s = s + 1
          IF s > n THEN EXIT DO
          IF a(s, j) <> 0 THEN EXIT DO
          a(s, j) = a(s - 1, j): a(s - 1, j) = 0
        LOOP
NEXT j, i
FOR i = 1 TO n: FOR j = 1 TO n
    PRINT a(i, j);
NEXT j: PRINT : NEXT i

SUB delblock (x, y)
IF a(x, y) = k THEN
   a(x, y) = 0
   IF x > 1 THEN CALL delblock(x - 1, y)
   IF x < n THEN CALL delblock(x + 1, y)
   IF y > 1 THEN CALL delblock(x, y - 1)
   IF y < n THEN CALL delblock(x, y + 1)
END IF
END SUB

12 楼

H.in 文件在哪?

13 楼

DECLARE SUB changecolor (c!, t!)
DECLARE SUB win ()
DECLARE SUB lose ()
DIM SHARED circlecolor0, squarecolor0
CLS
SCREEN 12
bomb = 20
LOCATE 13, 30: PRINT "Loading..."
FOR i = 1 TO 1000000: NEXT i: CLS
squarecolor = 1: circlecolor = 1
LOCATE 1, 1: PRINT "bomb:"; bomb
LINE (270, 20)-(320, 70), squarecolor, BF
CIRCLE (300, 400), 30, circlecolor
PAINT (300, 400), circlecolor
DO
  FOR i = 1 TO 300000: NEXT i
  CALL changecolor(1, INT(RND * 15) + 1)
  d$ = INKEY$: d$ = UCASE$(d$)
  IF d$ >= "1" AND d$ <= "9" OR d$ >= "A" AND d$ <= "F" THEN
     f = INSTR("123456789ABCDEF", d$)
     CALL changecolor(2, f)
     LINE (270, 20)-(320, 70), squarecolor0, BF
     squarecolor = squarecolor0
  ELSEIF d$ = "K" THEN
     LOCATE 13, 10: PRINT "Square"; squarecolor; "VS circle"; circlecolor;
     IF squarecolor = circlecolor THEN
        PRINT "--> Success!"
        bomb = bomb + 3
        IF bomb >= 40 THEN CALL win
     ELSE
        PRINT "--> Fail!"
        bomb = bomb - 1
        IF bomb = 0 THEN CALL lose
     END IF
     k$ = INPUT$(1)
     LOCATE 13, 10: PRINT "                                                       "
     LOCATE 1, 1: PRINT "bomb:"; bomb
  END IF
  CIRCLE (300, 400), 30, circlecolor0
  PAINT (300, 400), circlecolor0
  circlecolor = circlecolor0
LOOP
END

SUB changecolor (c, t)
IF c = 1 THEN
   CIRCLE (300, 400), 30, 0
   PAINT (300, 400), 0
   circlecolor0 = t
ELSE
   LINE (270, 20)-(320, 70), 0, BF
   squarecolor0 = t
END IF
END SUB

SUB lose
    CLS
    LOCATE 5, 5: PRINT "You lose!"
    END
END SUB

SUB win
    CLS
    LOCATE 5, 5: PRINT "You win!"
    END
END SUB
别忘了,还有我

我来回复

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