2011-10-12 18 views
6

Điều này rất nhỏ, tôi biết, nhưng hãy nói rằng tôi có một lớp nhân vật và một khả năng lớp (chủ yếu là vì đó là những gì tôi đang làm việc). Lớp nhân vật có sáu khả năng (vì vậy điển hình D & D ...). cơ bản:Cách tạo một bài tập đơn giản hoặc thuộc tính mặc định cho một lớp trong C#

public class Character 
{ 
    public Character() 
    { 
     this.Str = new Ability("Strength", "Str"); 
     this.Dex = new Ability("Dexterity", "Dex"); 
     this.Con = new Ability("Constitution", "Con"); 
     this.Int = new Ability("Intelligence", "Int"); 
     this.Wis = new Ability("Wisdom", "Wis"); 
     this.Cha = new Ability("Charisma", "Cha"); 
    } 

    #region Abilities 
    public Ability Str { get; set; } 
    public Ability Dex { get; set; } 
    public Ability Con { get; set; } 
    public Ability Int { get; set; } 
    public Ability Wis { get; set; } 
    public Ability Cha { get; set; } 
    #endregion 
} 

public class Ability 
{ 
    public Ability() 
    { 
     Score = 10; 
    } 
    public Ability(string Name, string Abbr) 
     : this() 
    { 
     this.Name = Name; 
     this.Abbr = Abbr; 
    } 

    public string Name { get; set; } 
    public string Abbr { get; set; } 
    public int Score { get; set; } 
    public int Mod 
    { 
     get 
     { 
      return (Score - 10)/2; 
     } 
    } 
} 

Khi thực sự sử dụng những tính năng trong mã tương lai, tôi muốn có thể để mặc định chỉ số điểm, như vậy:

//Conan hits someone 
int damage = RollDice("2d6") + Conan.Str; 

//evil sorcerer attack drains strength 
Conan.Str = 0; 

thay vì:

//Conan hits someone 
int damage = RollDie("2d6") + Conan.Str.Score; 

//evil sorcerer attack drains strength 
Conan.Str.Score = 0; 

Bây giờ, trường hợp đầu tiên có thể được xử lý với một chuyển đổi tiềm ẩn:

public static implicit operator int(Ability a) 
{ 
    return a.Score; 
} 

Ai có thể giúp tôi ngược lại không? chuyển đổi ngầm như thế này:

public static implicit operator Ability(int a) 
{ 
    return new Ability(){ Score = a }; 
} 

sẽ thay thế toàn bộ thuộc tính thay vì chỉ số điểm của thuộc tính — không phải là kết quả mong muốn ...

+1

Như vậy * thực sự * điều bạn muốn làm? Là một khả năng hợp lệ mà không có tên và viết tắt? Bạn sẽ phải nhớ rằng bạn không bao giờ có thể lưu trữ những khả năng 'int to Ability' này bởi vì chúng thiếu dữ liệu hiển thị. –

+0

Đó là một điểm tốt, Ed. Câu trả lời ngắn gọn, không thực sự (đặc biệt là vì Tên và Abbr phạm lỗi nội địa hóa tại một số điểm). Ví dụ, vì tôi sẽ cần thêm các thuộc tính "Tiền thưởng", "CurScore" và "CurMod" vào Khả năng. –

+0

Nếu lớp nhân vật của bạn là tĩnh, điều đó sẽ dễ thực hiện. Rõ ràng, bạn phải có các ký tự khác nhau vì vậy nó không thể tĩnh .. – GianT971

Trả lời

3

Thứ nhất, giữ cho chuyển đổi ngầm của bạn:

public static implicit operator Ability(int a) 
{ 
    return new Ability(){ Score = a }; 
} 

Sau đó, trong lớp nhân vật của bạn: Thêm thuộc tính Ability cho str, và thay đổi getter và setter của thuộc tính Str như sau:

private Ability str; 
    public Ability Str 
    { 
     get 
     { 
      return this.str; 
     } 
     set 
     { 
      if (value.Name == "") 
      { 
       this.str.Score = value.Score; 
      } 
      else 
      { 
       this.str = value; 
      } 
     } 
    } 

Có bạn đi :)

Bạn cũng có thể sử dụng:

   if(string.IsNullOrWhiteSpace(value.Name)) 

thay vì

   if (value.Name == "") 

Nếu bạn đang soạn thảo để NET 4.0 phiên bản

EDIT : Tôi đã cung cấp cho bạn giải pháp chính xác những gì bạn muốn, nhưng những gì ja72 đã viết cũng là một gợi ý tốt với các toán tử + và -; bạn có thể thêm giải pháp của mình vào mỏ (hoặc của tôi cho anh ta, bất cứ điều gì), nó sẽ hoạt động tốt. Sau đó bạn sẽ có thể viết:

 Character Jax = new Character(); // Str.Score = 10 
     Character Conan = new Character(); // Str.Score = 10 

     Jax.Str = 2000; // Str.Score = 2000; 
     Conan.Str += 150; // Str.Score = 160 
+0

Điều này thật tuyệt vời. Tôi không thể tin rằng tôi không nghĩ về nó, bản thân mình. Nhưng sau đó, đó là dấu hiệu của một câu trả lời hay, phải không? :) –

+1

Cảm ơn :-) Tôi đang khám phá bản thân mình để giúp mọi người giải quyết các vấn đề lập trình, có lẽ đó là những gì tôi sẽ làm trong công việc tiếp theo của tôi, ai biết ^^ – GianT971

4

Điều tốt nhất bạn có thể làm là tăng điểm số bằng cách thêm các phương pháp để Ability.

public static Ability operator + (Ability lhs, int score) 
    { 
     lhs.Score += score; 
     return lhs; 
    } 

    public static Ability operator - (Ability lhs, int score) 
    { 
     lhs.Score -= score; 
     return lhs; 
    } 

    public static implicit operator int(Ability rhs) 
    { 
     return rhs.Score; 
    } 

và sử dụng chúng thích:

static void Main(string[] args) 
    { 
     Character evil = new Character(); //Str.Sccore=10 

     evil.Str += 10; //cast spell for Str.Sccore=20 

     evil.Str -= evil.Str; //death with Str.Sccore=0 
    } 
+0

+1, đây là cách tôi sẽ đi về nó. –

+0

Bạn không thực sự trả lời câu hỏi mà anh ấy hỏi, nhưng đó là một lời khuyên rất hay. Tôi nghĩ rằng anh ta nên sử dụng cả hai giải pháp của chúng tôi trong một, vì anh ta có thể muốn thiết lập khả năng sức mạnh trong một số trường hợp, thay vì thêm hoặc loại bỏ các điểm khả năng. Tôi đã thử nghiệm nó và nó hoạt động tốt với cả hai giải pháp. – GianT971

+0

Điều này cực kỳ hữu ích và tôi rất biết ơn câu trả lời. Gian's làm chính xác những gì tôi cần, vì vậy tôi sẽ chấp nhận, nhưng đó là một sự lựa chọn khó khăn cho việc này. Tôi rất vui khi nhận được phiếu bầu tương đương. Nó xứng đáng. –

1

lựa chọn khác là để thay thế các thuộc tính với các đại biểu như thế này

public class Character 
{ 
    public Character() 
    { 
     ... 
    } 

    #region Abilities 
    ... 
    #endregion 

    public Func<int> Strength 
    { 
     get { return() => Str.Score; } 
     set { Str.Score = value(); } 
    } 

} 

và sử dụng nó như thế này

 Character evil = new Character(); //Str.Sccore=10 
     // fist spell hits 
     evil.Strength =() => 5; //set Str.Score=5 
     // second spell hits 
     evil.Strength =() => 0; //set Str.Score=5 

     if (evil.Strength() == 0) 
     { 
      // dead 
     } 
0

lẽ bạn có thể làm Ability trừu tượng và sau đó lấy các lớp mới từ Ability cho mỗi người trong số các tiểu lớp: Strength ...

Các constructor cho lớp Strength sẽ giống như thế này:

public Strength() : base ("Strength", "Str") { ...} 

Bây giờ các tính năng tắt a Character sẽ được nhập mạnh mẽ và chuyển đổi tiềm ẩn có thể biến một giá trị như 5 thành đối tượng Strength với giá trị là 5. Điều này cũng sẽ ngăn bạn vô tình lưu trữ số Dexterity trong thuộc tính Strength.

[Giả sử tên và chữ viết tắt thực tế đã được sửa cho tất cả các đối tượng thuộc loại đó.]

Các vấn đề liên quan