溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解Java農(nóng)夫過河問題的繼承與多態(tài)實(shí)現(xiàn)

發(fā)布時(shí)間:2021-11-24 14:22:00 來源:億速云 閱讀:125 作者:柒染 欄目:編程語言

今天就跟大家聊聊有關(guān)如何理解Java農(nóng)夫過河問題的繼承與多態(tài)實(shí)現(xiàn),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

題目描述:

一個(gè)農(nóng)夫帶著一匹狼、一只羊、一顆白菜要過河,只有一條船而且農(nóng)夫每次最多只能帶一個(gè)動(dòng)物或物品過河,并且當(dāng)農(nóng)夫不在的時(shí)候狼會吃羊,羊會吃白菜。,請?jiān)O(shè)計(jì)程序,由用戶選擇角色過河,系統(tǒng)自動(dòng)判斷游戲的勝負(fù):當(dāng)出現(xiàn)有生物被吃掉的時(shí)候,游戲失敗,所有角色都到了河的另一邊,游戲成功。話不多說,直接看代碼:

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()/* 輸出農(nóng)夫、各種動(dòng)物、物品的狀態(tài)(生存、位置) */ {  System.out.println("過河狀態(tài):");  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("農(nóng)夫:  是否在左邊河:"+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) {  //如果羊和狼在同一邊且農(nóng)夫在另外一邊時(shí)則羊會被吃  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) {  //如果羊和白菜在同一邊且農(nóng)夫在另外一邊時(shí)則白菜會被吃  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) {   //如果農(nóng)夫羊狼白菜都到了河的右邊則返回1游戲成功  return 1;  } return 2; //其他情況則繼續(xù)進(jìn)行 }   public static void main(String[] args) { // TODO Auto-generated method stub Scanner input = new Scanner(System.in); int choice = 0; int m=2;  //將m的初始值設(shè)置為2表示正在進(jìn)行的情況 boolean gamevoer=false,win=false; while(!gamevoer) {  if(m==1||m==0) { //如果m=0或1則直接退出顯示游戲結(jié)果  break;  }  menu();  choice = input.nextInt();  System.out.println("\n");  switch(choice)  {  case 0: gamevoer=true;   break;  case 1:{   farmer.cross_alone(); /* 農(nóng)夫獨(dú)自過河的處理 */   //農(nóng)夫位置的判斷   is_alive();   show();   m=is_win(); //m用來記錄方法的返回值0,1,2   if(m==1) //如果m=1,則表示過河成功   {   win=true;//直接輸出游戲成功   }   break;      }  //以下情況類似  case 2:{   farmer.cross_wolf();/* 農(nóng)夫帶狼的處理 */   is_alive();   show();   m=is_win();   if(m==1)   {   win=true;   }   break;  }  case 3:{   farmer.cross_sheep();/* 農(nóng)夫帶羊的處理 */   is_alive();   show();   m=is_win();   if(m==1)   {   win=true;   }   break;  }  case 4:{   farmer.cross_cabbage(); /* 農(nóng)夫帶白菜的處理 */   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 ; //默認(rèn)河左邊為開始的一邊 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) { //如果白菜農(nóng)夫在一邊  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) { //農(nóng)夫右邊到左邊  is_across_left=true;  is_across_right=false;  }    else { //農(nóng)夫左邊到右邊  is_across_left=false;  is_across_right=true;  }   } else {  //如果白菜農(nóng)夫不在一邊則白菜無法過河  System.out.println(cabbage.name+"不再農(nóng)夫這邊"); }   }  public void cross_sheep() {  if(sheep.is_across_left==is_across_left||sheep.is_across_right==is_across_right) { //如果羊農(nóng)夫在一邊     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) { //農(nóng)夫右邊到左邊  is_across_left=true;  is_across_right=false; }  else{ //農(nóng)夫左邊到右邊  is_across_left=false;  is_across_right=true; } } else {  //如果羊農(nóng)夫不在一邊則羊無法過河  System.out.println(sheep.name+"不再農(nóng)夫這邊"); }    }  public void cross_wolf() {  if(wolf.is_across_left==is_across_left||wolf.is_across_right==is_across_right) { //如果狼農(nóng)夫在一邊     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) { //農(nóng)夫右邊到左邊  is_across_left=true;  is_across_right=false; }  else { //農(nóng)夫左邊到右邊  is_across_left=false;  is_across_right=true; } } else {  //如果狼農(nóng)夫不在一邊則狼無法過河  System.out.println(wolf.name+"不再農(nóng)夫這邊"); }  }  public void cross_alone() {  if(is_across_left==false) { //農(nóng)夫右邊到左邊  is_across_left=true;  is_across_right=false; }  else{ //農(nóng)夫左邊到右邊  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;}

首先創(chuàng)建一個(gè)物體類wuti.java,其中包括name用來說明要過河的物體, is_across_left表示在河的左邊,默認(rèn)為true, is_across_right表示在河的右邊,默認(rèn)為false, is_alive表示物體沒有被吃,這個(gè)類是父類,將會有3個(gè)類繼承自此類,分別是Cabbage,Sheep,Wolf類,但是這3個(gè)類中只有分別表示名字的構(gòu)造方法,雖然簡單但是有利于游戲的變更,比如實(shí)驗(yàn)要求的將狼,羊,白菜改為狐貍,兔子,胡蘿卜,這樣的話只需要將super.name改為需要的物體名稱就可以。然后創(chuàng)建一個(gè)Farmer類,其中包括cross_cabbage ()方法,cross_sheep()方法,cross_wolf()方法,這3個(gè)方法分別用來表示農(nóng)夫和白菜,羊,狼過河的情況,而且農(nóng)夫必須和物體在一邊,否則會輸出提示表示物體與農(nóng)夫的位置不一樣無法進(jìn)行過河。最后創(chuàng)建一個(gè)Client類,其中包括menu()方法,show()方法,is_alive()方法,is_win()方法,menu()方法顯示一個(gè)類似菜單的選擇項(xiàng),可以選擇想要過河的情況。show()方法輸出農(nóng)夫、各種動(dòng)物、物品的狀態(tài)(生存、位置),如果物體過河成功則河左邊(is_across_left)顯示false河右邊(is_across_right)顯示true。is_alive()方法用來判斷羊和白菜是否被吃,如果羊和狼在同一邊且農(nóng)夫在另外一邊時(shí)則羊會被吃,如果羊和白菜在同一邊且農(nóng)夫在另外一邊時(shí)則白菜會被吃。is_win()方法判斷是否成功過河,如果羊或白菜被吃了則返回0直接退出游戲失敗,如果農(nóng)夫羊狼白菜都到了河的右邊則返回1游戲成功。在主方法中,將m的初始值設(shè)置為2表示正在進(jìn)行的情況,在while循環(huán)中如果m=0或1則直接退出顯示游戲結(jié)果,在switch語句中case0,1,2,3,4分別選擇過河的物體的情況,case中farmer.cross_alone()等類似的方法表示農(nóng)夫和物體過河的位置以及是否成功過河的情況,is_alive()方法表示判斷物體是否被吃,show()方法輸出農(nóng)夫、各種動(dòng)物、物品的狀態(tài)(生存、位置),is_win()方法判斷是否成功過河。巧妙利用m的值判斷是否過河成功。

看完上述內(nèi)容,你們對如何理解Java農(nóng)夫過河問題的繼承與多態(tài)實(shí)現(xiàn)有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI