不知您有沒有發現到,在上一章裡初級智慧動物像無頭蒼蠅那樣隨意亂竄,這是因為它沒有目標可以追尋。在本章裡,我們將利用滑鼠游標代表另一隻動物,而具有初級智慧的那隻動物會來追逐牠。
取得滑鼠游標座標
系統變數 mouseX 和 mouseY 分別表示滑鼠的 X 座標和 Y 座標。當移動滑鼠時,您所取得的 mouseX 和 mouseY 數值也會跟著改變。
這兒我們要讓初級智慧動物追逐游標,游標移動到哪裡牠便跟著移動到那裡,程式碼如下:
int cx, cy;
int vx, vy;
void setup() {
size(800,600);
cx = width / 2;
cy = height / 2;
}
void draw() {
background(155);
if (mouseX > cx)
vx = 1;
else
vx = -1;
if (mouseY > cy)
vy = 1;
else
vy = -1;
cx += vx;
cy += vy;
rect(cx, cy, 5, 5);
}
2015年6月28日 星期日
蘋果的智慧 - Part2.1 移動
本章旨在探討初級智慧動物如何移動。
在說明如何移動之前,我們要先瞭解 Processing 的座標系統。Processing 是以螢幕的左上角落為座標原點 (0, 0),水平方向為 X 軸,往右為正(+),往左為負(-);垂直方向為 Y 軸,往下為正(+),往上為負(-)。旋轉方向順時針為正(+),逆時針為負(-)。您可以參考 https://processing.org/tutorials/drawing/
最初出現的地方
為了方便觀察,最開始我們會將初級智慧動物置放於螢幕中央,如此牠不至於很快就走出螢幕而消失不見。程式碼如下:
size(800, 600) // 設置螢幕大小,水平為 800 單位,垂直為 600 單位
int cx = width / 2 // cx 表動物目前的水平座標位置
int cy = height / 2 // cy 表動物目前的垂直座標位置
width 和 height 都是公用變數,其意思分別是螢幕的水平尺寸和垂直尺寸,在此處也就是 800 x 600。
如果我們希望初級智慧動物是隨意出現在螢幕的任一角落,我們可以使用亂數函式 random,程式碼可以修改如下:
size(800, 600) // 設置螢幕大小,水平為 800 單位,垂直為 600 單位
int cx = (int)random(0, width) // cx 表動物目前的水平座標位置
int cy = (int)random(0, height) // cy 表動物目前的垂直座標位置
因為 random 傳回的值是 float 的格式,為了要配合 cx 和 cy 的 int 格式,所以我們要在前面加上 (int) 做格式轉換的動作。
然後,我們畫出一個 5x5 單位的正方形來代表初級智慧動物,程式碼如下:
rect(cx, cy, 5, 5);
完整程式碼如下:
int cx, cy;
void setup() {
size(800,600);
cx = width / 2;
cy = height / 2;
}
void draw() {
rect(cx, cy, 5, 5);
}
更改為隨機出現在任一位置,完整程式碼如下:
int cx, cy;
void setup() {
size(800,600);
frameRate(2); // 指定影格速率,每秒執行 2 次 draw 函式
}
void draw() {
background(155); // 指定背景顏色,此處有刷新螢幕的作用
cx = (int)random(0, width);
cy = (int)random(0, height);
rect(cx, cy, 5, 5);
}
移動碼
初級智慧動物會依據移動碼的數值來移動。移動碼又可分為水平分量與垂直分量。分量的值愈大表移動速度愈快,反之則愈慢,若為 0 則表示靜止不動。
我們用變數 xv 和 yv 分別代表水平分量和垂直分量的移動值,將位置變數 cx 和 cy 分別加入變數 vx 和 vy,就可以讓初級智慧動物產生移動的效果。
移動有方向性,所以 xv 和 yv 有正負的分別。另外為了限制移動的速度,此處我們將移動分量暫時限定於 -5 ~ 5 之間。
程式碼如下:
int vx = (int)random(-5, 5);
int vy = (int)random(-5, 5);
cx += vx;
cy += vy;
完整程式碼如下:
int cx, cy;
void setup() {
size(800,600);
cx = width / 2;
cy = height / 2;
frameRate(10);
}
void draw() {
background(155);
int vx = (int)random(-5, 5);
int vy = (int)random(-5, 5);
cx += vx;
cy += vy;
rect(cx, cy, 5, 5);
}
延伸閱讀
亂數 random 函式 https://processing.org/reference/random_.html
在說明如何移動之前,我們要先瞭解 Processing 的座標系統。Processing 是以螢幕的左上角落為座標原點 (0, 0),水平方向為 X 軸,往右為正(+),往左為負(-);垂直方向為 Y 軸,往下為正(+),往上為負(-)。旋轉方向順時針為正(+),逆時針為負(-)。您可以參考 https://processing.org/tutorials/drawing/
最初出現的地方
為了方便觀察,最開始我們會將初級智慧動物置放於螢幕中央,如此牠不至於很快就走出螢幕而消失不見。程式碼如下:
size(800, 600) // 設置螢幕大小,水平為 800 單位,垂直為 600 單位
int cx = width / 2 // cx 表動物目前的水平座標位置
int cy = height / 2 // cy 表動物目前的垂直座標位置
width 和 height 都是公用變數,其意思分別是螢幕的水平尺寸和垂直尺寸,在此處也就是 800 x 600。
如果我們希望初級智慧動物是隨意出現在螢幕的任一角落,我們可以使用亂數函式 random,程式碼可以修改如下:
size(800, 600) // 設置螢幕大小,水平為 800 單位,垂直為 600 單位
int cx = (int)random(0, width) // cx 表動物目前的水平座標位置
int cy = (int)random(0, height) // cy 表動物目前的垂直座標位置
因為 random 傳回的值是 float 的格式,為了要配合 cx 和 cy 的 int 格式,所以我們要在前面加上 (int) 做格式轉換的動作。
然後,我們畫出一個 5x5 單位的正方形來代表初級智慧動物,程式碼如下:
rect(cx, cy, 5, 5);
完整程式碼如下:
int cx, cy;
void setup() {
size(800,600);
cx = width / 2;
cy = height / 2;
}
void draw() {
rect(cx, cy, 5, 5);
}
更改為隨機出現在任一位置,完整程式碼如下:
int cx, cy;
void setup() {
size(800,600);
frameRate(2); // 指定影格速率,每秒執行 2 次 draw 函式
}
void draw() {
background(155); // 指定背景顏色,此處有刷新螢幕的作用
cx = (int)random(0, width);
cy = (int)random(0, height);
rect(cx, cy, 5, 5);
}
移動碼
初級智慧動物會依據移動碼的數值來移動。移動碼又可分為水平分量與垂直分量。分量的值愈大表移動速度愈快,反之則愈慢,若為 0 則表示靜止不動。
我們用變數 xv 和 yv 分別代表水平分量和垂直分量的移動值,將位置變數 cx 和 cy 分別加入變數 vx 和 vy,就可以讓初級智慧動物產生移動的效果。
移動有方向性,所以 xv 和 yv 有正負的分別。另外為了限制移動的速度,此處我們將移動分量暫時限定於 -5 ~ 5 之間。
程式碼如下:
int vx = (int)random(-5, 5);
int vy = (int)random(-5, 5);
cx += vx;
cy += vy;
完整程式碼如下:
int cx, cy;
void setup() {
size(800,600);
cx = width / 2;
cy = height / 2;
frameRate(10);
}
void draw() {
background(155);
int vx = (int)random(-5, 5);
int vy = (int)random(-5, 5);
cx += vx;
cy += vy;
rect(cx, cy, 5, 5);
}
延伸閱讀
亂數 random 函式 https://processing.org/reference/random_.html
蘋果的智慧 - Part1 智慧的分級
「蘋果的智慧」這本書將機器智慧概分為初級智慧與中級智慧。
初級智慧動物會隨機取得一個指令,告訴他該往右、往左或往其他方向移動,另外還會隨機取得移動的速度。
中級智慧動物除了俱備初級智慧動物所有的屬性之外,它最特別的是有記憶功能,它會學習,可以透過記憶資料庫告訴他在面對問題時該怎麼做。
初級智慧動物會隨機取得一個指令,告訴他該往右、往左或往其他方向移動,另外還會隨機取得移動的速度。
中級智慧動物除了俱備初級智慧動物所有的屬性之外,它最特別的是有記憶功能,它會學習,可以透過記憶資料庫告訴他在面對問題時該怎麼做。
蘋果的智慧 - Part0 前言
作者黃松榮於民國72年12月出版一本書,書名叫「蘋果的智慧」,這本書在我書架內已塵封30幾年了,最近在臉書看到一篇有關人工智慧的貼文,剛好我這幾年來也在玩自走車和機器人,心想或許能為機器人加入一些人工智慧,於是就把這本書再重新翻出來看看。
這本「頻果的智慧」書中所謂的人工智慧,前面幾個章節僅僅只是模擬動物如何移動、搜尋、獵殺或躲避,最後一個章節則加入記憶。若以現今的電腦遊戲設計方法來看,書中所謂的人工智慧只能算是幼稚園等級。雖然如此,它還是有很多地方值得初學者來學習的。
「頻果的智慧」書中的範例程式是用 APPLE BASIC 寫的,我個人覺得 Processing 這種自然語言比 BASIC 更能表現圖形和動態效果,所以如果對人工智慧有興趣卻又不瞭解 Processing 程式語言的人可能得花更多時間和精神在這上面。
人工智慧 (Artificial Intelligence) 簡稱AI,我不多作解釋,建議您可以看一下維基百科,文中說明得非常詳細,網址 https://zh.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD
。
「頻果的智慧」目錄如下:
第1章 智慧的分級
第2章 移動與前往搜尋
第3章 初級智慧
第4章 初級智慧的互相結合
第5章 中級智慧
第6章 機器心理學簡介
第7章 蒐集編譯資料
本人會依據上述章節陸續來探討人工智慧。
這本「頻果的智慧」書中所謂的人工智慧,前面幾個章節僅僅只是模擬動物如何移動、搜尋、獵殺或躲避,最後一個章節則加入記憶。若以現今的電腦遊戲設計方法來看,書中所謂的人工智慧只能算是幼稚園等級。雖然如此,它還是有很多地方值得初學者來學習的。
「頻果的智慧」書中的範例程式是用 APPLE BASIC 寫的,我個人覺得 Processing 這種自然語言比 BASIC 更能表現圖形和動態效果,所以如果對人工智慧有興趣卻又不瞭解 Processing 程式語言的人可能得花更多時間和精神在這上面。
人工智慧 (Artificial Intelligence) 簡稱AI,我不多作解釋,建議您可以看一下維基百科,文中說明得非常詳細,網址 https://zh.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD
。
「頻果的智慧」目錄如下:
第1章 智慧的分級
第2章 移動與前往搜尋
第3章 初級智慧
第4章 初級智慧的互相結合
第5章 中級智慧
第6章 機器心理學簡介
第7章 蒐集編譯資料
本人會依據上述章節陸續來探討人工智慧。
2015年6月19日 星期五
列印電風扇遙控器電池蓋
夏天到了,即使不開冷氣也需要開電風扇。家裡的壁扇遙控器電池蓋失蹤許久,CR2032 電池容易掉出來,想要開啟電風扇時搖控器卻因為沒有電池而無法發揮作用,久而久之大家都寧可爬高開壁扇,也懶得再去尋找遙控器的電池。
我有3D印表機,畫機構圖也不是難事,好吧~~趁著端午假期閒閒沒事那就來做一個蓋子。
這是壁扇搖控器
這是背面,可以看到沒有蓋子。中間那個是 CR2032 電池。
量取相關尺寸後用 AutoCAD 畫圖
經過數分鐘後終於畫好了,切換視角到立體圖。
使用 Cura 切片軟體產生 GCode。
3D 列印。
列印完成。
打磨後組裝。我設計了一個10元硬幣的凹槽,可以使用10元開關這個蓋子。
成功~~~~。
3D列印確實是 Maker 的好夥伴。
我有3D印表機,畫機構圖也不是難事,好吧~~趁著端午假期閒閒沒事那就來做一個蓋子。
這是壁扇搖控器
這是背面,可以看到沒有蓋子。中間那個是 CR2032 電池。
量取相關尺寸後用 AutoCAD 畫圖
經過數分鐘後終於畫好了,切換視角到立體圖。
使用 Cura 切片軟體產生 GCode。
3D 列印。
列印完成。
打磨後組裝。我設計了一個10元硬幣的凹槽,可以使用10元開關這個蓋子。
成功~~~~。
3D列印確實是 Maker 的好夥伴。
2015年6月18日 星期四
上傳(Upload) hex 檔
如果別人給你的檔案不是 .ino,而是 .hex,這時該如何把它上傳(Upload)到 Arduino 呢?
這裡我們要介紹 XLoader 這套軟體給你。
官網 http://russemotto.com/xloader/
下載 http://russemotto.com/xloader/XLoader.zip
上傳步驟如下:
1. 下載 XLoader,解壓縮後執行 xloader.exe。
2. 點擊 Hex file 右側的瀏覽按鈕,選取 hex 檔案。
3. 點擊 Device 右側的按鈕,選取您的 Arduino 板子,如果是 Uno,可以選取「Uno(ATmega328」。
4. 指定正確的 COM port。
5. 指定 Baud rate 為 115200。
6. 點擊「Upload」按鈕。
一旦出現類似 "xxxxs byte uploaded" 這樣的訊息,表示完成上傳動作。
這裡我們要介紹 XLoader 這套軟體給你。
官網 http://russemotto.com/xloader/
下載 http://russemotto.com/xloader/XLoader.zip
上傳步驟如下:
1. 下載 XLoader,解壓縮後執行 xloader.exe。
2. 點擊 Hex file 右側的瀏覽按鈕,選取 hex 檔案。
3. 點擊 Device 右側的按鈕,選取您的 Arduino 板子,如果是 Uno,可以選取「Uno(ATmega328」。
4. 指定正確的 COM port。
5. 指定 Baud rate 為 115200。
6. 點擊「Upload」按鈕。
一旦出現類似 "xxxxs byte uploaded" 這樣的訊息,表示完成上傳動作。
訂閱:
文章 (Atom)