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的值判断是否过河成功。
结果显示:
在这里插入图片描述在这里插入图片描述在这里插入图片描述
可以试试。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值