螢幕上的懷舊與複古 | 用 Python Animation 設計 ASCII 動畫


隨著科技日新月異,人們對過去的純樸與美好愈發懷念。這種懷舊的情感,不僅體現在時尚、音樂等領域,也逐漸滲透到程式設計的 Python Animation 世界。我們可以創造出充滿復古情懷的動畫,將懷舊情愫與現代科技巧妙地結合。

Python Animation

簡介

在當今高解析度圖形和先進動畫盛行的數位時代,ASCII Art 的簡潔美學依然具有獨特的魅力和吸引力。這種懷舊的復古風格可以成為設計創意項目的強大工具。這篇文章將引導你使用 Python 創建一個用 ASCII 藝術製作的動畫,展示一輛車在路上移動的過程。準備好回到編程的純真時代了嗎?

什麼是 ASCII Art?

ASCII Art 是一種使用 ASCII(美國信息交換標準碼)字符創建圖像和設計的圖形技術。它回溯到計算機早期時代,那時文本圖形是標準。儘管簡單,ASCII Art 可以極具細節和表現力,用文本字符創作藝術作品能激發創造力和問題解決能力。

設定環境

Python Animation 程式碼

目標是創建一輛車子,它可以在畫布上左右移動,並根據移動方向切換不同的車子形狀。以下是完整的 Python 程式碼:

import os
import time

def clear_screen():
    # Windows uses 'cls', Unix/Linux/MacOS uses 'clear'
    os.system('cls' if os.name == 'nt' else 'clear')

def draw_car(position, direction="right"):
    # Create a blank canvas
    road = [' ' * 60 for _ in range(6)]
    
    # ASCII art for the car (facing right)
    car_right = [
        '       ______',
        '      /|_||_\\`.__',
        '     (   _    _ _\\',
        '      `-(_)--(_)-\'']
    
    # ASCII art for the car (facing left, horizontally flipped)
    car_left = [
        '       ______',
        '  __.\'/_||_||\\',
        ' /_ _    _   )',
        ' \'-(_)--(_)-\'']
    
    # Choose car art based on the direction
    car = car_left if direction == "left" else car_right
    
    # Insert the car at the given position
    for i, line in enumerate(car):
        if position < len(road[i]):
            road[i] = ' ' * position + line + ' ' * (60 - len(line) - position)
    
    # Add the road
    road[-1] = '_' * 60
    
    # Return the full scene as a single string
    return '\n'.join(road)

def animate_car():
    try:
        # Move the car from left to right
        for position in range(40):
            clear_screen()
            print(draw_car(position, direction="right"))
            time.sleep(0.1)  # Pause for 0.1 seconds
        
        # Move the car from right to left
        for position in range(40, -1, -1):
            clear_screen()
            print(draw_car(position, direction="left"))
            time.sleep(0.1)
            
    except KeyboardInterrupt:
        print("\nAnimation ended!")

if __name__ == "__main__":
    print("Press Ctrl+C to stop the animation")
    animate_car()

程式細節解析

引入必要的模組

import os
import time

os: 用來執行跨平台的指令,這裡主要用於清除畫面。time: 用來在每個畫面之間添加延遲,創造流暢的動畫效果。

清除螢幕

def clear_screen():
    os.system('cls' if os.name == 'nt' else 'clear')

每一幀動畫需要清空終端畫面,否則畫面會疊加,影響觀看效果。並根據作業系統選擇對應的清屏指令。Windows: 使用 clsUnix/Linux/MacOS: 使用 clear

繪製車子與道路

def draw_car(position, direction="right"):
    ...

畫布由 6 行寬度 60 的字元組成,最底層為底線路面,車子的 ASCII 藝術根據方向切換,並按照指定的 position插入畫布,確保不超出邊界。

ASCII 動畫

car_right = [
    '       ______',
    '      /|_||_\\`.__',
    '     (   _    _ _\\',
    '      `-(_)--(_)-\'']

car_left = [
    '       ______',
    '  __.\'/_||_||\\',
    ' /_ _    _   )',
    ' \'-(_)--(_)-\'']

動畫邏輯透過從左到右及右到左的循環控制車子位置,每幀更新畫面並調用 draw_car 繪製,並使用 try-except捕捉鍵盤中斷 (Ctrl+C) 安全結束動畫。

執行效果

執行程式後,畫面上會顯示一輛小車以流暢的動畫形式來回移動:

         ______
        /|_||_\`.__
       (   _    _ _\
        `-(_)--(_)-'
________________________________________________________

結論

利用 Python 創建 ASCII 動畫,是一個結合程式邏輯與創意表現的有趣專案。在這篇教學中,我們從基本畫布開始,搭配循環控制和 ASCII 藝術,製作出一個車子左右移動的動態效果。通過清理畫面、更新位置和處理方向,動畫變得流暢自然。此外,我們還學習了使用 try-except 捕捉鍵盤中斷 (Ctrl+C),讓程式能安全地結束。這樣的項目不僅讓人回味 ASCII 藝術的懷舊魅力,還提供了很大的擴展性,無論是添加背景元素、實現多車互動,甚至創造完全自定義的場景,都能激發你的創意。現在就動手試試,探索 ASCII 動畫的無限可能吧!