zoukankan      html  css  js  c++  java
  • Java自学之路---DotCom

    引言

      我从接触编程以来,一直是一个C/C++程序猿,因为我喜欢编程时,那种接地气的感觉,认为只有自己管理内存的使用,心理才踏实。但随着工作中不断增加的见闻,不断的从博客和源码中获得新的见解,我发现这个时代已经发生了变化,我们有强劲的硬件资源、我们有久经考验的框架和源码,我们最宝贵的是花在编码上的时间。所以我决定带着之前C/C++的经验,来认识JAVA是门怎样的语言,以及它的编程理念可以给我带来怎样的好处。

    如何学习

      和我学习其他语言一样,我主要还是依靠书本,电子书或者是纸质书,这样学习起来才是最系统也是效率最高的,相比而言,视频教学可能让你掌握更多的实战经验,不过效率实在太慢。

    今天的主题

      我目前正在看一本经典的入门书籍《Head First JAVA》,中文名叫做《深入浅出学习java》,这本书确实是比较适合初学者的,而且主要从意识流上让你汲取java的精髓,和其他“教科书”般的学习资料相比,显得与众不同。因为具备C/C++的基础,前几章讲的数据类型、类与对象、对象的操作基本上扫一遍就过掉了,今天拿出其中的总结性的练习题,就当开始学习JAVA的热身运动吧。

      这个练习题是说编写一个叫做DotCom的游戏,说是游戏,其实内容很简单,在一个N*N的网格中,随机生成3个物体,物体占据网格的若干个格子,用户输入网格的坐标当做击打物体(用户事先不知道物体存在于哪几个格子中),如果用户输入的坐标正好是物体的坐标,则表示击中,其中该物体所占所有的格子,则该物体被击毁,游戏结束。

    图片来自《Head First JAVA》

      这个游戏其他的部分都不算复杂,只要随机生成物体坐标,读取用户输入,轮询的判断、读取,满足游戏结束条件就结束即可,唯一有挑战性的便是如何随机生成若干个符合逻辑的物体,即物体不能超出网格范围,不能跨行,物体与物体之间不能重叠,每次都要随机生成。

      当然书中给出了解决的方法,但是我觉得算法很繁琐,大家有机会可以去看看,在书中的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 }

      算法基本的核心就是先随机选取一个物体的头坐标,然后反复判断每个物体结点坐标是否合法,物体的坐标全部合法,则记入网格中。

    结束语

      相信不管以后是否从事JAVA的编程工作,学习JAVA总总是有好处的,而且我也不赞成,学一门语言就一定要靠它吃饭,世界上的编程语言种类繁多,每一种都有他的独特之处,都有他的魅力所在,就好比旅游,你去了一趟泰国,并不表示你就要永远的留着泰国,并且编程语言也不是编程的全部,语言只是我们解决问题的一种方法和工具,我们使用不同的语言,有时只为达到同样的目的:就好比上班的路上,有人坐地铁,有人挤公交,还有人骑单车甚至走路,目的都是为了赶在迟到之前到公司。

  • 相关阅读:
    软工实践4
    软工实践3
    软工实践1
    《暗时间》读书笔记
    关系规范化(数据库)
    关于Git的初步使用
    软件体系结构模式
    第六周编程总结
    第五周编程总结
    第四周编程总结
  • 原文地址:https://www.cnblogs.com/xyliao/p/5086940.html
Copyright © 2011-2022 走看看