引言

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

如何学习

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

今天的主题

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

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

图片来自《Head First JAVA》

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

  当然书中给出了解决的方法,但是我觉得算法很繁琐,大家有机会可以去看看,在书中的152页,这里就不贴出代码了,因为不能直接复制。。。

  由于初识JAVA,只是按照自己的想法去编码,肯定有很多纰漏,还请各位JAVA大神帮忙指正。

下面给出我的代码:

 package dotComGame;
import java.util.ArrayList;
public class GameHelper {
private int row = 0;
private int col = 0;
private int gridSize = 0;
private int[] grid = null;
public GameHelper(int num) {
if (num >= 0 || num < 65535) {
row = num;
col = num; gridSize = row * col;
grid = new int[gridSize]; for (int i = 0; i < grid.length; i++) {
grid[i] = 0;
}
}
} public ArrayList<Integer> placeDotCom(int num) { int []tmp = new int[gridSize]; ArrayList<Integer> pos = new ArrayList<Integer>();
if (num > row || num > col) {
return null;
} int incre = 1; if (Math.round(Math.random() * 1) == 0) {
incre = col;
} boolean success = false;
int attempts = 0;
while (!success && attempts++ < 512) {
System.arraycopy(grid, 0, tmp, 0, gridSize);
//找到第一个可以存放的位置
int location = (int) Math.ceil(Math.random() * gridSize);
int i = 0;
while (i < num) { //是否越下边界
if (location + (i * incre) >= gridSize) {
success = false;
break;
} //是否越右边界
if (0 == (location + (i * incre)) % col) {
success = false;
break;
} //是否已经被占用
if (0 != tmp[location + (i * incre)]) {
success = false;
break;
} tmp[location + (i * incre)] = 1; pos.add(location + (i * incre)); i++;
} if (i == num) {
success = true;
System.arraycopy(tmp, 0, grid, 0, gridSize);
break;
}
else {
pos.clear();
} } if (success)
return pos;
else
return null;
} public void Draw() { for (int i = 0; i < grid.length; i++) {
System.out.print(grid[i]);
if (0 == (i+1) % col) {
System.out.println();
}
} }
public static void main(String []args) {
GameHelper helper = new GameHelper(15);
for (int i = 0; i < 6; i++) {
helper.placeDotCom(3);
}
helper.Draw();
}
}

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

结束语

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

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

  1. 【转】JAVA自学之路

    JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向 ...

  2. 【转】Java自学之路——by马士兵

    作者:马士兵老师 JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟 ...

  3. Java自学之路(新手一定要看)

    Java自学之路(新手一定要看) 转自尚学堂 JAVA自学之路 一:学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游 ...

  4. [感悟]马士兵Java自学之路——(精华版)

    JAVA自学之路 一: 学会选择 为了就业,不少同学参加各种各样的培训. 决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等. 那么究竟应该选择什么方向 ...

  5. 聊聊我的 Java 自学之路

    最近经常在知乎收到类似『没基础,java 如何自学』.『怎么才能掌握编程』等等问题,再加上发现高中同学也在自学.有感而发,讲讲我的自学之路. 1.1. 大学 高考没正常发挥,考入一所二流的学校,当时分 ...

  6. 我的Java自学之路

    其实在转正之后我就想抽个时间好好的梳理一下我的 Java 上车之路 ,但是一直拖到现在 ,因为有学弟问到 ,所以也就给了我动力 .毕竟答应了人家的事要做到 . 首先要有相应的背景介绍 ,不然说个毛线啊 ...

  7. java自学之路-开篇

    开篇 想写一些java自学文章的心思起好久了,也在心里规划了一段时间,今天终于开始正式付于纸上.接下来要写的内容从java基础开始,一步步到正式工作用到的技术,整个体系适合java初学者自学.内容可能 ...

  8. Java自学之路(小白向)

    首先学习一门语言无非就受教与自学两种方式,本博文针对自学(穷逼没钱报班,大学又不是计算机专业,只能自学啊) 开个玩笑,其实有很多人是适合自学的,下面介绍. 一.要充满自信我自己就可以学好(够面试用的入 ...

  9. Java自学成长路线(转载)

    JAVA自学之路 一:学会选择  决心做软件的,大多数人选的是java,或是.net,也有一些选择了手机.嵌入式.游戏.3G.测试等.  JAVA是一种平台,也是一种程序设计语言,如何学好程序设计不仅 ...

随机推荐

  1. ASP.NET使用ImageMap控件

    文章来自:http://www.baike369.com/content/?id=5773

  2. abowman

    http://abowman.com/google-modules/ball-clock/

  3. Atomic 升级

    Atomic 采用类似github的版本管理,  可以使用以下命令升级 ostree remote add --set=gpg-verify=false atomic20160212 http://. ...

  4. setcookie 设置无效

    转载请署名 achieverain,谢谢 经常见人问PHP程序无法设置cookie.下面把我遇见过的情况都说一遍 1 PHP程序在执行setcookie之前有输出. 解决 :    把setcooki ...

  5. 关于css3的fixed布局

    理解CSS3里的Flex布局用法 2016-10-21 阮一峰 web前端开发 web前端开发 web前端开发 微信号 web_qdkf 功能介绍 我们专注web前端开发技术的学习(html,css, ...

  6. textview设置不同字体大小

    <style name="style0"> <item name="android:textSize">19dip</item&g ...

  7. 简单的socket方法

    void sockfunc() { WSADATA Ws; WSAStartup(MAKEWORD(,), &Ws); SOCKET hs = socket(AF_INET, SOCK_STR ...

  8. es6--(二)变量的解构赋值

    1.数组的解构赋值 //数组解析 let [a,b,c] = [1,2,3]; //a=1;b=2;c=3 //嵌套数组 let [a,[b,c]] = [1,[2,3]];//a=1;b=2;c=3 ...

  9. 信息存储——当值X是2的非负整数n次幂时,如何表示成十六进制

    十六进制表示法              当值X是2的非负整数n次幂时,很容易将X写成十六进制形式,只要记住X的二进制表示就是1后面跟n个0.十六进制数字0代表4个二进制0.所以当n表示成i+4j的形 ...

  10. 通过mvn archetype:generate创建Maven项目模板慢的问题

    通过mvn archetype:generate这种交互方式来创建Maven项目模板的时候,经常会长时间卡在Generating project in Interactive mode这一行提示(图1 ...