2011-01-07 43 views
7

Xin chào các bạn. Tôi đã hy vọng một ai đó sẽ có thể giúp tôi tìm ra cách để tăng số đếm. Tôi có một trò chơi sử dụng điều tra để có được điểm để giết kẻ thù, tôi muốn giá trị của kẻ thù tăng lên 10 mỗi khi một trong những kẻ thù bị giết. Dưới đây là đoạn code tôi có cho việc đếm:Cách tốt nhất để tăng một điều tra là gì?

public enum gamescore// Enumeration to hold the score values of the enemies 

    { 

    Martian = 10, 

    Vesuvian = 20, 

    Mercurian = 30, 

    Meteor = 50, 

    MotherShip = 100, 

    Destroyer = 200 

    } 

và phương pháp để có được điểm số gọi từ lớp khác khi kẻ thù chết:

public int GetScore()// The method that utilieses the enumeration to get the score for the enemy killed 
    { 

     if (this is Martian) 
     { 
      return (int)gamescore.Martian; 
     } 
     else if (this is Vesuvian) 
     { 
      return (int)gamescore.Vesuvian; 
     } 
     else if (this is Mercurian) 
     { 
      return (int)gamescore.Mercurian; 
     } 
     else if (this is Destroyer) 
     { 
      return (int)gamescore.Destroyer; 
     } 
     else if (this is Meteor) 
     { 
      return (int)gamescore.Meteor; 
     } 
     else if (this is Mothership) 
     { 
      return (int)gamescore.MotherShip; 
     } 
     return 0; 
    } 

Bất kỳ lời đề nghị? Tôi chỉ có thể nghĩ ra những cách phức tạp để làm điều này, rằng tôi thậm chí không nghĩ là làm việc. Ngoài ra tôi đã tự hỏi, tôi có một nhãn điểm cao được cập nhật nếu nó ít hơn điểm số, vì vậy điểm cao sẽ trở thành điểm số, nhưng khi ứng dụng khởi động lại, nếu trò chơi được hoàn thành hoặc nếu người chơi hết thời gian, điểm cao đặt lại về không, có cách nào để giữ giá trị điểm cao trong đó vì vậy điểm số cao nhất luôn luôn ở đó?

Tôi đánh giá cao sự giúp đỡ của bạn với các câu hỏi của tôi, tôi thực sự làm.

Cảm ơn!

+1

Bạn có hai câu hỏi ở đây, hãy tách chúng thành hai câu hỏi thực tế. – sgriffinusa

+2

Về # 1: Đa hình. Giai đoạn. – delnan

+1

Ý của bạn là gì: "Tôi muốn giá trị của kẻ địch tăng thêm 10 lần mỗi khi một kẻ địch bị giết"? –

Trả lời

6

Thiết kế này không hướng đối tượng. Một cách tiếp cận tốt hơn là có giao diện IEnemy. Giao diện đó sẽ yêu cầu một phương thức GetScore (có lẽ là trong số các phương thức khác). Phương pháp đó sau đó có thể trả về giá trị của kẻ thù. Sau đó, bạn có một lớp riêng biệt cho mỗi kẻ thù của bạn mà thực hiện giao diện IEnemy.

public interface IEnemy{ 
    int GetScore(); 
} 

public class Martian : IEnemy{ 
    int GetScore(){ return 10; } 
} 

public class Vesuvian : IEnemy{ 
    int GetScore(){ return 20; } 
} 
... 

Điều này có nhiều lợi ích hơn khi sử dụng điều tra, ví dụ: bạn có thể có kẻ thù có cùng điểm số nhưng khác với các thuộc tính khác.

+0

Điều đó giống như một ý tưởng tuyệt vời, cảm ơn bạn tôi sẽ thử nó và xem tôi có thể làm cho nó hoạt động được không. Cảm ơn! – deucalion0

6

Trong trường hợp này tôi sẽ không lưu trữ nó như là một enum - nó âm thanh giống như đánh dấu phạm vi hơn giá trị kín đáo. Tôi thể có một số hằng số và một phương pháp để kiểm tra

if(score>100) return "awesome"; 
if(score>40) return "meh"; 

Etc

Tuy nhiên, để trả lời các câu hỏi về incrementing một enum: bạn có thể bỏ nó vào cơ sở loại (thường là int):

myEnumValue = (MyEnum)((int)myEnumValue + 10); 
+0

Tôi không phải là lập trình viên giỏi nhất, tôi là người mới bắt đầu, tôi sử dụng điều tra để giữ số điểm như cách duy nhất tôi biết, như là bà mẹ và tàu khu trục là kẻ thù của ông chủ Tôi muốn lượng calo của họ tăng thêm mười điểm. chúng. – deucalion0

+0

@ user567371 - một số 'const int' có thể đủ cho điều đó ... –

2

Tại sao sử dụng điều tra? Tại sao không tạo giao diện IScorable, nó chỉ có thuộc tính GetScore và thực hiện nó trong các lớp "Kẻ thù" của bạn. Sau đó, bạn có thể kiểm tra nếu kẻ thù của bạn là IScorable và nếu có, đọc tài sản này. Hoặc nếu tất cả các lớp kẻ thù của bạn xuất phát từ một, thì hãy đặt nó vào đó.

Đồng thời Cách bạn sử dụng Đếm là sai. Các bảng liệt kê dành cho các loại quần áo hoàn toàn khác nhau.

+0

Xin lỗi, tôi không có ý định tạo hai câu hỏi cùng một lúc, tôi không tự do rằng cả hai đều là những câu hỏi lớn nếu tôi biết cách tách chúng ra Tôi xin lỗi! – deucalion0

+0

Bạn đưa bình luận của bạn vào hộp văn bản sai .. – Euphoric

+0

Xin lỗi tôi đã nhầm lẫn với mọi thứ xuất hiện cùng một lúc trên trang. Nếu tôi biết làm thế nào để tạo ra nó với một giao diện tôi sẽ, tôi sẽ xem xét nó! – deucalion0

2

Tôi sẽ tạo một lớp Tóm tắt được gọi là Kẻ thù, với thuộc tính được gọi là KillScore (hoặc bất kỳ thứ gì bạn thích).Lấy mỗi loại kẻ thù của bạn từ đó:

public abstract class Enemy 
{ 
    virtual public int KillScore 
    { 
     get { return 0; } 
    } 
} 

public class Martian : Enemy 
{ 
    public override int KillScore 
    { 
     get { return 10; } 
    } 
} 

// All the other classes here 

public class Destoyer : Enemy 
{ 
    public override int KillScore 
    { 
     get { return 200; } 
    } 
} 

Bạn chỉ cần nhanh chóng lớp học cá nhân của bạn, ví dụ:

Martian martian = new Martian(); 
    Destoyer destroyer = new Destoyer(); 
    int score = GetScore(martian); 
    score = GetScore(destroyer); 

Sau đó, chức năng GetScore của bạn trở nên rất dễ dàng:

public int GetScore(Enemy enemy) 
{ 
    // Debug Statement to show you what this enemy actually is 
    Console.WriteLine("{0} {1}", enemy.GetType(), enemy.KillScore); 
    return enemy.KillScore; 
} 

(Một giao diện cũng sẽ hoạt động, nhưng điều này cho phép bạn kiểm soát một số giá trị mặc định, cho phép bạn thực hiện một số chức năng phổ biến trong lớp cơ sở có thể hoặc không thể ghi đè trong các lớp con, v.v. .).

+0

Cảm ơn rất nhiều vì sự giúp đỡ của bạn với điều này, bạn đã cho tôi một đầu mối tuyệt vời để giải quyết vấn đề này, tôi đã có được sự kế thừa từ lớp kẻ thù Tóm tắt, tôi sẽ thử ý tưởng của bạn với cốt lõi. Cảm ơn bạn! – deucalion0

+1

Haha, chúng rất giống nhau. Tư tưởng lớn gặp nhau. Mặc dù user567371 có lẽ nên chấp nhận của bạn khi bạn thêm ghi chú về cách sử dụng một giao diện Vs một lớp trừu tượng giúp giải thích nó. –

+0

@Corith - tâm trí tuyệt vời nghĩ như nhau, và do đó chúng tôi ... –

2

Có lẽ đặt cược tốt nhất của bạn là sử dụng Đa hình. Vì vậy, bạn sẽ có một lớp cơ sở được gọi là kẻ thù và nó sẽ là trừu tượng.

public abstract class Enemy 
{ 
    public abstract int GetScore(); 
} 

Sau đó, bạn sẽ kế thừa từ đó cho mỗi lần.

public class Martian : Enemy 
{ 
    public int GetScore() { return 10; } 
} 

public class Vesuvian : Enemy 
{ 
    public int GetScore() { return 20; } 
} 

Sau đó, trong phương pháp chính của bạn, bạn chỉ cần có để tạo ra đúng loại của kẻ thù:

Enemy blah = new Martian(); 
Enemy blah1 = new Vesuvian(); 

int x = blah.GetScore(); // This is 10. 
int y = blah1.GetScore(); // This is 20. 
+0

+1 để trả lời gần như chính xác cùng một cách cùng một lúc với tôi ... :) –

+0

HI, điều đó có ý nghĩa, nhưng làm thế nào có thể có được tàu khu trục và bà mẹ để tăng 10 bằng cách sử dụng ý tưởng của bạn? Cảm ơn bạn! – deucalion0

+0

Họ sẽ là những lớp học mới. Tôi chỉ không bao gồm tất cả các lớp học cho ngắn gọn. Và thay vì trở về 10, bạn muốn trả lại enum của bạn được đúc như một int. –

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