想像貪吃蛇的遊戲中,地圖上有很多食物, 程式要檢測蛇頭是否與食物碰撞(根據地圖上的座標)。
如果用一個數組保存食物的信息,就要遍歷這個數組。但如果有很多食物(陣列很大),完全遍歷是沒必要的,因為只有一定範圍裡的食物可能發生碰撞。
問題是怎麼實現不遍歷整個數組,而根據座標,找到可能發生碰撞的食物。
我能想到的是使用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,表示蛇會吃到這個食物,如果小於,則表示吃不到,繼續下一個座標的判斷。
其實,我估計實際做的時候應該就是遍歷所有的食物,畢竟貪吃蛇的食物沒那麼多吧。