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

时间: 2024-12-20 17:42:30

Java自学之路---DotCom的相关文章

【转】JAVA自学之路

JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向呢? 我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当成学生,不要把自己的将来交给别人,学会运用自己的眼睛去观察,去了解这个世界吧. 每个培训机构都会宣传自己的好处,并不能说明大的趋势. 一些新闻文章很有可能是枪手写的,不必太过相信.国外背景的

[转载] JAVA自学之路

原文链接http://blog.csdn.net/mengxin846/article/details/2219844 虽然文章有点旧但还是有些启发的,譬如要事第一,好读书不求甚解. JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向呢? 我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当 成学生

马士兵:JAVA自学之路

JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训.决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向呢?我的意见是,不要太过相信各种培训机构或是抢手文章的说法(包括我),当你要走向社会的时候,就不要再把自己当成学生,不要把自己的将来交给别人,学会运用自己的眼睛去观察,去了解这个世界吧. 每个培训机构都会宣传自己的好处,并不能说明大的趋势.一些新闻文章很有可能是枪手写的,不必太过相信.国外背景的教师和课

Java 自学之路

Java 自学之路 前言 从运行第一个程序开始算起,我接触编程也有三年的时间了.最初是从51单片机入门学习的C语言,班里面的大佬带着我一起做小项目,但是因为没人教,基本靠自学,学得慢,写的代码也烂,很没有章法.后来大三下半学期开始准备考研(从电子跨考计算机),从零开始学习数据结构,这才算是真正地入了编程的门.至于考研,后来就放弃了(别问我为什么放弃,当时脑子抽了),去了一家小公司实习.这家公司主要做机器视觉的项目,当时去面试的时候觉得挺高大上,技术 leader 也挺和蔼,感觉是很务实的一个团队

java自学之路-day17

JAVA17 多线程 进程和线程的概念 进程 l  正在运行中的程序 l  程序存储在硬盘中 当进入内存运行时 l  内存中的每一个程序就叫进程 l  并且每一个进程都有一个独立的功能 线程 l  迅雷中的多线程下载 l  main方法中有很多方法一次排列 如果其中一个方法执行了很多次循环 那么下一个方法就不会执行 从入口main到结束,一条路走到底 必须一个一个的执行 这种程序是单线程程序 效率慢 l  例如 多台电脑网吧上网 多条路通行 线程 概念 l  CPU 中央处理器 inter AW

java自学之路-day16

JAVA16 IO流 转换流 引入 l  中文系统默认编码表GBK l  FileWriter的构造方法假定默认编码GBK l  但是一些文本文件有可能是其他编码方式 l  所以引入转换流 可以对编码表进行设定 l  对之后开发互联网程序很重要 概述 l  字符流的一种 l  字符与字节的桥梁 l  继承Writer类 OutputStreamWriter l  Java.io. OutputStreamWriter l  继承Writer类 l  字符输出流 向文本文件写入数据 l  字符流转

java自学之路-day18

数据库 数据库 概念 l  对于一串数据修改其中的一条数据 l  如果用io流就需要全盘读写 然后找到其中的一行 进行修改 l  或者使用数组进行修改 l  这样太复杂 效率慢 所以需要引用数据库 l  数据库本质是一个文件系统 可以看做是一个具有很好的处理数据能力的容器 和集合 数组 都一样 l  里面有严格的数据存储格式 l  数据库管理系统是用一个软件管理数据库 l  常见的数据库管理系统 MYSQL  开源免费 瑞典的公司开发 sun公司收购  Oracle收购了sun MYSQL6.x

java自学之路-day10

JAVA10 Eclipse快捷键补充 l  选中类Ctrl T 继承树 l  Ctrl 或者f3 查看源码 多态会跳转到调用父类中 l  Java中lang包中的所有类 不需要导包 直接用  例如 System String l  Ecplise 中的Jre System Library是默认的eclipse依赖jre的类库 在该位置可以查找到平常使用的String 类 Random类 Math类 l  Jdk 包括 jre和开发工具,jre包括jvm 和运行时所需要的核心类库 l  运行 h

java自学之路-day14

JAVA14 异常 引入 l  Java代码在运行时期发生的问题就是异常 l  Java中把异常信息封装成了一个类 l  当出现了问题时,就会创建异常类对象并抛出异常相关的信息 l  如异常出现的位置 原因等 继承体系 l  java.lang 类 Throwable   可以被扔出去的类 l  java中所有的错误和异常 l  直接已知子类: Error, Exception 异常和错误的区别 l  数组访问越界是异常 Exception RuntimeException 编译,运行期间出现的