题目:
某纸牌游戏软件中,人物角色具有人门级(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 Main {
public static void main(String[] args) {
Context context = new Context();
context.play(false);
context.play(true);
context.play(true);
context.play(false);
context.doubleScore();
context.play(true);
context.play(true);
context.doubleScore();
context.peekCards();
context.play(false);
}
}
public class Context {
public State state;
public String name;
public State getState() {
return state;
}
public void setState(State state) {
this.state = state;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Context(){
this.state = new PrimaryState(0, this);
}
public void play(Boolean isWin){
state.play(isWin);
}
public void doubleScore(){
state.doubleScore();
}
public void peekCards(){
state.peekCards();
}
}
public interface State {
void play(Boolean isWin);
void checkState();
void doubleScore();
void peekCards();
}
public class PrimaryState implements State{
public int score;
public Context context;
public PrimaryState(int score, Context context){
this.score = score;
this.context = context;
}
@Override
public void play(Boolean isWin) {
if (isWin){
score += 10;
}else {
score -= 10;
if (score < 0){
score = 0;
}
}
System.out.println("当前状态是primary, 积分为 : " + score);
checkState();
}
@Override
public void checkState() {
if (score > 20){
System.out.println("升级成为Secondary状态啦");
context.setState(new SecondaryState(score, context));
}
}
@Override
public void doubleScore() {
System.out.println("primary阶段没有这个功能");
}
@Override
public void peekCards() {
System.out.println("primary阶段没有这个功能");
}
}
public class SecondaryState implements State{
public int score;
public Context context;
public SecondaryState(int score, Context context){
this.score = score;
this.context = context;
}
@Override
public void play(Boolean isWin) {
if (isWin){
score += 10;
}else {
score -= 10;
}
System.out.println("当前状态是Secondary, 积分为 : " + score);
checkState();
}
@Override
public void checkState() {
if (score < 30){
System.out.println("抱歉要降成Primary状态~");
context.setState(new PrimaryState(score, context));
}
if (score > 40){
System.out.println("升级成为Professional状态啦");
context.setState(new ProfessionalState(score, context));
}
}
@Override
public void doubleScore() {
score += 20;
System.out.println("使用doubleScore功能,积分增加20");
System.out.println("积分变为 : " + score);
checkState();
}
@Override
public void peekCards() {
System.out.println("抱歉");
}
}
import javax.naming.ldap.Control;
public class ProfessionalState implements State{
public int score;
public Context context;
public ProfessionalState(int score, Context context) {
this.score = score;
this.context = context;
}
@Override
public void play(Boolean isWin) {
if (isWin){
score += 10;
}else {
score -= 10;
}
System.out.println("当前状态是Secondary, 积分为 : " + score);
checkState();
}
@Override
public void checkState() {
if (score < 60){
System.out.println("抱歉要降成Secondary状态~");
context.setState(new SecondaryState(score, context));
}
}
@Override
public void doubleScore() {
score += 20;
System.out.println("使用doubleScore功能,积分增加20");
System.out.println("积分变为 : " + score);
checkState();
}
@Override
public void peekCards() {
System.out.println("偷看了别人的牌,这功能真不要脸");
}
}
结果
当前状态是primary, 积分为 : 0
当前状态是primary, 积分为 : 10
当前状态是primary, 积分为 : 20
当前状态是primary, 积分为 : 10
primary阶段没有这个功能
当前状态是primary, 积分为 : 20
当前状态是primary, 积分为 : 30
升级成为Secondary状态啦
使用doubleScore功能,积分增加20
积分变为 : 50
升级成为Professional状态啦
偷看了别人的牌,这功能真不要脸
当前状态是Secondary, 积分为 : 40
抱歉要降成Secondary状态~