用继承写农夫过河的Java代码
时间: 2024-04-29 13:26:24 浏览: 101
好的,我可以为您提供一个使用继承的Java代码示例,实现农夫过河游戏:
首先,我们需要创建一个父类“Person”(人),包含以下方法:
```
public class Person {
protected String name; // 人名
protected boolean isFarmer; // 是否是农夫
protected boolean isBoatOnThisSide; // 游船是否在这一边
public Person(String name, boolean isFarmer, boolean isBoatOnThisSide) {
this.name = name;
this.isFarmer = isFarmer;
this.isBoatOnThisSide = isBoatOnThisSide;
}
public String getName() {
return name;
}
public boolean isFarmer() {
return isFarmer;
}
public void setIsBoatOnThisSide(boolean isBoatOnThisSide) {
this.isBoatOnThisSide = isBoatOnThisSide;
}
public boolean isBoatOnThisSide() {
return isBoatOnThisSide;
}
public boolean canRowBoat() {
return true; // 默认可以操作船只
}
}
```
然后我们需要创建继承自“Person”的“Farmer”(农夫)类,该类专门处理农夫特有的行为,包括移动、搭乘船只等等。
```
public class Farmer extends Person {
public Farmer(String name, boolean isBoatOnThisSide) {
super(name, true, isBoatOnThisSide);
}
@Override
public boolean canRowBoat() {
return true;
}
}
```
接下来,我们需要另一个子类“Boat”(船)类,该类包含两个“Person”类型的对象,表示船上可以载人的人员,还有一些方法实现移动、判断船上人员是否可以乘船等。
```
public class Boat {
private Person[] people = new Person[2]; // 船上可容纳的人数
private boolean isBoatOnThisSide; // 船是否在目前这侧岸边
public Boat(boolean isBoatOnThisSide) {
this.isBoatOnThisSide = isBoatOnThisSide;
}
public void setPeople(Person person1, Person person2) {
people[0] = person1;
people[1] = person2;
}
public boolean canRow() {
if (people[0] == null || people[1] == null) {
return false; // 船上没有两个人,不能划船
}
if (!people[0].canRowBoat() && !people[1].canRowBoat()) {
return false; // 船上的人员都不能划船,不能划船
}
return true;
}
public void moveBoat() {
isBoatOnThisSide = !isBoatOnThisSide; // 移到对岸
for (Person person : people) {
person.setIsBoatOnThisSide(isBoatOnThisSide); // 更改人员的状态
}
}
public boolean isBoatOnThisSide() {
return isBoatOnThisSide;
}
public boolean isEmpty() {
return people[0] == null && people[1] == null;
}
}
```
最后我们需要实现一个“Game”(游戏)类表示整个农夫过河的游戏,包含游戏的状态、移动、判断游戏是否结束等。
```
public class Game {
private Farmer farmer1;
private Farmer farmer2;
private Boat boat;
private boolean isGameEnd;
public Game() {
farmer1 = new Farmer("农夫1", true);
farmer2 = new Farmer("农夫2", true);
boat = new Boat(true); // 船在左岸
isGameEnd = false;
}
public boolean isGameEnd() {
return isGameEnd;
}
/**
* 移动船
*/
public void moveBoat() {
if (boat.canRow()) {
boat.moveBoat();
System.out.println(boat.getSide() + "河岸" + "行驶船只到另" + (boat.getSide() == "左" ? "右" : "左") + "河岸");
} else {
System.out.println("船上至少需要一位农夫或者河岸人员有一个农夫");
}
}
/**
* 移动农夫
*/
public void moveFarmer(Farmer farmer) {
if (boat.isBoatOnThisSide() == farmer.isBoatOnThisSide()) {
if (boat.isEmpty()) {
System.out.println("船是空的,不能移动");
return;
}
Person p = boat.getPeople()[0];
if (!p.canRowBoat() && boat.getPeople()[1] != null && !boat.getPeople()[1].canRowBoat()) {
System.out.println("两位乘客都不能划船");
return;
}
if (farmer != p && !farmer.isFarmer()) {
System.out.println("农夫才能操作农夫");
return;
}
if (!boat.canRow()) {
System.out.println("船上至少需要一位农夫或者河岸人员有一个农夫");
return;
}
if (boat.getPeople()[1] == null) {
System.out.println("船上至少需要两人才能通过河流");
return;
}
boat.moveBoat(); // 先移动一下船
System.out.println(String.format("%s上船到%s岸,船在%s岸边", farmer.getName(), boat.getSide(), boat.getSide()));
return;
}
farmer.setIsBoatOnThisSide(!farmer.isBoatOnThisSide());
System.out.println(String.format("%s上岸离开了船,船在%s岸边", farmer.getName(), boat.getSide()));
}
/**
* 判断游戏是否结束
*/
private boolean isGameOver() {
if (farmer1.isBoatOnThisSide() && farmer2.isBoatOnThisSide()) {
return true;
}
if (!farmer1.isBoatOnThisSide() && !farmer2.isBoatOnThisSide()) {
return true;
}
return false;
}
}
```
使用上述代码,我们可以实现一个简单的农夫过河游戏。请注意,此示例可能需要进行更改以完全满足您的需求!
阅读全文