题目

某纸牌游戏软件中,人物角色具有人门级(Primary)、熟练级(Secondary),高手绍(Professional)和骨灰级(Final)四种等级,角色的等级与其积分相对应,游戏胜利将增加和分,失败则扣除积分。人门级具有最基本的游戏功能 play(),熟练级增加丁游戏胜利积分加倍功能doubleScore),高手级在熟练级基础上再增加换牌功能 changeCards(),骨灰级在高手级基础上再增加偷看他人的牌功能 peekCards()。现使用状态模式来设计该系统,绘制类图并编程实现。

类图

在这里插入图片描述

规则

新手Primary: point < 30, 熟练Secondary : 30=< point < 50, 高手professionary: 50=< point < 60, 骨灰final: point > =60
其中积分翻倍,就只是加20分而已,换牌、看牌就只输出提示信息

代码

public class Pro {
	public static void main(String[] args) {
		Player player = new Player("rick");
		player.play_win();
		player.play_win();
		player.play_win();
		player.play_win();
		player.doubleScore();
		player.changeCards();
		player.play_win();
		player.peekCards();
		player.play_lose();
		player.play_lose();
		player.play_lose();
	}
}

class Player {
	private String name;
	private State state;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public State getState() {
		return state;
	}

	public void setState(State state) {
		this.state = state;
	}

	public Player(String name) {
		this.name = name;
		this.state = new PrimaryState(this);
	}

	public void play_win() {
		state.play_win();
	}

	public void play_lose() {
		state.play_lose();
	}

	public void doubleScore() {
		state.doubleScore();
	}

	public void changeCards() {
		state.changeCards();
	}

	public void peekCards() {
		state.peekCards();
	}
}

abstract class State {
	protected String rankName;
	protected int point;
	protected Player player;

	public void play_lose() {
		point -= 10;
		System.out.println(rankName + "玩家" + player.getName() + "输了一局,积分-10,当前积分:" + point);
		checkState(point);
	}

	public void play_win() {
		point += 10;
		System.out.println(rankName + "玩家" + player.getName() + "赢了一局,积分+10,当前积分:" + point);
		checkState(point);
	}

	public void doubleScore() {
		System.out.println(rankName + "未解锁积分加倍");
	}

	public void changeCards() {
		System.out.println(rankName + "未解锁换牌");
	}

	public void peekCards() {
		System.out.println(rankName + "未解锁偷看牌");
	}

	public String getRankName() {
		return rankName;
	}

	public void setRankName(String rankName) {
		this.rankName = rankName;
	}

	public abstract void checkState(int point);
}

class PrimaryState extends State {
	public PrimaryState(Player player) {
		// 初始状态
		this.rankName = "入门级";
		this.player = player;
		point = 0;
	}

	public PrimaryState(State state) {
		this.rankName = "入门级";
		this.player = state.player;
		point = state.point;
	}

	@Override
	public void checkState(int point) {
		if (point >= 30) {
			player.setState(new SecondaryState(this));
		}
	}

}

class SecondaryState extends State {
	public SecondaryState(State primaryState) {
		this.player = primaryState.player;
		this.point = primaryState.point;
		this.rankName = "熟练级";
	}

	public void doubleScore() {
		System.out.println(rankName + "玩家" + player.getName() + "使用积分翻倍+20");
		point += 20;
		checkState(point);
	}

	@Override
	public void checkState(int point) {
		if (point < 30)
			player.setState(new PrimaryState(this)); // state下落
		else if (point >= 50)
			player.setState(new ProfessionalState(this));
	}
}

class ProfessionalState extends State {

	public ProfessionalState(State secondaryState) {
		this.rankName = "高手级";
		this.player = secondaryState.player;
		this.point = secondaryState.point;
	}

	@Override
	public void doubleScore() {
		System.out.println(rankName + "玩家" + player.getName() + "使用积分翻倍+20");
		point += 20;
		checkState(point);
	}

	@Override
	public void changeCards() {
		System.out.println(rankName + "玩家" + player.getName() + "换牌");
	}

	@Override
	public void checkState(int point) {
		if (point >= 60) {
			player.setState(new FinalState(this));
		} else if (point < 50) {
			player.setState(new SecondaryState(this));
		}
	}
}

class FinalState extends State {
	public FinalState(State professionalState) {
		this.rankName = "骨灰级";
		this.player = professionalState.player;
		this.point = professionalState.point;
	}

	@Override
	public void doubleScore() {
		System.out.println(rankName + "玩家" + player.getName() + "使用积分翻倍+20");
		point += 20;
		checkState(point);
	}

	@Override
	public void changeCards() {
		System.out.println(rankName + "玩家" + player.getName() + "换牌");
	}

	@Override
	public void peekCards() {
		System.out.println(rankName + "玩家" + player.getName() + "偷看牌");
	}

	@Override
	public void checkState(int point) {
		if (point < 60)
			player.setState(new ProfessionalState(this));
	}
}

运行结果

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐