设计模式-状态模式练习
题目:某纸牌游戏软件中,人物角色具有人门级(Primary)、熟练级(Secondary),高手绍(Professional)和骨灰级(Final)四种等级,角色的等级与其积分相对应,游戏胜利将增加和分,失败则扣除积分。人门级具有最基本的游戏功能 play(),熟练级增加丁游戏胜利积分加倍功能doubleScore),高手级在熟练级基础上再增加换牌功能 changeCards(),骨灰级在高手级基
·
题目
某纸牌游戏软件中,人物角色具有人门级(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));
}
}
运行结果

更多推荐



所有评论(0)