我的俄罗斯方块算法实现

itrose9 2005-02-28 04:07:54
包括标号行,数据赋值,大概180行
不详细说了
自认为比较有新意的一点是:6个可控制方块,不为四种翻转状态分别存储点阵数据,运行中也不生成新的点阵数组,只用两个行,列指针在点阵数组中的移动来实现各翻转状态点阵的读取。
QBASIC代码实现 ,因为最近很怀旧,所以,用它编了这个小东西。
一晚而就,没刻意优化

DECLARE SUB xd (x!, y!, a!, b!)
CLEAR
CLS
CONST wts = 50000 * 2
CONST kuan = 20
CONST gao = 20
DIM p(kuan, gao), ln(gao)
FOR i = 1 TO 4
READ xt(i), yt(i)
NEXT
READ j
FOR i = 1 TO j
READ c2(i), k2(i)
FOR m = 1 TO k2(i)
FOR n = 1 TO c2(i)
READ a(i, n, m):
NEXT
NEXT
NEXT
CLS
DO
a = int(rnd * j + 1)
x = 6
y = 2
xt = 1
txt = 1
tx = x
ty = y
GOSUB tst
IF full = 1 THEN EXIT DO
GOSUB txs
GOSUB xs
xa = 0
ya = 0
DO
wk = 0
xa = 0
ya = 0
wt = wt + 1
IF wt = wts THEN
wk = 2
wt = 0
ya = 1
END IF
a$ = INKEY$
SELECT CASE a$
CASE "k": wk = 2
CASE "j": xa = -1: wk = 1
CASE "l": xa = 1: wk = 1
CASE " "
IF xt = 4 THEN txt = 1 ELSE txt = xt + 1
GOSUB tst
IF full = 0 THEN
GOSUB xc
GOSUB txs
xt = txt
GOSUB xs
END IF
END SELECT
IF wk <> 0 THEN
IF wk = 2 THEN xa = 0: ya = 1
tx = x + xa
ty = y + ya
txt = xt
GOSUB tst
GOSUB txs
IF full = 0 THEN
GOSUB xc
x = tx
y = ty
GOSUB xs
ELSE
IF wk = 2 THEN
a$ = "a"
FOR i = 0 TO k - 1
tmp2 = yp + ypa * i + 1
FOR j = 0 TO c - 1
IF a(a, xp + xpa * j + 1, tmp2) = 1 THEN
tmp3 = j
tmp4 = i
IF xt = 2 OR xt = 4 THEN SWAP tmp3, tmp4
p(x + tmp3, y + tmp4) = 1
tmp3 = tmp4 + y
ln(tmp3) = ln(tmp3) + 1
COLOR 7, 0: LOCATE 15, 40: PRINT ln(tmp3), tmp3
IF ln(tmp3) = kuan THEN
FOR k1 = tmp3 TO 1 STEP -1
FOR l = 0 TO kuan - 1
p(l, k1) = p(l, k1 - 1)
NEXT
NEXT
FOR k1 = 0 TO kuan - 1
p(k1, 0) = 0
NEXT
FOR k1 = 0 TO gao - 1
FOR l = 0 TO kuan - 1
CALL xd(l, k1, p(l, k1), 1)
NEXT
NEXT
ln(tmp3) = ln(tmp3 - 1)
END IF
END IF
NEXT
NEXT
END IF
END IF
END IF
LOOP UNTIL a$ = CHR$(27) OR a$ = "a"
LOOP UNTIL a$ = CHR$(27)
END

tst:
full = 0
i = k
j = c
IF txt = 2 OR txt = 4 THEN SWAP i, j
IF ty < 0 OR ty + i - 1 >= gao THEN full = 1
IF tx < 0 OR tx + j - 1 >= kuan THEN full = 1
IF full = 0 THEN
FOR i = 0 TO k - 1
tmp2 = yp + ypa * i + 1
FOR j = 0 TO c - 1
tmp3 = j
tmp4 = i
IF txt = 2 OR txt = 4 THEN SWAP tmp3, tmp4
IF a(a, xp + xpa * j + 1, tmp2) = 1 AND p(tx + tmp3, ty + tmp4) = 1 THEN full = 1
NEXT
NEXT
END IF
RETURN
txs:
c = c2(a)
k = k2(a)
IF xt(txt) = 1 THEN
xp = 0
xpa = 1
ELSE
xp = c - 1
xpa = -1
END IF
IF yt(txt) = 1 THEN
yp = 0
ypa = 1
ELSE
yp = k - 1
ypa = -1
END IF
RETURN
xs:
col = 1
GOSUB xx
RETURN
xc:
col = 0
GOSUB xx
RETURN
xx:
FOR tp1 = 0 TO k - 1
FOR tp2 = 0 TO c - 1
tp3 = tp1
tp4 = tp2
IF xt = 2 OR xt = 4 THEN SWAP tp3, tp4
CALL xd(x + tp4, y + tp3, a(a, xp + xpa * tp2 + 1, yp + ypa * tp1 + 1), col)
NEXT
NEXT
RETURN

DATA 1,1,2,1,2,2,1,2
DATA 6
DATA 2,2,1,1,1,1
DATA 2,3,1,0,1,0,1,1
DATA 2,3,0,1,0,1,1,1
DATA 2,3,1,0,1,1,0,1
DATA 2,3,0,1,1,1,1,0
DATA 4,1,1,1,1,1

SUB xd (x, y, a, b)
LOCATE y + 2, x * 2 + 1
IF b = 1 THEN COLOR 7, 2 ELSE COLOR 0, 0
IF a = 0 THEN COLOR 0, 0
PRINT " ";
END SUB
...全文
195 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
gofb 2005-02-28
  • 打赏
  • 举报
回复
呵呵,怎么感觉有点象汇编
hujiiori 2005-02-28
  • 打赏
  • 举报
回复

up

8,303

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧