做一个新的项目:滚动的小球。

今天,我们开始一起做一个项目。

一步步来吧

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】

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unconquerable p

给点吧~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值