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

 更新时间:2020年01月15日 09:23:21   作者:小任性嘛  
这篇文章主要介绍了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基于正则表达式实现时间日期的常用判断操作实例

    java基于正则表达式实现时间日期的常用判断操作实例

    这篇文章主要介绍了java基于正则表达式实现时间日期的常用判断操作,简单说明了正则表达式常用元字符含义并结合实例形式分析了java基于正则表达式针对常用日期时间格式的判断操作技巧,需要的朋友可以参考下
    2017-10-10
  • Jmeter BlazeMeter实现web录制过程

    Jmeter BlazeMeter实现web录制过程

    BlazeMeter是一款与Apache JMeter兼容的chrome插件,采用BlazeMeter可以方便的进行流量录制和脚本生成,作为接口测试脚本编写的一个基础,这篇文章主要介绍了Jmeter BlazeMeter实现web录制,需要的朋友可以参考下
    2021-12-12
  • 浅谈springboot与微服务架构

    浅谈springboot与微服务架构

    这篇文章主要介绍了浅谈springboot与微服务架构,SpringBoot是由 Pivotal团队提供的框架,其设计⽬的是⽤来简化新Spring应⽤,初始搭建以及开发过程,该框架使⽤了特定的⽅式来进⾏配置,需要的朋友可以参考下
    2023-07-07
  • Windows Zookeeper安装过程及启动图解

    Windows Zookeeper安装过程及启动图解

    这篇文章主要介绍了Windows Zookeeper安装过程及启动图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • SpringBoot+RabbitMQ实现消息可靠传输详解

    SpringBoot+RabbitMQ实现消息可靠传输详解

    消息的可靠传输是面试必问的问题之一,保证消息的可靠传输主要在生产端开启 comfirm 模式,RabbitMQ 开启持久化,消费端关闭自动 ack 模式。本文将详解SpringBoot整合RabbitMQ如何实现消息可靠传输,需要的可以参考一下
    2022-05-05
  • Java程序去调用并执行shell脚本及问题总结(推荐)

    Java程序去调用并执行shell脚本及问题总结(推荐)

    这篇文章主要介绍了Java程序去调用并执行shell脚本及问题总结,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • Map集合中获取key-value值的实现方法

    Map集合中获取key-value值的实现方法

    这篇文章主要介绍了Map集合中获取key-value值的实现方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • Java 如何将前端传来的数字转化为日期

    Java 如何将前端传来的数字转化为日期

    这篇文章主要介绍了Java 如何将前端传来的数字转化为日期,本文通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Java校验银行卡是否正确的核心代码

    Java校验银行卡是否正确的核心代码

    这篇文章主要介绍了Java校验银行卡是否正确的核心代码,需要的朋友可以参考下
    2017-01-01
  • 解决idea中maven项目无端显示404错误的方法

    解决idea中maven项目无端显示404错误的方法

    这篇文章主要介绍了解决idea中maven项目无端显示404错误的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论