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

发布时间:2020-08-22 06:04:29

来源:脚本之家

阅读:61

作者:小任性嘛

题目描述:

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

话不多说,直接看代码:

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农夫过河问题的继承与多态实现详解相关推荐

  1. Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  2. Java中创建String的两道面试题及详解

    转载自 Java中创建String的两道面试题及详解 我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd";String str2 ...

  3. java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

    java函数式编程归约reduce概念原理 stream reduce方法详解 reduce三个参数的reduce方法如何使用

  4. java显示参数,Java中的隐式参数和显示参数实例详解

    在学习java的过程中,我们会遇到许多的问题.下面我们就来看看什么是隐式参数和显示参数. 显式参数,就是平时见到的在方法名括号中间的参数,就是所谓能看得见的参数www.cppcns.com. 隐式参数 ...

  5. WEB后台--邮件和短信业务实现(包括Java一键实现、封装和异步)以及原理详解

    本来就打算针对一些固定的特别点的业务(QQ与网易邮件.拦截设计.短信.定时器等等)来进行记录以及解析原理,这些会比较零散记录在JavaWeb的分类里面,感兴趣的童鞋可以去看下. 有人问为什么要邮件短信 ...

  6. Java数据结构与算法-SingleLinkedList单向链表插入,删除,查找,修改详解及代码

    SingleLinkedList单向链表插入,删除,查找,修改详解及代码 单向链表学习目标 1. 链表的介绍 2. 单向链表的存储特点以及原理 3. 基本操作:插入,删除等 4. 单向链表应用场景举例 ...

  7. java g1的并行_「g1」JVM G1详解 - seo实验室

    g1 当我们调优java程序时,通常的目标有两个: 响应能力 或者 吞吐量 响应能力 响应能力指一个程序或者系统对请求的是否能够及时响应. 比如: 一个桌面UI能多快的响应一个事件: 一个网站能够多快 ...

  8. Java开发面试准备,JVM垃圾回收面试题详解

    ```PhantomReference<String> phantom = new PhantomReference<>(new String("hello" ...

  9. Java高级开发面试,红黑树详细分析(图文详解)

    开头 如果Redis的读写请求量很大,那么单个实例很有可能承担不了这么大的请求量,如何提高Redis的性能呢?你也许已经想到了,可以部署多个副本节点,业务采用读写分离的方式,把读请求分担到多个副本节点 ...

最新文章

  1. manjaro无效的软件包
  2. 白给的性能不要?cvpr2021-Diverse branch block
  3. CF1090F - How to Learn You Score(构造)
  4. 通过DOS命令nslookup查域名DNS服务器
  5. 二叉树:通过前序遍历与中序遍历序列输出二叉树的后序遍历序列
  6. 多个非空文件整合至一个文件
  7. 嵌入式数据库与数据库服务器
  8. redis持久化(persistence)
  9. mapabc 国人推荐
  10. H3CV7交换机WEB登录设备方法
  11. i51130g7和i71160g7差多少 酷睿i5 1130G7和i7 1160G7差距
  12. selenium小白学习笔记(7) - 第二个脚本(126邮箱登录为例,包含xpath定位、frame切换)
  13. 数值分析常用的几个小程序C++实现
  14. 云桌面-ThinVirt3-EXP操作手册(一)云桌面系统安装
  15. Android 蓝牙 -- 还原网络设置 删除蓝牙所有存储配对信息流程分析---全网唯一
  16. 如何在iPhone和iPad上使用Group FaceTime
  17. Elasticsearch6.4专题之16:Ingest Node
  18. java代码控制开关
  19. 怎样拿下SUN公司的SCJP认证?
  20. 如何把matlab里的字符串按照顺序排列好

热门文章

  1. 【T+】畅捷通T+登录的时候,提示仅支持以手机号或邮箱登录。
  2. gnome硬盘分析_使用Gnome磁盘工具轻松备份还原硬盘
  3. Linux - 自动同步网络时间
  4. 基于node.js + ElementUI 的sass人力资源后台管理系统的实现
  5. 台式电脑增加算数计算机,台式电脑如何增加硬盘数量
  6. 老司机教你怎样下载电影
  7. 实训一 古诗横竖输出
  8. 打包 压缩 解压缩命令
  9. pytorch锁死在dataloader(训练时卡死)
  10. Miktex 安装遇到过的问题