以 C 語言實作龍與地下城 (Dragons and Dungeons) 風格的骰子

學習程式設計時,除了學習其語法外,運用已知的語法來實作一些小型程式,更有助於澄清我們對於程式語言的理解是否正確。在本例中,我們使用 C 語言來實作龍與地下城 (Dragons and Dungeons) 遊戲中著名的 d20 骰子系統,雖然在這麼短的範例無法做出電腦遊戲,實作遊戲中的骰子也是程式設計中常見的一項課題。 介紹 在遊戲中,隨機性 (randomness) 可增加遊戲的趣味,避免遊戲結果太過固定、可預期而感到乏味。在桌上遊戲中,透過 (公正的) 骰子來達到隨機性,在電腦程式中,則是透過隨機函式來生成亂數。龍與地下城原本是桌上遊戲,後來有數家電腦遊戲廠商將其做成電腦遊戲,像是柏德之門 (Baldur’s Gate)、冰風之谷 (Icewind Dale)、絕冬城之夜 (Ne...
「點我閱讀更多」

Go (Golang) 適合初學者做為網頁後端程式嗎?

原本這是在 Quora 討論區上出現的一個問題,筆者當時也發文回答。因這個議題蠻有意思的,筆者將其重新整理後用中文寫出來,網頁程式的初學者可以參考參考。由於這類議題帶有個人主觀的成分,其實沒有標準答案;程式語言和函式庫畢竟是工具,工具只要順手合用即可。 現在學網頁程式,網頁框架是顯學,不過,也有像 Golang 或 PHP 等不用網頁框架也能有效地寫出網頁程式的語言。PHP 原本的概念是模板語言 (template language),由於簡單易學,很快就變成當時主流的網頁後端語言。不過,PHP 很容易寫出難以維護的程式,後來也出現像 Laravel 等用 PHP 所寫的網頁框架,用來改善 PHP 網頁程式的工程性。以本文要介紹的 Golang 來說,Golang 本身無法做為模板語...
「點我閱讀更多」

Anaconda 簡易入門

Anaconda 簡易入門 最近在 Python 語言相關討論區會看到有網友在問 Anaconda 相關的問題,網路上中文相關的介紹也偏少,因此筆者在這裡寫一篇相關的介紹,讓讀者可以比較快上手。Anaconda 是一家美國的軟體公司 (見 FAQ),該公司製作了一套 Anaconda Python Distribution,該 Python 發行版算是 Python (和 R) 的懶人包,這套發行版除了原本 Python 和 R 的功能外,另外加入套件管理和環境管理相關的軟體 (conda),也預包了 1000+ 資料科學 (和其他領域) 相關的 Python 套件。 註:環境 (environment) 是 Anaconda 中虛擬的概念,在某個環境中可以指定某個版本的 Pyth...
「點我閱讀更多」

如何以 C 語言撰寫泛型程式?

泛型 (Generics) 是一種無型別的程式,主要是用在靜態型別的語言上。撰寫泛型程式的好處是同一個演算法可以套件在不同型別上,減少重覆撰寫相同演算法但不同類別的程式碼。由於泛型的好處,很多資料結構和演算法的函式庫會用泛型程式來實作,一些實例像是 C++ 的 STL (Standard Template Library)、Java (或 C#) 的 Collections 等。 在 C11 以前的 C 不支援實質的泛型,所以在網路上宣稱的 C 泛型程式並不是真的泛型程式,而是用其他語法特性模擬出來的;所以在學習這些「泛型」程式時要注意其手法和限制。一般來說,C 的擬泛型程式有以下三種實作方式: 指向 void 的指標 (pointer to void) 巨集 (macr...
「點我閱讀更多」

為什麼要用 C 語言寫物件導向程式?

雖然 C 語言沒有直接支援物件導向程式的語法,但我們可以在一些真實世界的專案看到具有物件導向思維的 C 程式碼,一些知名的例子像是 Linux 核心和 GTK+ 等。然而,我們在 C 語言的教材很少直接探討這個議題,大部分教材的態度是在教完基本的 C 語法後就轉往 C++,像是 C 程式設計藝術 (全華圖書) 的前面是 C 語言,後面就塞入 C++ 相關的內容來增加版面。那麼,我們為什麼要用 C 語言寫物件導向程式呢? 物件導向是一種程式設計的範式 (paradigm),理論上是抽象的程式設計思維,但卻會受到程式語言特性的影響,從每個程式語言的語法就可以看到不同程度的物件特性。對物件導向來說,最基本的是資料 (data) 和行為 (behavior) 連動所帶來的狀態 (state)...
「點我閱讀更多」