如何理解Java农夫过河问题的继承与多态实现

发布时间:2021-11-24 14:22:00 作者:柒染
来源:亿速云 阅读:130

今天就跟大家聊聊有关如何理解Java农夫过河问题的继承与多态实现,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

题目描述:

一个农夫带着一匹狼、一只羊、一颗白菜要过河,只有一条船而且农夫每次最多只能带一个动物或物品过河,并且当农夫不在的时候狼会吃羊,羊会吃白菜。,请设计程序,由用户选择角色过河,系统自动判断游戏的胜负:当出现有生物被吃掉的时候,游戏失败,所有角色都到了河的另一边,游戏成功。话不多说,直接看代码:

package Test1;import java.util.Scanner;public class Client {  static Farmer farmer = new Farmer();  public static void menu() { System.out.println("==================Please choose operation============"); System.out.println("\t==========1:Cross the river alone==========="); System.out.println("\t==========2:Cross the river with ("+farmer.wolf.name+")"+"========="); System.out.println("\t==========3:Cross the river with ("+farmer.sheep.name+")"+"============"); System.out.println("\t==========4:Cross the river with ("+farmer.cabbage.name+")"+"=========="); System.out.println("\t==========0:Quit===============");   System.out.println("==================================================="); System.out.println("Input the number(0~4):"); } public static void show()/* 输出农夫、各种动物、物品的状态(生存、位置) */ {  System.out.println("过河状态:");  System.out.println(farmer.sheep.name+":  是否在左边河:"+farmer.sheep.is_across_left+  "  是否在右边河"+farmer.sheep.is_across_right+"  是否存活:"+farmer.sheep.is_alive); //如果羊过河成功则河左边显示false河右边显示true  System.out.println(farmer.cabbage.name+":  是否在左边河:"+farmer.cabbage.is_across_left+  "  是否在右边河"+farmer.cabbage.is_across_right+"  是否存活:"+farmer.cabbage.is_alive); //如果白菜过河成功则河左边显示false河右边显示true  System.out.println(farmer.wolf.name+":  是否在左边河:"+farmer.wolf.is_across_left+  "  是否在右边河"+farmer.wolf.is_across_right+"  是否存活:"+farmer.wolf.is_alive); //如果狼过河成功则河左边显示false河右边显示true  System.out.println("农夫:  是否在左边河:"+farmer.is_across_left+"  是否在右边河"+farmer.is_across_right);  } public static void is_alive() { //判断羊和白菜是否被吃  if(farmer.sheep.is_across_left==farmer.wolf.is_across_left&&farmer.sheep.is_across_right==farmer.wolf.is_across_right  &&farmer.is_across_left==farmer.sheep.is_across_right&&farmer.is_across_right==farmer.sheep.is_across_left  &&farmer.is_across_left==farmer.wolf.is_across_right&&farmer.is_across_right==farmer.wolf.is_across_left) {  //如果羊和狼在同一边且农夫在另外一边时则羊会被吃  farmer.sheep.is_alive=false;   }  if(farmer.sheep.is_across_left==farmer.cabbage.is_across_left&&farmer.sheep.is_across_right==farmer.cabbage.is_across_right  &&farmer.is_across_left==farmer.cabbage.is_across_right&&farmer.is_across_right==farmer.cabbage.is_across_left  &&farmer.is_across_left==farmer.sheep.is_across_right&&farmer.is_across_right==farmer.sheep.is_across_left) {  //如果羊和白菜在同一边且农夫在另外一边时则白菜会被吃  farmer.cabbage.is_alive=false; }  } public static int is_win(){ //判断是否成功过河 if(farmer.sheep.is_alive==false||farmer.cabbage.is_alive==false) {    return 0;  //如果羊或白菜被吃了则返回0直接退出游戏失败 } if(farmer.is_across_right==true&&farmer.sheep.is_across_right==true&&farmer.wolf.is_across_right&&farmer.cabbage.is_across_right==true) {   //如果农夫羊狼白菜都到了河的右边则返回1游戏成功  return 1;  } return 2; //其他情况则继续进行 }   public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); int choice = 0; int m=2;  //将m的初始值设置为2表示正在进行的情况 boolean gamevoer=false,win=false; while(!gamevoer) {  if(m==1||m==0) { //如果m=0或1则直接退出显示游戏结果  break;  }  menu();  choice = input.nextInt();  System.out.println("\n");  switch(choice)  {  case 0: gamevoer=true;   break;  case 1:{   farmer.cross_alone(); /* 农夫独自过河的处理 */   //农夫位置的判断   is_alive();   show();   m=is_win(); //m用来记录方法的返回值0,1,2   if(m==1) //如果m=1,则表示过河成功   {   win=true;//直接输出游戏成功   }   break;      }  //以下情况类似  case 2:{   farmer.cross_wolf();/* 农夫带狼的处理 */   is_alive();   show();   m=is_win();   if(m==1)   {   win=true;   }   break;  }  case 3:{   farmer.cross_sheep();/* 农夫带羊的处理 */   is_alive();   show();   m=is_win();   if(m==1)   {   win=true;   }   break;  }  case 4:{   farmer.cross_cabbage(); /* 农夫带白菜的处理 */   is_alive();   show();   m=is_win();   if(m==1)   {   win=true;   }   break;  }     }   } if(win) {  System.out.println("game over: you win !"); }else {  System.out.println("game over: you lose !"); }  input.close();  }}

package Test1;public class Cabbage extends wuti { public Cabbage(){ super.name="白菜"; } }

package Test1;public class Farmer{ boolean is_across_left = true ; //默认河左边为开始的一边 boolean is_across_right = false; Sheep sheep = new Sheep(); Wolf wolf = new Wolf(); Cabbage cabbage = new Cabbage(); public void cross_cabbage () {  if(cabbage.is_across_left==is_across_left||cabbage.is_across_right==is_across_right) { //如果白菜农夫在一边  if(cabbage.is_across_left==false) { //白菜右边到左边  cabbage.is_across_left=true;  cabbage.is_across_right=false;  }    else { //白菜左边到右边  cabbage.is_across_left=false;  cabbage.is_across_right=true;  }    if(is_across_left==false) { //农夫右边到左边  is_across_left=true;  is_across_right=false;  }    else { //农夫左边到右边  is_across_left=false;  is_across_right=true;  }   } else {  //如果白菜农夫不在一边则白菜无法过河  System.out.println(cabbage.name+"不再农夫这边"); }   }  public void cross_sheep() {  if(sheep.is_across_left==is_across_left||sheep.is_across_right==is_across_right) { //如果羊农夫在一边     if(sheep.is_across_left==false) { //羊右边到左边  sheep.is_across_left=true;  sheep.is_across_right=false; }  else{ //羊左边到右边  sheep.is_across_left=false;  sheep.is_across_right=true; }  if(is_across_left==false) { //农夫右边到左边  is_across_left=true;  is_across_right=false; }  else{ //农夫左边到右边  is_across_left=false;  is_across_right=true; } } else {  //如果羊农夫不在一边则羊无法过河  System.out.println(sheep.name+"不再农夫这边"); }    }  public void cross_wolf() {  if(wolf.is_across_left==is_across_left||wolf.is_across_right==is_across_right) { //如果狼农夫在一边     if(wolf.is_across_left==false) { //狼右边到左边  wolf.is_across_left=true;  wolf.is_across_right=false; }  else { //狼左边到右边  wolf.is_across_left=false;  wolf.is_across_right=true; }  if(is_across_left==false) { //农夫右边到左边  is_across_left=true;  is_across_right=false; }  else { //农夫左边到右边  is_across_left=false;  is_across_right=true; } } else {  //如果狼农夫不在一边则狼无法过河  System.out.println(wolf.name+"不再农夫这边"); }  }  public void cross_alone() {  if(is_across_left==false) { //农夫右边到左边  is_across_left=true;  is_across_right=false; }  else{ //农夫左边到右边  is_across_left=false;  is_across_right=true; }  } }

package Test1;public class Sheep extends wuti{public Sheep(){ super.name="羊"; }}

package Test1;public class Wolf extends wuti{public Wolf(){ super.name="狼"; }}

package Test1;public class wuti {String name; boolean is_across_left = true ; boolean is_across_right = false; boolean is_alive = true;}

首先创建一个物体类wuti.java,其中包括name用来说明要过河的物体, is_across_left表示在河的左边,默认为true, is_across_right表示在河的右边,默认为false, is_alive表示物体没有被吃,这个类是父类,将会有3个类继承自此类,分别是Cabbage,Sheep,Wolf类,但是这3个类中只有分别表示名字的构造方法,虽然简单但是有利于游戏的变更,比如实验要求的将狼,羊,白菜改为狐狸,兔子,胡萝卜,这样的话只需要将super.name改为需要的物体名称就可以。然后创建一个Farmer类,其中包括cross_cabbage ()方法,cross_sheep()方法,cross_wolf()方法,这3个方法分别用来表示农夫和白菜,羊,狼过河的情况,而且农夫必须和物体在一边,否则会输出提示表示物体与农夫的位置不一样无法进行过河。最后创建一个Client类,其中包括menu()方法,show()方法,is_alive()方法,is_win()方法,menu()方法显示一个类似菜单的选择项,可以选择想要过河的情况。show()方法输出农夫、各种动物、物品的状态(生存、位置),如果物体过河成功则河左边(is_across_left)显示false河右边(is_across_right)显示true。is_alive()方法用来判断羊和白菜是否被吃,如果羊和狼在同一边且农夫在另外一边时则羊会被吃,如果羊和白菜在同一边且农夫在另外一边时则白菜会被吃。is_win()方法判断是否成功过河,如果羊或白菜被吃了则返回0直接退出游戏失败,如果农夫羊狼白菜都到了河的右边则返回1游戏成功。在主方法中,将m的初始值设置为2表示正在进行的情况,在while循环中如果m=0或1则直接退出显示游戏结果,在switch语句中case0,1,2,3,4分别选择过河的物体的情况,case中farmer.cross_alone()等类似的方法表示农夫和物体过河的位置以及是否成功过河的情况,is_alive()方法表示判断物体是否被吃,show()方法输出农夫、各种动物、物品的状态(生存、位置),is_win()方法判断是否成功过河。巧妙利用m的值判断是否过河成功。

看完上述内容,你们对如何理解Java农夫过河问题的继承与多态实现有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

推荐阅读:
  1. java中的多态如何理解
  2. C++中的封装、继承、多态理解

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java

上一篇:Hadoop2.7.4完全分布式集群如何构建

下一篇:如何实现hadoop启动脚本

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》