首頁 > 後端開發 > php教程 > 按範圍遍歷大型數組或其他資料結構

按範圍遍歷大型數組或其他資料結構

WBOY
發布: 2016-10-11 14:23:43
原創
884 人瀏覽過

想像貪吃蛇的遊戲中,地圖上有很多食物, 程式要檢測蛇頭是否與食物碰撞(根據地圖上的座標)。
如果用一個數組保存食物的信息,就要遍歷這個數組。但如果有很多食物(陣列很大),完全遍歷是沒必要的,因為只有一定範圍裡的食物可能發生碰撞。
問題是怎麼實現不遍歷整個數組,而根據座標,找到可能發生碰撞的食物。

我能想到的是使用array_filter,但實質上還是遍歷。
如果有使用其他資料結構(不用數組)的方法,也可以提供。
可能做過遊戲的朋友會有好的解決方案。

回覆內容:

想像貪吃蛇的遊戲中,地圖上有很多食物, 程式要檢測蛇頭是否與食物碰撞(根據地圖上的座標)。
如果用一個數組保存食物的信息,就要遍歷這個數組。但如果有很多食物(陣列很大),完全遍歷是沒必要的,因為只有一定範圍裡的食物可能發生碰撞。
問題是怎麼實現不遍歷整個數組,而根據座標,找到可能發生碰撞的食物。

我能想到的是使用array_filter,但實質上還是遍歷。
如果有使用其他資料結構(不用數組)的方法,也可以提供。
可能做過遊戲的朋友會有好的解決方案。

redis的sort set類型 可以滿足你的需求 http://redis.readthedocs.io/e...

我覺得是這個樣子:

  • 首先貪吃蛇中食物是一個球,那存食物的數組應該存的是,在C++裡有map可以用;

  • 然後,你可以開一個陣列就叫做Map,陣列的大小就是地圖的w h,假設有這麼食物,那Map需要這麼賦值:Map[wx + y ] = r;記錄一個maxR的東西,代表食物的最大半徑,maxR=max(r).

  • 最後,判斷碰撞,設蛇頭的位置為(a, b),你需要做的是遍歷以(a,b)為中心半徑為maxR的圓的所有坐標(x,y),然後取出r = Map[w*x + y],與now_r = dis((a,b), (x,y))比較,如果r>=now_r,表示蛇會吃到這個食物,如果小於,則表示吃不到,繼續下一個座標的判斷。

  • 其實,我估計實際做的時候應該就是遍歷所有的食物,畢竟貪吃蛇的食物沒那麼多吧。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板