请用策略设计模式写一个案例
时间: 2024-05-05 20:16:51 浏览: 9
题目:设计一个简单的游戏,玩家需要控制一个角色在一个迷宫中寻找出口,每次移动需要消耗一定的体力,如果体力值为0则游戏结束,同时在迷宫中会有一些道具可以增加或减少体力值。
解决方案:使用策略模式设计该游戏,将游戏中的角色、迷宫、道具等对象抽象出来,并将每个对象的行为封装成具体的策略类。
1. 定义角色类
角色类包含角色的属性和方法,如角色名称、当前位置、当前体力值、移动方法等。
```
public class Character {
private String name;
private int x;
private int y;
private int energy;
public Character(String name, int x, int y, int energy) {
this.name = name;
this.x = x;
this.y = y;
this.energy = energy;
}
public void move(int dx, int dy, MoveStrategy strategy) {
strategy.move(this, dx, dy);
}
// getters and setters
}
```
2. 定义迷宫类
迷宫类包含迷宫的属性和方法,如迷宫地图、迷宫出口位置、是否有墙等。
```
public class Maze {
private int[][] map;
private int exitX;
private int exitY;
public Maze(int[][] map, int exitX, int exitY) {
this.map = map;
this.exitX = exitX;
this.exitY = exitY;
}
public boolean hasWall(int x, int y) {
return map[x][y] == 1;
}
// getters and setters
}
```
3. 定义道具类
道具类包含道具的属性和方法,如道具名称、道具类型、影响体力值的方法等。
```
public abstract class Item {
private String name;
private ItemType type;
public Item(String name, ItemType type) {
this.name = name;
this.type = type;
}
public abstract void affect(Character character);
// getters and setters
}
public enum ItemType {
ADD_ENERGY,
REDUCE_ENERGY
}
public class AddEnergyItem extends Item {
private int energy;
public AddEnergyItem(String name, int energy) {
super(name, ItemType.ADD_ENERGY);
this.energy = energy;
}
@Override
public void affect(Character character) {
character.setEnergy(character.getEnergy() + energy);
}
}
public class ReduceEnergyItem extends Item {
private int energy;
public ReduceEnergyItem(String name, int energy) {
super(name, ItemType.REDUCE_ENERGY);
this.energy = energy;
}
@Override
public void affect(Character character) {
character.setEnergy(character.getEnergy() - energy);
}
}
```
4. 定义移动策略类
移动策略类包含不同的移动策略,如向上、向下、向左、向右等。
```
public interface MoveStrategy {
void move(Character character, int dx, int dy);
}
public class UpMoveStrategy implements MoveStrategy {
@Override
public void move(Character character, int dx, int dy) {
if (character.getY() - dy >= 0 && !maze.hasWall(character.getX(), character.getY() - dy)) {
character.setY(character.getY() - dy);
character.setEnergy(character.getEnergy() - 1);
}
}
}
public class DownMoveStrategy implements MoveStrategy {
@Override
public void move(Character character, int dx, int dy) {
if (character.getY() + dy < maze.getHeight() && !maze.hasWall(character.getX(), character.getY() + dy)) {
character.setY(character.getY() + dy);
character.setEnergy(character.getEnergy() - 1);
}
}
}
public class LeftMoveStrategy implements MoveStrategy {
@Override
public void move(Character character, int dx, int dy) {
if (character.getX() - dx >= 0 && !maze.hasWall(character.getX() - dx, character.getY())) {
character.setX(character.getX() - dx);
character.setEnergy(character.getEnergy() - 1);
}
}
}
public class RightMoveStrategy implements MoveStrategy {
@Override
public void move(Character character, int dx, int dy) {
if (character.getX() + dx < maze.getWidth() && !maze.hasWall(character.getX() + dx, character.getY())) {
character.setX(character.getX() + dx);
character.setEnergy(character.getEnergy() - 1);
}
}
}
```
5. 编写游戏逻辑
游戏逻辑包含游戏初始化、游戏运行、游戏结束等方法,通过策略模式实现不同的移动策略和道具策略。
```
public class Game {
private Character character;
private Maze maze;
private List<Item> items;
public Game(Character character, Maze maze, List<Item> items) {
this.character = character;
this.maze = maze;
this.items = items;
}
public void run() {
while (character.getEnergy() > 0) {
// 获取玩家输入的方向
int dx = 0;
int dy = 0;
MoveStrategy strategy = null;
switch (direction) {
case UP:
dy = 1;
strategy = new UpMoveStrategy();
break;
case DOWN:
dy = 1;
strategy = new DownMoveStrategy();
break;
case LEFT:
dx = 1;
strategy = new LeftMoveStrategy();
break;
case RIGHT:
dx = 1;
strategy = new RightMoveStrategy();
break;
}
character.move(dx, dy, strategy);
// 判断是否到达出口
if (character.getX() == maze.getExitX() && character.getY() == maze.getExitY()) {
System.out.println("恭喜你通关了!");
break;
}
// 检查是否有道具
for (Item item : items) {
if (item.getX() == character.getX() && item.getY() == character.getY()) {
item.affect(character);
items.remove(item);
break;
}
}
}
if (character.getEnergy() == 0) {
System.out.println("游戏失败!");
}
}
}
```
以上就是使用策略模式设计简单游戏的实现方法,通过将不同的行为封装成策略类,可以更加灵活地组合不同的行为,实现不同的游戏玩法。