Java自學之路---DotCom

引言

  我從接觸編程以來,一直是一個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總老是有好處的,並且我也不同意,學一門語言就必定要靠它吃飯,世界上的編程語言種類繁多,每一種都有他的獨特之處,都有他的魅力所在,就比如旅遊,你去了一趟泰國,並不表示你就要永遠的留着泰國,而且編程語言也不是編程的所有,語言只是咱們解決問題的一種方法和工具,咱們使用不一樣的語言,有時只爲達到一樣的目的:就比如上班的路上,有人坐地鐵,有人擠公交,還有人騎單車甚至走路,目的都是爲了趕在遲到以前到公司。

相關文章
相關標籤/搜索