我從接觸編程以來,一直是一個C/C++程序猿,由於我喜歡編程時,那種接地氣的感受,認爲只有本身管理內存的使用,心理才踏實。但隨着工做中不斷增長的見聞,不斷的從博客和源碼中得到新的看法,我發現這個時代已經發生了變化,咱們有強勁的硬件資源、咱們有久經考驗的框架和源碼,咱們最寶貴的是花在編碼上的時間。因此我決定帶着以前C/C++的經驗,來認識JAVA是門怎樣的語言,以及它的編程理念能夠給我帶來怎樣的好處。java
和我學習其餘語言同樣,我主要仍是依靠書本,電子書或者是紙質書,這樣學習起來纔是最系統也是效率最高的,相比而言,視頻教學可能讓你掌握更多的實戰經驗,不過效率實在太慢。算法
我目前正在看一本經典的入門書籍《Head First JAVA》,中文名叫作《深刻淺出學習java》,這本書確實是比較適合初學者的,並且主要從意識流上讓你汲取java的精髓,和其餘「教科書」般的學習資料相比,顯得不同凡響。由於具有C/C++的基礎,前幾章講的數據類型、類與對象、對象的操做基本上掃一遍就過掉了,今天拿出其中的總結性的練習題,就當開始學習JAVA的熱身運動吧。編程
這個練習題是說編寫一個叫作DotCom的遊戲,說是遊戲,其實內容很簡單,在一個N*N的網格中,隨機生成3個物體,物體佔據網格的若干個格子,用戶輸入網格的座標當作擊打物體(用戶事先不知道物體存在於哪幾個格子中),若是用戶輸入的座標正好是物體的座標,則表示擊中,其中該物體所佔全部的格子,則該物體被擊毀,遊戲結束。框架
圖片來自《Head First JAVA》dom
這個遊戲其餘的部分都不算複雜,只要隨機生成物體座標,讀取用戶輸入,輪詢的判斷、讀取,知足遊戲結束條件就結束便可,惟一有挑戰性的即是如何隨機生成若干個符合邏輯的物體,即物體不能超出網格範圍,不能跨行,物體與物體之間不能重疊,每次都要隨機生成。編程語言
固然書中給出瞭解決的方法,可是我以爲算法很繁瑣,你們有機會能夠去看看,在書中的152頁,這裏就不貼出代碼了,由於不能直接複製。。。工具
因爲初識JAVA,只是按照本身的想法去編碼,確定有不少紕漏,還請各位JAVA大神幫忙指正。學習
下面給出個人代碼:編碼
1 package dotComGame; 2 import java.util.ArrayList; 3 public class GameHelper { 4 private int row = 0; 5 private int col = 0; 6 private int gridSize = 0; 7 private int[] grid = null; 8 public GameHelper(int num) { 9 if (num >= 0 || num < 65535) { 10 row = num; 11 col = num; 12 13 gridSize = row * col; 14 grid = new int[gridSize]; 15 16 for (int i = 0; i < grid.length; i++) { 17 grid[i] = 0; 18 } 19 } 20 } 21 22 public ArrayList<Integer> placeDotCom(int num) { 23 24 int []tmp = new int[gridSize]; 25 26 ArrayList<Integer> pos = new ArrayList<Integer>(); 27 if (num > row || num > col) { 28 return null; 29 } 30 31 int incre = 1; 32 33 if (Math.round(Math.random() * 1) == 0) { 34 incre = col; 35 } 36 37 boolean success = false; 38 int attempts = 0; 39 while (!success && attempts++ < 512) { 40 System.arraycopy(grid, 0, tmp, 0, gridSize); 41 //找到第一個能夠存放的位置 42 int location = (int) Math.ceil(Math.random() * gridSize); 43 int i = 0; 44 while (i < num) { 45 46 //是否越下邊界 47 if (location + (i * incre) >= gridSize) { 48 success = false; 49 break; 50 } 51 52 //是否越右邊界 53 if (0 == (location + (i * incre)) % col) { 54 success = false; 55 break; 56 } 57 58 //是否已經被佔用 59 if (0 != tmp[location + (i * incre)]) { 60 success = false; 61 break; 62 } 63 64 tmp[location + (i * incre)] = 1; 65 66 pos.add(location + (i * incre)); 67 68 i++; 69 } 70 71 if (i == num) { 72 success = true; 73 System.arraycopy(tmp, 0, grid, 0, gridSize); 74 break; 75 } 76 else { 77 pos.clear(); 78 } 79 80 } 81 82 if (success) 83 return pos; 84 else 85 return null; 86 } 87 88 public void Draw() { 89 90 for (int i = 0; i < grid.length; i++) { 91 System.out.print(grid[i]); 92 if (0 == (i+1) % col) { 93 System.out.println(); 94 } 95 } 96 97 } 98 public static void main(String []args) { 99 GameHelper helper = new GameHelper(15); 100 for (int i = 0; i < 6; i++) { 101 helper.placeDotCom(3); 102 } 103 helper.Draw(); 104 } 105 }
算法基本的核心就是先隨機選取一個物體的頭座標,而後反覆判斷每一個物體結點座標是否合法,物體的座標所有合法,則記入網格中。spa
相信無論之後是否從事JAVA的編程工做,學習JAVA總老是有好處的,並且我也不同意,學一門語言就必定要靠它吃飯,世界上的編程語言種類繁多,每一種都有他的獨特之處,都有他的魅力所在,就比如旅遊,你去了一趟泰國,並不表示你就要永遠的留着泰國,而且編程語言也不是編程的所有,語言只是咱們解決問題的一種方法和工具,咱們使用不一樣的語言,有時只爲達到一樣的目的:就比如上班的路上,有人坐地鐵,有人擠公交,還有人騎單車甚至走路,目的都是爲了趕在遲到以前到公司。