顯示具有 Python 標籤的文章。 顯示所有文章
顯示具有 Python 標籤的文章。 顯示所有文章
2020年9月20日 星期日

[筆記] Round() 不一定是四捨五入

  使用程式語言函式庫提供的 `Round()` 之類的函式對數值做四捨五入時,要小心它的捨入結果可能不是所預期的四捨五入,因而踩到雷。
來看看 Python 的:

來看看 JavaScript 的:

最後看看 C# 的:

可以發現,對 1.5 跟 3.5 都是四捨五入到 2 與 4,可是在 Python 與 C# 中,對 2.5 的結果卻是 2。

2020年3月18日 星期三

[筆記] 矩形的碰撞偵測 (下篇) - 沒被偵測到的碰撞

  有時就是天不從人願,當覺得碰撞 OK,反彈 OK 的時候,就會出現不 OK 的情況。做了一個球速會漸漸加快的 pixel game,然後遊戲就逐漸毋湯。當球移動的速度很快的時候,球會穿越平台,連碰撞都沒有被偵測到,然後就蹦蹦了。

問題點


如圖所示,當球一次移動的距離大於板子的厚度時,板子可是一點感覺都沒有呢。因為球的移動並非連續移動,而是在這個影格是 A 地點,下一個影格就直接出現在 B 地點(直接加上要移動的距離)。可以想像做碰撞偵測時,是看當下每個物件的位子來判斷有沒有碰撞的,所以當球直接「掠過」板子時,就不會被偵測到碰撞。如此一來就會出現穿板的現象,原本應該繼續的遊戲,就 Game Over 了。

2019年7月10日 星期三

[筆記] 矩形的碰撞偵測 (中篇) - 反彈

  處理完碰撞後,接著就要來處理碰撞後的反彈。因為做的是打磚塊這類 pixel game,所以呈現的是簡單反彈,也就是反彈物體速度的 xy 分量的正負號變換(呈現出來是入射角 = 反射角,反彈後速率維持不變)。
  這個功能困擾的我很久,困難點在於如何判斷是哪個面發生碰撞。期間一直無法做出理想中的反彈效果。後來拋出問題向朋友求救,討論後終於得到解答,雖然想出來的演算法不盡完美,但大部分的情況下都能有預想中的反彈行為。

2019年3月31日 星期日

[筆記] Django - File Validator 上傳檔案與驗證

  Django 的表格 (Django.forms.Form) 能夠從設定的欄位產生對應的 html 表格,並幫助開發者從提交的資料中過濾有害的資訊,將資料轉換成 Python 物件供取用。還可以撰寫額外的程式碼以驗證提交的資料是否有效。
  撰寫驗證資料的方式有三種:在表格的定義中撰寫 clean_<field_name> 函式、繼承對應的欄位類別並提供 validate()、撰寫驗證類別並傳入到對應的欄位中。本篇網誌使用第三種方法來驗證使用者上傳的檔案,檢查檔案副檔名、MIME type、檔案大小。

2019年1月17日 星期四

[筆記] 矩形的碰撞偵測 (上篇)

  寫遊戲常常用 API 來幫忙處理碰撞偵測,當需要自己寫類似的功能時,發現內部的運作沒有想像中的簡單。最近因為專案的需求,撰寫打磚塊遊戲,原本想利用 pygame 的碰撞偵測,但是不適合這個專案,只好挽起袖子研究研究作作看。上篇介紹矩形碰撞偵測的原理,下篇則介紹在碰撞之後反彈的效果。

2018年12月3日 星期一

[筆記] Python - 應用 decorator 實作函式開關

  最近為了課程撰寫遊戲的 server 端 (專案於 Github),主要提供遊戲資訊跟進程控制的功能,client 端是一群擁有通訊功能的迷宮車,兩邊靠既定的指令溝通。在設計遊戲功能時,有些指令希望只在遊戲開始後才有作用,但又不可能讓 client 端乖乖在遊戲開始後才發送指令。最直觀的作法就是在每個處理指令的函式中檢查遊戲是否開始:
def game_command(...):
    if not game_is_started:
        return
    # Other jobs
但很快發現充滿重複的程式碼,而且影響程式碼的簡潔與維護的不方便。於是上網查找有無類似 C# 的 function attribute 的寫法,只要在函式的定義前加上像是 game_started 的 attribute,就可以控制該函式的行為。於是找到了 decorator (裝飾器)

  本篇主要介紹我如何在專案中使用 decorator,先簡單介紹 decorator,接著是本篇主題 ─ 利用 decorator 來實作函式開關,與在類別中使用 decorator,最後是如何進一步強化 decorator 的能力。以下講解皆使用 python 3。