震驚, 我居然用Python幹這種事ꈍ .̮ ꈍ

来源:https://www.cnblogs.com/Mifen2952277346/archive/2019/04/15/10713943.html
-Advertisement-
Play Games

閱讀本文只需花費你兩分鐘, 兩分鐘你買不了吃虧,你也買不了上當. 那麼, 為何不靜下心來看看呢? Python 海龜創意繪畫, Turtle庫創作精美圖畫 Author:Amd794 E-mail:[email protected] 全部完整代碼下載地址 前言: 最初來自於 Wally Feurzi ...


閱讀本文只需花費你兩分鐘, 兩分鐘你買不了吃虧,你也買不了上當. 那麼, 為何不靜下心來看看呢?

 


Python 海龜創意繪畫, Turtle庫創作精美圖畫 

Author:Amd794     E-mail:[email protected]    全部完整代碼下載地址 

 


 

 

前言

  • 最初來自於 Wally Feurzig 和 Seymour Papert 於 1966 年所創造的 Logo 編程語言
  • 可以通過相關的指令, 輕鬆地繪製出精美的形狀和圖案
  • 可以培養學習電腦的興趣, 以一種娛樂的方式瞭解電腦的趣味

 

turtle 教程:

 

正文:

  1. 先來個簡單的例子, 我們來用Turtle來寫一段詩詞, 用過的人都知道, Turtle實現寫字是十分簡單的, 那麼, 如何才能把朴素的文字, 變得更吸引人呢? 先來看下我想的. 效果圖如下:

演示效果

gif圖像, 可能打了一點, 無法上傳, 但這並不影響. 那麼它是怎麼繪製的呢? 莫慌, 我們來看下代碼 , 如下:

 1 from turtle import *
 2 import random
 3 
 4 str_ = """
 5 守一段情 念一個人。
 6 時光不老 我們不散。
 7 廝守終生 不離不棄。
 8 天暗下來 你就是光。
 9 亡魂溺海 止於終老。
10 生死挈闊 與子成說。
11 柔情似水 佳期如夢。
12 我中有你 你中有我。
13 青山不老 為雪白頭。
14 心若向陽 無畏悲傷。
15 一人一心 白首不離。
16 心如荒島 囚我終老。
17 我的世界 只有你懂。
18 你若安好 便是晴天。
19 心有靈犀 一點就通。
20 廝守海角 非你不娶。
21 執子的手 漫漫的走。
22 執子之手 與子偕老。
23 山河拱手 為君一笑。
24 紅塵初妝 山河無疆。
25 千秋功名 一世葬你。
26 既不回頭 何必不忘。
27 既然無緣 何須誓言。
28 今日種種 似水無痕。
29 明夕何夕 君已陌路。
30 才會相思 便害相思。
31 人來人往 繁華似錦。
32 迴首萬年 情衷伊人。
33 生能盡歡 死亦無憾。
34 執手若無 淚濺花上。
35 花開花落 人世無常。
36 入我心者 待以君王。
37 為醉而醉 似醉非醉。
38 傷心鴻影 愛已惘然。
39 只要你要 只要我有。
40 日久生情 日久情疏。
41 憂佳相隨 風雨無悔。
42 有生之年 誓死嬌寵
43 引喻山河 指日可誠。
44 水上鴛鴦 雲中翡翠。
45 天荒地老 海誓山盟。
46 生則同襟 死則同穴。
47 生有此女 夫復何求""".split("")
48 setup(1280,720)  # 設置視窗大小
49 colormode(255)  # 使用的顏色模式, 整數還是小數
50 up()
51 a, b = -500, 280
52 goto(a,b)
53 bgcolor("black")
54 
55 
56 down()
57 def w(str_,b):
58     bgcolor( random.randint(0,255),random.randint(0,255),random.randint(0,255))  # 隨機生成RGB值, 每次調用函數改變背景顏色
59     for i in range(len(str_)):
60         up()
61         goto(a+100*i,b)
62         down()
63         size =  random.randint(12,68)  # 隨機字體大小
64         color( random.randint(0,255),random.randint(0,255),random.randint(0,255))  # 隨機字體顏色
65         write(str_[i], align="center",font=("楷體",size))
66 
67         
68 for k in range(4):
69     for i in range(7):
70         w(str_[i+7*k],b-100*i)
71     reset()  # 清屏
72 
73     
74 for i in range(7):
75     w(str_[i+7*4],b-100*i)
簡單文字

 

2. 這很一般啊, 也沒什麼好看的, 變來變去的,看到我眼睛都花了乛c乛, 也對, 起初我是想背景是動態星空的背景的, 文字通過下拉滑動的方式顯示, 這樣會比較友好, 但是我沒找到合適的, 哈哈哈. 話題跑偏了,抱歉, 那麼, 你能不能拿點***的來呢, 這都吹的吧.好吧, 那麼, 看下下麵的效果, 如下圖:

月亮代表我的心

由於篇幅有限, 顯示部分, 完整代碼在標題 ,代碼如何下:

# 文字個性化
def writez(x, y, str_, size=56, font="華文行楷"):
    gotopos(x, y)
    write(str_, font=(font, size))


color("#7d776d")
s = "願天化作比翼鳥"
s2 = "在地願為連理枝"
for i in range(len(s)):
    writez(560,350-i*50,s[i],36)
for i in range(len(s2)):
    writez(460,350-i*50,s2[i],36)
color("#888475")
writez(-50, 100, "我")
writez(-50, 40, "的")
writez(-160, 0, "心", 96)
writez(-50, 0, "月", 176)
writez(33, -30, "代", 62)
writez(-18, -95, "表", 78)
writez(-213, -210, "亮", 196)

  

3. 怎麼樣, 還行吧. 哼, 這也沒什麼難度的, 我也行啊, 好吧, 我們來乾點高級一點的, 我們基於Lsystem來,用turtle優雅的畫一顆樹

  • 一個L-系統Lindenmayer系統是並行重寫系統和類型的形式文法。L系統由可用於製作字元串的符號字母表,用於將每個符號擴展為更大的符號串的生產規則集合,用於開始構建的初始“ 公理 ”字元串以及用於製作字元串的機制組成。將生成的字元串轉換為幾何結構。

  • 更多請看 https://github.com/Amd794/Python123/blob/master/README.md
  • 變數  : 'FX'

    常數  :+ - [] a b c

    開始 :'FX'

    規則 :    'F': 'aFF-[b-F+F]+[c+F-F]',
                     'X': 'aFF+[b+F]+[c-F]'

    角度 :25°

  • 好啦, 初始階段已經介紹完畢, 那麼我們開始寫代碼:

1. 先初始化一下變數:

setup(1280,720)  # 設置視窗的大小
t.speed(0)  # 改變海龜的繪製速度
t.pensize(1) # 可以通過海龜的大小, 來凸顯樹幹與樹枝的粗細差別
length = 5 # 每一次繪製的長度
path = 'FX' # 初始的規則
angle = 25  # 每次變換的角度

expalnation = {
    'F': '畫線',
    'x': '-',
    '+': '逆時針旋轉',
    '-': '順時針旋轉',
    '[': '記錄當前位置',
    ']': '恢覆上一個位置',
    'a': '上色',
    'b': '上色',
    'c': '上色'
}

# 替換的規則
rules = {
    'F': 'aFF-[b-F+F]+[c+F-F]',
    'X': 'aFF+[b+F]+[c-F]'
}

  

2. 下麵開始應用規則:

def apply_rules(path, rules):
    L = [_ for _ in path]
    for i in range(len(L)):
        symbol = L[i]
        if symbol == 'F':
            L[i] = rules[symbol]
        if symbol == 'X':
            L[i] = rules[symbol]
    path = ''.join(L)
    return path


for _ in range(5):
    path = apply_rules(path, rules)

  

3. 最後, 開始畫圖:

# 這裡通過映射的方式更佳, 我起初寫前面的例子的時候規則不是很多, 就沒怎麼留意.
def draw_path(path, expalnation):
    posList, angleList = [], []
    t.up()
    t.goto(0, -350)
    t.down()
    t.lt(90)
    for symbol in path:
        if symbol == 'F':
            t.forward(length)
        elif symbol == '+':
            t.left(angle)
        elif symbol == '-':
            t.rt(angle)
        elif symbol == '[':
            posList.append(t.pos())
            angleList.append(t.heading())
        elif symbol == 'a':
            t.pensize(3)
            t.color("#8c503c")
        elif symbol == 'b':
            t.pensize(2)
            t.color("#4ab441")
        elif symbol == 'c':
            t.pensize(2)
            t.color("#18b418")
        elif symbol == ']':
            t.up()
            t.home()
            t.goto(posList.pop())
            t.left(angleList.pop())
            t.down()

  

 

好, 所有都已準備好了, 我們來看下效果:

tree

哎呀, 好像忘記了改變畫筆大小了, 沒關係,這些後期處理一下就好.那麼本文到此結束.


總結:

1

2

3

4

5


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 引子 最近遇到很多朋友過來咨詢G1調優的問題,我自己去年有專門學過一次G1,但是當時只是看了個皮毛,因此自己也有不少問題。總體來講,對於G1我有幾個疑惑,希望能夠在這篇文章中得到解決。 1. G1出現的初衷是什麼? 2. G1適合在什麼場景下使用? 3. G1的trade off是什麼? 4. G1 ...
  • python3字元串操作 ...
  • 今天繼續學習一下Numpy庫,廢話不多說,整起走 先說下Numpy中,經常會犯錯的地方,就是數據的複製 這個問題不僅僅是在numpy中有,其他地方也同樣會出現 先看看這段代碼,我們隨便建立了一個numpy數組 然後我想把a這個值,賦值給b,很簡單的操作,b = a 那麼我們列印一下b和a是不相等,返 ...
  • 第一周-第06章節-Python3.5-第一個python程式 G:\Python3.7.3\python.exe G:/practise/oldboy/day1/HelloWorld.pyHelloWorld!!! Process finished with exit code 0 第一周-第07 ...
  • Java8是自java5之後最重大的一次更新,它給JAVA語言帶來了很多新的特性(包括編譯器、類庫、工具類、JVM等),其中最重要的升級是它給我們帶來了Lambda表達式和Stream API。 1、什麼是Lambda表達式? Lambda是一個匿名函數,可以理解為是一段可以傳遞的代碼,可以將代碼像 ...
  • 隊列:先入先出(FIFO)表。 常用操作: Enqueue:入隊,即將數據寫入隊列末尾 Dequeue:出隊,即將隊列開頭的元素從隊列中刪除並返回 應用場景: 隊列通常用來實現消息(任務)的快速讀寫,即消息隊列。消息隊列的常用來解決如下問題: 提升系統的吞吐量:通過引入消息隊列,將不是必須的業務邏輯 ...
  • 當伺服器是Linux的時候不懂指令覺得很懊惱,這個時候直接就可以使用PHPstorm連接伺服器操作了; 1丶準備工作 首先你先要準備伺服器丶phpstorm這兩個吧! 2丶開始配置phpstorm 按照紅線的部分一步一步的走 點擊configuration 點擊+號 我直接選擇的sftp 就這樣連接 ...
  • 1. 三種控制結構是什麼? 答:順序結構,選擇結構,迴圈結構 2. 如果if語句後不加{},if的控制範圍是否只限於第一句? 答:if語句的控制範圍只能是緊接著的一句,使用{}可以將多個語句合併成為一個複合語句,進而控制多個語句。 3. Math.random()是什麼意思?如果想要獲取15到20之 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...