黑马程序员技术交流社区

标题: 终于做出来IO版的老农过河了,还有很多瑕疵,求完善 [打印本页]

作者: 想飞的鱼    时间: 2014-6-10 21:15
标题: 终于做出来IO版的老农过河了,还有很多瑕疵,求完善
本帖最后由 想飞的鱼 于 2014-6-10 21:22 编辑

写了大半天,终于做出来IO版的老农过河了,但是还有很多瑕疵,如:没处理IO异常,输入流没有关闭,判断输入格式神马的不严谨.......好多!求完善
下面是我的源码(感觉好繁琐,都写晕我了==!!):
  1. /*
  2. 需求:做一个控制台版的老农过河小游戏
  3. 规则:一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。
  4. 当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。

  5. */
  6. import java.util.*;
  7. import java.io.*;
  8. class  LaoNongGuoHe
  9. {
  10.         ArrayList<String> left = null;//左岸
  11.         ArrayList<String> right = null;//右岸
  12.         int count = 1;//记录步数
  13.         LaoNongGuoHe()
  14.         {
  15.                 /*
  16.                 一初始化就有了左岸,右岸,
  17.                 所有的动物和人开始都在左岸
  18.                 */
  19.                 left = new ArrayList<String>();
  20.                 right = new ArrayList<String>();
  21.                 left.add("person");
  22.                 left.add("dog");
  23.                 left.add("cat");
  24.                 left.add("fish");
  25.         }

  26.         public static void main(String[] args) throws IOException
  27.         {
  28.                 System.out.println("《过河规则》:一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。"
  29. +"当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。\n"
  30. +"《输入格式》:person,animal---如:person,cat或person");
  31.                 System.out.println("《初始化》左岸:[person,cat,fish,dog]\t右岸:[]");
  32.                 new LaoNongGuoHe().keyboardInput();               
  33.         }
  34.         public void keyboardInput()throws IOException
  35.         {
  36.                 System.out.print("\n请输入过河的person和动物:");
  37.                 BufferedReader bis = new BufferedReader(new InputStreamReader(System.in));

  38.                 String line = bis.readLine();

  39.                 duHe(line);
  40.         }
  41.         public void duHe(String str)throws IOException
  42.         {
  43.                 String[] s = str.split(",");//按格式输入的字符串,用”和“切割开

  44.                 if (left.contains("person"))//人在左岸的情况
  45.                 {
  46.                         if (s.length!=2||!s[0].equals("person"))
  47.                         {
  48.                                 System.out.println("请按格式输入!person必须带一个动物过去");
  49.                                 keyboardInput();
  50.                         }
  51.                         /*
  52.                         移动人和动物
  53.                         */
  54.                         left.remove(s[0]);
  55.                         left.remove(s[1]);

  56.                         right.add(s[0]);
  57.                         right.add(s[1]);
  58.                         /*
  59.                         如果打架则返回来,重新输入;否则此步渡河成功
  60.                         */
  61.                         if (this.daJia())
  62.                         {
  63.                                 right.remove(s[0]);
  64.                                 right.remove(s[1]);
  65.                                 left.add(s[0]);
  66.                                 left.add(s[1]);
  67.                                 keyboardInput();
  68.                         }
  69.                         else
  70.                         {
  71.                                 System.out.println("第"+count++ +"步::"+s[0]+" 把 "+s[1]+" 带到了右岸");
  72.                                 System.out.println("左岸:"+left+"\t右岸:"+right);
  73.                                 if (!this.chengGong())//如果渡河没完成就继续输入
  74.                                         keyboardInput();
  75.                                 else
  76.                                         return;
  77.                         }
  78.                 }
  79.                 else//人在右岸的情况
  80.                 {
  81.                         /*
  82.                         这是只输入person的情况
  83.                         */
  84.                         if(s.length==1&&s[0].equals("person"))
  85.                         {
  86.                                 right.remove(s[0]);
  87.                                 left.add(s[0]);
  88.                                 if (this.daJia())
  89.                                 {
  90.                                         left.remove(s[0]);
  91.                                         right.add(s[0]);
  92.                                         keyboardInput();
  93.                                 }
  94.                                 else
  95.                                 {
  96.                                         System.out.println("第"+count++ +"步::"+s[0]+" 回到了左岸");
  97.                                         System.out.println("左岸:"+left+"\t右岸:"+right);
  98.                                         if (!this.chengGong())
  99.                                                 keyboardInput();
  100.                                         else
  101.                                                 return;
  102.                                 }
  103.                         }
  104.                         else if(s.length==2&&s[0].equals("person"))//这是输入person和一个动物的情况
  105.                         {
  106.                                 right.remove(s[0]);
  107.                                 right.remove(s[1]);
  108.                                 left.add(s[0]);
  109.                                 left.add(s[1]);
  110.                                 if (this.daJia())
  111.                                 {
  112.                                         left.remove(s[0]);
  113.                                         left.remove(s[1]);
  114.                                         right.add(s[0]);
  115.                                         right.add(s[1]);
  116.                                         keyboardInput();
  117.                                 }
  118.                                 else
  119.                                 {
  120.                                         System.out.println("第"+count++ +"步::"+s[0]+" 和 "+s[1]+" 回到了左岸");
  121.                                         System.out.println("左岸:"+left+"\t右岸:"+right);
  122.                                         if (!this.chengGong())
  123.                                                 keyboardInput();
  124.                                         else
  125.                                                 return;
  126.                                 }
  127.                         }
  128.                         else
  129.                         {
  130.                                 System.out.println("请按格式输入!");
  131.                                 keyboardInput();
  132.                         }
  133.                 }
  134.         }
  135.         
  136.         /*
  137.         判断左岸和右岸是否发生打架,
  138.         */
  139.         public boolean daJia()
  140.         {
  141.                 //如果人不在左岸,左岸还包含dog和cat则打架,以下同理
  142.                 if ((!left.contains("person")) && left.contains("dog") && left.contains("cat"))
  143.                 {
  144.                         System.out.println("左岸打架!狗咬猫!请重新输入");
  145.                         return true;
  146.                 }        
  147.                 if ((!left.contains("person")) && left.contains("cat") && left.contains("fish"))
  148.                 {
  149.                         System.out.println("左岸打架!猫吃鱼!请重新输入");
  150.                         return true;
  151.                 }
  152.                 if ((!right.contains("person")) && right.contains("dog") && right.contains("cat"))
  153.                 {
  154.                         System.out.println("右岸打架!狗咬猫!请重新输入");
  155.                         return true;
  156.                 }
  157.                 if ((!right.contains("person")) && right.contains("cat") && right.contains("fish"))
  158.                 {
  159.                         System.out.println("右岸打架!猫吃鱼!请重新输入");
  160.                         return true;
  161.                 }

  162.                 return false;
  163.         }
  164.         /*
  165.         判断渡河是否成功,如果左岸空了代表成功
  166.         */
  167.         public boolean chengGong()
  168.         {
  169.                 if (left.isEmpty())
  170.                 {
  171.                         System.out.println("\n渡河成功!!!!");
  172.                         return true;
  173.                 }
  174.                 else
  175.                         return false;
  176.         }
  177. }
复制代码




作者: 谭荣强    时间: 2014-6-10 22:31
中文我打小就看不懂,更别说编程了。
作者: 黑马粉、峥    时间: 2014-6-10 23:09
  1. package exam;
  2. //一位老农带着猫、狗、鱼过河,河边有一条船,每次老农只能带一只动物过河。当老农不和猫狗鱼在一起时,狗会咬猫,猫会吃鱼,当老农和猫狗鱼在一起时,则不会发生这种问题。编程解决猫狗鱼过河问题。
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. //先带猫过去,然后回来把狗带过,把猫带回来  
  6. //再把鱼带过去,再回来带猫  
  7. public class Test10
  8. {  
  9.     ArrayList<String> here = new ArrayList<String>();  
  10.     ArrayList<String> there = new ArrayList<String>();  
  11.     public boolean isSafty(List list)
  12.     {  
  13.         if (list.contains("dog") && list.contains("cat")  
  14.                || list.contains("cat") && list.contains("fish"))
  15.                    {  
  16.            return false;         
  17.            }  
  18.         return true;  
  19.    }  
  20.   
  21.     public Test10()
  22.     {  
  23.         here.add("Dog");  
  24.         here.add("cat");  
  25.        here.add("fish");  
  26.     }  
  27.     public void toTake()
  28.     {  
  29.        String str = here.get(0);  
  30.       here.remove(str);  
  31.       if (isSafty(here))
  32.       {  
  33.            System.out.println("1农夫带着" + str + "去往对岸,这边还剩下" + here + ",对岸有"  + there);  
  34.                            toThere(str);      
  35.       }
  36.       else
  37.       {  
  38.            here.add(str);  
  39.           toTake();  
  40.       }  
  41.     }   
  42.     public void toThere(String s)
  43.     {  
  44.             if (isSafty(there))
  45.             {  
  46.                     there.add(s);  
  47.             if(here.isEmpty())
  48.             {  
  49.                System.out.println("农夫,"+there+"都被你带过来了");  
  50.                 return;  
  51.             }  
  52.            if(isSafty(there))
  53.            {  
  54.                 System.out.println("2农夫回到原点,对岸有" + there);  
  55.                toTake();  
  56.            }
  57.                                 else
  58.                                 {  
  59.                 String temp=there.get(0);  
  60.                there.remove(temp);  
  61.                System.out.println("3农夫带着"+temp+"回到原点,这边有" + here + ",对岸有" + there);  
  62.                 here.add(temp);  
  63.                 toTake();  
  64.                                 }  
  65.         }
  66.                                 else
  67.                                 {  
  68.                                 there.remove(s);  
  69.                                 toTake();  
  70.                         }  
  71.     }  
  72.     public static void main(String[] args)
  73.     {  
  74.        new Test10().toTake();  
  75.     }  
  76. }  
复制代码

作者: 汤姆纳斯    时间: 2014-6-11 00:05
厉害啊,我还没看到这里呢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2