文本 link
Ren’Py內涵多種方式用於顯示文本。 say
和 menu 語句就會用到文本顯示。 用戶介面通常都包含文本,顯示時使用 text, textbutton,
和 label screen語言語句。這些screen語句加上其他的函數,可以創建 Text()
文本組件,並在界面上展示出來。
文本組件用於管理顯示給用戶的文本內容。文本組件按以下順序執行行為:
轉化文本。
在文本中內插數據
使用樣式和文本標籤將文本樣式化。
給樣式化後的文本布局。
將文本內容繪製到界面上。
本節內容討論在Ren’Py中處理文本顯示問題的過程。
跳脫字元 link
對Ren’Py來說,有3個特殊字元能控制文本顯示。創作者需要注意,這3個字元的寫法不要讓引擎產生曲解。
- (反斜槓)
反斜槓用於Ren’Py字串中的字元轉義。一些常見的轉義符號如下:
- \” (反斜槓雙引號)
兩端用雙引號標識的字串中含有一個雙引號。
- \’ (反斜槓單引號)
兩端用單引號標識的字串中含有一個單引號。
- \ (雙引號空格)
在Ren’Py字串中含有一個額外的空格。默認情況下,Ren’Py腳本會將一段連續的空白轉為一個空格字元。
- \n (反斜槓-字元n)
文本含有一個換行符。
- \\ (反斜槓-反斜槓)
文本含有一個反斜槓字元。
- \% (反斜槓-百分號)
文本中包含一個百分號字元。 也可以寫作 %%。 兩種寫法都會顯示為一個百分號。
- [ (左方括號)
左方括號用於轉義在文本中內插的值。如果要在文本中包含左方括號,需要寫兩個左方括號 ——
[[
。- { (左花括號)
左花括號用於轉義文本標籤(tag)。如果要在文本中包含左花括號,需要寫兩個左花括號 ——
{{
。- 【 (左方頭凹形括號)
左方頭凹形括號用於引入Ruby/片假名文本。若要在文本中直接顯示左方頭凹形括號,需要寫兩個連續的方頭凹形括號
【【
。
內插數值 link
Ren’Py支持在文本字串中內插數值。例如,假設使用者名稱字儲存在 playername
變數中,我們可以寫這樣一行對話:
g "歡迎來到貓耳協會, [playername] !"
Ren’Py會按以下順序搜索變數:
在某個界面中時,搜索界面本地變數。
搜索
interpolate
命名空間的變數。搜索全局變數。
Ren’Py並不限制只允許內插簡單變數值,也支持合法的Python表達式。以下寫法也是可以的:
g "我姓 [player.names[0]]。"
顯示數值之前可以先進行格式化。下面的例子顯示的是一個保留小數點後兩位的浮點數:
g "我百分之 [100.0 * points / max_points:.2] 喜歡你!"
Ren’Py字串的數值內插符合 PEP 3101 的字串格式規範。 Ren’Py字串內插使用 [
,因為 {
被用於文本標籤(tag)了。
還有,Ren’Py支持!s、!r、!q和!t等轉換標記。!q轉換標記表示文本標籤(tag)內引號已經正確匹配和使用,顯示字串時不會轉義為不希望出現的格式。舉例:
g "你別想唬弄我, [playername!q] !"
!t轉換標記會轉換或計算內插字串的值:
if points > 5:
$ mood = _("高興")
else:
$ mood = _("頭大")
g "見到你我很 [mood!t] 。"
!i
標識會在字串中執行一次額外的插值:
define earned_points_info = _("[points]{image=points.png} 贏得點數")
g "我很高興看到你 [earned_points_info!ti] "
界面語言中會經常用到,詳見 常量文本 。
!u
標識強制將(英文)文本轉為大寫, !l
標識強制將(英文)文本轉為小寫。
!c
標識將首字母大寫。
這些標識可以聯用,比如使用 !cl
可以將首字母大寫,後面所有文本強制小寫。
有幾個點需要注意:
標記的使用順序不會影響最終結果:
!cl
與!lc
是一樣的。各標記前補充驚嘆號將被忽略,並且依然遵循上一條規則:
!l!c
、!c!l
和!cl
的結果都是一樣的。
具體變換遵照以下順序進行:
r
/s
(替換字串)t
(多語言)i
(循環插值)q
(引用)u
(將字母大寫)l
(將字母小寫)c
(首字母大寫)
樣式化和文本標籤(tag) link
在Ren’Py中,文本有兩種方式獲取樣式(style)資訊。第一種是,根據整個文本段落(block)應用的樣式獲取。請詳見 樣式系統 及 文本樣式特性 部分的內容。
第二種是,透過使用文本標籤(tag)。文本標籤(tag)可用於一個文本段落(block)中一部分的樣式化,也可以用於程序中所有文本段落中一部分的樣式化。如果你發現自己在文本的每一行裡都應用了同樣的文本標籤,可以考慮使用樣式代替這種做法。
總共有兩種文本標籤。某些文本標籤是自閉合的,而有些文本標籤需要成對的閉合標籤。當多個成對的閉合標籤出現時,閉合順序必須是後出現的標籤先閉合——Ren’Py會拒絕不正確匹配。例如:
# 這行是正確的
"Plain {b}Bold {i}Bold-Italic{/i} Bold{/b} Plain"
# 這行是不正確的,並會引起報錯或不正確的畫面表現
"Plain {b}Bold {i}Bold-Italic{/b} Italic{/i} Plain"
某些文本標籤可以帶一個入參。帶入參的文本標籤後面會帶一個等號(=),後面跟參數值。入參不能含有右花括號(})。入參的含義根據不同的文本標籤而不同。
非英語 link
Ren’Py包含英語和很多其他語言的默認字體。考慮到字體庫大小問題,Ren’Py沒有包含需要渲染的語種,包括中日韓語。如果需要支持那些語言,在項目開頭就需要更改使用的字體。
Ren’Py在之後的版本可能會支持世界上絕大多數的語言,而不需要做特別配置。韓語是在各個字之間不帶空格書寫的語言。Ren’Py有一個特殊模式可以支持帶空格的韓語,可以做如下設置啟用:
define gui.language = "korean-with-spaces"
這也可以通過修改gui.rpy文件中“unicode”項的預設值實現。
日語在換行方面有許多規則。我們推薦開始先設置為“japanese-normal”,進階使用“japanese-loose”或者“japanese-strict”,分別對應換行比較多或者比較少的情況。:
define gui.language = "japanese-loose"
表意文字語言經常含有大量換行。要啟用更快但運算量更少的換行算法的話,使用如下配置:
define gui.language = "greedy"
這種更快的換行算法並不一定要啟用,除非遊戲中需要一次顯示巨量文本,例如在NVL模式下。
後續也可以使用
renpy.language_tailor()
函數配置換行算法。
垂直文本 link
當配置了 vertical
樣式特性,Ren’Py就能生成原生的垂直文本。垂直文本的書寫順序是從上到下,從右往左。
這裡有兩個文本標籤與垂直文本相關。
- horiz link
在垂直文本中包含原生水平文本。
- vert link
在水平文本中包含原生的垂直文本。(該標籤不會旋轉原生垂直文本內容。)
Note
如果字體中沒有包含垂直文本的字元間隔資訊,Ren’Py會嘗試從水平文本資訊自動計算出垂直文本的字元間隔。在不同的Ren’Py版本中,實際的字元間隔可能並不一致。
Ruby文本 link
Ruby文本(較常用來標明假名或者注音)是一種在某個字元或單字上方顯示小號文本的文本。以下是幾個步驟可以讓你的遊戲支持Ruby文本。
首先,你必須配置Ruby文本的樣式(style)。需要修改以下樣式特性:
line_leading
或ruby_line_leading
特性必須為Ruby文本預留足夠的高度。創建一個新的自訂名的樣式(style)。該樣式的特性,比如
size
需要適合Ruby文本。新樣式的
yoffset
必須額外設置,這是為了將Ruby文本升到一般文本基線之上。無論是在對話還是歷史記錄中,文本樣式的
ruby_style
欄位都應該被設置為上面新創建的樣式。
舉例:
style ruby_style is default:
size 12
yoffset -20
style say_dialogue:
ruby_line_leading 12
ruby_style style.ruby_style
style history_text:
ruby_line_leading 12
ruby_style style.ruby_style
(使用 style.style_name
格式指定需要的樣式)
完成Ren’Py的相關配置後,我們就可以使用rt和rb文本標籤,在腳本中包含Ruby文本了。rt標籤用於標識一些字元將被顯示為Ruby文本。如果在Ruby文本前面出現了rb標籤,Ruby文本會與rb標籤內的所有文本中央對齊。如果沒有rb標籤,Ruby文本會與對應的字元左對齊。
完成Ren’Py的相關配置後,我們有兩種方式在腳本中包含Ruby文本。
方頭凹型括號。 Ruby文本可以寫在一對方頭凹型括號(【】)中。全形或半形的豎線符號(|或|)用來分隔Ruby文本的上半與下半內容。
舉例:
e "Ruby 可以用來標識假名(【東|とう】 【京|きょう】)。"
e "也可以用來翻譯 (【東京|Tokyo】)."
只有在檢測到豎線符號時,才會檢測Ruby文本。連續兩個左方頭凹形括號表示轉義。 方頭凹形括號中不能包含其他文本標籤(tag)。
{rt} 和 {rb} 文本標籤。 {rt} 標籤用於標識一些字元將以Ruby文本形式顯示。 如果在Ruby文本前面出現了 {rb} 標籤,Ruby文本會與rb標籤內的所有文本居中對齊。如果沒有rb標籤,Ruby文本會與前一個字元居中對齊。
舉例:
e "Ruby 可以用來標識假名(東{rt}とう{/rt} 京{rt}きょう{/rt})。"
e "也可以用來翻譯({rb}東京{/rb}{rt}Tokyo{/rt})."
確保Ruby文本不會與其他文本內容重疊是創作者的職責。為了防止這種問題的出現,最好在文本上方多預留一些空間。
字體 link
Ren’Py支持TrueType/OpenType字體和字體集,以及基於圖形的字體。
TrueType或OpenType字體會給定字體檔案名。那個字體檔案必須被放在game文件夾裡,或者某個歸檔文件中。
Ren’Py也支持TrueType/OpenType字體集。一個字體集中定義了多種字體。當我們接入一個字體集時,使用從0開始的字體下標,後面跟@符號和檔案名。例如,“0@font.ttc”是字體集font的第一種字體,“1@font.ttc”是字體集font的第二種字體,以此類推。
如果Ren’Py在根目錄沒有找到某個字體檔案,會在 game/fonts
再次搜索。
例如,使用一個名為test.ttf的文件時,Ren’Py會先搜索 game/test.ttf
,然後搜索 game/fonts/test.ttf
。
字體替換 link
config.font_replacement_map
配置項用於字體map圖。字體檔案、加粗和斜體會使用map圖捆綁為一個組合。這個組合就用指定的斜體效果代替系統自動生成的斜體。
這種替換可以實現將“Deja Vu Sans”版本的斜體換成官方的“oblique”版本。(當然你需要先在網路上下載“oblique”字體。)
init python:
config.font_replacement_map["DejaVuSans.ttf", False, True] = ("DejaVuSans-Oblique.ttf", False, False)
完成替換後可以提升斜體文本的感官效果。
字體名稱與別名: link
配置項 config.font_name_map
用於建立字體與別名間的對應關係。
字體別名有兩個用於:首先,對話中使用的 {font}
文本標籤(tag)可以更簡短;
其次,可以在文本標籤中使用 字體組。
define config.font_name_map["jap"] = "electroharmonix.ttf"
define config.font_name_map["tjap"] = FontGroup().add("OrthodoxHerbertarian.ttf", "A", "Z").add("electroharmonix.ttf", None, None)
label yamato:
e "Sorry, what does {font=jap}Black holes and revelations{/font} mean ?"
y "You pronounce it {font=tjap}Black Holes And Revelations{/font}." # 只用OrthodoxHerbertarian字體的大寫字母
(譯者註:electroharmonix是從日文中選取了一些假名和符號替換 英文字母 的一套字體。OrthodoxHerbertarian也是一套英文字體。這兩種字體都不支持漢字,所以文本內容就不翻譯了。)
基於圖形的字體 link
透過調用以下字體註冊函數之一,可以註冊基於圖形的字體。註冊時,需要指定字體的名稱、字號、粗體、斜體和下劃線。當所有特性都匹配時,註冊後的字體才可以使用。
- renpy.register_bmfont(name=None, size=None, bold=False, italics=False, underline=False, filename=None) link
該函數註冊了一個給定明細的BMFont(點陣圖字體)。請注意,字號、粗體、斜體和下劃線入參只是詢問性質的(用於特性匹配),並不會改變字體的實際效果。
請查看 BMFont首頁 可以找到創建BMFonts的工具。Ren’Py需要filename參數是BMFont文本格式的,其描述了一個32比特字體的資訊。alpha通道應該包含字體資訊,而紅綠藍顏色通道應該被設置為1。圖形文件、字偶距和其他控制資訊都可以從BMFont文件中讀取。
我們推薦,創建的BMFont中包含拉丁字母和主要的標點符號,並確保在Ren’Py的介面上可以正確渲染。
- name
一個字串,註冊的字體名稱。
- size
一個整數,註冊字體的字號。
- bold
一個布爾值,標識註冊字體是否為粗體。
- italics
一個布爾值,標識註冊字體是否為斜體。
- underline
可以忽略的參數。
- filename
包含BMFont控制資訊的文件。
- renpy.register_mudgefont(name=None, size=None, bold=False, italics=False, underline=False, filename=None, xml=None, spacewidth=10, default_kern=0, kerns={}) link
該函數註冊了一個給定明細的MudgeFont。請注意,字號、粗體、斜體和下劃線入參只是詢問性質的(用於特性匹配),並不會改變字體的實際效果。
請查看 MudgeFont首頁 可以找到創建BMFonts的工具。Ren’Py假設MudgeFont的xml文件中的字元帶都unicode字元數值,並會忽略所有負值。
- name
一個字串,註冊的字體名稱。
- size
一個整數,註冊字體的字號。
- bold
一個布爾值,標識註冊字體是否為粗體。
- italics
一個布爾值,標識註冊字體是否為斜體。
- underline
可以忽略的參數。
- filename
一個字串,表示包含MudgeFont圖形的文件。該圖形通常是一個TGA文件,也可能是一個PNG或者其他Ren’Py支持的圖片格式。
- xml
包含MudgeFont工具生成資訊的xml文件。
- spacewidth
表示空格字元的寬度的整數,單位是像素。
- default_kern
字元間距的預設值,單位是像素。
- kerns
兩字型字串中字元間距的值。
- renpy.register_sfont(name=None, size=None, bold=False, italics=False, underline=False, filename=None, spacewidth=10, default_kern=0, kerns={}, charset=u'!"#$%&'()*+, -./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~') link
該函數註冊了一個給定明細的SFont。請注意,字號、粗體、斜體和下劃線入參只是詢問性質的(用於特性匹配),並不會改變字體的實際效果。
- name
一個字串,註冊的字體名稱。
- size
一個整數,註冊字體的字號。
- bold
一個布爾值,標識註冊字體是否為粗體。
- italics
一個布爾值,標識註冊字體是否為斜體。
- underline
可以忽略的參數。
- filename
一個字串,包含SFont圖形的檔案名。
- spacewidth
表示空格字元的寬度的整數,單位是像素。
- default_kern
字元間距的預設值,單位是像素。
- kerns
兩字型字串中字元間距的值。
- charset
字體的字元集。這是一個字串,可以按照字串中包含的字元順序在圖像文件中找到對應的字元。more的SFont字元集如下:
! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \\ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
由於BMFont是Ren’Py支持的所有三種圖形文字中完成度最高的,所以我們推薦新建項目使用BMFont。一個BMFont的使用樣例如下:
init python:
renpy.register_bmfont("bmfont", 22, filename="bmfont.fnt")
define ebf = Character('Eileen', what_font="bmfont", what_size=22)
label demo_bmfont:
ebf "Finally, Ren'Py supports BMFonts."
字體組 link
創建一個多語言遊戲時,有時無法找到單一的字體能夠包含所有文字並保持創作者想要表現的氛圍。 因此,Ren’Py支持將“字體組”的形式,將兩種或更多字體合併為一種字體。
創建字體組時,需要創建一個 :class:FontGroup 對象並調用逐次調用 .add
方法。FontGroup對象可以直接當作字體使用。
add方法會查看指定範圍內的unicode字元,並採用最先能匹配到的unicode字元範圍對應的字體。
舉例:
style default:
font FontGroup().add("english.ttf", 0x0020, 0x007f).add("japanese.ttf", 0x0000, 0xffff)
- class FontGroup link
可以將一組字體當作一種字體使用。
- add(font, start, end, target=None, target_increment=False) link
將某個範圍內的字元與字體 font 關聯。
- start
字元範圍起點。可以是一個單字元的字串,也可以是一個unicode字元對應的整數值。如果該入參為None,使用font入參的字體作為預設值。
- end
字元範圍終點。可以是一個單字元的字串,也可以是一個unicode字元對應的整數值。如果 start 入參為None,該參數值將忽略。
- target
若給定該入參,將根target_increment的值,將指定範圍的字元與指定的字體做關聯。 可以是一個單字元的字串,也可以是一個unicode字元對應的整數值。 如果指定的字元已經在添加了關聯,則忽略此參數。
- target_increment
若該值為True,[start, end]範圍內的字元將映射到[target, target+end-start]範圍。 若該值為False,指定範圍內的字元直接與目標字元做關聯。
當多個
.add()
調用中包含同一個字元時,使用第一個包含該字元的add方法中的字體。這個方法會返回FontGroup對象,所以能多個
.add()
串聯使用。
- remap(cha, target) link
將一個或一組字元重映射為某一個目標字元。
- cha
需要映射的源字元或源字元集。該值可以是一個單字元的字串,或unicode字元對應的整數值,或前兩者的疊代器對象(iterable)。
- target
需要映射的目標字元。該值可以是一個單字元的字串,或unicode字元對應的整數值。
已經(使用add或remap方法)重映射過的字元將被忽略。如果FontGroup對象沒有默認字體,必須指定每一個字元映射或關聯關係。
與add方法一樣,返回FontGroup對象。
注意,FontGroup類可以使用 config.font_name_map
獲取字體,但FontGroup對象只會獲取字體路徑,
並不會識別配置項中的字體名或別名。
文本組件 link
文本也可以用作一個 可視組件,這意味著你可以在文本上應用各種變換(transform),可以當作一個圖片顯示並在界面上移動它的位置。
- renpy.ParameterizedText(style='default', `properties) link
該函數創建一個可視組件對象,可以帶一個字串做為入參,根據入參字串生成的對象能當作圖像顯示。常用作預定義的
文本
圖片的一部分。舉例,我們可以這樣寫:
show text "Hello, World" at truecenter with dissolve pause 1 hide text with dissolve
你可以使用ParameterizedText函數,採用不同的樣式特性,直接定義出一些類似的圖片。舉例,我們可以這樣寫:
image top_text = ParameterizedText(xalign=0.5, yalign=0.0) label start: show top_text "這段文字顯示在界面正中"
- Text(text, slow=None, scope=None, substitute=None, slow_done=None, *, tokenized=False, **properties) link
創建一個可視組件,在界面上顯示文本。
- text
在界面上顯示的文本內容。該參數可以是一個字串,或者一個字串和可視組件的列表。
- slow
決定文本是否緩慢顯示,即在界面上逐個顯示出每個字元。若為None,緩慢文本模式取決於slow_cps樣式特性。否則,是否啟用緩慢文本模式由此處參數slow決定。
- scope
若不為None,該值應該是一個字典型數值,提供了額外的作用域(scope)供文本內插(interpolation)的使用。
- substitute
若該值為True,則應用文本內插(interpolation)。若該值為False,不應用文本內插。若該值為None,由
config.new_substitutions
控制文本內插表現。- slow_done
若非None,並且啟用了慢速文本模式(參見 slow 參數),該參數應該是一個無參數的函數或可調用對象。 當文本完成顯示後調用參數對應的函數或可調用對象。
- tokenized
若為True,text 參數需要是一個token列表而不是一個字串。token內容參見 訂製文本標籤 頁面。
- **properties
與其他可視組件類似,文本組件可以使用樣式特性,包括
mipmap
。
文本功能函數 link
- renpy.filter_text_tags(s, allow=None, deny=None) link
返回入參s的一個拷貝,其是文本標籤過濾後的結果。allow和deny關鍵字參數至少需要給出1個。
- allow
允許通過的標籤的集。如果某個標籤不在該列表中,將會被移除。
- deny
禁止通過的標籤的集。如果某個標籤不在該列表中,將會保留在字串中。
- renpy.transform_text(s, function) link
轉換字串s,但保留s的文本標籤和內插文本不變。
- function
一個轉換函數,將文本進行轉換並返迴轉換後的文本。
init python: def upper(s): return s.upper() $ upper_string = renpy.transform_text("{b}Not Upper{/b}", upper)
慢速文本的顧慮 link
Ren’Py允許創作者或者用於指示某些文本以慢速顯示。這種情況下,Ren’Py會將文本渲染至某個紋理(texture),然後將紋理的矩形區域繪製到界面上。
不幸的是,這意味著字元間的重疊區域渲染後會出現瑕疵。為了盡可能減少這種渲染瑕疵,需要盡可能保證 line_leading
和
line_spacing
值足夠大,各行之間沒有覆蓋的區域。如果首行縮進文本,特別是line_spacing為負值的情況,我們需要考慮增大
line_overlap_split
的值。
水平方向的瑕疵也可能由於字偶距原因而擠在一起,不過這不是什麼嚴重的問題,畢竟相鄰字元之間顯示的時間差不過1幀而已。
對於靜態文本來說存在瑕疵不是什麼問題,比如菜單等用戶界面部分。
文本溢出日誌 link
Ren’Py可以記錄文本溢出所在區域的日誌。要啟用文本溢出日誌功能的話,需要經過以下步驟:
將
config.debug_text_overflow
配置項設為True。運行遊戲。
一旦文本顯示溢出了可用區域,Ren’Py就會把錯誤記錄在 text_overflow.txt 文件中。
可變字體 link
Ren’Py支持OpenType可變字體。這些字體可能會支持多個axe,比如字重和寬度。 基於這些axe的不同值,同一個字體可以顯示出不同的形態。可變字體也可能會對不同axe值的實例直接採用不同名稱。 例如,“bold”為名的實力會提供某個字體的粗體版,而“regular”則是某個字體的普通版。
可變字體要求設置 shaper
樣式特性為harfbuzz文本渲染器。
設置完成後,instance
特性選擇實例名,axis
特性設置各axe的值。
可變字體也可以用在GUI中。例如:
define gui.text_font = "nunito.ttf"
define gui.text_instance = "light"
define gui.text_axis = {"width" : 125}
可以使用“light”型字體,並設置文字寬度。
若不指定實例名,Ren’Py預設使用“regular”顯示非加粗文本,使用“bold”顯示加粗文本。
有兩種文本標籤可以用於可變字體。
- instance link
instance標籤更改當前使用的字體實例。例如:
"This is {instance=heavy}heavy{/instance} text."
instance標籤會覆蓋axis特性。
- axis link
axis標籤會修改一個或多個axe的值。例如:
"This is {axis:width=125}wide{/axis} text."
axis標籤可以多層嵌套組合使用。
“This is {axis:width=125}{axis:weight=200}wide and bold{/axis}{/axis} text.”
標籤內參數賦值時,等號右邊的數會被當作浮點型數值處理。
若要獲取某個字體的實例和axe資訊,可以調用 renpy.variable_font_info()
函數。
該函數設計為從控制台調用。使用時,先用Shift+O打開控制台,然後輸入:
renpy.variable_font_info("nunito.ttf")
就能在控制台看到nunito.ttf字體資訊了。
- renpy.variable_font_info(font) link
返回某個可變字體的資訊。若字體不是可變字體則返回None。
- font
字體檔案名。
返回對象具有下列欄位:
- instance
該欄位是一個字典。字典的鍵(key)分別是該字體的所有實例名。(例如,“light”、“regular”、“bold”或“heavy”。) 字典的各個值可以忽略。
- axis
該欄位是一個字典,表示字體中各axe與下列欄位的映射關係:
- minimum
axis的最小值。
- default
axis的預設值。
- maximum
axis的最大值。
該函數返回對象和對象中的數據不能修改。
只有Ren’Py的顯示部分完成初始化之後才能調用該函數。 該函數被設計成透過控制台調用,並以人類能閱讀的形式列印返回結果。