加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

海龟编辑器学习记录

(2020-04-29 16:30:55)
分类: 研究-学习
https://www.aimaker.net.cn/live/l_5e9e6473dbe07_3ZarJcEp
平台选择编程猫的海龟编辑器,主要考虑它的库管理功能非常方便,直接点击按钮就能实现文件库的安装。此外他还支持在本地和云端保存文件。
python社的在线直播中,河海大学的童晶老师介绍了通过趣味游戏开发的方法来学习python编程,开发学生特别是低年级学生的计算思维能力。他的理念是在玩中学,只将必要的语法知识穿插在案例中介绍,不给儿童增加较大的负担。他编写的教材《python游戏趣味编程》预计在五月份出版。

在视频讲座中他重点介绍了两个案例,分别是“弹跳的小球”和“美丽的圆圈画”。
在弹跳的小球中,他大概分为了十个步骤,下面逐一记录一下。
1,首先是安装游戏开发库。分别是pygame和pygame zero。安装完成后,输入代码
import pgzrun
pgzrun.go()
此时会弹出一个空白的黑色的窗口(pygame zero game)
2,显示一个空心圆,
import pgzrun
def draw():
     screen.draw.circle((400,300),100,"white")
pgzrun.go()

3,设置小球颜色。如果要将小球设置有填充颜色,可以用filled_circle代替circle
import pgzrun
def draw():
    screen.draw.filled_circle((400,300),100,"white")
pgzrun.go()

【提供一些颜色,如white,blue,yellow,red,orange,purple】
如果要更改背景的颜色,可以添加一句 screen.fill("white")
import pgzrun
def draw():
    screen.fill("white")
    screen.draw.filled_circle((400,300),100,"red")
pgzrun.go()
4,显示多个小球。(需要涉及到坐标的概念,在python坐标中,(0,0)位于左上角,向右为X正值,向下为Y正值)
import pgzrun
def draw():
    screen.fill("white")
    screen.draw.filled_circle((150,300),100,"red")
    screen.draw.filled_circle((400,300),100,"red")
    screen.draw.filled_circle((650,300),100,"red")
pgzrun.go()

学习了以上知识之后,就可以绘制一个笑脸的图标了。【小练习阶段】
import pgzrun
def draw():
    screen.fill("white")
    screen.draw.circle((350,300),200,"black")
    screen.draw.circle((260, 200), 50, "black")
    screen.draw.filled_circle((240, 200), 30, "black")
    screen.draw.circle((410, 200), 50, "black")
    screen.draw.filled_circle((390, 200), 30, "black")
    screen.draw.circle((335, 350), 15, "black")
    screen.draw.circle((335, 430), 35, "black")


pgzrun.go()
5,使用变量
(如果要调整上面小球的大小、位置等,相同的操作可能要进行3遍,有没有更加简便的方法?)变量就是一个会变化的量
如半径r,Y坐标y
import pgzrun
r=50
def draw():
    screen.fill("white")
    screen.draw.filled_circle((150,300),r,"red")
    screen.draw.filled_circle((400,300),r,"red")
    screen.draw.filled_circle((650,300),r,"red")
pgzrun.go()

6,逐渐变大的小球 【需要用到一个新的函数,update()】

import pgzrun
r=1
def draw():
    screen.fill("white")
    screen.draw.filled_circle((150,300),r,"red")

def update():    
global r
r=r+1
pgzrun.go()   #此命令在最后


7,小球逐渐下落【改变Y坐标】

import pgzrun
y=0
def draw():
    screen.fill("white")
    screen.draw.filled_circle((400,y),50,"red")

def update():
    global y
    y=y+5
pgzrun.go()


小球落下去就没有了,怎么样让小球落下后再回到顶端接着下落呢?【if语句】
def update():
    global y
    y=y+1
    if y>630:    #高度大约在650左右
        y=0

8,if语句与比较运算符(表达式等)
x=3
y=5
if x>y:         #x是否大于y
  print("x大")
if x==y: #x是否等于y
  print("x与y一样大")
if x #x是否小于y
  print("y大")

x!=y  #x是否不等于y
x>=y   #x是否大于或等于y
x<=y   #x是否小于或等于y
练习题:
编程计算11*13*15*17,并用if语句判断结果是否大于30000


9,改变小球下落的速度  (定义变量speed_y)
#下落的小球
import pgzrun
y=0
speed_y = 3   #变量命名的规范,提高程序可读性

def draw():
    screen.fill("white")
    screen.draw.filled_circle((400, y), 50, "red")

def update():
    global y
    y = y+speed_y
pgzrun.go()

实现小球触底反弹:

import pgzrun
y=0
speed_y = 30

def draw():
    screen.fill("white")
    screen.draw.filled_circle((400, y), 50, "red")

def update():

    global y,speed_y   注意此处定义2个全局变量,否则出错。为什么上面可以不用定义speed_y变量呢??
    y = y+speed_y
    if y>570:
       speed_y=-speed_y

pgzrun.go()

实现来回弹:
def update():

    global y,speed_y   
    y = y+speed_y
    if y>570:
       speed_y=-speed_y
    if y<30:
       speed_y=-speed_y

此处可以用上表达式,合并条件:
    if y>570 or y<30:
       speed_y=-speed_y

此处补充逻辑运算符的概念:
print(3>2)
print(4>5)

print(not(3>2))
print(not(4>5))

print((3>2)or(4>5))
print((3>2)and(4>5))


引入更多变量:(代码更加规范)

import pgzrun
HEIGHT=600
WIDTH=800
y=100
speed_y=3
r=30
def draw():
    screen.fill("white")
    screen.draw.filled_circle((WIDTH/2,y),r,"red")

def update():
    global y,speed_y
    y=y+speed_y
    if y>=HEIGHT-r or y<=r:
        speed_y=-speed_y

pgzrun.go()     


10,增加x方向速度

import pgzrun   #导入游戏库
HEIGHT=600      #设置窗口的高度
WIDTH=800 #设置窗口的宽度
x=WIDTH/2 #小球的x坐标,初始化在窗口中间 
y=HEIGHT/2 #小球的y坐标,初始化在窗口中间
speed_x = 3 #小球x方向的速度
speed_y = 3 #小球y方向的速度
r=30 #小球的半径

def draw(): #绘制模块,每帧重复执行
    screen.fill("white")  #白色背景
    #绘制一个填充圆,坐标(x,y),半径r,红色
    screen.draw.filled_circle((x,y),r,"red") 

def update():    #更新模块,每帧重复操作
    global x,y,speed_x,speed_y #要修改的变量在这里说明下
    x = x+speed_x #利用x方向速度更新x坐标
    y = y+speed_y #利用y方向速度更新y坐标
    if y>=HEIGHT-r or y<= r: #当小球碰到上下边界时
        speed_y=-speed_y     #y方向速度反转 
    if x >= WIDTH-r or x <= r:#当小球碰到左右边界时
        speed_x = -speed_x    #x方向速度反转

pgzrun.go()  #开始执行游戏


增加注释
增加代码可读性

练习,实现线条穿插绘制的效果??
如何实现呢,目前还没有明确的办法。
思路:滚动的球变成了线条,就是将球的半径变小,同时一直显示其移动轨迹,所以update函数不能再使用了。
要出现很过个球,是用随机数的方式?
但是用这种方式不能显示画图的过程,只是显示最终的结果。加入time.sleep(1)则执行速度很慢。

==========
有问题的代码:
import pgzrun
import time
HEIGHT = 600
WIDTH = 800
x = WIDTH/2
y = HEIGHT/2
speed_x = 3
speed_y = 3
r = 3


def draw():
    global x, y, speed_x, speed_y
  screen.fill("white")
  screen.draw.filled_circle((x, y), r, "red")
    for i in range(30):
        x = x+speed_x
        y = y+speed_y
        if y >= HEIGHT-r or y <= r:
            speed_y = -speed_y
        if x >= WIDTH-r or x <= r:
            speed_x = -speed_x
        screen.draw.filled_circle((x, y), r, "red")
        time.sleep(1)
#def update():
  global x, y, speed_x, speed_y
  x = x+speed_x
  y = y+speed_y
  if y >= HEIGHT-r or y <= r:
      speed_y = -speed_y
  if x >= WIDTH-r or x <= r:
      speed_x = -speed_x


pgzrun.go()

========

待续!

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有