這篇是The Nature fo Code的第0章-Introduction,想必內容也不會太艱澀,這章在描述物體的隨機移動,隨機運動可以應用在模擬空氣中的漂浮粒子,或是賭局的過程與結果。
怎麼樣隨機呢?想像你正在走路,但只有兩個方向可以選擇,不是前進就是後退,我們用擲硬幣來決定前進或後退,擲到正面就前進一步,反面則後退一步,這就是隨機運動。假如要往四個方向移動,便是擲兩次硬幣,
1 | 2 | 決定的動作
一 | 一 | 一
正 | 正 | 前進
正 | 負 | 後退
負 | 正 | 向右
負 | 負 | 向左
乍看之下不就是一個Random function就可以解決了嗎? 真的這麼簡單?的確是,但也不是,這章的主要目的有三個:
看完這張的內容之後發現,關於物件導向,從來沒有真的那麼接近過老師舉的例子,我真的有一個叫人的類別,它真的有一個行為叫走路,它真的會在螢幕上走路,真的很酷,所以我們不能跳過簡單的這一章。
首先要建出一個Walker的物件,說明一下物件導向
物件Object
是一個擁有屬性以及方法的實體,在Walker物件上代表,會有一個屬性去記錄他在螢幕上的位置,另外會有方法去呈現Walker會做的行為,像是往某個方向走一步,或是把自己畫在螢幕上。
類別Class
類別是一個物件的藍圖,可以用來創造出物件的實體,用書裡的例子來講,類別是餅乾刀模(cookie cutter),物件則是真正的餅乾。
現在來定義一個Walker的class,他會需要兩個屬性,x坐標與y坐標,代表螢幕上的位置。
class Walker{
int x;
int y;
每個class也可以定義建構子(constructor),他會在物件被建立的時候執行,裡面可以放初始值或一開始要執行的動作,在這邊我們定義物件起始的位置。
Walker(){
x = width/2;
y = height/2;
}
再來是物件的行為,需要一個方法能夠把它自己畫在螢幕上,
void display(){
stroke(0);
point(x,y);
}
但畫在螢幕上還不會移動,因為x與y的值沒有被改變,需要一個移動位置的方法,前面提到我們要進行隨機移動可以擲硬幣決定,四個方向必須擲兩次,但在程式中我們可以使用random()這個方法,random(4),會產生介於0~3.99999999之間的浮點數(不會是4),因此如果小數點後捨去,int(random(4)),就可以得到整數的0、1、2、3四個結果,剛剛好四個方向。
void step() {
int choice = int(random(4));
得到的結果對應四個方向的移動
if(choice == 0){
x++;
}else if(choice == 1){
x--;
}else if(choice == 2){
y++;
}else{ //3
y--
}
我們已經有了一個完整的class,把Walker所有的行為都定義在裡面,現在要把它真正的畫到螢幕上,這會使用到在Processing基礎介紹到的setup()與draw(),
定義一個Walker形態的全域變數w,讓它可以同時在setup與draw中使用
Walker w;
設定螢幕大小與背景顏色,並創建Walker物件
void setup(){
size(300, 300);
background(255);
w = new Walker();
}
在每次畫面更新的時候,walker便移動一步,並在螢幕上畫一個點
void draw(){
w.step();
w.display();
}
執行後的結果便是一個移動的小點,會不斷地在螢幕上留下軌跡,為什麼會留下軌跡呢?因為Processing不會在每次draw之後清空畫面,所以就會記錄每一次所繪的結果,也可以在draw裡面插入background(255),這樣就會跑出像是一隻螢火蟲(或蒼蠅)
飛來飛去的結果。
void draw(){
background(255);
w.step();
w.draw();
}
完整程式碼可以在書本的Github Repo找到,這裡是本節程式碼。
下一次要繼續介紹introduction的內容,大概會拆成三篇來寫,主要希望每篇的字數能控制在兩千字以內,比較容易理解與閱讀。
下一篇-改進Random Walker。