起初看到這個,你的想法是什麼,這小子想幹嘛呢???
這個方法是在一個多月前做多線程遊戲的時候想到的,最初是中南的一位朋友提出來的。最近的部落格老是在“炒剩飯”,一些新學的東西也總是來不及作總結,不過覺得這個想法確實不錯,所以也才拿出來再與大家探討一下,說不定還有更好的方法。
我們所玩的一些情境不動2D的遊戲,往往需要構建一些地圖,如泡泡堂,坦克大戰等等。
而在地圖構建的時候,我們往往採用的是用一個數組將所需的地圖儲存起來,但是做到後來,需要的地圖多了,儲存的效率往往也就偏低了,而且還會耗費大多的代碼去填數組。
在一個記事本中把你想要做的地圖儲存起來,看上去也更加直觀,簡潔。使用IO流進行位元組讀取是出錯率相對較低的,所以我們的地圖中理論上可以存在256種元素(一個byte佔8位)。當然,我們或許不需要這麼多,a-z加上1到9就完全可以滿足我們的日常需求了。
最開始的時候,有人問到,既然是OOP,為什麼不用對象來儲存我們的地圖元素?原因很簡單,我們操作byte資料的效率要高於操作對象本身。
好的,閑話不多說,方法如下:
首先,我們需要一個ArrayList來儲存資料,有什麼用呢?繼續看你就知道了
//建立地圖數組來儲存資料
ArrayList<Byte> MapList=new ArrayList<Byte>();
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/Java/
Java代碼
/** * 將記事本中的資料讀入到數組當中 * @param mapName 記事本的檔案名稱 * @return 得到的位元組數組 */public int[][] createMap(String mapName){ File file=new File(mapName); //建立地圖數組 int map[][]=null; if(file.exists()){ try{ InputStream in=new FileInputStream(file); //建立與檔案相同大小的位元組數組 byte content[]=new byte[in.available()]; //讀取位元組數組 in.read(content); //將內容添加到隊列當中 for(int i=0;i<content.length;i++){ MapList.add(content[i]); } //移除斷行符號符 for(int i=0;i<MapList.size();i++){ if(MapList.get(i)==10){ MapList.remove(i); } } //移除分行符號 for(int i=0;i<MapList.size();i++){ if(MapList.get(i)==13){ MapList.remove(i); } } //封裝位元組內容 String string=new String(content); String arr[]=string.split("\r\n"); //存入數組當中 int index=0; map=new int[arr.length][arr[0].length()]; for(int i=0;i<map.length;i++){ for(int j=0;j<map[i].length;j++{ map[i][j]=MapList.get(index)-48; index++; } } in.close(); }catch(Exception e){ e.printStackTrace(); } }else{ System.out.println("檔案不存在"); } return map; }
比較關鍵的步驟是移除斷行符號換行字元,這兩個字元是我們看不到的,只有在列印的時候才會發現他們,
莫名其妙的多出個10跟13,起初我也是覺得納悶,任何方法當然都要測試一下,自己做個記事本地圖試一下吧。