学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
from xdf import *
import math
x0 = 0
y0 = 0
x = 0
y = 0
W = 768
H = 1024
G = 1.6
JUMPF = -20
MAX_SPEED = 10
MAX_SPEED_Y = 20
ACC = 6
levels = [
["I",866,630,"P",150,625,"C",25,675,"C",75,675,"C",125,675,"C",175,675,"C",225,675,"C",275,675,"C",325,675,"C",375,675,"C",425,675,"C",475,675,"C",525,675,"C",575,675,"C",625,675,"C",675,675,"C",725,675,"C",775,675,"C",825,675,"C",875,675,"C",925,675,"C",975,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",325,725,"C",375,725,"C",425,725,"C",475,725,"C",525,725,"C",575,725,"C",625,725,"C",675,725,"C",725,725,"C",775,725,"C",825,725,"C",875,725,"C",925,725,"C",975,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",325,775,"C",375,775,"C",425,775,"C",475,775,"C",525,775,"C",575,775,"C",625,775,"C",675,775,"C",725,775,"C",775,775,"C",825,775,"C",875,775,"C",925,775,"C",975,775,"C",1025,675,"C",1025,725,"C",1025,775],
["I",866,630,"P",150,625,"C",25,675,"C",75,675,"C",125,675,"C",175,675,"C",225,675,"C",275,675,"C",325,675,"C",375,675,"C",425,675,"C",475,675,"C",525,675,"C",575,675,"C",625,675,"C",675,675,"C",725,675,"C",775,675,"C",825,675,"C",875,675,"C",925,675,"C",975,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",325,725,"C",375,725,"C",425,725,"C",475,725,"C",525,725,"C",575,725,"C",625,725,"C",675,725,"C",725,725,"C",775,725,"C",825,725,"C",875,725,"C",925,725,"C",975,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",325,775,"C",375,775,"C",425,775,"C",475,775,"C",525,775,"C",575,775,"C",625,775,"C",675,775,"C",725,775,"C",775,775,"C",825,775,"C",875,775,"C",925,775,"C",975,775,"C",1025,675,"C",1025,725,"C",1025,775,"C",525,525,"C",525,575,"C",525,625,"C",525,475],
["I",434,430,"P",150,625,"C",25,675,"C",75,675,"C",125,675,"C",175,675,"C",225,675,"C",275,675,"C",325,675,"C",375,675,"C",425,675,"C",625,675,"C",675,675,"C",725,675,"C",775,675,"C",825,675,"C",875,675,"C",925,675,"C",975,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",325,725,"C",375,725,"C",425,725,"C",625,725,"C",675,725,"C",725,725,"C",775,725,"C",825,725,"C",875,725,"C",925,725,"C",975,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",325,775,"C",375,775,"C",425,775,"C",625,775,"C",675,775,"C",725,775,"C",775,775,"C",825,775,"C",875,775,"C",925,775,"C",975,775,"C",1025,675,"C",1025,725,"C",1025,775,"C",375,475,"C",425,475,"C",475,475,"C",525,475,"C",575,475,"C",625,475],
["I",226,430,"P",150,625,"C",25,675,"C",75,675,"C",125,675,"C",175,675,"C",225,675,"C",275,675,"C",325,675,"C",375,675,"C",425,675,"C",625,675,"C",675,675,"C",725,675,"C",775,675,"C",825,675,"C",875,675,"C",925,675,"C",975,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",325,725,"C",375,725,"C",425,725,"C",625,725,"C",675,725,"C",725,725,"C",775,725,"C",825,725,"C",875,725,"C",925,725,"C",975,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",325,775,"C",375,775,"C",425,775,"C",625,775,"C",675,775,"C",725,775,"C",775,775,"C",825,775,"C",875,775,"C",925,775,"C",975,775,"C",1025,675,"C",1025,725,"C",1025,775,"C",75,475,"C",125,475,"C",175,475,"C",225,475,"C",475,675,"C",475,725,"C",475,775,"C",625,475,"C",675,475,"C",725,475,"C",775,475,"C",825,475,"C",875,475,"C",925,475,"C",975,475],
["I",325,425,"P",150,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",325,675,"C",375,675,"C",425,675,"C",625,725,"C",675,725,"C",725,725,"C",775,725,"C",825,725,"C",875,725,"C",925,725,"C",975,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",525,675,"C",575,675,"C",625,675,"C",625,775,"C",675,775,"C",725,775,"C",775,775,"C",825,775,"C",875,775,"C",925,775,"C",975,775,"C",1025,725,"C",1025,775,"C",75,475,"C",125,475,"C",175,475,"C",225,475,"C",475,675,"C",675,675,"C",725,475,"C",775,475,"C",825,475,"C",875,475,"C",925,475,"C",975,475,"C",425,575,"C",525,575,"C",575,575,"C",625,575,"C",475,575,"C",375,625,"C",375,575,"C",375,525,"C",375,475,"C",375,425,"C",375,375,"C",375,325,"C",275,475,"C",325,475,"C",575,375,"C",625,375,"C",1025,475,"C",325,325,"C",275,375,"C",75,425,"C",75,375,"C",75,325,"C",75,275,"H",725,475,0],
["I",925,425,"P",150,625,"C",25,675,"C",75,675,"C",125,675,"C",175,675,"C",225,675,"C",275,675,"C",325,675,"C",375,675,"C",425,675,"C",475,675,"C",525,675,"C",575,675,"C",625,675,"C",675,675,"C",725,675,"C",775,675,"C",825,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",325,725,"C",375,725,"C",425,725,"C",475,725,"C",525,725,"C",575,725,"C",625,725,"C",675,725,"C",725,725,"C",775,725,"C",825,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",325,775,"C",375,775,"C",425,775,"C",475,775,"C",525,775,"C",575,775,"C",625,775,"C",675,775,"C",725,775,"C",775,775,"C",825,775,"C",1025,675,"C",1025,725,"C",1025,775,"C",25,625,"C",25,575,"C",25,525,"C",25,475,"C",25,425,"C",25,375,"C",25,325,"C",25,275,"C",25,25,"C",25,75,"C",25,125,"C",25,175,"C",25,225,"C",875,675,"C",875,725,"C",875,775,"C",1025,625,"C",1025,575,"C",1025,525,"C",1025,475,"C",1025,425,"C",1025,375,"C",1025,325,"C",1025,275,"C",1025,25,"C",1025,75,"C",1025,125,"C",1025,175,"C",1025,225,"C",825,425,"C",825,375,"C",825,325,"C",825,275,"C",825,25,"C",825,75,"C",825,125,"C",825,175,"C",825,225,"C",875,425,"C",975,325,"C",875,475,"C",925,475,"C",975,475,"C",675,625,"C",675,575,"C",675,525,"C",675,475,"C",775,625,"C",825,625,"C",475,575,"C",525,575,"C",475,625,"C",525,625,"C",175,475,"C",225,475,"C",275,475,"C",325,475,"C",175,425,"C",475,375,"C",525,375,"C",575,375,"H",575,375,0],
["Z",15,753,"Z",75,753,"Z",135,753,"Z",195,753,"Z",255,753,"Z",315,753,"Z",375,753,"Z",435,753,"Z",495,753,"Z",555,753,"Z",615,753,"Z",675,753,"Z",735,753,"Z",795,753,"Z",855,753,"Z",915,753,"Z",975,753,"Z",1035,753,"P",175,625,"C",775,525,"C",825,525,"C",325,625,"C",375,625,"C",625,625,"C",675,625,"C",75,475,"C",125,475,"C",475,625,"C",525,625,"C",125,675,"C",175,675,"C",225,675,"I",100,425,"C",898,425,"C",948,425,"C",875,425,"C",925,425,"H",525,625,0,"H",825,525,0],
["Z",15,753,"Z",75,753,"Z",135,753,"Z",195,753,"Z",255,753,"Z",315,753,"Z",375,753,"Z",435,753,"Z",495,753,"Z",555,753,"Z",615,753,"Z",675,753,"Z",735,753,"Z",795,753,"Z",855,753,"Z",915,753,"Z",975,753,"Z",1035,753,"P",500,625,"C",775,475,"C",825,475,"I",775,325,"C",525,675,"C",575,675,"C",625,675,"C",375,675,"C",425,675,"C",475,675,"C",925,625,"C",975,625,"C",1025,625,"C",775,625,"C",825,625,"C",875,625,"C",175,525,"C",225,525,"C",275,525,"C",25,525,"C",75,525,"C",125,525,"C",325,425,"C",375,425,"C",175,425,"C",225,425,"C",275,425,"C",675,375,"C",725,375,"C",775,375,"C",525,375,"C",575,375,"C",625,375,"C",825,375,"H",775,625,180,"H",525,375,0,"H",175,425,0],
["Z",15,753,"Z",75,753,"Z",135,753,"Z",195,753,"Z",255,753,"Z",315,753,"Z",375,753,"Z",435,753,"Z",495,753,"Z",555,753,"Z",615,753,"Z",675,753,"P",500,625,"I",75,325,"C",525,675,"C",575,675,"C",625,675,"C",375,675,"C",425,675,"C",475,675,"C",875,475,"C",925,475,"C",975,475,"C",725,475,"C",775,475,"C",825,475,"C",1025,475,"C",475,425,"C",525,425,"C",575,425,"C",325,425,"C",375,425,"C",425,425,"C",175,375,"C",225,375,"C",25,375,"C",75,375,"C",125,375,"C",225,475,"C",75,475,"C",125,475,"C",175,475,"C",25,325,"C",25,275,"C",25,225,"C",25,175,"C",25,125,"C",25,75,"C",25,25,"H",725,475,89,"H",325,425,180,"H",225,375,0],
["Z",550,753,"P",325,625,"I",75,625,"Z",910,753,"Z",970,753,"C",25,675,"C",75,675,"C",125,675,"C",175,675,"C",225,675,"C",275,675,"C",325,675,"C",375,675,"C",425,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",325,725,"C",375,725,"C",425,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",325,775,"C",375,775,"C",425,775,"C",475,675,"C",475,725,"C",475,775,"C",625,675,"C",675,675,"C",625,725,"C",675,725,"C",625,775,"C",675,775,"C",725,675,"C",725,725,"C",725,775,"C",25,625,"C",25,575,"C",25,525,"C",25,475,"C",25,425,"C",25,375,"C",25,325,"C",25,275,"C",25,25,"C",25,75,"C",25,125,"C",25,175,"C",25,225,"C",1025,675,"C",1025,725,"C",1025,775,"C",1025,625,"C",1025,575,"C",1025,525,"C",1025,475,"C",1025,425,"C",1025,375,"C",1025,325,"C",1025,275,"C",1025,25,"C",1025,75,"C",1025,125,"C",1025,175,"C",1025,225,"C",775,475,"C",825,475,"C",875,475,"C",925,475,"C",975,475,"C",375,475,"C",425,475,"C",475,475,"C",525,475,"C",575,475,"C",225,625,"C",225,575,"C",225,525,"C",225,475,"H",225,475,0,"H",225,475,180,"H",775,478,89,"H",775,478,-91],
["C",25,675,"C",75,675,"C",125,675,"C",175,675,"C",225,675,"C",275,675,"C",325,675,"C",375,675,"C",425,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",475,675,"C",525,675,"C",625,675,"C",675,675,"C",725,675,"C",775,675,"C",825,675,"C",875,675,"C",925,675,"C",975,675,"C",625,725,"C",675,725,"C",725,725,"C",775,725,"C",825,725,"C",875,725,"C",925,725,"C",975,725,"C",625,775,"C",675,775,"C",725,775,"C",775,775,"C",825,775,"C",875,775,"C",925,775,"C",975,775,"C",1025,675,"C",1025,725,"C",1025,775,"P",675,425,"I",475,425,"C",325,475,"C",375,475,"C",425,475,"C",475,475,"C",525,475,"C",575,475,"C",625,475,"C",675,475,"C",725,475,"C",775,475,"C",825,475,"C",875,475,"C",925,475,"C",975,475,"C",1025,475,"C",325,325,"C",325,375,"C",325,425,"C",325,275,"C",375,275,"C",425,275,"C",475,275,"C",525,275,"C",625,275,"C",675,275,"C",725,275,"C",775,275,"C",825,275,"C",875,275,"C",625,325,"C",625,375,"C",625,425,"C",525,325,"C",525,375,"H",475,675,0,"H",125,675,0,"H",275,700,180,"H",875,475,0],
["P",500,250,"I",200,475,"Z",15,753,"Z",75,753,"Z",135,753,"Z",195,753,"Z",255,753,"Z",315,753,"Z",375,753,"Z",615,753,"Z",675,753,"Z",735,753,"Z",795,753,"Z",855,753,"Z",915,753,"Z",975,753,"Z",1035,753,"C",625,525,"C",675,525,"C",725,525,"C",175,525,"C",225,525,"C",75,475,"C",125,475,"C",275,475,"C",325,475,"C",775,575,"C",825,575,"C",875,525,"C",925,525,"H",825,575,0,"H",125,475,0,"H",325,475,180,"H",325,475,0],
["I",725,625,"P",425,425,"C",25,675,"C",75,675,"C",125,675,"C",175,675,"C",225,675,"C",275,675,"C",325,675,"C",375,675,"C",425,675,"C",475,675,"C",525,675,"C",575,675,"C",625,675,"C",675,675,"C",725,675,"C",775,675,"C",825,675,"C",875,675,"C",925,675,"C",975,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",325,725,"C",375,725,"C",425,725,"C",475,725,"C",525,725,"C",575,725,"C",625,725,"C",675,725,"C",725,725,"C",775,725,"C",825,725,"C",875,725,"C",925,725,"C",975,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",325,775,"C",375,775,"C",425,775,"C",475,775,"C",525,775,"C",575,775,"C",625,775,"C",675,775,"C",725,775,"C",775,775,"C",825,775,"C",875,775,"C",925,775,"C",975,775,"C",1025,675,"C",1025,725,"C",1025,775,"C",375,475,"C",425,475,"C",475,475,"C",525,475,"C",575,475,"C",625,475,"C",675,475,"C",725,475,"C",775,475,"C",825,475,"C",875,425,"C",925,425,"C",975,425,"C",1025,425,"C",475,525,"C",475,575,"C",475,625,"C",25,475,"C",75,475,"C",125,475,"C",175,475,"C",225,475,"C",375,425,"C",375,375,"C",375,325,"C",375,275,"C",375,225,"H",775,475,-61,"H",775,475,180,"H",175,475,0,"H",875,425,0],
["C",25,675,"C",75,675,"C",125,675,"C",175,675,"C",225,675,"C",275,675,"C",325,675,"C",375,675,"C",425,675,"C",475,675,"C",525,675,"C",575,675,"C",625,675,"C",675,675,"C",725,675,"C",775,675,"C",825,675,"C",875,675,"C",925,675,"C",975,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",325,725,"C",375,725,"C",425,725,"C",475,725,"C",525,725,"C",575,725,"C",625,725,"C",675,725,"C",725,725,"C",775,725,"C",825,725,"C",875,725,"C",925,725,"C",975,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",325,775,"C",375,775,"C",425,775,"C",475,775,"C",525,775,"C",575,775,"C",625,775,"C",675,775,"C",725,775,"C",775,775,"C",825,775,"C",875,775,"C",925,775,"C",975,775,"C",1025,675,"C",1025,725,"C",1025,775,"I",75,525,"P",100,325,"C",25,625,"C",25,575,"C",25,525,"C",25,475,"C",25,425,"C",25,375,"C",25,325,"C",25,275,"C",25,25,"C",25,75,"C",25,125,"C",25,175,"C",25,225,"C",1025,625,"C",1025,575,"C",1025,525,"C",1025,475,"C",1025,425,"C",1025,375,"C",1025,325,"C",1025,275,"C",1025,25,"C",1025,75,"C",1025,125,"C",1025,175,"C",1025,225,"C",375,575,"C",425,575,"C",475,575,"C",525,575,"C",575,575,"C",625,575,"C",675,575,"C",725,575,"C",775,575,"C",825,575,"C",875,575,"C",925,575,"C",975,575,"C",75,575,"C",125,575,"C",175,575,"C",75,375,"C",125,375,"C",175,375,"C",225,375,"C",275,375,"C",325,375,"C",375,375,"C",425,375,"C",475,375,"C",525,375,"C",575,375,"C",625,375,"C",675,375,"C",725,375,"C",775,375,"C",825,375,"C",975,375,"H",776,378,180,"H",776,378,60,"H",975,375,-90,"H",625,575,0,"H",175,575,0,"H",275,375,180,"H",375,375,0],
["C",25,675,"C",75,675,"C",125,675,"C",175,675,"C",225,675,"C",275,675,"C",425,675,"C",475,675,"C",525,675,"C",575,675,"C",625,675,"C",675,675,"C",725,675,"C",775,675,"C",825,675,"C",875,675,"C",925,675,"C",975,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",425,725,"C",475,725,"C",525,725,"C",575,725,"C",625,725,"C",675,725,"C",725,725,"C",775,725,"C",825,725,"C",875,725,"C",925,725,"C",975,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",425,775,"C",475,775,"C",525,775,"C",575,775,"C",625,775,"C",675,775,"C",725,775,"C",775,775,"C",825,775,"C",875,775,"C",925,775,"C",975,775,"C",1025,675,"C",1025,725,"C",1025,775,"I",575,325,"P",625,625,"C",25,525,"C",75,525,"C",125,525,"C",175,525,"C",225,525,"C",275,525,"C",325,525,"C",375,525,"C",425,525,"C",425,575,"C",425,625,"C",425,375,"C",425,425,"C",425,475,"C",575,425,"C",625,425,"C",675,425,"C",725,425,"C",775,425,"C",775,525,"C",825,525,"C",875,525,"C",925,525,"C",975,525,"C",1025,525,"C",575,375,"C",625,375,"H",125,525,0,"H",425,375,0,"H",775,425,89],
["I",625,625,"P",75,625,"C",25,675,"C",75,675,"C",125,675,"C",175,675,"C",225,675,"C",275,675,"C",325,675,"C",375,675,"C",425,675,"C",475,675,"C",525,675,"C",575,675,"C",625,675,"C",675,675,"C",725,675,"C",775,675,"C",825,675,"C",875,675,"C",925,675,"C",975,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",325,725,"C",375,725,"C",425,725,"C",475,725,"C",525,725,"C",575,725,"C",625,725,"C",675,725,"C",725,725,"C",775,725,"C",825,725,"C",875,725,"C",925,725,"C",975,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",325,775,"C",375,775,"C",425,775,"C",475,775,"C",525,775,"C",575,775,"C",625,775,"C",675,775,"C",725,775,"C",775,775,"C",825,775,"C",875,775,"C",925,775,"C",975,775,"C",1025,675,"C",1025,725,"C",1025,775,"C",225,575,"C",275,575,"C",175,625,"C",225,625,"C",275,625,"C",325,625,"C",425,425,"C",475,425,"C",525,425,"C",575,425,"C",625,425,"C",825,375,"C",875,375,"C",925,375,"C",975,375,"C",1025,375,"C",75,375,"C",125,375,"C",175,375,"C",325,475,"C",375,475,"C",825,525,"C",825,575,"C",825,625,"C",825,425,"C",825,475,"C",475,525,"C",475,575,"C",475,625,"C",475,475,"H",125,375,0,"H",375,475,0,"H",475,425,0,"H",625,425,180,"H",825,475,180],
["C",25,675,"C",75,675,"C",125,675,"C",175,675,"C",225,675,"C",275,675,"C",325,675,"C",375,675,"C",425,675,"C",475,675,"C",525,675,"C",575,675,"C",625,675,"C",675,675,"C",725,675,"C",775,675,"C",825,675,"C",875,675,"C",925,675,"C",975,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",325,725,"C",375,725,"C",425,725,"C",475,725,"C",525,725,"C",575,725,"C",625,725,"C",675,725,"C",725,725,"C",775,725,"C",825,725,"C",875,725,"C",925,725,"C",975,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",325,775,"C",375,775,"C",425,775,"C",475,775,"C",525,775,"C",575,775,"C",625,775,"C",675,775,"C",725,775,"C",775,775,"C",825,775,"C",875,775,"C",925,775,"C",975,775,"C",1025,675,"C",1025,725,"C",1025,775,"I",150,625,"P",125,325,"C",25,575,"C",75,575,"C",25,625,"C",75,625,"C",825,575,"C",875,575,"C",925,575,"C",975,575,"C",825,625,"C",875,625,"C",925,625,"C",975,625,"C",1025,575,"C",1025,625,"C",775,375,"C",825,375,"C",875,375,"C",925,375,"C",975,375,"C",1025,375,"C",175,475,"C",225,475,"C",275,475,"C",325,475,"C",375,475,"C",425,475,"C",475,475,"C",25,375,"C",75,375,"C",125,375,"C",175,375,"C",425,425,"C",475,425,"C",525,425,"C",575,375,"C",625,375,"C",473,525,"C",473,575,"C",473,625,"C",175,425,"C",25,225,"C",25,275,"C",25,325,"C",25,125,"C",25,175,"C",25,25,"C",25,75,"C",1025,225,"C",1025,275,"C",1025,325,"C",1025,125,"C",1025,175,"C",1025,25,"C",1025,75,"H",350,475,0,"H",500,425,0,"H",600,375,180,"H",825,375,180],
["C",25,675,"C",75,675,"C",125,675,"C",175,675,"C",225,675,"C",275,675,"C",325,675,"C",375,675,"C",425,675,"C",475,675,"C",525,675,"C",575,675,"C",625,675,"C",675,675,"C",725,675,"C",775,675,"C",825,675,"C",875,675,"C",925,675,"C",975,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",325,725,"C",375,725,"C",425,725,"C",475,725,"C",525,725,"C",575,725,"C",625,725,"C",675,725,"C",725,725,"C",775,725,"C",825,725,"C",875,725,"C",925,725,"C",975,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",325,775,"C",375,775,"C",425,775,"C",475,775,"C",525,775,"C",575,775,"C",625,775,"C",675,775,"C",725,775,"C",775,775,"C",825,775,"C",875,775,"C",925,775,"C",975,775,"C",1025,675,"C",1025,725,"C",1025,775,"I",675,625,"P",100,475,"C",475,575,"C",525,575,"C",475,625,"C",525,625,"C",25,525,"C",75,525,"C",125,525,"C",175,525,"C",225,525,"C",275,525,"C",325,525,"C",325,425,"C",375,425,"C",425,425,"C",475,425,"C",525,425,"C",575,425,"C",625,425,"C",675,425,"C",725,425,"C",325,475,"C",775,325,"C",825,325,"C",875,325,"C",925,325,"C",975,325,"C",1025,325,"C",875,475,"C",925,475,"C",975,475,"C",1025,475,"C",1025,375,"C",1025,425,"C",25,375,"C",25,425,"C",25,475,"C",25,225,"C",25,275,"C",25,325,"C",25,75,"C",25,125,"C",25,175,"C",25,25,"C",1020,225,"C",1020,275,"C",1020,75,"C",1020,125,"C",1020,175,"C",1020,25,"C",725,625,"C",725,475,"C",725,525,"C",725,575,"H",775,325,29,"H",575,425,0,"H",325,425,29,"H",275,525,0],
["C",25,675,"C",75,675,"C",125,675,"C",175,675,"C",225,675,"C",275,675,"C",325,675,"C",375,675,"C",425,675,"C",475,675,"C",525,675,"C",575,675,"C",625,675,"C",675,675,"C",725,675,"C",775,675,"C",825,675,"C",875,675,"C",925,675,"C",975,675,"C",25,725,"C",75,725,"C",125,725,"C",175,725,"C",225,725,"C",275,725,"C",325,725,"C",375,725,"C",425,725,"C",475,725,"C",525,725,"C",575,725,"C",625,725,"C",675,725,"C",725,725,"C",775,725,"C",825,725,"C",875,725,"C",925,725,"C",975,725,"C",25,775,"C",75,775,"C",125,775,"C",175,775,"C",225,775,"C",275,775,"C",325,775,"C",375,775,"C",425,775,"C",475,775,"C",525,775,"C",575,775,"C",625,775,"C",675,775,"C",725,775,"C",775,775,"C",825,775,"C",875,775,"C",925,775,"C",975,775,"C",1025,675,"C",1025,725,"C",1025,775,"C",25,525,"C",25,375,"C",25,425,"C",25,475,"C",25,225,"C",25,275,"C",25,325,"C",25,75,"C",25,125,"C",25,175,"C",25,25,"C",25,575,"C",25,625,"C",1025,525,"C",1025,375,"C",1025,425,"C",1025,475,"C",1025,225,"C",1025,275,"C",1025,325,"C",1025,75,"C",1025,125,"C",1025,175,"C",1025,25,"C",1025,575,"C",1025,625,"C",325,575,"C",375,575,"C",325,625,"C",375,625,"I",75,625,"P",350,325,"C",75,375,"C",125,375,"C",175,375,"C",225,375,"C",275,375,"C",325,375,"C",375,375,"C",425,375,"C",475,375,"C",525,375,"C",575,375,"C",625,375,"C",675,375,"C",725,375,"C",875,375,"C",925,375,"C",975,375,"C",775,525,"C",825,525,"C",875,525,"C",525,625,"C",575,625,"H",375,575,0,"H",575,375,89,"H",725,375,0,"H",825,525,0,"H",925,375,0,"H",125,375,0,"H",125,375,180,"H",125,375,-90,"H",125,375,89],
["C",175,325,"C",225,325,"C",175,375,"C",225,375,"I",175,625,"P",500,525,"C",725,575,"C",775,575,"C",725,625,"C",775,625,"C",175,675,"C",225,675,"C",275,675,"H",203,353,0,"H",203,353,180,"H",203,353,-90,"H",203,353,89,"H",753,603,0,"H",753,603,180,"H",753,603,-90,"H",753,603,89]
]
class HPoint:
def __init__(self, x, y):
self.x = x
self.y = y
def setXy(self, x, y):
self.x = x
self.y = y
def add(self, p):
return HPoint(self.x + p.x, self.y + p.y)
def subtract(self, p):
return HPoint(self.x - p.x, self.y - p.y)
def middle(self, p):
return HPoint((self.x + p.x) / 2, (self.y + p.y) / 2)
def length(self):
return math.sqrt(self.x * self.x + self.y * self.y)
def normalize(self, n):
a = n / self.length()
return HPoint(self.x * a, self.y * a)
def dot(self, p):
return self.x * p.x + self.y * p.y
# 分离轴 碰撞检测
class Sat:
def __init__(self):
pass
def test(self, points0, points1):
return self.halfTest(points0, points1) and self.halfTest(points1, points0)
def halfTest(self, points0, points1):
n = len(points0)
for i in range(n):
axis = self.getAxis(points0[i], points0[(i + 1) % n])
range1 = self.getRange(axis[0], axis[1], points0)
range2 = self.getRange(axis[0], axis[1], points1)
if not self.intersection(range1[0], range1[1], range2[0], range2[1]):
return False
return True
def getAxis(self, p0, p1):
p2 = HPoint((p0.x + p1.x) / 2, (p0.y + p1.y) / 2)
p3 = HPoint(-(p0.y - p1.y), p0.x - p1.x)
p3 = p3.normalize(1)
return [p2, p2.add(p3)]
def getRange(self, p0, p1, points):
max = None
min = None
v = p1.subtract(p0)
for p in points:
n = v.dot(p.subtract(p0))
if max == None or n > max:
max = n
if min == None or n < min:
min = n
return [min, max]
def intersection(self, n0, n1, n2, n3):
if n1 < n2 or n3 < n0:
return False
return True
pass
Sat = Sat()
class Sprite:
def __init__(self, src, x = 0, y = 0, name = ''):
self.stamp = stamp(src, x, y)
self.src = src
self.name = name
self.x = x
self.y = y
self.speedY = 0
self.speedX = 0
self.visible = True
self.removed = False
self.isStand = False
self.flipped = False
self.lastFlipped = False
self.rotation = 0
pass
def change(self, src):
if src != self.src:
self.src = src
self.stamp.change(src)
def reset(self):
pass
def front(self):
self.stamp.front()
pass
def update(self):
pass
def refresh(self, parent):
if self.flipped != self.lastFlipped:
self.lastFlipped = self.flipped
self.stamp.flip()
if self.removed:
if not self.stamp.hidden:
self.stamp.hide()
return
if self.visible and parent.visible:
if self.stamp.hidden:
self.stamp.show()
else:
if not self.stamp.hidden:
self.stamp.hide()
if not self.stamp.hidden:
self.stamp.rotate(self.rotation + 90)
self.stamp.move(768 - (parent.y + self.y), parent.x + self.x)
pass
def tap(self):
if self.visible and self.stamp.hits(x, y):
return True
return False
pass
class Layer:
def __init__(self, x = 0, y = 0):
self.x = x
self.y = y
self.children = []
self.pool = []
self.visible = True
pass
def addSp(self, src, x = 0, y = 0, name = ''):
for sp in self.pool:
if sp.src == src:
self.pool.remove(sp)
self.children.append(sp)
sp.x = x
sp.y = y
sp.name = name
if sp.src != src:
sp.stamp.change(src)
sp.removed = False
sp.visible = True
sp.speedY = 0
sp.speedX = 0
sp.front()
return sp
sp = Sprite(src, x, y, name)
self.children.append(sp)
return sp
def clear(self):
self.pool.extend(self.children)
self.children.clear()
pass
def removeSp(self, sp):
self.pool.append(sp)
self.children.remove(sp)
sp.removed = True
def update(self):
pass
def refresh(self):
for sp in self.children:
sp.refresh(self)
for sp in self.pool:
sp.removed = True
sp.refresh(self)
pass
def reset(self):
pass
def tap(self):
if self.visible:
for sp in reversed(self.children):
if sp.visible and sp.tap():
return True
return False
pass
class Home(Layer):
def __init__(self):
Layer.__init__(self, 0, 0)
pass
def reset(self):
fill("ice-c-bg1@004l")
pass
def tap(self):
if abs(x0 - 505) < 125 and abs(y0 - 505) < 35:
game.showMenu()
return True
return False
pass
class LevelSelectMenu(Layer):
def __init__(self):
Layer.__init__(self, 0, 0)
self.locks = []
for j in range(4):
for i in range(5):
self.locks.append(self.addSp("ice-c-l@005M", 280+120*i, 320+86*j))
pass
def reset(self):
fill("ce-c-bg2@004m")
pass
def updateRecords(self, records):
for i in range(len(self.locks)):
self.locks[i].visible = i > records
pass
def update(self):
super().update()
pass
def refresh(self):
super().refresh()
pass
def tap(self):
for i in range(len(self.locks)):
sp = self.locks[i]
if not sp.visible:
x1 = x0 - self.x - sp.x
y1 = y0 - self.y - sp.y
if abs(x1) < 35 and abs(y1) < 35:
game.startLevel(i)
return True
else:
break
return False
pass
class Gamelayer(Layer):
def __init__(self):
Layer.__init__(self,0,0)
self.pool = []
self.penguin = None
self.menu = None
self.count = 0
self.state = 0
pass
def reset(self):
fill("ice-c-bg@004k")
pass
def tap(self):
if self.state != 0:
return False
for sp in self.children:
if not sp.visible:
continue
dx = x0 - sp.x
dy = y0 - sp.y
if sp.name == 'M':
if abs(dx) < 30 and abs(dy) < 30:
game.showMenu()
return True
#self.jumpPenguin()
return False
def jumpPenguin(self):
if not self.penguin.isStand:
return
self.penguin.speedY = JUMPF
self.penguin.isStand = False
pass
def update(self):
super().update()
if not self.penguin:
return
if self.state == 0:
self.updateHammer()
self.movePenguin()
if self.state == 0:
self.checkHit()
elif self.state == 1:
self.count += 1
if self.count == 10:
game.complete()
elif self.state == 2:
self.count += 1
if self.count == 10:
game.gameOver()
pass
def updateHammer(self):
for sp in self.children:
if sp.name == 'H':
sp.rotation += 2
pass
def movePenguin(self):
penguin = self.penguin
if isKeydown('39'):
self.penguin.speedX += ACC
if isKeydown('37'):
self.penguin.speedX -= ACC
pass
if isKeydown('38') or isKeydown('32'):
self.jumpPenguin()
if penguin.speedX > MAX_SPEED:
penguin.speedX = MAX_SPEED
elif penguin.speedX < -MAX_SPEED:
penguin.speedX = -MAX_SPEED
# move x
penguin.x += penguin.speedX
self.formatPos()
self.checkHitFloorX()
penguin.speedX *= 0.7
# move y
penguin.speedY += G
if penguin.speedY > MAX_SPEED_Y:
penguin.speedY = MAX_SPEED_Y
penguin.y += penguin.speedY
penguin.isStand = False
self.formatPos()
self.checkHitFloorY()
if penguin.isStand:
if abs(penguin.speedX) < 0.1:
penguin.speedX = 0
penguin.change("ice-c-p1@004u")
else:
penguin.change("ice-c-pr@005K")
else:
penguin.change("ice-c-p16@0059")
if penguin.speedX < 0:
penguin.flipped = True
elif penguin.speedX > 0:
penguin.flipped = False
pass
def checkHitFloorX(self):
penguin = self.penguin
for sp in self.children:
if sp.name == "C":
dx = penguin.x - sp.x
dy = penguin.y - sp.y
if abs(dx) < 48 and abs(dy) < 48:
penguin.x = sp.x + 48 * abs(dx) / dx
self.formatPos()
return
pass
def checkHitFloorY(self):
penguin = self.penguin
for sp in self.children:
if sp.name == "C":
dy = penguin.y - sp.y
dx = penguin.x - sp.x
if abs(dx) < 48 and abs(dy) < 48:
penguin.y = sp.y + 48 * abs(dy) / dy
if dy < 0:
penguin.isStand = True
penguin.speedY = 0
self.formatPos()
def formatPos(self):
penguin = self.penguin
if penguin.x < 0:
penguin.x += 1024
elif penguin.x > 1024:
penguin.x -= 1024
if penguin.y < 0:
penguin.y += 768
elif penguin.y > 768:
penguin.y -= 768
pass
def checkHit(self):
penguin = self.penguin
for sp in self.children:
if sp.name == "C" or sp.name == "P" or sp.name == "M":
continue
dx = sp.x - penguin.x
dy = sp.y - penguin.y
if sp.name == "Z":
if abs(dx) < 55 and abs(dy) < 40:
return self.fail()
elif sp.name == "I":
if abs(dx) < 50 and abs(dy) < 50:
return self.complete()
elif sp.name == "H":
if self.hitHammer(sp):
return self.fail()
pass
def hitHammer(self, hm):
penguin = self.penguin
points1 = [
HPoint(penguin.x - 25, penguin.y - 25),
HPoint(penguin.x + 25, penguin.y - 25),
HPoint(penguin.x + 25, penguin.y + 25),
HPoint(penguin.x - 25, penguin.y + 25)
]
ang = hm.rotation * math.pi / 180
c = math.cos(ang)
s = math.sin(ang)
ps2 = [
[-25, 65],
[25, 65],
[25, 100],
[-25, 100],
[-5, 0],
[5, 0],
[5, 65],
[-5, 65]
]
points2 = []
for a in ps2:
p = HPoint(hm.x + c * a[0] - s * a[1],
hm.y + s * a[0] + c * a[1])
points2.append(p)
return Sat.test(points1, points2[:4]) or Sat.test(points1, points2[4:])
def fail(self):
self.state = 2
def complete(self):
self.state = 1
pass
def start(self, arr):
self.initLevel(arr)
pass
def initLevel(self, arr):
#fill("ice-c-bg@004k")
self.penguin = None
self.icecream = None
self.menu = None
self.count = 0
self.state = 0
self.clear()
i = 0
names = {
"H": "ice-c-hm@004p",
"P": "ice-c-p1@004u",
"I": "ice-c-i@004o",
"C": "ice-c-c@005N",
"Z": "ice-c-zhu@004s"
}
while i < len(arr):
s = arr[i]
x = arr[i+1]
y = arr[i+2]
i+=3
sp = self.addSp(names[s], x, y, s)
if s == 'H':
sp.rotation = arr[i]
i+=1
elif s == 'P':
self.penguin = sp
elif s == 'I':
self.icecream = sp
self.menu = self.addSp("ice-c-home@004q", 1024-50, 50, "M")
self.icecream.front()
self.penguin.front()
self.menu.front()
pass
pass
class Game:
def __init__(self):
self.homeLayer = Home()
self.menuLayer = LevelSelectMenu()
self.gameLayer = Gamelayer()
self.layers = [self.homeLayer, self.menuLayer, self.gameLayer]
self.maxLevel = 0
self.level = 0
self.goHome()
pass
def hideAll(self):
for layer in self.layers:
layer.visible = False
pass
def update(self):
for layer in self.layers:
layer.update()
pass
def refresh(self):
for layer in self.layers:
layer.refresh()
pass
def tap(self):
for layer in self.layers:
if layer.visible and layer.tap():
break
pass
def complete(self):
self.nextLevel()
pass
def showMenu(self):
self.hideAll()
self.menuLayer.reset()
self.menuLayer.updateRecords(self.maxLevel)
self.menuLayer.visible = True
pass
def gameOver(self):
self.restart()
pass
def startLevel(self, level):
self.level = level
self.start()
pass
def goHome(self):
self.hideAll()
self.homeLayer.reset()
self.homeLayer.visible = True
pass
def nextLevel(self):
if self.level < 20 - 1:
self.level += 1
self.maxLevel = max(self.maxLevel, self.level)
self.start()
pass
def start(self):
self.hideAll()
self.gameLayer.reset()
self.gameLayer.visible = True
self.gameLayer.start(levels[self.level])
pass
def restart(self):
self.start()
pass
pass
game = Game()
keys = {"37": False, "38": False, "39": False, "32": False}
def tap():
updateMouse()
game.tap()
pass
def loop():
updateMouse()
game.update()
game.refresh()
pass
def updateMouse():
global x0,y0,x,y
x0 = y
y0 = 768 - x
def isKeydown(code):
return keys[code] or yaogan.isKeyDown(code)
def keydown(code, key):
keys[str(code)] = True
def keyup(code, key):
keys[str(code)] = False
class Yaogan:
def __init__(self, w = 768):
self.w = w
self.touches = []
self.touch0 = [0, 0, 0, 0]
self.touch1 = [0, 0, 0, 0]
self.keys = {"37": False, "38": False, "39": False, "40": False, "32": False}
self.loop()
def touch(self, x, y):
if x < self.w / 2:
self.touch0 = [x, y, x, y]
else:
self.touch1 = [x, y, x, y]
def touching(self, x, y):
if x < self.w / 2:
self.touch0[2] = x
self.touch0[3] = y
else:
self.touch1[2] = x
self.touch1[3] = y
def untouch(self, x, y):
if x < self.w / 2:
self.touch0 = [0, 0, 0, 0]
else:
self.touch1 = [0, 0, 0, 0]
def loop(self):
dx = self.touch0[2] - self.touch0[0]
dy = self.touch0[3] - self.touch0[1]
self.keys["37"] = dx < -20
self.keys["39"] = dx > 20
self.keys["38"] = dy < -20
self.keys["40"] = dy > 20
self.keys["32"] = self.touch1[0] != 0
delay(self.loop, 50)
def isKeyDown(self, key):
return self.keys[key]
pass
yaogan = Yaogan(1024)
def touch():
yaogan.touch(y, 768-x)
def untouch():
yaogan.untouch(y, 768-x)
def touching():
yaogan.touching(y, 768-x)
也可以下载代码,本地python环境运行(用pygame封装了xdf库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。