Java农夫过河问题的继承与多态实现详解
题目描述:
一个农夫带着一匹狼、一只羊、一颗白菜要过河,只有一条船而且农夫每次最多只能带一个动物或物品过河,并且当农夫不在的时候狼会吃羊,羊会吃白菜。,请设计程序,由用户选择角色过河,系统自动判断游戏的胜负:当出现有生物被吃掉的时候,游戏失败,所有角色都到了河的另一边,游戏成功。
话不多说,直接看代码:
packageTest1;
importjava.util.Scanner;
publicclassClient{
staticFarmerfarmer=newFarmer();
publicstaticvoidmenu()
{
System.out.println("==================Pleasechooseoperation============");
System.out.println("\t==========1:Crosstheriveralone===========");
System.out.println("\t==========2:Crosstheriverwith("+farmer.wolf.name+")"+"=========");
System.out.println("\t==========3:Crosstheriverwith("+farmer.sheep.name+")"+"============");
System.out.println("\t==========4:Crosstheriverwith("+farmer.cabbage.name+")"+"==========");
System.out.println("\t==========0:Quit===============");
System.out.println("===================================================");
System.out.println("Inputthenumber(0~4):");
}
publicstaticvoidshow()/*输出农夫、各种动物、物品的状态(生存、位置)*/
{
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);
}
publicstaticvoidis_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;
}
}
publicstaticintis_win(){//判断是否成功过河
if(farmer.sheep.is_alive==false||farmer.cabbage.is_alive==false){
return0;//如果羊或白菜被吃了则返回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游戏成功
return1;
}
return2;//其他情况则继续进行
}
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
Scannerinput=newScanner(System.in);
intchoice=0;
intm=2;//将m的初始值设置为2表示正在进行的情况
booleangamevoer=false,win=false;
while(!gamevoer)
{
if(m==1||m==0){//如果m=0或1则直接退出显示游戏结果
break;
}
menu();
choice=input.nextInt();
System.out.println("\n");
switch(choice)
{
case0:gamevoer=true;
break;
case1:{
farmer.cross_alone();/*农夫独自过河的处理*/
//农夫位置的判断
is_alive();
show();
m=is_win();//m用来记录方法的返回值0,1,2
if(m==1)//如果m=1,则表示过河成功
{
win=true;//直接输出游戏成功
}
break;
}
//以下情况类似
case2:{
farmer.cross_wolf();/*农夫带狼的处理*/
is_alive();
show();
m=is_win();
if(m==1)
{
win=true;
}
break;
}
case3:{
farmer.cross_sheep();/*农夫带羊的处理*/
is_alive();
show();
m=is_win();
if(m==1)
{
win=true;
}
break;
}
case4:{
farmer.cross_cabbage();/*农夫带白菜的处理*/
is_alive();
show();
m=is_win();
if(m==1)
{
win=true;
}
break;
}
}
}
if(win){
System.out.println("gameover:youwin!");
}else{
System.out.println("gameover:youlose!");
}
input.close();
}
}
packageTest1;
publicclassCabbageextendswuti{
publicCabbage(){
super.name="白菜";
}
}
packageTest1;
publicclassFarmer{
booleanis_across_left=true;//默认河左边为开始的一边
booleanis_across_right=false;
Sheepsheep=newSheep();
Wolfwolf=newWolf();
Cabbagecabbage=newCabbage();
publicvoidcross_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+"不再农夫这边");
}
}
publicvoidcross_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+"不再农夫这边");
}
}
publicvoidcross_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+"不再农夫这边");
}
}
publicvoidcross_alone(){
if(is_across_left==false){//农夫右边到左边
is_across_left=true;
is_across_right=false;
}
else{//农夫左边到右边
is_across_left=false;
is_across_right=true;
}
}
}
packageTest1;
publicclassSheepextendswuti{
publicSheep(){
super.name="羊";
}
}
packageTest1;
publicclassWolfextendswuti{
publicWolf(){
super.name="狼";
}
}
packageTest1;
publicclasswuti{
Stringname;
booleanis_across_left=true;
booleanis_across_right=false;
booleanis_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的值判断是否过河成功。
结果显示:
可以试试。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。