SDL井字棋實作

林品儒

2016/12/2

今日流程

介紹方法呼叫以及方法定義

將範例程式完成

方法

方法

可以將內部資料或外部資料作運算的功能

可執行的程式碼片斷

重複出現的程式碼可以寫成方法

方法呼叫

呼叫者給予引數

被呼叫者(方法)取得參數

方法會運算之後可以回傳結果

呼叫方法

方法後面使用小括號並給予引數

或是省略小括號直接給予引數

puts("Hello, world")

puts "Hello, world"

語法糖衣

很多看起來是運算子的運算其實也是方法

Ruby所有東西都是物件

而物件的操作就被稱為方法

1.+(2.*(3)) vs 1.+2.*3 vs 1+2*3

變數可視範圍

變數

在講解方法定義前要先知道有哪些變數

全域變數

區域變數

現在用不到的實體變數和類別變數

全域變數

"有錢能使鬼推磨"

$stdin,$stdout,$stderr

任何地方都可以存取全域變數

但是因為到處都可以用被誰改了也不知道...

區域變數

只有在該變數出現後才可以使用的變數

在被敘述或區塊包住的結構內可以使用外面的變數

但是該結構內的變數外面不能用

而方法定義則是獨立的可見範圍

方法定義

方法定義

接下來看看方法定義的語法吧

利用def關鍵字定義方法名稱以及參數

def add(a,b)
  return a+b
end

方法會自動回傳最後的運算

方法名稱

只要是英文字母開頭都可以命名

但是要注意和區域變數撞名

建議是採用全小寫加上底線分隔

參數

Ruby有非常多種參數傳遞方式

以下一一介紹

定位參數

一個蘿蔔一個坑

像底下的例子一定要傳入兩個參數

def mul(a,b)
  return a*b
end
mul 3,5

預設參數

好像也有人說是預設引數...

可以在後面的參數給予預設值

省略引數不傳遞也沒有關係

def sub(a,b=0)
  return a-b
end
sub 6

不定長度

其實像是puts,print之類的方法可以傳入很多引數

定義方法時可以把不定個數的引數用陣列收集

def acc(*numbers)
  return numbers.inject(:+)
end
acc 1,4,9,16

命名參數

在Ruby2.0後支援的功能

可以傳遞帶有名字的引數方便辨識

def func(a: 0, b: 0, method: :+)
  return a.send(method,b)
end
func method: :**,a: 2,b: 12

雜湊參數

其實是命名參數的原先版本

傳遞了錯誤的引數也不會發現...

def func(op)
  return op[:a].send(op[:method],op[:b])
end
func a: 2,b: 12,metnod: :**

仔細看看??

小結

定義方法的時候參數有很多種設計

挑選合適的來搭配才有好效果

程式實作

程式實作

不會讓同學撰寫全部的程式碼

只需要定義函式並且實作內部功能

套件安裝

需要使用gem這個ruby套件管理工具

rubysdl和ruby-sdl-ffi都要裝

gem install ruby-sdl-ffi

gem install rubysdl-mswin32-1.9

install_rubysdl

套件功能

rubysdl提供了各種包裝好的SDL功能

不過這次只是要用他的dll

ruby-sdl-ffi則是直接取用SDL的函式

雖然比較難用不過跨平台比較方便

完成程式碼

未完成程式碼

在程式碼中會有註解以及提示

特別注意 ?? 的部份

刪除兩個問號並且填入程式碼

標記位置只是輔助 有需要其他程式碼也可以自己寫

開始動手做

可以利用IRB來實驗方法的使用

開啟文字編輯器以及命令列

慢慢完成程式吧