程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

如何優雅地用micropython下一個代碼雨?

編輯:Python

其實早就想寫一個這個小程序當練手了,一直挺喜歡黑客帝國的那種風格的,想著簡單,但是寫起來居然無從下手,首先程序必須好看,太次的東西我接受不了,其次要流暢,太卡我也接受不了。
總體邏輯:
1、隨機字母以下雨的方式往下掉
2、顏色要變化,有漸變
3、可以自定義參數,方便移植到不同的屏幕
4、同時有多個雨滴往下掉
寫一行雨滴其實真的不難,同時寫多行我真的懵逼想了半天居然無從下手,python的pygame寫的有很多,mpy沒有,後來去github上找了一下,只有一個,但是核心代碼居然只有20多行,優雅!實在是優雅!但是作者沒給注釋,於是硬著頭皮逐步打印,分布運行,終於弄懂了機制,移植成功啦,效果如下:

核心原理還是用數組,根據行列建立一個比屏幕顯示多兩行的,這兩行用於緩存模擬雨滴的數據,然後這個數組專門用於儲存雨滴的進程,也就是顏色等級,越高則越亮,看似是一行一行落的,其實每次都是輸出全屏的字符!得力於我github大佬的高速st7789驅動,終於實現了絲滑的效果,學到了學到了,以後做東西多了個思路。
最後貼上核心部分代碼,再次感歎是現實太優雅了,實際只輸出了一次字符,看似絲滑的動畫是實際上是全屏字符刷出來的,前方高能優雅!拋去定義變量其實while那裡裡就三個for循環搞定了!

BLACK = st7789.color565(0,0,0)
WHITE = st7789.color565(200,255,200)
FONT = 16
width = 15
height = 15
size = width*height
chars = [random.choice("0123456789abcdef") for _ in range(size+2*width)]
field = [0 for _ in range(size+2*width)]
while 1:
for _ in range(1): #how many rains each time
field[int(random.random()*15)] = 15 #random rain
for i in range(size+width*2-1, width-1, -1): #create matrix rain scale
if field[i-width] == 15: #each line -1 and send to next line
field[i] = 15
if field[i-width] > 0:
field[i-width] -= 1
for i in range(size):
if field[i+width]==0: #decide color
attr = BLACK
elif field[i+width] == 15:
attr = WHITE
else:
attr=st7789.color565(0,43+field[i+width]*13,0)
lcd.text(font1,chars[i+width], FONT * (i % width),FONT * (i//width),attr,BLACK)

硬件初始化部分,根據自己的平台來把

import utime as time
from machine import Pin,SPI
import st7789,os,machine
import random
import font1
#---------------Hardware init----------------
#screen for 01stuido pyclock
spi = machine.SPI(1,baudrate=40000000,mosi=Pin(7),miso=Pin(0),sck=Pin(6))
lcd = st7789.ST7789(
spi, 240,240,
reset=Pin(8, Pin.OUT),
cs=Pin(5, Pin.OUT),
dc=Pin(4, Pin.OUT),
backlight=Pin(0, Pin.OUT),
rotation=0
)
lcd.init()
lcd.inversion_mode(True)

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved