学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
from xdf import * CW = 128 #64 M = int(768 / CW) - 2 N = int(1024 / CW) - 2 MN = M * N data = [] winTxt = text("恭喜过关,点击重新开始", 50, "red", "center") isWin = False select1 = None select2 = None total = 0 def xy2ij(x, y): return [int(y / CW) - 1, int(x / CW) - 1] def ij2xy(i, j): return [(j + 1.5) * CW, (i + 1.5) * CW] def ij2n(i, j): return i * M + j def n2ij(n): return [int(n//m), n % M] for i in range(N): for j in range(M): xy = ij2xy(i, j) x = xy[0] y = xy[1] b = [ 0, box(x - CW / 2 + 2, y - CW / 2 + 2, CW - 4, CW - 4, "#ccc", "black"), text("0", x, y + CW * 0.25 , CW / 2, "red", "center"), box(x - CW / 2 + 2, y - CW / 2 + 2, CW - 4, CW - 4, "transparent", "red"), True, i, j ] data.append(b) lines = [line(1,1,100,100, 'red') ,line(1,1,100,100, 'red') ,line(1,1,100,100, 'red') ] def hide(b): b[1].hide() b[2].hide() b[3].hide() b[4]=False def show(b): b[1].show() b[2].show() b[4] = True def initData(): n = 0 for i in range(N): for j in range(M): data[n][0] = i show(data[n]) n = n + 1 def upset(): for i in range(MN): j = random(MN) - 1 temp = data[i][0] data[i][0] = data[j][0] data[j][0] = temp def tap(): global data, isWin if isWin: reset() return ij = xy2ij(x, y) i = ij[0] j = ij[1] if i < 0 or i >= N or j < 0 or j >= M: return n = ij2n(i, j) b = data[n] if (not isEmpty(i, j)) and (not isSelected(b)): select(b) checkLink() refresh() def isSelected(b): global select1, select2 return b == select1 or b == select2 def select(b): global select1, select2 if select1 == None: select1 = b else: select2 = b def isSelect2(): global select1, select2 return select1 != None and select2 != None def reset(): global isWin, select1, select2, winTxt, total isWin = False winTxt.hide() initData() upset() select1 = None select2 = None refresh() total = MN hideLines() def refresh(): global data, select1, select2 for i in range(MN): b = data[i] b[2].change(str(b[0])) b[3].hide() if select1 != None: select1[3].show() if select2 != None: select2[3].show() def checkLink(): global select1, select2 if not isSelect2(): return if canLink(): checkWin() return select1 = select2 select2 = None def canLink(): global select1, select2 if select1[0] != select2[0]: return False i1 = select1[5] j1 = select1[6] i2 = select2[5] j2 = select2[6] if checkOne(i1, j1, i2, j2): link() showLine(i1, j1, i2, j2, 0) return True if checkTwo(i1, j1, i2, j2) or checkThree(i1, j1, i2, j2): link() return True return False def showLine(i1, j1, i2, j2, n): global lines line = lines[n] line.show() if j2 < j1: temp = j1 j1 = j2 j2 = temp if i2 < i1: temp = i1 i1 = i2 i2 = temp xy1 = ij2xy(i1, j1) xy2 = ij2xy(i2, j2) # xdf库有bug,move指定了坐标,还是根据角度算的 if j1 == j2: line.rotate(180) else: line.rotate(90) line.move(xy1[0], xy1[1], xy2[0], xy2[1]) delay(hideLines, 300) def hideLines(): lines[0].hide() lines[1].hide() lines[2].hide() def checkTwo(i1, j1, i2, j2): #print('two') if i1 == i2 or j1 == j2: return False if (isEmpty(i1, j2) and checkOne(i1, j1, i1, j2) and checkOne(i2, j2, i1, j2)): showLine(i1, j1, i1, j2, 0) showLine(i1, j2, i2, j2, 1) return True if (isEmpty(i2, j1) and checkOne(i1, j1, i2, j1) and checkOne(i2, j2, i2, j1)): showLine(i1, j1, i2, j1, 0) showLine(i2, j1, i2, j2, 1) return True return False def checkThree(i1, j1, i2, j2): #print('three') for i in range(N+2): i = i - 1 #print('i:', i, isEmpty(i, j1), isEmpty(i, j2), checkOne(i1, j1, i, j1), checkOne(i, j1, i, j2), checkOne(i, j2, i2, j2)) if isEmpty(i, j1) and isEmpty(i, j2) and checkOne(i1, j1, i, j1) and checkOne(i, j1, i, j2) and checkOne(i, j2, i2, j2): showLine(i1, j1, i, j1, 0) showLine(i, j1, i, j2, 1) showLine(i, j2, i2, j2, 2) return True for j in range(M+2): j = j - 1 #print('j:', j, isEmpty(i1, j), isEmpty(i2, j), checkOne(i1, j1, i1, j), checkOne(i1, j, i2, j), checkOne(i2, j, i2, j2)) if isEmpty(i1, j) and isEmpty(i2, j) and checkOne(i1, j1, i1, j) and checkOne(i1, j, i2, j) and checkOne(i2, j, i2, j2): showLine(i1, j1, i1, j, 0) showLine(i1, j, i2, j, 1) showLine(i2, j, i2, j2, 2) return True return False def checkOne(i1, j1, i2, j2): #print("one", i1, j1, i2, j2) global data if i1 == i2: dr = 1 if j1 > j2: dr = -1 for i in range(abs(j2 - j1) - 1): if not isEmpty(i1, j1 + dr*(i + 1)): return False; return True if j1 == j2: dr = 1 if i1 > i2: dr = -1 for i in range(abs(i2 - i1) - 1): if not isEmpty(i1 + dr*(i + 1), j1): return False; return True return False def isEmpty(i, j): global data if i < 0 or i >= N or j < 0 or j >= M: return True n = ij2n(i, j) return not data[n][4] def link(): global select1, select2, total hide(select1) hide(select2) select1 = None select2 = None total = total - 2 def checkWin(): global total, isWin if total == 0: winTxt.show() isWin = True reset()
也可以下载代码,本地python环境运行(用pygame封装了xdf库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。