学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
from xdf import * SW = 768 SH = 1024 M = 4 N = M * M CW = 128 OX = (SW - CW * M) // 2 OY = (SH - CW * M) // 2 isOver = False cubes = [] datas = [] def ij2xy(i, j): return [OX + i * CW, OY + j * CW] def xy2ij(x, y): return [(x-OX) // CW, (y-OY) // CW] for i in range(M): cubes.append([]) datas.append([]) for j in range(M): xy = ij2xy(i, j) cubes[i].append([ box(xy[0], xy[1], CW, CW, 'white', 'black'), box(xy[0], xy[1], CW, CW, 'blue', 'transparent'), box(xy[0], xy[1], CW, CW, 'green', 'transparent'), text('00', xy[0] + CW // 2, xy[1] + CW//2 + CW//8, CW//4, 'red', 'center'), 1 ]) datas[i].append(0) overTxt = text("Game Over", 50, "red", "center") def refresh(): for i in range(M): for j in range(M): cube = cubes[i][j] value = datas[i][j] if value == 0: cube[1].hide() cube[2].hide() cube[3].change('') else: if cube[4] == 1: cube[2].show() cube[1].hide() else: cube[1].show() cube[2].hide() cube[3].change(value) cube[4] = 0 def reset(): #print("reset") global isOver,count count = 0 isOver = False overTxt.hide() for i in range(M): for j in range(M): datas[i][j]=0 addCube() refresh() def isNotOut(p): return p[0] >= 0 and p[0] < M and p[1] >= 0 and p[1] < M def nextP(p, d): return [p[0] + d[0], p[1] + d[1]] def prevP(p, d): return [p[0] - d[0], p[1] - d[1]] def move(sts, dr): for i in range(len(sts)): flag = True while flag: flag = False p0 = sts[i] p1 = nextP(p0, dr) while isNotOut(p1): c0 = datas[p0[0]][p0[1]] c1 = datas[p1[0]][p1[1]] if c0 == 0 and c1 != 0: datas[p0[0]][p0[1]] = c1 datas[p1[0]][p1[1]] = 0 flag = True #print('空白') elif c0 != 0 and c0 == c1: datas[p0[0]][p0[1]] = c1 * 2 datas[p1[0]][p1[1]] = 0 flag = True #print('合并') p0 = p1 p1 = nextP(p0, dr) addCube() refresh() def moveLeft(): move([[0, 0], [0, 1], [0, 2],[0, 3]], [1, 0]) def moveRight(): move([[3, 0], [3, 1], [3, 2],[3, 3]], [-1, 0]) def moveUp(): move([[0, 0], [1, 0], [2, 0],[3, 0]], [0, 1]) def moveDown(): move([[0, 3], [1, 3], [2, 3],[3, 3]], [0, -1]) def addCube(): ps = [] for i in range(M): for j in range(M): if datas[i][j] == 0: ps.append([i,j]) if len(ps) == 0: gameOver() else: i = random(len(ps))-1 p = ps[i] datas[p[0]][p[1]] = 1 cubes[p[0]][p[1]][4] = 1 def gameOver(): global isOver isOver = True overTxt.show() def keydown(key, code): global isOver #print(key, code) if isOver: if key == 32: reset() return if key == 38: moveUp() elif key == 40: moveDown() elif key == 37: moveLeft() elif key == 39: moveRight() reset() mp0 = [0, 0] def touch(): global mp0 mp0 = [x, y] def untouch(): global mp0 dx = x - mp0[0] dy = y - mp0[1] if abs(dx) > 20 or abs(dy) > 20: if abs(dx) > abs(dy): if dx > 0: keydown(39, 'ArrowRight') else: keydown(37, 'ArrowLeft') else: if dy > 0: keydown(40, 'ArrowDown') else: keydown(38, 'ArrowUp') else: keydown(32, ' ')
也可以下载代码,本地python环境运行(用pygame封装了xdf库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。