1、問題描述
某紙牌游戲軟體中,人物角色具有人門級(Primary)﹑熟練級(Secondary),高手紹(Professional)和骨灰級(Final)四種等級,角色的等級與其積分相對應,游戲勝利將增加和分,失敗則扣除積分,人門級具有最基本的游戲功能play(),熟練級增加丁游戲勝利積分加倍功能doubleScore),高手級在熟練級基礎上再增加換牌功能changeCards(),骨灰級在高手級基礎上再增加偷看他人的牌功能peekCards(),現使用狀態模式來設計該系統,繪制類圖并編程實作,
2、所用模式結構視圖

3、本實體類圖

4、實體實作代碼

4.1、環境類
package com.作業三.問題4;
public class Wx17_Character {
private Wx17_CharacterLevel level;
private String name;
public Wx17_Character(String name){
this.name = name;
this.level = new Wx17_Primary(this);
System.out.println(this.name+"游戲角色創建成功");
System.out.println("當前賬號游戲積分為:"+level.getPoint()+"積分, 游戲等級為:"+level.levelName+",");
System.out.println("------------------------------------------");
}
public void setLevel(Wx17_CharacterLevel level){
this.level = level;
}
public Wx17_CharacterLevel getLevel(){
return level;
}
public String getName(){
return name;
}
public void play(){
level.play();
}
public void doubleScore(){
level.doubleScore();
}
public void changeCards(){
level.changeCards();
}
public void peekCards(){
level.peekCards();
}
}
4.2、抽象狀態類
package com.作業三.問題4;
import java.util.Random;
public abstract class Wx17_CharacterLevel {
// 等級的劃分
// 入門級(Primary) 積分<=200 功能:play()
// 熟練級(Secondary) 積分200——500 功能:play()、doubleScore()
// 高手級(Professional) 積分500——1000 功能:play()、doubleScore()、changeCards()
// 骨灰級(Final) 積分>1000 功能:play()、doubleScore()、changeCards()、peekCards()
protected Wx17_Character character;
protected int point;
protected String levelName;
protected int probability = 0; //游戲勝利的概率的提升值
protected int score = 10;
public abstract void checkLevel();
//獲取1-100之間的亂數
public int getRandom(){
return new Random().nextInt(100)+1;
}
public void play(){
if((getRandom()+probability)>50){ //初始游戲勝利的概率為50%
probability = 0;
point += score;
checkLevel();
System.out.println(character.getName()+"獲得本次游戲勝利,積分+"+ score
+",\n當前賬號游戲積分為:"+getPoint()+"積分, 游戲等級為:"+character.getLevel().levelName+",");
}else{
score = 10;
probability = 0;
point -= score;
checkLevel();
System.out.println(character.getName()+"此局游戲失敗,積分-"+ score
+",\n當前賬號游戲積分為:"+getPoint()+"積分, 游戲等級為:"+character.getLevel().levelName+",");
}
System.out.println("----------------------------------------------------------");
}
public void doubleScore(){
score *= 2;
System.out.println(character.getName()+"使用積分翻倍功能,在本局中游戲勝利將獲得雙倍積分獎勵,");
}
public void changeCards(){
probability += 10;
System.out.println(character.getName()+"使用換牌功能,本局游戲勝利的概率提升15%");
}
public void peekCards(){
probability += 10;
System.out.println(character.getName()+"使用偷看牌牌功能,本局游戲勝利的概率提升20%");
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
this.point = point;
System.out.println("設定當前游戲賬號積分為:"+point);
checkLevel();
System.out.println("當前賬號游戲積分為:"+getPoint()+"積分, 游戲等級為:"+character.getLevel().levelName+",");
}
public String getLevelName() {
return levelName;
}
public void setLevelName(String levelName) {
this.levelName = levelName;
}
}
4.3、具體狀態類
入門級
package com.作業三.問題4;
public class Wx17_Primary extends Wx17_CharacterLevel{
public Wx17_Primary(Wx17_Character character){
this.point = 0;
this.character = character;
this.levelName = "入門級";
}
public Wx17_Primary(Wx17_CharacterLevel level){
this.character = level.character;
this.point = level.getPoint();
this.levelName = "入門級";
}
@Override
public void doubleScore(){
System.out.println("對不起,你等級不夠,現在不可使用積分翻倍功能");
}
@Override
public void changeCards(){
System.out.println("對不起,你等級不夠,現在不可使用換牌功能");
}
@Override
public void peekCards() {
System.out.println("對不起,你等級不夠,現在不可使用偷看牌功能");
}
@Override
public void checkLevel() {
if(point > 1000){
character.setLevel(new Wx17_Final(this));
}else if(point > 500){
character.setLevel(new Wx17_Professional(this));
}else if(point > 200){
character.setLevel(new Wx17_Secondary(this));
}
}
}
熟練級
package com.作業三.問題4;
public class Wx17_Secondary extends Wx17_CharacterLevel {
public Wx17_Secondary(Wx17_CharacterLevel level){
this.character = level.character;
this.point = level.getPoint();
this.levelName = "熟練級";
}
@Override
public void changeCards(){
System.out.println("對不起,你等級不夠,現在不可使用換牌功能");
}
@Override
public void peekCards() {
System.out.println("對不起,你等級不夠,現在不可使用偷看牌功能");
}
@Override
public void checkLevel() {
if(point > 1000){
character.setLevel(new Wx17_Final(this));
}else if(point > 500){
character.setLevel(new Wx17_Professional(this));
}else if(point <= 200){
character.setLevel(new Wx17_Primary(this));
}
}
}
高手級
package com.作業三.問題4;
public class Wx17_Professional extends Wx17_CharacterLevel {
public Wx17_Professional(Wx17_CharacterLevel level){
this.character = level.character;
this.point = level.getPoint();
this.levelName = "高手級";
}
@Override
public void peekCards() {
System.out.println("對不起,你等級不夠,現在不可使用偷看牌功能");
}
@Override
public void checkLevel() {
if(point > 1000){
character.setLevel(new Wx17_Final(this));
}else if(point <= 500 && point > 200){
character.setLevel(new Wx17_Secondary(this));
}else if(point <= 200){
character.setLevel(new Wx17_Primary(this));
}
}
}
骨灰級
package com.作業三.問題4;
public class Wx17_Final extends Wx17_CharacterLevel {
public Wx17_Final(Wx17_CharacterLevel level){
this.character = level.character;
this.point = level.getPoint();
this.levelName = "骨灰級";
}
@Override
public void checkLevel() {
if(point > 500 && point <= 1000){
character.setLevel(new Wx17_Professional(this));
}else if(point > 200 && point <= 500){
character.setLevel(new Wx17_Secondary(this));
}else if(point <= 200){
character.setLevel(new Wx17_Primary(this));
}
}
}
4.4、測驗類
package com.作業三.問題4;
public class Client {
public static void main(String[] args) {
Wx17_Character character = new Wx17_Character("張三");
character.doubleScore();
character.changeCards();
character.peekCards();
character.play();
character.getLevel().setPoint(250);
character.doubleScore();
character.changeCards();
character.peekCards();
character.play();
character.getLevel().setPoint(666);
character.doubleScore();
character.changeCards();
character.peekCards();
character.play();
character.getLevel().setPoint(1024);
character.doubleScore();
character.changeCards();
character.peekCards();
character.play();
}
}
5、運行結果

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/386733.html
標籤:其他
上一篇:練習-聊天機器人
