head first java第六章的学习

上一个程序有bug

找到问题所在:逻辑原因

解决问题的几种方法:

再来一个数组

直接在原来数组置零

终极办法:要有一个可变大小的数组,只要一个格子被猜中了,直接将格子删除。

学习ArrayList的特性和使用方法

创建

ArrayList<Egg> myList=new ArrayList<Egg>();

添加(只能添加本类型的元素)

Egg s=new Egg();

myList.add(s);

myList.add(b);

删除

myList.remove(b);

有没有在里面

boolean isIN=myList.contains(s);

看大小

int size=myList.size();//用方法获取!而不是直接用length什么的直接读取,留一点隐私

是否空了(一般用来指示循环控制)

boolean empty=myList.isEmpty();

用索引返回对象

Object o=myList.get(1);

ArrayList和一般数组的比较

1.一般数组在创建时就要确定大小,且不可改变

2.一般数组加入对象的时候必须创建索引

使用方法:

初始化实际上是有了一个这样功能的引用,在后续就像为数组对象赋值一样初始化。

学习如何使用函数库(API)

——认识包(组织意义,使用方法)

——如何阅读API文档和书籍(待编辑和学习)

大程序DotCom的从头到尾的完成

由于上一个程序耗费了两到三个小时的精力,本来以为会比较好学习和自我完成这一个程序,但是结果好像并不如预期的那样。

相反,在分析流程和列出类和功能的过程中,因为思考过少,再加上有新知识点的出现(理解记忆如何通过ArrayList遍历对象,又要如何拆分功能变成函数,又是如何调用函数的),反而在短时间内让大脑迷糊了。

此次重新对整个程序自顶而下的分析对象和流程,再细分功能写出伪码,最后一步一步按照伪码进行程序实现。

认清问题

目标:程序首先创建初始化三个战舰,主要是保存每个战舰的位置;然后进入循环过程:问用户,用户猜测,判断用户是否成功击沉三个所有的战舰;击沉之后,显示游戏结束,根据用户的猜测次数给出评分。

(注意,上述由于是第一直观印象,可能每一个词都对应着一个大步骤,并且有的一句话因为对程序设计的不清晰认识,不知道如何具体实现的过程,需要对应来学习,之后就知道自己还需要哪方面的经验,加以学习内化)

分出功能(最重要):

1.初始化战舰的位置void setLocationCells(ArrayList<String> local——是算法的需要)(位置由于需要删除也用ArrayList)【战舰类的方法】(需要数据结构来储存,根据算法的需求,用ArrayList DotCom存放每一个战舰(对象)的位置值int location[]【战舰类的实例变量】;随机生成战舰的位置【战舰类外的方法helper辅助类来完成】并通过setter为每一个对象进行赋值操作)

2.控制循环过程:判断用户是否击沉战舰(读取用户输入【输入这个东西在java中还是很重要的,要确定输入是否成功、抛出异常,因此需要一个辅助类来完成输入】,如果没有ArrayList对象了(isEmpty)就退出,如果有,进入判断程序【对象的方法应该是根据用户输入的值判断是否hit,hit就删除这个值,然后返回result】;【判断对象是否删除完毕】:对每一个对象的每一个值进行遍历),每一次用户输入都要记录增加用户的次数【控制类需要的实例变量numOfGuess++】

3.结尾宣布过程:根据猜测次数宣布用户的分数【简单,只需要设计语句,翻译成英文即可】

再在上面进行类、方法、实例变量的程序描述

最终需要的类

 战舰类DotCom、控制类DotComBust、辅助类GoodHelper

战舰类

String name;

ArrayList<String> local

void setLocationCells(ArrayList<String> local)

控制类DotComBust

int numOfGuess;

ArrayList<DotCom> dotComList=new ArrayList<DotCom>();

GoodHelper helper;

初始化(生成对象,调用helper随机生成位置并赋值)

void setUpGame()

控制循环(调用helper类进行用户输入,对每一个对象遍历——调用战舰的方法知道是否击沉,击沉后删除,直到ArrayList为空,每记一次加一个numOfGuess)

void gamePlaying();

结束

void finish();

最后的加上访问修饰符:控制类全部private,由于战舰类需要被用到方法,方法全部public,实例变量仍然保持隐私性private

程序实现

(最重要也最难熬的一个难关已经过去,剩下的就是一步一步机械的写步骤了,当然可以进行一些优化,不过目前为止没有这个水准,只能一步步来了;到目前为止对程序设计有了新的认识:设计的逻辑和思路才是最重要的,不过在学习的过程中思路和语法相辅相成,只有知道了语法,才知道设计的过程中如何去构思,只有有了初步的构思思路才知道那一部分语法有所欠缺还要加以改进;到目前为止还是对程序设计这个步骤有着难以磨灭的混乱,可能就算把整个程序给写出来,对这个程序的把握还不是很深刻,后续应该会找一些书籍来看看)(查到了程序设计的六大原则,类的设计灵活多变,重要的是让每一个类的职责明确,在没有继承的情况下我觉得是这么理解的,一旦继承开始,要涉及到开闭原则和里氏替换原则,剩余的再说)

import java.util.*;
public class DotComBust
{
int numOfGuess;
GameHelper helper=new GameHelper();
ArrayList<DotCom> dotComList=new ArrayList<DotCom>();


void setUpGame()
{
DotCom one=new DotCom();
DotCom two=new DotCom();
DotCom three=new DotCom();
one.setName("Pets.com");
two.setName("eToys.com");
three.setName("Go2.com");
dotComList.add(one);
dotComList.add(two);
dotComList.add(three);
//让用户得知消息,其实在开始游戏之后再给出也可以
System.out.println("Your goal is to sink three dot coms:");
System.out.println("Pets.com,eToys.com,Go2.com");
System.out.println("Try to sink them all in the fewest number of guesses");

for(DotCom dotComToSet :dotComList)
{
ArrayList<String> newLocation=helpler.placeDotCom(3);
 dotComToSet.setLocationCells(newLocation);
}

}//setUpGame方法结束


void startPlaying()
{
while(!dotComList.isEmpty())
{
String userGuess=helper.getUserInput("Enter your guess");
checkUserGuess(userGuess);
}//while结束
}//startPlaying方法结束


void checkUserGuess(String guess)
{
numOfGuess++;
String result="miss";
for(DotCom dotComToTest :dotComSet)
{
String result=dotComToTest.checkYourself(guess);
if(result.equals("hit"))
break;
else if(result.equals("sink"))
dotComList.remove(dotComToTest);
System.out.println(result);

}
}//close method

void finishGame()
{
System.out.println("All Dot Coms are dead!Your stock is now worthless");
if(numOfGuess>18)
{
System.out.println("It only took you"+numOfGuess+"guesses.");
System.out.println("You got out before your optin sank");
}
else
{
System.out.println("Took you long enough."+numOfGuess+"guesses.");
System.out.println("Fish are dancing with your options");
}
}//close method


public static main(String[] args)
{
DotComBust game=new DotComBust();
game.setUpGame();
game.startPlaying();

}
}

再实现DotCom即可完成

import java.util.*;
class DotCom
{
ArrayList<String> locationCells=new ArrayList<String>();
String name;


void setLocation(ArrayList<String> local)
{
 locationCells=local;
}

String checkYourself(String userGuess)
{
//miss-不管 hit-删除 sink-变sink
String result="miss";
int index=locationCells.indexOf(userGuess);
if(index>=0)
{
result="hit";
locationCells.Remove(index);
}
if(locationCells.isEmpty())
{
result="sink";

}
return result;
}//checkYourself method结束

}

太感动了!写完了!半自己写,半抄书。有的地方和书本不一样,但是我觉得实现逻辑是差不多的!没什么大问题,ok,去拥抱API的海洋了。 

来吧API!

Q:为什么需要用到包?

A:1.把类都放到一起(方便)

2.区分名字相同的类(防混淆)

3.限制类的存取(安全)

Q:包怎么防止命名冲突?

A:java命名传统。

关于javax

是后来新加入的标准库扩展,虽然取得了正式名分,但是如果改了以前的很多import都要改,所以还是有个extension

关于要默认引用:java.lang

Q:使用import会加入文件吗?

A:不会,只是省略了类前面的标识

Q:怎么建立自己的包

A:等等

Q:去哪里、怎么查询API?

A:-买书(厚、花钱)-现在不需要,否决

-查API(bingo)

怎么学习

-熟悉API文档的结构

-熟悉类的方法种类和分布-主要是英文要熟悉,看完一个类就行了

下载java api

看方法的输入输出

看方法的在各种情况下的表现  eg.indexOf()在不存在的时候,返回-1

现在看一下API文档以便以后运用

猜你喜欢

转载自blog.csdn.net/qq_41004188/article/details/82969802