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

yumo6666个月前 (06-15)技术文章42

少儿编程教育最近受到越来越多的关注,编程未来将成为一个人的必备技能之一。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少儿编程:序列和随机数(240820)

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

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

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

用Python编写一个简单程序

按照软件行业传统习惯,当你学习一种新的编程语言如Python时,首先编写一个“Hello World! ”程序。请执行以下步骤,以创造你的“Hello World!” Python程序。1.打开“开始...

阿码奇星空 少儿编程 python 二级 程序题2022-04-15

少儿编程 python 二级 程序题试卷2022-04-15试卷答题时间90分钟开卷答题,每道题目按照题中的文件名进行保存,答题结束之后,把所有程序文件打包,压缩包名字按照:姓名-pylv2-2022...

少儿python编程:找出100以内能被3整除的数

常规编程方法:for num in range(101): if num>=3 and num%3==0: print(num,end=',')另外一种编程方法:for num...

使用Google Speech API在Python中进行语音识别

语音识别是家庭自动化、人工智能等应用中的一个重要特性,本文介绍了如何利用Python语言识别库。所需的组件必须安装以下组件:1)Python语音识别模块:sudo pip install Speech...