学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
from xdf import * import math bgs = ["car-bg1@003h", "car-bg2@003i", "car-bg3@003j"] fill(bgs[0]) car1 = stamp("car-1@003n") car2 = stamp("car-2@003o") carHit = stamp("car-hit@003p") run = stamp("car-run@003q") speed = 0.01 p1 = 0 p2 = 0 car1_path = 0 car2_path = 1 turn = 0 isOver = True cx = 385 cy = 510 changed = False turnTf = text("第1圈", 10, 40, 30, "red") def getPathOnDis(p, d): p1 = [] for i in range(0, len(p), 2): x = p[i] y = p[i+1] dx = x - cx dy = y - cy a = math.sqrt(dx * dx + dy * dy) dx = dx/a dy = dy/a a = a + d p1.append(round(cx + dx * a)) p1.append(round(cy + dy * a)) return p1 def pLength(p): s = 0 for i in range(0, len(p), 2): x1 = p[i] y1 = p[i+1] x2 = p[(i+2)%len(p)] y2 = p[(i+3)%len(p)] dx = x2 - x1 dy = y2 - y1 a = math.sqrt(dx * dx + dy * dy) s += a return s def rad2ang(rad): return rad * 180 / math.pi def ang2rad(ang): return ang * math.pi / 180 def getPatS(p, n, st): s = n * st if s == 0: return [p[0], p[1], 0] s0 = 0 for i in range(0, len(p), 2): x1 = p[i] y1 = p[i+1] x2 = p[(i+2)%len(p)] y2 = p[(i+3)%len(p)] dx = x2 - x1 dy = y2 - y1 a = math.sqrt(dx * dx + dy * dy) if s0 <= s and s0 + a >= s: s = s - s0 dx = dx / a dy = dy / a return [x1 + dx * s, y1 + dy * s, rad2ang(math.atan2(dy, dx))] s0 += a #print("error:", n, st) return [p[0], p[1], 0] path = [221,511,221,493,221,475,221,457,221,439,221,421,221,403,221,385,221,367,221,350,221,332,222,314,224,296,229,279,235,262,242,246,252,231,263,217,275,204,288,192,303,181,318,173,335,166,352,161,370,159,388,158,405,159,423,162,440,168,456,175,472,184,486,195,499,207,511,221,521,235,530,251,537,267,543,284,547,302,549,319,549,337,549,355,549,373,549,391,549,409,549,427,549,445,549,463,549,480,549,498,549,516,549,534,549,552,549,570,549,588,549,606,549,624,549,641,549,659,549,677,549,695,548,713,545,730,540,747,533,764,525,780,515,795,504,809,491,821,478,833,463,843,447,851,430,857,413,861,395,863,377,863,359,861,342,857,325,851,309,843,294,834,280,822,267,810,256,796,246,781,238,765,231,749,226,731,223,714,221,696,221,678,221,660,221,642,221,624,221,606,221,589,221,571,221,553,221,535,222,516] path1 = getPathOnDis(path, 20) path2 = getPathOnDis(path, -20) paths = [path1, path2] s1 = pLength(path1) s2 = pLength(path2) ss = [s1, s2] def updateCar(): pp1 = getPatS(paths[car1_path], p1, ss[car1_path]) pp2 = getPatS(paths[car2_path], (1-p2), ss[car2_path]) car1.move(pp1[0], pp1[1]) car2.move(pp2[0], pp2[1]) car1.rotate(pp1[2] + 90) car2.rotate(pp2[2] - 90) pass def updateTurn(): turnTf.change("第" + str(turn+1) + "圈") pass def reset(): global p1,p2,isOver,car1_path,car2_path,turn,changed p1 = 0 p2 = 0 car1_path = 0 car2_path = 1 turn = 0 isOver = False changed = False updateCar() updateTurn() carHit.hide() run.hide() carHit.hide() pass def checkOver(): if car1_path != car2_path: return global isOver d0 = abs(p1-(1-p2)) if d0 > 0.5: d0 = 1 - d0 if d0 < 60 / ss[car1_path]: run.show() carHit.show() carHit.move((car1.x + car2.x) / 2, (car1.y + car2.y) / 2) isOver = True pass def tap(): global isOver,car1_path if isOver: return car1_path = (car1_path + 1) % 2 pass def loop(): global isOver,p1,p2,car2_path,turn,changed if isOver: return p1 += speed p2 += speed if p1 > 1: p1 -= 1 turn += 1 changed = False updateTurn() if p2 > 1: p2 -= 1 if not changed and random(1000) > 950: d0 = abs(p1-(1-p2)) if d0 > 0.2 and d0 < 0.8: changed = True car2_path = (car2_path + 1) % 2 pass updateCar() checkOver() pass def start(): delay(reset, 100) run.tap = start
也可以下载代码,本地python环境运行(用pygame封装了xdf库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。