学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
from xdf import * import math def ang2rad(ang): return math.pi * ang / 180 def rad2ang(rad): return 180 * rad / math.pi class factory: def __init__(self, tp, co): self.tp = tp self.co = co self.arr = [] self.pool = [] pass def get(self): if len(self.pool): return self.initC(self.pool.pop()) return self.initC(self.create()) def initC(self, c): self.arr.append(c) c.front() c.show() return c def remove(self, c): c.hide() self.pool.append(c) self.arr.remove(c) pass def removeAll(self): for c in self.arr: c.hide() self.pool.extend(self.arr) self.arr.clear() pass def create(self): if self.tp == 'circle': return circle(0, 0, 10, self.co) if self.tp == 'line': return line(0, 0, 100, 100, 5, self.co) return None pass levels = [ [[382,298,536,618,184,638],[0,2,4,0]], [[226,336,548,324,556,696,224,696],[0,2,4,6,0]], [[218,316,556,310,230,706,560,696],[0,2,4,6,0]], [[386,300,574,682,164,450,594,382,310,698],[0,2,4,6,8,0]], [[198,436,582,432,576,736,196,736,380,280],[0,2,4,6,0,8,2]], [[570,698,206,704,198,404,390,240,564,382],[0,2,4,6,8,4,0,8,2]], [[350,234,76,436,588,438,200,696,466,686],[0,2,4,0,6,8,0]], [[354,468,162,684,342,180,550,670],[0,2,4,0,6,4]], [[550,314,352,166,202,306,124,502,210,652,382,772,506,654,614,500,354,482],[0,2,4,6,8,10,12,14,0,12,16,4,8,16,0,4]], [[364,216,268,304,348,400,436,288,158,362,342,498,458,588,234,600,510,362],[0,2,4,0,6,4,8,10,12,14,10,16,4]] ] level = 0 levelData = levels[level] levelTf = text('', 0, 30, 30, 'red') btn = text('重置', 768, 30, 30, 'red','right') facC = factory('circle', 'red') facL = factory('line', 'black') facLU = factory('line', 'blue') pu = [0, 0, None] lu = [] def setLine(li, x0, y0, x1, y1): dx = x1 - x0 dy = y1 - y0 sz = math.sqrt(dx * dx + dy * dy) rot = math.atan2(dy, dx) li.move(x0, y0) li.rotate(rad2ang(rot) + 90) li.size(sz) pass def refreshLevel(): ps = levelData[0] ls = levelData[1] for i in range(1, len(ls)): x0 = ps[ls[i-1]] y0 = ps[ls[i-1]+1] x1 = ps[ls[i]] y1 = ps[ls[i]+1] l = facL.get() setLine(l, x0, y0, x1, y1) pass for i in range(0, len(ps), 2): x = ps[i] y = ps[i+1] c = facC.get() c.move(x, y) pass def reset(): clearULine() facC.removeAll() facL.removeAll() updateLevel() refreshLevel() pass btn.tap = reset def nextLevel(): global level, levelData level += 1 if level >= len(levels): level = 0 levelData = levels[level] reset() pass def updateLevel(): levelTf.change('第' + str(level + 1) + '关') pass def distance2(x0, y0, x1, y1): dx = x1 - x0 dy = y1 - y0 return dx * dx + dy * dy def getP(x, y): ps = levelData[0] for i in range(0, len(ps), 2): xi = ps[i] yi = ps[i+1] if distance2(x, y, xi, yi) < 20 * 20: return i pass return -1 def getPat(i): ps = levelData[0] return [ps[i], ps[i+1]] def clearULine(): pu[2] = None lu.clear() facLU.removeAll() pass def touch(): clearULine() i = getP(x, y) if i != -1: pu[2] = facLU.get() lu.append(i) pu[0] = x pu[1] = y updateUline() pass def updateUline(): p = getPat(lu[-1]) setLine(pu[2], p[0], p[1], pu[0], pu[1]) pass def getPat(i): ps = levelData[0] return [ps[i], ps[i+1]] def touching(): if pu[2]: i = getP(x, y) if i!= -1 and i != lu[len(lu)-1]: p = getPat(i) pu[0] = p[0] pu[1] = p[1] updateUline() pu[2] = facLU.get() lu.append(i) pu[0] = x pu[1] = y updateUline() pass pass def untouch(): if pu[2]: facLU.remove(pu[2]) pu[2] = None if checkWin(): delay(nextLevel, 1000) else: delay(reset, 1000) pass pass def getS(ls): a = [] for i in range(1, len(ls)): i1 = ls[i-1] i2 = ls[i] if i1 > i2: a.append('-'.join([str(i2),str(i1)])) else: a.append('-'.join([str(i1),str(i2)])) pass a.sort() s = ','.join(a) #print(s) return s def checkWin(): ls = levelData[1] return len(ls) == len(lu) and getS(ls) == getS(lu) reset()
也可以下载代码,本地python环境运行(用pygame封装了xdf库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。