2010-06-15 3 views
1

Каков наилучший способ реализации системы ранга:Как реализовать структуру ранга

здесь код я буду использовать

public class MyRank 
{ 
    private int LevelOneMaxPoints = 100; 
    private int LevelTwoMinPoints = 200; 
    private int LevelTwoMaxPoints = 299; 
    private int LevelThreeMinPoints = 300; 
    private int LevelThreeMaxPoints = 399; 
    private int LevelFourMinPoints = 400; 
    private int LevelFourMaxPoints = 599; 
    private int LevelFourPlusMinPoints = 600; 
    private int LevelFourPlusMaxPoints = 999; 
    private int LevelFiveMinPoints = 1000; 
    private int LevelFiveMaxPoints = 1299; 
    private int LevelSixMinPoints = 1300; 
    private int LevelSixMaxPoints = 2699; 
    private int LevelSevenMinPoints = 2700; 
    private int LevelSevenMaxPoints = 3999; 
    private int LevelEightMinPoints = 4000; 
    private int LevelEightMaxPoints = 5499; 
    private int LevelEightPlusMinPoints = 5500; 
    private int LevelEightPlusMaxPoints = 7499; 
    private int LevelNineMinPoints = 7500; 
    private int LevelNineMaxPoints = 9999; 
    private int LevelTenMinPoints = 10000; 

    private string LevelOneName = "Private"; 
    private string LevelTwoName = "PV2"; 
    private string LevelThreeName = "Private Fist Class"; 
    private string LevelFourName = "Specialist"; 
    private string LevelFourPlusName = "Corporal"; 
    private string LevelFiveName = "Sergeant"; 
    //private string LevelSixName = "Staff Sergeant"; 
    private string LevelSevenName = "Sergeant First Class"; 
    private string LevelEightName = "Master Sergeant"; 
    private string LevelEightPlusName = "First Sergeant"; 
    private string LevelNineName = "Sergeant Major"; 
    //private string LevelTenName = "Sergeant Major of the Answers"; 
    private int points = 0; 

    public string RankName { get; private set; } 
    public MyRank(int points) 
    { 
     this.points = points; 
     RankName = GetRankName(); 
    } 

    private string GetRankName() 
    { 
     if (points >= Int32.MinValue && points <= LevelOneMaxPoints) 
      return LevelOneName; 
     else if (points >= LevelTwoMinPoints && points <= LevelTwoMaxPoints) 
      return LevelTwoName; 
     else if (points >= LevelThreeMinPoints && points <= LevelThreeMaxPoints) 
      return LevelThreeName; 
     else if (points >= LevelFourMinPoints && points <= LevelFourMaxPoints) 
      return LevelFourName; 
     else if (points >= LevelFourPlusMinPoints && points <= LevelFourPlusMaxPoints) 
      return LevelFourPlusName; 
     else if (points >= LevelFiveMinPoints && points <= LevelFiveMaxPoints) 
      return LevelFiveName; 
     else if (points >= LevelSixMinPoints && points <= LevelSixMaxPoints) 
      return LevelFiveName; 
     else if (points >= LevelSevenMinPoints && points <= LevelSevenMaxPoints) 
      return LevelSevenName; 
     else if (points >= LevelEightMinPoints && points <= LevelEightMaxPoints) 
      return LevelEightName; 
     else if (points >= LevelEightPlusMinPoints && points <= LevelEightPlusMaxPoints) 
      return LevelEightPlusName; 
     else if (points >= LevelNineMinPoints && points <= LevelNineMaxPoints) 
      return LevelNineName; 
     else if (points >= LevelNineMinPoints && points <= LevelNineMaxPoints) 
      return LevelNineName; 
     else if (points >= LevelTenMinPoints) 
      return LevelFourName; 
     else 
      return "No Rank"; 
    } 
} 

Как вы думаете, это самый эффективный способ сделать это?

ответ

3

Я бы начал с преобразования ваших уровней в одно перечисление. Значение каждого Enum может быть минимальным значением, нет необходимости отслеживать максимальные значения, как вы увидите ниже.

public enum Level 
{ 
    [Description("Private")] 
    One = 0, 
    [Description("PV2")] 
    Two = 200, 
    [Description("Private Fist Class")] 
    Three = 300, 
    ... 
    ... 
    [Description("Sergeant Major of the Answers")] 
    Ten = 10000 
} 

Тогда вы можете написать это, чтобы получить имя:

string GetRankName(Level level) 
{ 
    FieldInfo fieldInfo = level.GetType().GetField(level.ToString()); 
    DescriptionAttribute[] attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); 
    return (attributes.Length > 0) ? attributes[0].Description : level.ToString();   
} 

и это получить уровень

Level GetLevel(int points) 
{ 
    Level level = Level.One; 
    foreach(int i in Enum.GetValues(typeof(Level))) 
    { 
     if (points < i) break; 
     level = (Level)i; 
    } 
    return level; 
} 

бы тогда ваши члены объекта:

public Level Level { get; set; } 
public string RankName { get; set; } 
public MyRank(int points) 
{ 
    Level = GetLevel(points); 
    RankName = GetRankName(Level); 
} 
+0

Я получаю синтаксическую ошибку - тип или пространство имен «описание» не удалось найти. Я что-то делаю с атрибутами? – Luke101

+0

OK..Я выяснил это – Luke101

+0

Отлично! Является ли это решение более управляемым? – hunter

1

Вы можете использовать массив:

private int[] levelPoints = new int[]{ 
    99, 299, 399, 599, 999, 1299, 2699, 3999, 5499, 7499, 9999 
}; 

private string[] levelNames = new string[]{ 
    "Private", "PV2", "Private First Class", "Specialist", "Corporal", 
    "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", 
    "First Sergeant", "Sergeant Major", "Sergeant Major of the Answers" 
}; 

private int GetMinPointsOfLevel(int level) { 
    // I think, the levels starts from 1 

    if (level <= 1) { return 0; } 
    else if (level >= levelPoints.Lengtht) { return levelPoints.Last(); } 
    else { return levelPoints[level - 2] + 1; } 
} 
private int GetMaxPointsOfLevel(int level) { 
    if (level <= 1) { return levelPoints[level - 1]; } 
    else if (level >= levelPoints) { return int.MaxValue; } 
    else { return levelPoints[level - 1]; } 
} 
private inte GetNameOfLevel(int level) { 
    if (level < 1) { return levelNames[0]; } 
    else if (level >= levelPoints - 1) { return levelNames.Last(); } 
    else { return levelNames[level - 1]; } 
} 
Смежные вопросы