利用Go語言實現在終端繪製小兔子
2023-01-14 14:01:42
前言
思來想去,使用 Go
語言創作,沒有想到好的創意,最後打算在終端動態列印小兔子,給大家拜年!
先來看看效果圖:
創作過程
小兔子模型製作
大部分的時間,都花在了畫兔子圖案的工作上。建立一個 txt
檔案,在檔案裡通過特殊符號,一步一步將模型搭好,然後附上一副春節對聯。
實現思路
整個動態過程是由幾個不同的圖案依次列印而成,一共有 7 個圖案。起初我是將這 7 個圖案放到 txt
檔案裡,然後通過讀取檔案,分割圖案,最後列印圖案,這樣做的好處是圖案和程式碼分開了,降低圖案與程式碼間的耦合度。
到最後,由於程式碼要放到碼上掘金上面,而碼上掘金不支援讀取檔案的操作,因此只能將圖案放到程式碼裡,用字串變數接收。
程式碼
package main import ( "fmt" "os" "os/exec" "time" ) var r1 = "n /\ /\" + "n / : / |" + "n : :` /" + "n \ ." + "n \ :." + "n .` `." + "n : 0 \" + "n ..` ;" + "n . ` `.¯" + "n .` :" + "n .` ." + "n .` :" + "n . Happy New Year ." + "n . .`" + "n .. ` .`" + "n: `` ;. `、" + "n`..`._____________::____)" var r2 = "n /\ /\" + "n / : / |" + "n : :` /" + "n \ ." + "n \ :." + "n .` `." + "n : 0 \" + "n ..` ;" + "n . ` `.¯" + "n .` :" + "n .` ." + "n .` :" + "n . Happy New Year ." + "n . .`" + "n .. ` .`" + "n : `` ;. `、" + "n `..`._____________::____)" var r3 = "n /\ /\" + "n / : / |" + "n : :` /" + "n \ ." + "n \ :." + "n .` `." + "n : 0 \" + "n ..` ;" + "n . ` `.¯" + "n .` :" + "n .` ." + "n .` :" + "n . Happy New Year ." + "n . .`" + "n .. ` .`" + "n : `` ;. `、" + "n `..`._____________::____)" var r4 = "n /\ /\" + "n / : / |" + "n : :` /" + "n \ . ________________" + "n \ :. | 喜 辭 舊 歲 |" + "n .` `. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯" + "n : 0 \" + "n ..` ;" + "n . ` `.¯" + "n .` :" + "n .` ." + "n .` :" + "n . Happy New Year ." + "n . .`" + "n .. ` .`" + "n : `` ;. `、" + "n `..`._____________::____)" var r5 = "n /\ /\" + "n / : / |" + "n : :` /" + "n \ . ________________" + "n \ :. | 喜 辭 舊 歲 |" + "n .` `. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯" + "n : 0 \ ____" + "n ..` ; | 兔 |" + "n . ` `.¯ | 躍 |" + "n .` : | 龍 |" + "n .` . | 騰 |" + "n .` : | 辭 |" + "n . Happy New Year . | 舊 |" + "n . .` | 歲 |" + "n .. ` .` ¯¯¯" + "n : `` ;. `、" + "n `..`._____________::____)" var r6 = "n /\ /\" + "n / : / |" + "n : :` /" + "n \ . ________________" + "n \ :. | 喜 辭 舊 歲 |" + "n .` `. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯" + "n : 0 \ ____ ____" + "n ..` ; | 兔 | | 龍 |" + "n . ` `.¯ | 躍 | | 騰 |" + "n .` : | 龍 | | 虎 |" + "n .` . | 騰 | | 躍 |" + "n .` : | 辭 | | 賀 |" + "n . Happy New Year . | 舊 | | 新 |" + "n . .` | 歲 | | 春 |" + "n .. ` .` ¯¯¯ ¯¯¯" + "n : `` ;. `、" + "n `..`._____________::____)" var r7 = "n /\ /\" + "n / : / |" + "n : :` /" + "n \ . ________________" + "n \ :. | 喜 辭 舊 歲 |" + "n .` `. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯" + "n : 0 \ ____ ____" + "n ..` ; | 兔 | | 龍 |" + "n . ` `.¯ | 躍 | 2 | 騰 |" + "n .` : | 龍 | 0 | 虎 |" + "n .` . | 騰 | 2 | 躍 |" + "n .` : | 辭 | 3 | 賀 |" + "n . Happy New Year . | 舊 | | 新 |" + "n . .` | 歲 | | 春 |" + "n .. ` .` ¯¯¯ ¯¯¯" + "n : `` ;. `、" + "n `..`._____________::____)" func main() { rabbits := []string{r1, r2, r3, r4, r5, r6, r7} for _, rabbit := range rabbits { // 通過終端控制符進行清屏 //fmt.Println(" 33c") cmd := exec.Command("cmd", "/c", "cls") cmd.Stdout = os.Stdout cmd.Run() // 列印圖案 fmt.Printf("%s", rabbit) time.Sleep(time.Millisecond * 500) } }
首先,使用七個字串變數,儲存七個不同的圖案,用於後續列印。
其次,將七個字串變數放入字串切片裡,後續易於操作。
接下來,迴圈遍歷切片,列印圖案。
列印圖案之前,先通過 exec.Command
函數,執行 cls
命令,達到在 windows
系統上清屏的效果。cls
的缺點就是清屏時會閃屏,而上面註釋掉的一行程式碼是通過終端控制符進行清屏,基本上不閃爍,適用於 linux
終端,在 windows
的命令列模式下清屏無效。同時 cls
命令和終端控制符在碼上掘金上也沒有看到清屏的效果,如果讀者有好的方法,請多多指教!
列印一個圖案之後,延時 0.5
秒後列印下一個圖案,讓肉眼可觀察到整個過程。
小結
動一動手指,讓小兔子在終端給大家拜年,簡單又有趣。
除了動手製作圖案以外,本次創作遇到最大困難是如何在終端清屏時不閃爍。通過列印