<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          電視劇里的代碼真能運(yùn)行嗎?

          共 4699字,需瀏覽 10分鐘

           ·

          2022-11-24 16:55

          零基礎(chǔ)python入門教程:python666.cn


          大家好,歡迎來到 Crossin的編程教室 !


          前幾天,后臺老有小伙伴留言“愛心代碼”。這不是Crossin很早之前發(fā)過的內(nèi)容嘛,怎么最近突然又被人翻出來了?后來才知道,原來是一部有關(guān)程序員的青春偶像劇《點(diǎn)燃我,溫暖你》在熱播,而劇中有一段關(guān)于期中考試要用程序畫一個愛心的橋段。


          于是出于好奇,Crossin就去看了這一集(第5集,不用謝)。這一看不要緊,差點(diǎn)把剛吃的雞腿給噴出來--槽點(diǎn)實(shí)在太多了!


          忍不住做了個歡樂吐槽向的代碼解讀視頻,在某音上被頂?shù)搅?0個w的瀏覽,也算蹭了一波人家電視劇的熱度吧


          下面是圖文版,給大家分析下劇中出現(xiàn)的“愛心”代碼,并且來復(fù)刻一下最后男主完成的酷炫跳動愛心。


          劇中代碼賞析


          1. 首先是路人同學(xué)的代碼:


          雖然劇中說是“C語言期中考試”,但這位同學(xué)的代碼名叫 draw2.py,一個典型的 Python 文件,再結(jié)合截圖中的 pen.forward、pen.setpos 等方法來看,應(yīng)該是用 turtle 海龜作圖庫來畫愛心。那效果通常是這樣的:

          import turtle as tt.color('red')t.setheading(50)t.begin_fill()t.circle(-100, 170)t.circle(-300, 40)t.right(38)t.circle(-300, 40)t.circle(-100, 170)t.end_fill()t.done()

          而不是劇中那個命令行下用1組成的不規(guī)則的圖形。


          2. 然后是課代表向路人同學(xué)展示的優(yōu)秀代碼:


          及所謂的效果:


          這確實(shí)是C語言代碼了,但文件依然是以 .py 為后綴,并且 include 前面沒有加上 #,這顯然是沒法運(yùn)行的。


          里面的內(nèi)容是可以畫出愛心的,用是這個愛心曲線公式:

          然后遍歷一個15*17的方陣,計(jì)算每個坐標(biāo)是在曲線內(nèi)還是曲線外,在內(nèi)部就輸出#或*,外部就是-


          用python改寫一下是這樣的:

          for y in range(9, -6, -1):    for x in range(-8, 9):        print('*##*'[(x+10)%4] if (x*x+y*y-25)**3 < 25*x*x*y*y*y else '-', end=' ')    print()


          效果:


          稍微改一下輸出,還能做出前面那個全是1的效果:


          for y in range(9, -6, -1):    for x in range(-8, 9):        print('1' if (x*x+y*y-25)**3 < 25*x*x*y*y*y else ' ', end=' ')    print()

          但跟劇中所謂的效果相去甚遠(yuǎn)。


          3. 最后是主角狂拽酷炫D炸天的跳動愛心:


          代碼有兩個片段:


          但這兩個片段也不C語言,而是C++,且兩段并不是同一個程序,用的方法也完全不一樣。


          第一段代碼跟前面一種思路差不多,只不過沒有直接用一條曲線,而是上半部用兩個圓形,下半部用兩條直線,圍出一個愛心。


          改寫成 Python 代碼:


          size = 10for x in range(size):    for y in range(4*size+1):        dist1 = ((x-size)**2 + (y-size)**2) ** 0.5        dist2 = ((x-size)**2 + (y-3*size)**2) ** 0.5        if dist1 < size + 0.5 or dist2 < size + 0.5:            print('V', end=' ')        else:            print(' ', end=' ')    print()
          for x in range(1, 2*size): for y in range(x): print(' ', end=' ') for y in range(4*size+1-2*x): print('V', end=' ')    print()


          運(yùn)行效果:


          第二段代碼用的是基于極坐標(biāo)的愛心曲線,是遍歷角度來計(jì)算點(diǎn)的位置。公式是:

          計(jì)算出不同角度對應(yīng)的點(diǎn)坐標(biāo),然后把它們連起來,就是一個愛心。


          from math import pi, sin, cosimport matplotlib.pyplot as pltno_pieces = 100dt = 2*pi/no_piecest = 0vx = []vy = []while t <= 2*pi:    vx.append(16*sin(t)**3)    vy.append(13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t))    t += dtplt.plot(vx, vy)plt.show()


          效果:

          代碼中循環(huán)時用到的2π是為了保證曲線長度足夠繞一個圈,但其實(shí)長一點(diǎn)也無所謂,即使 π=100 也不影響顯示效果,只是相當(dāng)于同一條曲線畫了很多遍。所以劇中代碼里寫下35位小數(shù)的π,還被女主用紙筆一字不落地抄寫下來,實(shí)在是讓程序員無法理解的迷惑行為。


          但不管寫再多位的π,上述兩段代碼都和最終那個跳動的效果差了五百只羊了個羊。


          跳動愛心實(shí)現(xiàn)


          作為一個總是在寫一些沒什么亂用的代碼的編程博主,Crossin當(dāng)然也不會放過這個機(jī)會,下面就來挑戰(zhàn)一下用 Python 實(shí)現(xiàn)最終的那個效果。


          1. 想要繪制動態(tài)的效果,必定要借助一些庫的幫助,不然代碼量肯定會讓你感動得想哭。這里我們將使用之前 羊了個羊游戲 里用過的 pgzero 庫。然后結(jié)合最后那個極坐標(biāo)愛心曲線代碼,先繪制出曲線上離散的點(diǎn)。


          import pgzrunfrom math import pi, sin, cos
          no_p = 100dt = 2*3/no_pt = 0x = []y = []while t <= 2*3: x.append(16*sin(t)**3) y.append(13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)) t += dt
          def draw(): screen.clear() for i in range(len(x)): screen.draw.filled_rect(Rect((x[i]*10+400, -y[i]*10+300), (4, 4)), 'pink')
          pgzrun.go()


          2. 把點(diǎn)的數(shù)量增加,同時沿著原點(diǎn)到每個點(diǎn)的徑向加一個隨機(jī)數(shù),并且這個隨機(jī)數(shù)是按照正態(tài)分布來的(半個正態(tài)分布),大概率分布在曲線上,向曲線內(nèi)部遞減。這樣,就得到這樣一個隨機(jī)分布的愛心效果。


          ...no_p = 20000...while t <= 2*pi:    l = 10 - abs(random.gauss(10, 2) - 10)    x.append(l*16*sin(t)**3)    y.append(l*(13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)))    t += dt...


          3. 面就是讓點(diǎn)動起來,這步是關(guān)鍵,也有一點(diǎn)點(diǎn)復(fù)雜。為了方便對于每個點(diǎn)進(jìn)行控制,這里將每個點(diǎn)自定義成了一個Particle類的實(shí)例。

          從原理上來說,就是給每個點(diǎn)加一個縮放系數(shù),這個系數(shù)是根據(jù)時間變化的正弦函數(shù),看起來就會像呼吸的節(jié)律一樣。

          class Particle():    def __init__(self, pos, size, f):        self.pos = pos        self.pos0 = pos        self.size = size        self.f = f
          def draw(self): screen.draw.filled_rect(Rect((10*self.f*self.pos[0] + 400, -10*self.f*self.pos[1] + 300), self.size), 'hot pink')
          def update(self, t): df = 1 + (2 - 1.5) * sin(t * 3) / 8 self.pos = self.pos0[0] * df, self.pos0[1] * df
          ...
          t = 0def draw(): screen.clear() for p in particles: p.draw()
          def update(dt): global t    t += dt for p in particles: p.update(t)

          4. 劇中愛心跳動時,靠中間的點(diǎn)波動的幅度更大,有一種擴(kuò)張的效果。所以再根據(jù)每個點(diǎn)距離原點(diǎn)的遠(yuǎn)近,再加上一個系數(shù),離得越近,系數(shù)越大。

          class Particle():    ...    def update(self, t):        df = 1 + (2 - 1.5 * self.f) * sin(t * 3) / 8        self.pos = self.pos0[0] * df, self.pos0[1] * df


          5. 最后再用同樣的方法畫一個更大一點(diǎn)的愛心,這個愛心不需要跳動,只要每一幀隨機(jī)繪制就可以了。


          def draw():    ...    t = 0    while t < 2*pi:        f = random.gauss(1.1, 0.1)        x = 16*sin(t)**3        y = 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)        size = (random.uniform(0.5,2.5), random.uniform(0.5,2.5))        screen.draw.filled_rect(Rect((10*f*x + 400, -10*f*y + 300), size), 'hot pink')        t += dt * 3

          合在一起,搞定!



          總結(jié)一下,就是在原本的基礎(chǔ)愛心曲線上加上一個正態(tài)分布的隨機(jī)量、一個隨時間變化的正弦函數(shù)和一個跟距離成反比的系數(shù),外面再套一層更大的隨機(jī)愛心,就得到類似劇中的跳動愛心效果。


          但話說回來,真有人會在考場上這么干嗎?


          除非真的是超級大學(xué)霸,不然就是食堂伙食太好--


          吃太飽撐的……




          獲取源碼請?jiān)诠娞枴癈rossin的編程教室”里回復(fù)關(guān)鍵字:愛心

          感謝轉(zhuǎn)發(fā)點(diǎn)贊的各位~

          _往期文章推薦_

          羊了個羊,但是Python簡(li)單(pu)版




          如需了解付費(fèi)精品課程教學(xué)答疑服務(wù)
          請?jiān)?strong style="max-width: 100%;overflow-wrap: break-word !important;box-sizing: border-box !important;">Crossin的編程教室內(nèi)回復(fù): 666

          瀏覽 132
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  在线观看中文字幕视频一区 | 黄色小视频在线免费 | 欧美日韩乱国产 | 日韩精品三区 | 一区无码在线 |