【青少年编程】黄羽恒:平行空间
「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复【Scratch】或【Python】,即可进入。如果加入了之前的社群不需要重复加入。
微信后台回复“资料下载”可获取以往学习的材料(视频、代码、文档)。
编程题
“平行空间”是来自「青少年编程竞赛交流群」中 「黄羽恒」 小朋友的作品。
什么是“平行空间”呢?
这里指的就是可以把二维空间压缩到一维空间,即把平面上的曲线压缩成一条直线。
程序运行后,用户可以在平面上通过鼠标绘制一条或多条曲线。
用户停止绘制后,程序自动把这些平面上的曲线压缩成一条直线。
1. 思路分析
鼠标状态有两种,一种是按下MOUSEBUTTONDOWN
,一种是弹起MOUSEBUTTONUP
。
绘制曲线,就是把鼠标的坐标点存入列表,把前后坐标点通过短直线连接起来,不停的刷新重绘。
曲线压缩成直线,可以让这些坐标点的X坐标不变,把Y坐标逐渐减小直到平面的下方,这样就可以实现二维向一维的折叠。
2. 程序代码
import pygame
import sys
import time
pygame.init()
screen = pygame.display.set_mode([800, 600])
pygame.display.set_caption('平行空间')
clock = pygame.time.Clock()
is_mouse_down = False
mouse_path_full = []
current_mouse_path = []
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
last_draw_time = -1
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.MOUSEBUTTONDOWN:
is_mouse_down = True
if event.type == pygame.MOUSEBUTTONUP:
is_mouse_down = False
tmp = current_mouse_path[:]
mouse_path_full.append(tmp)
current_mouse_path.clear()
last_draw_time = time.time()
screen.fill(WHITE)
if is_mouse_down:
pos = pygame.mouse.get_pos()
current_mouse_path.append([pos[0], pos[1]])
if len(current_mouse_path) > 1:
pygame.draw.lines(screen, BLACK, False, current_mouse_path, 2)
if len(mouse_path_full) > 0:
for x in mouse_path_full:
pygame.draw.lines(screen, BLACK, False, x, 2)
if time.time() - last_draw_time > 6:
for x in mouse_path_full:
for y in x:
if y[1] + 80 < 600:
y[1] += (time.time() - last_draw_time)
pygame.display.update()
clock.tick(60) # 帧速率
3. 结果展示
基础知识:
一级编程题:
01 森林的一天 02 舞者凯希 03 小狗散步 04 猫捉老鼠 05 城堡漫步 06 火箭发射 07 飞向太空 08 小狗长大记 09 运动起来 10 动物园之旅 11 球飞了 12 希神吓走猫头鹰 13 棒球运动会
二级编程题:
01 飞不出去的蝴蝶 02 巡线小车 03 绘制雪花图案 04 制作蝙蝠冲关游戏 05 飞翔的小鸟 06 绘制十个正方形 07 别碰红块 08 小鸡捉害虫 09 垃圾分类 10 两座对称的山峰 11 寻找宝石 12 绘制方形螺旋
三级编程题:
小朋友投稿:
Scratch:
Python:
群内答疑:
Scratch:
Python: