今天,我们开始一起做一个项目。
一步步来吧
Step 1:
#coding=utf-8
import turtle
import random
好的接下来做一下基础配置
t=turtle.Pen()
turtle.done()
来窗口就做好了。
但是绝不能只有这么一点点:如果想让它移动,最好先把它的画笔抬起来,防止留下痕迹。
import turtle
import random
t=turtle.Pen()
t.penup()
turtle.done()
这就是目前的程序了
Step2
我们来做一下画笔的形状
t.shape("circle")
很不错!
Step3
好接下来需要再来一个画笔来画地面:
g=turtle.Pen()
g.penup()
g.goto(-300,-10)
让它画一条线,看一下效果是不是在t画笔的下面:
g.pendown()
g.forward(600)
这是结果:
好的非常不错!!!
接下来我想让这个小球回到开始的位置:
t.goto(-300,0)
然后,再把画笔g隐藏:
g.hideturtle()
现在看效果:
很不错,基本达到效果了。
再调整一下界面:
turtle.title("project:ball")
turtle.bgcolor("blue")
结果背景颜色太深,就改成了skyblue.
turtle.title("project:ball")
turtle.bgcolor("skyblue")
还有就是把小球的颜色改一改
t.fillcolor("red")
这是效果
还不错!!!
这是目前的代码(经过顺序调整)
#coding=utf-8
import turtle
import random
turtle.title("project:ball")
turtle.bgcolor("skyblue")
t=turtle.Pen()
t.penup()
t.shape("circle")
t.goto(-300,0)
t.fillcolor("red")
g=turtle.Pen()
g.penup()
g.goto(-300,-10)
g.pendown()
g.forward(600)
g.hideturtle()
turtle.mainloop()
Step4
好我们要让小球移动了。
想让它移动,就要用forward或者goto,明显forward更容易。
因为在游戏结束前它要一直向前,所以可以用上while。
while True:
t.forward(1)
光这样还不行,否则球就飞出去了。
加上time模块吧
import time
然后把while改成这样:
while True:
t.forward(1)
time.sleep(0.01)
速度还可以。
不过为了以后增加速度,我又改了一下while程序:
sp=1
while True:
t.forward(sp)
time.sleep(0.01)
然后让小球及时返回
...
while True:
if tuple(t.pos)[0]>300:
t.goto(-300,0)
else:
t.forward(sp)
time.sleep(0.01)
结果报错了。TypeError
不得不修改了一下while那一段。
sp=4
t.speed(0)
g.speed(0)
while True:
if tuple(t.position())[0]>300:
t.goto(-300,0)
else:
t.forward(sp)
time.sleep(0.01)
速度最好快一点,所以我设成了speed(0)【最快】
非常好
就在这个时候,我突然想到:这不是平移吗?
改改改!!!
sp=5
t.speed(0)
g.speed(0)
while True:
if tuple(t.position())[0]>300:
t.goto(-300,0)
else:
t.circle(0,-180)
t.setheading(0)
t.forward(sp)
time.sleep(0.01)
不过,因为是圆形,而且速度很快,其实看不大出来[○・`Д´・ ○]
好的我们继续。
地图需要重画,因为每一次相当于到了新的地方。
改进后的所有程序:
#coding=utf-8
import turtle
import random
import time
turtle.title("project:ball")
turtle.bgcolor("skyblue")
t=turtle.Pen()
t.penup()
t.shape("circle")
t.goto(-300,0)
t.fillcolor("red")
g=turtle.Pen()
g.penup()
g.goto(-300,-10)
g.pendown()
g.forward(600)
g.hideturtle()
sp=5
t.speed(0)
g.speed(0)
while True:
if tuple(t.position())[0]>300:
t.goto(-300,0)
g.clear()
g.penup()
g.goto(-300,-10)
g.pendown()
else:
t.circle(0,-180)
t.setheading(0)
t.forward(sp)
g.forward(sp)
time.sleep(0.01)
turtle.mainloop()
现在要做生成路的了:
Step5
def make_road():
rd=[]#路
for i in range(600):
a=random.randint(1,3)#随机
if a==1:
rd.append(" ")#陷阱(空的)
else:
rd.append("-")#正常路面
return rd
好的再调用一下就好了
这是现在的程序【有一些细微改动没有说】:
#coding=utf-8
import turtle
import time
import random
turtle.title("project:ball")
turtle.bgcolor("skyblue")
t=turtle.Pen()
t.penup()
t.shape("circle")
t.goto(-300,0)
t.fillcolor("red")
g=turtle.Pen()
g.penup()
g.goto(-300,-10)
g.pendown()
g.forward(600)
g.hideturtle()
sp=5
t.speed(0)
g.speed(0)
def make_road():
global g
rd=[]
for i in range(600):
a=random.randint(1,3)
if a==1:
rd.append(" ")
else:
rd.append("-")
return rd
while True:
if tuple(t.position())[0]>300:
t.goto(-300,0)
g.clear()
g.penup()
g.goto(-300,-10)
g.pendown()
f=make_road()
for i in f:
if i=="-":
g.forward(1)
else:
g.penup()
g.forward(1)
g.pendown()
else:
t.circle(0,-180)
t.setheading(0)
t.forward(sp)
time.sleep(0.01)
turtle.mainloop()
51行了~继~~续~~
【手动脑溢血】
突然我想到,1/600的小格子,怎么看!!!!!!!!
改~~~~~~~~~~~~~
【手动脑溢血】x 100000000
【当然,我进行了很多地方的微调,整体不大影响】
#coding=utf-8
import turtle
import time
import random
turtle.title("project:ball")
turtle.bgcolor("skyblue")
turtle.setup(600,600,0,0)
t=turtle.Pen()
t.penup()
t.shape("circle")
t.goto(-300,0)
t.fillcolor("red")
g=turtle.Pen()
g.penup()
g.goto(-300,-10)
g.pendown()
g.forward(600)
g.hideturtle()
sp=5
t.speed(0)
g.speed(0)
def make_road():
global g
rd=["-","-","-"]
for i in range(17):
a=random.randint(1,2)
if a==1 and not( rd[-1]==rd[-2]==rd[-3]==" "):
rd.append(" ")
else:
rd.append("-")
return rd
while True:
if tuple(t.position())[0]>300:
t.goto(-300,0)
g.clear()
g.penup()
g.goto(-300,-10)
g.pendown()
f=make_road()
for i in f:
if i=="-":
g.forward(30)
else:
g.penup()
g.forward(30)
g.pendown()
else:
t.circle(0,-180)
t.setheading(0)
t.forward(sp)
time.sleep(0.01)
turtle.mainloop()
52行了!
来先看看效果【是在第一行完整行过去之后,也就是开始生成路面之后】
Step 6
看看上面的图片,牛顿已经要哭了~
没错,我们要进行一下介个改造——加入失败系统
因为后来我们需要变量 f,所以在第一遍的判断时不得不先加入f。
f=["-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-"]
于是在无数次的报错后,全部的程序变成了这样:
#coding=utf-8
import turtle
import time
import random
turtle.title("project:ball")
turtle.bgcolor("skyblue")
turtle.setup(600,600,0,0)
t=turtle.Pen()
t.penup()
t.shape("circle")
t.goto(-300,0)
t.fillcolor("red")
g=turtle.Pen()
g.penup()
g.goto(-300,-10)
g.pendown()
g.forward(600)
g.hideturtle()
sp=5
t.speed(0)
g.speed(0)
def make_road():
global g
rd=["-","-","-"]
for i in range(17):
a=random.randint(1,2)
if a==1 and not( rd[-1]==rd[-2]==rd[-3]==" "):
rd.append(" ")
else:
rd.append("-")
return rd
f=["-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-","-"]
timew=-1
while True:
timew+=1
if tuple(t.position())[0]>300:
timew=-1
t.goto(-300,0)
g.clear()
g.penup()
g.goto(-300,-10)
g.pendown()
f=make_road()
for i in f:
if i=="-":
g.forward(30)
else:
g.penup()
g.forward(30)
g.pendown()
else:
s=(timew+1)%20
if f[int(timew/int(600/(20*sp)))]=="-":
t.circle(0,-180)
t.setheading(0)
t.forward(sp)
else:
t.setheading(-90)
t.forward(300)
break
time.sleep(0.01)
turtle.mainloop()
试验后,发现很不错呦~
Step7
是的,需要让小球跳起来了。
目前,我打算按上键让小球蹦起来,所以要用到onkey/onkeypress。
说实话我已经懒到不想再改程序了。
啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊我要废了
TAT泪千行
行我们继续干!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
首先,我们要构思:允不允许多段跳?
我的想法是,最多允许2段跳。
那么问题来了:怎么做出这一个限制?
其实我们可以让它跳跃的时间短一点,以至于最多只能连跳两次。
后文见:【2】