黑马程序员技术交流社区
标题:
终于做出来IO版的老农过河了,还有很多瑕疵,求完善
[打印本页]
作者:
想飞的鱼
时间:
2014-6-10 21:15
标题:
终于做出来IO版的老农过河了,还有很多瑕疵,求完善
本帖最后由 想飞的鱼 于 2014-6-10 21:22 编辑
写了大半天,终于做出来IO版的老农过河了,但是
还有很多瑕疵,如:没处理IO异常,输入流没有关闭,判断输入格式神马的不严谨
.......好多!求完善
下面是我的源码(感觉好繁琐,都写晕我了==!!):
/*
需求:做一个控制台版的老农过河小游戏
规则:一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
*/
import java.util.*;
import java.io.*;
class LaoNongGuoHe
{
ArrayList<String> left = null;//左岸
ArrayList<String> right = null;//右岸
int count = 1;//记录步数
LaoNongGuoHe()
{
/*
一初始化就有了左岸,右岸,
所有的动物和人开始都在左岸
*/
left = new ArrayList<String>();
right = new ArrayList<String>();
left.add("person");
left.add("dog");
left.add("cat");
left.add("fish");
}
public static void main(String[] args) throws IOException
{
System.out.println("《过河规则》:一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。"
+"当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。\n"
+"《输入格式》:person,animal---如:person,cat或person");
System.out.println("《初始化》左岸:[person,cat,fish,dog]\t右岸:[]");
new LaoNongGuoHe().keyboardInput();
}
public void keyboardInput()throws IOException
{
System.out.print("\n请输入过河的person和动物:");
BufferedReader bis = new BufferedReader(new InputStreamReader(System.in));
String line = bis.readLine();
duHe(line);
}
public void duHe(String str)throws IOException
{
String[] s = str.split(",");//按格式输入的字符串,用”和“切割开
if (left.contains("person"))//人在左岸的情况
{
if (s.length!=2||!s[0].equals("person"))
{
System.out.println("请按格式输入!person必须带一个动物过去");
keyboardInput();
}
/*
移动人和动物
*/
left.remove(s[0]);
left.remove(s[1]);
right.add(s[0]);
right.add(s[1]);
/*
如果打架则返回来,重新输入;否则此步渡河成功
*/
if (this.daJia())
{
right.remove(s[0]);
right.remove(s[1]);
left.add(s[0]);
left.add(s[1]);
keyboardInput();
}
else
{
System.out.println("第"+count++ +"步::"+s[0]+" 把 "+s[1]+" 带到了右岸");
System.out.println("左岸:"+left+"\t右岸:"+right);
if (!this.chengGong())//如果渡河没完成就继续输入
keyboardInput();
else
return;
}
}
else//人在右岸的情况
{
/*
这是只输入person的情况
*/
if(s.length==1&&s[0].equals("person"))
{
right.remove(s[0]);
left.add(s[0]);
if (this.daJia())
{
left.remove(s[0]);
right.add(s[0]);
keyboardInput();
}
else
{
System.out.println("第"+count++ +"步::"+s[0]+" 回到了左岸");
System.out.println("左岸:"+left+"\t右岸:"+right);
if (!this.chengGong())
keyboardInput();
else
return;
}
}
else if(s.length==2&&s[0].equals("person"))//这是输入person和一个动物的情况
{
right.remove(s[0]);
right.remove(s[1]);
left.add(s[0]);
left.add(s[1]);
if (this.daJia())
{
left.remove(s[0]);
left.remove(s[1]);
right.add(s[0]);
right.add(s[1]);
keyboardInput();
}
else
{
System.out.println("第"+count++ +"步::"+s[0]+" 和 "+s[1]+" 回到了左岸");
System.out.println("左岸:"+left+"\t右岸:"+right);
if (!this.chengGong())
keyboardInput();
else
return;
}
}
else
{
System.out.println("请按格式输入!");
keyboardInput();
}
}
}
/*
判断左岸和右岸是否发生打架,
*/
public boolean daJia()
{
//如果人不在左岸,左岸还包含dog和cat则打架,以下同理
if ((!left.contains("person")) && left.contains("dog") && left.contains("cat"))
{
System.out.println("左岸打架!狗咬猫!请重新输入");
return true;
}
if ((!left.contains("person")) && left.contains("cat") && left.contains("fish"))
{
System.out.println("左岸打架!猫吃鱼!请重新输入");
return true;
}
if ((!right.contains("person")) && right.contains("dog") && right.contains("cat"))
{
System.out.println("右岸打架!狗咬猫!请重新输入");
return true;
}
if ((!right.contains("person")) && right.contains("cat") && right.contains("fish"))
{
System.out.println("右岸打架!猫吃鱼!请重新输入");
return true;
}
return false;
}
/*
判断渡河是否成功,如果左岸空了代表成功
*/
public boolean chengGong()
{
if (left.isEmpty())
{
System.out.println("\n渡河成功!!!!");
return true;
}
else
return false;
}
}
复制代码
作者:
谭荣强
时间:
2014-6-10 22:31
中文我打小就看不懂,更别说编程了。
作者:
黑马粉、峥
时间:
2014-6-10 23:09
package exam;
//一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
import java.util.ArrayList;
import java.util.List;
//先带猫过去,然后回来把狗带过,把猫带回来
//再把鱼带过去,再回来带猫
public class Test10
{
ArrayList<String> here = new ArrayList<String>();
ArrayList<String> there = new ArrayList<String>();
public boolean isSafty(List list)
{
if (list.contains("dog") && list.contains("cat")
|| list.contains("cat") && list.contains("fish"))
{
return false;
}
return true;
}
public Test10()
{
here.add("Dog");
here.add("cat");
here.add("fish");
}
public void toTake()
{
String str = here.get(0);
here.remove(str);
if (isSafty(here))
{
System.out.println("1农夫带着" + str + "去往对岸,这边还剩下" + here + ",对岸有" + there);
toThere(str);
}
else
{
here.add(str);
toTake();
}
}
public void toThere(String s)
{
if (isSafty(there))
{
there.add(s);
if(here.isEmpty())
{
System.out.println("农夫,"+there+"都被你带过来了");
return;
}
if(isSafty(there))
{
System.out.println("2农夫回到原点,对岸有" + there);
toTake();
}
else
{
String temp=there.get(0);
there.remove(temp);
System.out.println("3农夫带着"+temp+"回到原点,这边有" + here + ",对岸有" + there);
here.add(temp);
toTake();
}
}
else
{
there.remove(s);
toTake();
}
}
public static void main(String[] args)
{
new Test10().toTake();
}
}
复制代码
作者:
汤姆纳斯
时间:
2014-6-11 00:05
厉害啊,我还没看到这里呢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2