2011年9月4日星期日

KAG教學---加減乘除,變數(2)

(k ゚∀゚)<除了直接指定數值給變數之外,也可以指定一些經過運算後的數值。

運算?即是加減乘除等等的東西嗎?>( ゚ω゚ s)

(k ゚∀゚)<吉里吉里除了加 ( + )、減( - )、乘( * )、除( / )等運算子之外,還有計算餘數的模數運算子( % ),看一下以下的範例。

[eval exp="tf.count=1+2*(3+1)"]
[emb exp="tf.count"]

(k ゚∀゚)<吉里吉里會由左而右進行運算,當然,先乘除後加減,括號優先運算等基本運算規則不會改變的,所以運算後的結果是9。以下是另一個範例。

[eval exp="tf.count=6/4"]
[emb exp="tf.count"]

答案是1.5嗎?>( ゚ω゚ s)

(k ゚∀゚)<正確,不過如果大家只想要整數的數值,可以使用反斜符號( \ )取代,小數點之後的部份就會被自動消去,以下是範例。

[eval exp="tf.count=6\4"]
[emb exp="tf.count"]

(k ゚∀゚)<這次運算結果是1。

(k ゚∀゚)<計算餘數可以用模數運算子(Modulus operator),不過只限於整數的運算,以下是範例。

[eval exp="tf.count=6%4"]
[emb exp="tf.count"]

(k ゚∀゚)<運算後的結果是2。

不過這個模數運算子的運算優先順序是怎樣?>( ゚ω゚ s)

(k ゚∀゚)<這個模數運算子的運算優先順序和乘除一樣,大家可看看以下的範例。

[eval exp="tf.count=6%4*2"]
6%4*2=
[emb exp="tf.count"][r]
[eval exp="tf.count=6*2%4"]
6*2%4=
[emb exp="tf.count"]

(k ゚∀゚)<由於運算優先順序一樣,所以由左而右進行運算,第一個結果是4,第二個結果是0。

(k ゚∀゚)<大家亦可把變數用來進行運算,看看以下的範例。

[eval exp="tf.count=0"]
[eval exp="tf.count=tf.count+1"]
[emb exp="tf.count"]

tf.count=tf.count+1不是錯誤嗎?count怎可能等於count+1。>( ゚ω゚ s)

(k ゚∀゚)<都說了不是"等於",我們是把count+1指定給count,如果原本的count是0,運算後count就是1。

(k ゚∀゚)<順便一提,就算是字串也可以加起來,兩個字串會黏在一起,以下是範例。

[eval exp="tf.count='我是'+'字串'"]
[emb exp="tf.count"]

(k ゚∀゚)<字串加起來後,count儲存了'我是字串'這句字串。

不如下回才繼續,我現在頭腦很混亂......>( ゚ω゚ s)

(k ゚∀゚)<好吧,下次再繼續介紹其餘的東西。

10 則留言:

  1. 請問一下,如果是要設定養成遊戲的數值,一開始是0,然後吃了物品會+1

    [eval exp="f.力量=0"]
    [eval exp="f.力量=f.力量+1"]
    [emb exp="f.力量"]
    這樣寫對嗎?不過是該要寫再哪個腳本裡呢?研究了好幾天都沒有頭緒阿(崩潰

    另外有辦法跑玩變數以後,以文字讓結果的數值顯現在頁面上面嗎....

    回覆刪除
  2. 嗯,這樣寫基本上沒有問題,
    不過要留意如果是養成遊戲的話,
    第一句通常是寫在遊戲一開始的地方,
    把所有變數進行初始化。
    第二句通常是遊戲的迴圈部分,
    當玩家按下使用物品的選項時,
    第二句就應該要執行。
    第三句就是用來顯示變數的數值,
    應該就是你所問的"讓結果的數值顯示在頁面上面"的方法。

    回覆刪除
  3. 噢噢,謝謝!
    我再試試看:)

    回覆刪除
  4. 我有個問題
    [link target=*1 eval exp="f.flag=1"]選項1[endlink][r]
    [link target=*1]選項2[endlink][r]
    [s]
    *1
    [p][cm]
    你好
    [p][cm]
    [if exp="f.flag==1"]
    ……
    [else]
    去死
    [endif]

    這個可以接受,但如果我想再放第二個選項並且加上+1的話是不是這樣:
    [link target=*2 eval exp="f.flag+=1"]選項1[endlink][r]
    [link target=*2]選項2[endlink][r]
    [s]
    *2
    [p][cm]
    [if exp="f.flag==1"]
    ……
    [elseif exp="f.flag==2"]
    嗯……
    [else]
    去死
    [endif]

    但這樣的話無論如何都會直接去“去死”…………求解釋

    回覆刪除
  5. 我剛剛測試了你的問題,
    如果按下選項1時,會顯示"……",
    而按下選項2時,則會顯示"去死"。
    這因為當我們按下選項1,
    f.flag的值就會加1,
    若果f.flag沒有被初始化,
    f.flag的值就是void,
    當吉里吉里執行f.flag=void+1這句,
    它會把void轉換成0,
    所以f.flag的值會變成1,
    並且顯示"……",
    用同樣道理可以解釋選項2,
    f.flag的值是void,
    這意味著f.flag不等於1或2,
    因此會顯示"去死",
    不知道有沒有理解錯你的問題,
    如果有其他問題歡迎再提問。
    (補充:[elseif]寫錯了,應該是[elsif]才對,
    還有[link]裡沒有eval的。)

    回覆刪除
  6. 原來是elsif啊啊啊 〉〉面壁去
    不過在link裏面寫eval的話還是順利的哦?
    (那不是的話eval該寫在link外面還是哪裏?)

    然後,在第二個選項要把flag的數目增加然後顯示“嗯……”要寫哪個?

    還有謝謝教程^^

    回覆刪除
  7. 吉里吉里會無視錯誤的屬性,
    所以在[link]裏面寫eval的話,
    吉里吉里就把eval無視掉。

    不知有沒有理解錯你的問題,
    如果你上面這兩段是寫在一起,
    當我連續兩次都按下選項1,
    就會顯示"嗯……"。
    如果單單是寫第二個選項,
    而沒有第一個選項的部分,
    那麼就必須有一個選項是把數值加2。

    回覆刪除
  8. 嗯,明白了
    然後最後問題是,
    要如何在選項中

    [link......]選項1[endlink]

    放置eval才能避免被無視訥?

    回覆刪除
  9. 其實這不需要放置eval,
    我想你是想把[link]和[eval]一起使用,
    不過這是不行的,
    而且[link]本身就有exp這屬性,
    已經可以做到指定數值給變數這個目的。
    即是以下的模樣,
    [link target=*2 exp="f.flag+=1"]選項1[endlink]
    這裡的exp是屬於[link]的。

    回覆刪除
  10. 好的謝謝你的解釋^^

    回覆刪除