少儿学编程系列---如何绘制夏夜的满天星空

少儿编程教育最近受到越来越多的关注,编程未来将成为一个人的必备技能之一。turtle(海龟)绘图很适合用来引导少儿学习编程,通过简单的命令,可以轻松地绘制出精美的形状和图案。本系列教程基于python turtle库、数学知识,围绕一个主题,画出有意思的图案,激发少儿学习编程的兴趣、培养逻辑思维能力和创新能力,提高孩子解决问题的独立能力。

本文会包含如下内容:

  • 为什么要画满天星空
  • 如何画满天星空

本篇文章适合人群:python爱好者、少儿编程爱好者

1. 为什么要画满天星空

今天听孩子唱儿歌《小星星》,稚嫩、可爱的声音让人听了心旷神怡。

一闪一闪亮晶晶

满天都是小星星

挂在天上放光明

好像许多小眼睛

回想起小时候的夏天的晚上,抬头看着夜晚的星空,觉得好美。夜空、皎洁的月亮和那一眨一眨的星星给我带来无遐的想象。那一片黑蓝黑蓝的天空就像一张纸,而那些一眨一眨的星星就像一朵朵漂亮的花儿,又像一盏盏亮晶晶的灯,静静的躺在这张黑蓝黑蓝的纸上。

所以想使用turtle,画出心目的这幅影像。

2. 如何画满天星空

2.1 思路

  • 设置整个画布为800*800,星空的背景为黑色
  • 星星使用黄色的五角星表示,代码如下:
    def star(self, starTurtle, x, y, leftAngle, edgeLen):
        '''
        画一个五角星
        :param starTurtle: 画星星的画笔
        :param x: 起始点的横坐标
        :param y: 起始点的纵坐标
        :param leftAngle: 逆时针旋转度数
        :param edgeLen: 五角星的边长
        :return:
        '''
        starTurtle.pencolor('yellow')
        starTurtle.fillcolor('yellow')
        starTurtle.penup()
        starTurtle.goto(x, y)
        starTurtle.pendown()
        starTurtle.begin_fill()
        starTurtle.left(leftAngle)
        for _ in range(5):
            starTurtle.forward(edgeLen)
            starTurtle.right(144)
        starTurtle.end_fill()
        starTurtle.left(-leftAngle)
  • 满天的繁星,代表着有很多很多颗星星,并且星星会眨眼睛,所以注册一个定时器,定时刷新小星星,让小星星动起来,就像眨眼睛。关键代码是:self.screen.ontimer(self.drawStars, 50)
  • 星空中,当然有月亮。月亮使用两个相互遮挡的图表示,第一个圆的填充色使用桔黄色,第一个圆向右移动一些,并使用和星空相同的背景色填充,这样就能画出一轮弯月。

2.2 效果

2.3 源代码

import turtle
from random import randint
from turtle import *


class DrawStarSky:
    n = 15  # 星星的个数
    tts = []
    isFirst = True

    def __init__(self, n=15):
        self.n = n;
        self.screen = turtle.Screen()

        for _ in range(self.n):
            tmp = turtle.Turtle()
            tmp.hideturtle()
            tmp.penup()
            tmp.speed(30)
            self.tts.append(tmp)

    def drawStars(self):
        for i in range(self.n):
            x = randint(-390, 390)
            y = randint(0, 400)
            if not self.isFirst:
                # 随机星星的眨眼睛
                if randint(0, 100) % 3 == 0:
                    self.tts[i].clear()
                    self.star(self.tts[i], x, y, randint(0, 180), randint(2, 8))
            else:
                self.star(self.tts[i], x, y, randint(0, 180), randint(2, 8))
            self.isFirst = False
        self.screen.update()
        self.screen.ontimer(self.drawStars, 50)

    def drawMonn(self):
        speed(30)
        # 画月亮
        up()
        goto(100, 150)
        color('orange')
        begin_fill()
        circle(50)
        end_fill()

        up()
        goto(130, 150)
        color('black')
        begin_fill()
        circle(50)
        end_fill()

    def star(self, starTurtle, x, y, leftAngle, edgeLen):
        '''
        画一个五角星
        :param starTurtle: 画星星的画笔
        :param x: 起始点的横坐标
        :param y: 起始点的纵坐标
        :param leftAngle: 逆时针旋转度数
        :param edgeLen: 五角星的边长
        :return:
        '''
        starTurtle.pencolor('yellow')
        starTurtle.fillcolor('yellow')
        starTurtle.penup()
        starTurtle.goto(x, y)
        starTurtle.pendown()
        starTurtle.begin_fill()
        starTurtle.left(leftAngle)
        for _ in range(5):
            starTurtle.forward(edgeLen)
            starTurtle.right(144)
        starTurtle.end_fill()
        starTurtle.left(-leftAngle)


if __name__ == '__main__':
    screen = Screen()
    screen.setup(800, 800)
    screen.title('画满天星空 - cloudcoder出品')
    hideturtle()
    bgcolor('black')

    starSky = DrawStarSky(200)
    # 画月亮
    starSky.drawMonn()
    # 画星星
    DrawStarSky(200).drawStars()
    done()

相关文章

少儿编程学习Python这三本书就够了,入门到精通,8岁即可入手

最近有一些家长留言想让孩子学习Python让郭老师推荐书籍发现各种Python书籍一大堆不推荐:原因:1、书籍不是针对青少年使用。(根本看不懂)2、这些书籍无法让孩子参加考级。本期分享Python学习...

少儿学编程系列---使用python turtle画熊猫

turtle简介Turtle库是Python语言中一个很流行的绘制图像的函数库,利用它可以绘制图形,非常适合于引导少儿学习编程。常用绘图命令绘图有着许多的命令,这些命令可以划分为3种:运动命令,画笔控...

少儿编程课是智商税吗?深扒编程猫等4家编程课,给你们4点忠告

最近身边很多家长开始谈论起来要不要给孩子报编程课,看到别人都报了,不想让自己的孩子落后,但是对编程课一点也不了解,不知道为什么要学习编程课?难道是以后让孩子当程序员吗?其实我跟很多家长都有同样的疑惑,...

python少儿编程:鸡兔同笼算法

for ji in range(1,35,1): if (ji*2+(35-ji)*4)==94: print("鸡的只数为:",ji) print("兔的只数为:",...

Python少儿编程:序列和随机数(240820)

今天介绍另一种从指定的数字中随机选择的常见方法。当我们需要模拟掷骰子的结果时,按照上节课的方式,我们可以选择从[1,6](这是数学的表示方法,即表示从数字1到6,包含1和6)的范围内随机生成一个数字,...

Python少儿编程:for循环(240827)

看着快开学了,上周末带着孩子在九宫山玩了两天,省内自驾游,慢悠悠的还挺惬意。今天咱们就进入蓝桥青少Python等级考试的7级了。翻了翻真题,主要是for循环的相关知识点。回想过往教孩子的时候,循环真的...