做一个新的项目:滚动的小球[2]

前文:【1】

好的我们继续。

昨天的方案被推翻了:我又有了新方案。

就是:

让小球每按上一次,就可以增加高度值1,以此类推。

那么这就好办了:

先创建一个高度变量,再在函数里引用,把它加上1(当然要把它声明全局)

于是乎就这样:

gd=0
def jump():
    global gd
    gd+=1

对吧,木得毛病。

好的再让小球去到这个坐标就好了。

那么想要让小球去到这个坐标,我们就必须把小球也声明全局。所以我们把原来的global语句换成了这个:

global gb,t

然后我本人是不想用goto的:因为还要使用横坐标值。

于是乎我们就这么写(zuo)。不过,为了让跳起来的样子明显一点,我们要把gd变量乘上20.

    t.sety(gd*20)

木得毛病!

这是整个函数的代码:

gd=0
def jump():
    global gd,t
    gd+=1
    t.sety(gd*20)

好的程序现在67行了。继续干~

再就是调用函数了(捕捉键盘)

故我们要使用onkey或者onkeypress。

我用的是onkey。

【在While循环内】

turtle.onkey(jump,"Up")

不过我也不知道为什么,turtle必须先按一下<Tab>键才能捕获键盘动作。

反正现在能跳起来了!

但是,我们还要判断,当跳起来时即使有坑也不会掉进去。

套上一个if吧,以后再编起来还方便~

好的现在是这一整个程序:

#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)
gd=0
def jump():
    global gd,t
    gd+=1
    t.sety(gd*20)
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:
        if gd==0:
            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
        else:
            t.circle(0, -180)
            t.setheading(0)
            t.forward(sp)
    turtle.onkey(jump,"Up")
    time.sleep(0.01)
turtle.mainloop()

啊啊啊73行了!加油继续干!!!

好的现在至少跳起来不会判断掉坑了~

继续……续……续续干!!!!!

首先有一件小事:

原来的第43行

t.goto(-300,0)

因为高度不能每次刷新都变成0,所以要改成:

t.goto(-300,gd*20)

那么目前我们还需要做到一个目标:要下落!(来自牛顿的笑容)

那么我们就在else(67行)里搞事情吧!

这是我的代码:

 对不起图配错了

这就是我最终的代码:::

#coding=utf-8
import turtle
import time
import random
turtle.title("project:ball game----make it interesting and make you interested.")
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)
gd=0
ti=99999999999999999999999999999999999999999999999999
def jump():
    global gd,t,ti
    ti=int(time.time())
    gd+=1
    t.sety(gd*20)
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
    t.sety(gd*20)
    if tuple(t.position())[0]>300:
        timew=-1
        t.goto(-300,gd*20)
        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:
        if gd==0:
            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)
                print("over")
                break
        else:
            t.circle(0, -180)
            t.setheading(0)
            t.forward(sp)
            if int(time.time())-ti==1:
                gd-=1
    turtle.onkey(jump,"Up")
    time.sleep(0.01)
turtle.mainloop()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1.基本要求 能够实现如下功能: ‹ 首先用蓝色清屏 ‹ 在屏幕中央显示由字符串“-============#”组成的黄色的小球,#为球, 按下方向键可以控制上述小球球行方式在屏幕上行走 ‹ 在行进过程中,球只能左转、右转或继续前进,不能掉转 180 度 2.鼓励实现完整的彩球滚动游戏,鼓励有的创意 3.提示 ①通过调用 INT 16H 的 0 号功能可以读取光标控制键的扩展码 光标控制键: ↑ ↓ ← → 扩展码(十进制): 72 80 75 77 ②在指定位置用指定属性显示字符的方法有两种:一是直接写显示缓冲区,二是利用 BIOS 屏显功能调用。解: 功能描述(基本上是全部功能):本程序有以下功能 共分为7关,可以手工选择关卡(带有输入异常处理)。走完一关后,如果后面还有关, 直接跳到下一关。否则,结束游戏。各个关之间的差别是速度不同。 按下方向键,球能够按照题的要求在屏幕上行走。按下 ESC 键,退出游戏,按下其他键, 程序不理会。 长时间不按键,球会自动前进。 能够产生随机数,作为蛋。球的初始大小为 14,当大小为 20 时,此关结束。 如果球运动到了边界,球死亡。游戏结束。 ① 设计思路 程序开始时,由用户指定一个关卡,进入游戏。 每次用清屏加显示字符的方式重显示球和蛋。 当检测到有键子按下时,判断是什么键子,如果是 esc,退出游戏,如果是方向键,按 正确的方向走(如果方向键与球运动方向相反,不理会按键),如果按下的时其它键, 不理会。 设置一个等待时间,如果超过等待时间仍没有按键,球自动前行一步。否则,重比较 时间。 每次球运动或有键子被按下时,判断是否撞到了自身和边界。 如果吃到了一个蛋,更完球的位置后,将原球的位置加入球中。 如果球的长度达到了 20(设置的球的最大大小),判断后面是否还有关,没有了,就结 束程序,还有,就跳到下一关卡。 ② 算法说明 设置两个标记变量,分别记录球的大小 ssize 和球上次的大小 befor。设置标记变量, 分别记录蛋的横纵座标 xlabel 和 ylabel,设置标记变量,记录球的位置 tailx 和 taily。设置 snake 记录球各个部分的位置,设置球的最大大小为 20。设置变量 TIME 为等待按键时间。 关卡的选择:程序开始时,从键盘读入一个数字,当作关卡,根据读入的数据,设置等 待时间,也就实现了对球的速度的控制。 清屏和显示小球和蛋。调用 bios 中断可以实现。每次输出 1 个球,下面说一下如何实现小球的手工移动(有按键输入时)。可以知道,如果把球看成一个 个单元,球每移动一次,它的身体的位置都等于它的前一个身体单元的上一步 的位置,因此,可以从尾部进行循环,把前一节的位置给后一节。这样循环 ssize-1 次 就更了身体,再根据输入的按键判断如何如移动头部,如果按键是左或者右, 只需将球的列加减 1,如果按键是上或者下,只需将球的行加减 1。至此,完成了 对球的显示位置的更,之后重清屏、显示,可以使球移动了。 在判断球是否向相反方向走时,可以采用如下算法:已知按键了(以向上为例),检查 球和身体第一节的行号,如果球行号大,说明此时设在向下运动,按键无效。 判断球撞到边界的算法如下(以向上键为例):判断球此时的行号是否为 0,如果是 0, 又按下了向上键,结束游戏,输出“I AM DEAD!!!”。如果球运动过程中撞到了自己, 也同撞到边界的操作。算法是这样的:取出球的位置,依次和每个身体和尾巴的位置 进行比较(从球开始比较),如果相等,说明撞上了,结束游戏。 如何实现球的自动移动。可以用 INT 10H 的 1 号功能检测是否有按键输入,如果有,转 到手工移动模块,否则,调用 INT 1AH 中的 00 号功能,读取当前时间。与上次读的时 间相比,如果小于设定的时间,重比较,否则,球自动前移。实现前移的算法与手工 移动相似,也是将身体的某一单元的位置置成塔前一单元上一次的位置,之后判断球 方向。 产生并输出蛋。相当于产生一个随机数,我已经读去了当前时间,可以利用 DX 移位(防 止溢出)以后,对 80 和 25 取余,获得位置的随机数。之后判断球的大小 ssize 和 befor, 先让 ssize 为 14,befor 为 13,每产生一个随机数,befor 加 1,每吃一个蛋,ssize 加 1。比较 ssize 和 befor,如果相等,证明球没有吃蛋,不用产生随机数,仍在 原位置输出随机数,否则,产生随机数。球的大小的变化。每次吃到一个蛋后,ssize加1,并且将更前球的位置加入到snake, 这样下次输出就能够多输出一个球,实现了大小的增加。 关卡的切换:每当球吃了一个蛋以后,判断是否达到了球的最大大小20,如果达到了, 继续判断是否的达到了等待时间的最小值(也就是最高的一关),如果没有达到,就更 等待时间,进入下一关卡之前,还要将球的大小 ssize 和初始大小befor 分别设为 14 和 13。将记录球位置的内存 snake 的前 14 个字更屏幕中央。之后,就可以进入下 一关了。如果已经达到了最高关,并且通过了,就结束程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Unconquerable p

给点吧~

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

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

打赏作者

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

抵扣说明:

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

余额充值