编写程序—超强力方法
创建一个类似战舰的游戏:攻击网站
你会创建一个攻击网站游戏,他有7*7的格子与3间达康公司。每个达康网站占用3个格子。
1.首先进行高层设计
我们需要类(Game和DotCom类)和方法,那就必须了解游戏的流程。游戏的基本思路:
1)玩家启动游戏
(1)计算机创建3个达康网站
(2)将此3个达康网站停在虚拟战场上
2)游戏开始
重复下面的操作直到所有达康网站被歼灭为止
(1)提示玩家输入坐标
(2)检查是否命中、没中或击沉。如果命中就删除格子,击沉就删除达康网站
3)游戏结束
根据猜测次数给分
2.开发类
编写程序的方法步骤:
1)找出类应该做的事情
2)列出实例变量和方法
3)编写方法的伪代码
4)编写方法的测试用程序
5)实现类
6)测试方法
7)除错或重新设计
伪码:伪码能帮你专注于逻辑而不需要顾虑到程序语法
伪码大致上包括3部分:实例变量的声明、方法的声明和方法的逻辑,最重要的部分是方法的逻辑,因为它定义出会发生"什么事",这个部分
会在真正编写程序代码时转译成"如何"发生。
测试码:测试用的程序代码
真实码:实际设计出的真正Java程序代码
3.编写方法的实现部分
开始编写真正可用的方法程序代码
极限编程(XP)
极限编程(XP)是一种新型的软件开发方法论。它的构想是结合了许多种"程序员真想这么做"的方法而成的。
XP是由一组被证明有效的施行方法组成的,这些方法都是被设计来共同运作的,但许多人只选择性地实行部分的XP规则,这些方法包括:
1)多次经常性的小规模发布
2)避免加入规格没有的功能(不管"未来"会用到的功能性有多诱人)
3)先写测试用的程序
4)正常工作上下班
5)随时随地重构(refactor),也就是改善程序代码
6)保持简单
7)双双结伴进行工作,并将长交换伴侣以便让大家都清楚全局
4.为SimpleDotCom编写测试代码
SimpleDotCom需要有下面的功能:
1)创建SimpleDotCom对象
2)赋值给它
3)要求玩家猜测
4)检查猜测值
5)重复猜测直到击沉为止
6)显示玩家的猜测次数
public class SimpleDotCom {
//格子位置private int[] locationCells;//命中数目值private int numOfHits = 0;//取得玩家的猜测public String checkYourself(String stringGuess){
//把用户猜测转化成int//把字符串转换成intint guess = Integer.parseInt(stringGuess);//创建出保存返回结果的变量。以miss做为默认值String result = "miss";//对每个格子重复//以循环对每个格子重复执行for(int cell:locationCells){
//如果猜中//比较格子与猜测值if(guess==cell){
//命中result = "hit";//递增命中数numOfHits++;//已经离开循环,但需要判断是否击沉break;}}//如果命中数为3返回击沉信息if(numOfHits==locationCells.length){
result = "kill";}//列出信息//将结果显示出来System.out.println(result);//将结果返回给调用方return result;}public void setLocationCells(int[] locs){
locationCells = locs;}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;//从命令行取得输入
public class GameHelper {
public String getUserInput(String prompt){
String inputLine = null;System.out.print(prompt+" ");try{
BufferedReader is = new BufferedReader(new InputStreamReader(System.in));inputLine = is.readLine();if(inputLine.length()==0) {
return null;}}catch (IOException e){
System.out.println("IOException:"+e);}return inputLine;}
}
public class SimpleDotComTestDrive {
public static void main(String[] args) {
//记录玩家猜测次数的变量int numOfGuesses = 0;GameHelper helper = new GameHelper();//创建dotcom对象SimpleDotCom theDotCom = new SimpleDotCom();//用随机数产生第一格的位置,然后以此制作出数组int randomNum = (int) (Math.random()*5);int[] locations = {
randomNum,randomNum+1,randomNum+2};//赋值位置theDotCom.setLocationCells(locations);boolean isAlive = true;//创建出记录游戏是否继续进行的boolean变量,这会用在while循环中while(isAlive==true){
//取得玩家输入的字符串String guess = helper.getUserInput("enter a number");//检查玩家的猜测并将结果存储在String中String result = theDotCom.checkYourself(guess);numOfGuesses++;//是否击沉,若击沉,则设定if(result.equals("kill")){
isAlive = false;System.out.println("You took"+numOfGuesses+"guess");}}/*//初始化一个SimpleDotSimpleDotCom dot = new SimpleDotCom();//创建带有dotcom位置的数组int[] locations = {2,3,4};//调用dotcom的setterdot.setLocationCells(locations);//假的猜测String userGuess = "2";//调用被测方法并传入假的数据String result = dot.checkYourself(userGuess);String testResult = "failed";if(result.equals("hit")){//测试应该返回"hit"才算成功testResult = "passed";}//列出测试结果System.out.println(testResult);}*/}}
5.要点
1)你的Java程序应该从高层的设计开始
2)你通常会在创建新的类时写出下列3种东西:伪码、测试码、真实码
3)伪码应该描述要做什么事情而不是如何做
4)使用伪码来帮助测试码的设计
5)实现方法之前应该要编写测试码
6)如果直到要执行多少次,应该使用for循环而不是while循环
7)使用前置或后置的递增为变量+1(x++)
8)使用前置或后置的递减为变量-1(x–)
9)使用Integer.parseInt()来取得String的整数值
10)Integer.parseInt()只会在所给的String为数字时有用
11)使用break命令来提前跳出循环
6.关于for循环
1)基本的for循环
for(int i=0;i<100;i++)
第一段:初始化,使用这个部分来声明和初始化用在循环体内的变量。
第二段:boolean测试。
第三段:重复表达式,安置每趟循环运行完后要执行的项目。
for循环与while循环的差别:
while循环只有boolean测试,它并没有内建的初始化或重复表达式。while适合用在不知道要循环几次的循环上。若知道执行次数,则for循环会
比较容易阅读。
++x:先加后用
x++:先用后加
2)加强版的for循环
能够很容易地逐个运行数组或其他集合的元素。
for(String name:nameArray)
第一段:声明循环变量,使用这个部分来声明和初始化用在循环体内的变量。循环过程中此变量所携带的值会有不同。此变量的类型必须要与数组
元素匹配
第二段:要运行的集合,必须是对数组或其他集合的引用
7.转换primitive主数据类型
eg:小杯子无法装载大杯子的内容物的内容
long y = 42;
int x = y;//不能通过编译
long比int大,且编译器无法确定long的内容是否可以裁掉。若要强制编译器装,可以使用cast运算符。
long y = 42;
int x = (int) y;
前置的类型转换会告诉编译器要将y的值裁剪成int的大小来赋值给x。