Python画小仓鼠

Posted 阿黎逸阳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python画小仓鼠相关的知识,希望对你有一定的参考价值。

肉嘟嘟的小动物很是可爱,本文介绍运用Python中的turtle库控制函数绘制小仓鼠。
  

文章目录

  

一、效果展示

  
在介绍代码之前,先来看下本文的实现效果。

可以参考Pinstaller(Python打包为exe文件)一文把Python文件转化成exe,发给未安装Python的他/她。

  
  

二、代码详解

  
Python绘制小仓鼠的原理是:应用turtle库绘制身体的不同部位。

  

1 导入库

  
首先导入本文需要加载的库,如果你有些库还没有安装,导致运行代码时报错,可以在Anaconda Prompt中用pip方法安装。

# -*- coding: UTF-8 -*-
'''
代码用途 :画小仓鼠
作者     :阿黎逸阳
博客     :  https://blog.csdn.net/qq_32532663/article/details/106176609
'''
import os
import pygame
import turtle as t 

本文应用到的库较少,只应用了os、pygame和turtle三个库。
  
os库可以设置文件读取的位置。
  
pygame库是为了绘制过程更有趣,在绘图过程中添加了背景音乐。
  
turtle库是绘图库,相当于给你一支画笔,你可以在画布上用数学逻辑控制的代码完成绘图。

  
  

2 播放音乐

  
接着应用pygame库播放背景音乐,本文的音乐是《Eran - 春の思い出》。

#播放音乐
print('播放音乐')
pygame.mixer.init()
pygame.mixer.music.load(r"F:\\公众号\\64.小仓鼠\\Eran - 春の思い出.mp3") 
pygame.mixer.music.set_volume(0.5) 
pygame.mixer.music.play(1, 10)

这一部分的代码和整体代码是剥离的,可以选泽在最开始放上该代码,也可以直接删除。如果选择播放音乐,需要在代码music.load函数中把你想放音乐的电脑本地存放地址填进去。有部分朋友对这一块有疑问,填充格式可参考如下图片:

  
  

3 定义画小仓鼠头的函数

  
然后设置画板的大小,并定义绘制小仓鼠头的函数。

t.title('阿黎逸阳的代码公众号')
t.speed(10)
#t.screensize(1000, 800)
t.setup(startx=0, starty = 0, width=800, height = 600)
print('画右耳朵')
#画右耳朵
t.penup()
t.goto(100, 150)
t.pendown()
t.pensize(0.5)
t.color('cornsilk')
#t.color('cornsilk', 'cornsilk')
t.begin_fill()
t.setheading(40)
t.circle(40, 20)
t.circle(7, 180)
t.right(22)
t.circle(50, 12)
print('画头')
#画头
t.setheading(173)
t.circle(200, 14)
print('画左耳朵')
#画左耳朵
t.setheading(120)
t.circle(40, 20)
t.circle(7, 180)
t.right(22)
t.circle(50, 12)
print('画左脸')
#画左脸
t.setheading(230)
t.circle(200, 10)
t.setheading(190)
t.circle(20, 100)
print('画脸上的波浪线')
#画脸上的波浪线
t.setheading(60)
t.circle(-30, 100)
t.setheading(60)
t.circle(-10, 130)
t.setheading(70)
t.circle(-10, 130)
t.setheading(40)
t.circle(-38, 100)
t.setheading(56)
t.circle(20, 130)
t.setheading(110)
t.circle(80, 22)
t.end_fill()

关键代码详解:
  
t.pensize(width):设置画笔的尺寸。
  
t.color(color):设置画笔的颜色。
  
t.penup():抬起画笔,一般用于另起一个地方绘图使用。
  
t.goto(x,y):画笔去到某个位置,参数为(x,y),对应去到的横坐标和纵坐标。
  
t.pendown():放下画笔,一般和penup组合使用。
  
t.left(degree):画笔向左转多少度,括号里表示度数。
  
t.right(degree):画笔向右转多少度,括号里表示度数。
  
t.circle(radius,extent,steps):radius指半径,若为正,半径在小乌龟左侧radius远的地方,若为负,半径在小乌龟右侧radius远的地方;extent指弧度;steps指阶数。
  
画外轮廓的关键是:通过调节circle函数中的半径和弧度来调节曲线的弧度,从而使得小仓鼠的轮廓比较流畅。

  
  

4 定义画左眼和右眼的函数

  
接着定义画左眼和右眼的函数。

print('画左眼睛')
#画左眼睛
t.penup()
t.goto(30, 115)
t.pendown()
t.color('black')
t.begin_fill()
t.setheading(5)
t.circle(-20, 40)
t.setheading(60)
t.circle(6, 205)
t.end_fill()
print('画右眼睛')
#画右眼睛
t.penup()
t.goto(90, 116)
t.pendown()
t.color('black')
t.begin_fill()
t.setheading(180)
t.circle(20, 40)
t.setheading(120)
t.circle(-6, 205)
t.end_fill()

  
  

5 定义画嘴的函数

  
接着定义画嘴的函数。

#画嘴巴
t.color('black', 'yellow')
t.begin_fill()
t.setheading(-20)
t.circle(10, 60)
t.setheading(290)
t.circle(-30, 30)
t.circle(-9, 180)
t.left(20)
t.circle(-50, 12)
t.setheading(-22)
t.circle(10, 60)
t.end_fill()

至此,在Python中实现小仓鼠的绘制逻辑已大致讲解完毕。快喊你喜欢挑战的朋友一起把缺失部分补充完整吧。
  
你可能感兴趣:
用Python绘制皮卡丘
用Python绘制词云图
用Python绘制520永恒心动
Python人脸识别—我的眼里只有你
Python画好看的星空图(唯美的背景)
【Python】情人节表白烟花(带声音和文字)
用Python中的py2neo库操作neo4j,搭建关联图谱
Python浪漫表白源码合集(爱心、玫瑰花、照片墙、星空下的告白)

luogu 3398 仓鼠找sugar

题目描述

小仓鼠的和他的基(mei)友(zi)$sugar$住在地下洞穴中,每个节点的编号为$1~n$。地下洞穴是一个树形结构。这一天小仓鼠打算从从他的卧室$(a)$到餐厅$(b)$,而他的基友同时要从他的卧室$(c)$到图书馆$(d)$。他们都会走最短路径。现在小仓鼠希望知道,有没有可能在某个地方,可以碰到他的基友?

小仓鼠那么弱,还要天天被zzq大爷虐,请你快来救救他吧!

输入输出格式

输入格式
第一行两个正整数$n$和$q$,表示这棵树节点的个数和询问的个数。

接下来$n-1$行,每行两个正整数$u$和$v$,表示节点u到节点v之间有一条边。

接下来$q$行,每行四个正整数$a$、$b$、$c$和$d$,表示节点编号,也就是一次询问,其意义如上。

输出格式
对于每个询问,如果有公共点,输出大写字母“Y”;否则输出“N”。

输入输出样例
输入样例#1:
5 5
2 5
4 2
1 3
1 4
5 1 5 1
2 2 1 4
4 1 3 4
3 1 1 5
3 5 1 4
输出样例#1:
Y
N
Y
Y
Y

说明

本题时限1s,内存限制128M,因新评测机速度较为接近NOIP评测机速度,请注意常数问题带来的影响。

20%的数据$ n<=200,q<=200$

40%的数据 $n<=2000,q<=2000$

70%的数据 $n<=50000,q<=50000$

100%的数据 $n<=100000,q<=100000$

solution

这道题用裸的树剖求$LCA$就可以做出来。
但是我们要判断如何在两天路径上找相同的点。
经过多次画图发现,一条路径上的$LCA$一定会出现在另一条路径上。
所以我们就可以求$LCA$。
那么我们需要判断哪两个条件呢?
设当前点$x$,判断在$a$到$b$这条路径上

1.deep[x]>deep[LCA(a,b)]
2.LCA(x,a)==x||LCA(x,b}==x

这两个条件的意思是
如果$x$比$LCA$要深,并且是两个点任意一个点的祖先,那么一定在这个简单路径上

code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 200000;
int n,q;
struct edge
{
    int next,to;
} e[N];
int head[N],tot,deep[N],fa[N],size[N],top[N],son[N],id[N],cnt,ind[N],root;
void add(int x,int y)
{
    e[++tot].next=head[x];
    head[x]=tot;
    e[tot].to=y;
}
void dfs1(int x,int f)
{
    fa[x]=f;
    size[x]=1;
    for(int i=head[x]; i; i=e[i].next)
    {
        int v=e[i].to;
        if(v!=f && !deep[v])
        {
            deep[v]=deep[x]+1;
            dfs1(v,x);
            size[x]=size[v]+size[x];
            if(size[v]>size[son[x]]) son[x]=v;
        }
    }
}
void dfs2(int x,int topf)
{
    id[x]=++cnt;
    top[x]=topf;
    if(!son[x]) return;
    dfs2(son[x],topf);
    for(int i=head[x]; i; i=e[i].next)
    {
        int v=e[i].to;
        if(v!=fa[x] && !id[v])
            dfs2(v,v);
    }
}
int LCA(int x,int y)
{
    while(top[x]!=top[y])
    {
        if(deep[top[x]]<deep[top[y]]) swap(x,y);
        x=fa[top[x]];
    }
    return deep[x]<=deep[y]? x:y;
}
bool judge(int lca,int x,int y)
{
    while(top[x]!=top[y])
    {
        if(deep[top[x]]<deep[top[y]]) swap(x,y);
        x=fa[top[x]];
        if(x==lca)return true;
    }
    return false;
}
int main()
{
    cin >> n >> q;
    for(int i=1; i<=n-1; i++)
    {
        int a,b;
        cin >> a >> b;
        add(a,b);
        add(b,a);
    }
    root=1;
    deep[1]=1;
    dfs1(1,1);
    dfs2(1,1);
    while(q--)
    {
        int a,b,c,d;
        cin >> a >> b >> c >> d;
        int S=LCA(a,b);
        int T=LCA(c,d);
        if(S==T)
        {
            cout<<"Y"<<endl;
            continue;
        }
        if(deep[S]>=deep[LCA(S,T)])cout<<"Y"<<endl;
        else cout<<"N"<<endl;
    }
}

以上是关于Python画小仓鼠的主要内容,如果未能解决你的问题,请参考以下文章

王大仙的博客园小仓鼠

一个小仓鼠的js动画

python游戏pygame模块画圆及移动方法介绍

仓鼠找sugar

仓鼠找sugar(lca)

仓鼠找sugar(洛谷 3398)