Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 30 kết quả

Đề tài: Tortoise and Hare tournament | Bài toán rùa và thỏ trong lập trình C#

  1. #1
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Mặc định Tortoise and Hare tournament | Bài toán rùa và thỏ trong lập trình C#

    ĐỀ BÀI

    Ở bài tập này chúng ta sẽ viết 1 chương trình mô phỏng lại quá trình chạy đua của Rùa và Thỏ với những quy luật sau đâu : Cả 2 con vật sẽ bắt đầu từ điểm xuất phát tại ô 1 trong 70 ô. Mỗi ô sẽ biểu diễn cho 1 vị trí trong suốt chặng đua này. Vị trí ô thứ 70 sẽ là đích đến. Con nào tới được ô 70 trước sẽ là winner hì hì. Nhưng sẽ có những chướng ngại giữa đường đi và làm tăng thêm hấp dẫn cho cuộc đua, chúng ta sẽ có những quy luật sau theo phần trăm của thời gian và những bước di chuyển. Chúng ta sẽ điều khiển 2 chú rùa và thỏ theo quy luật ở trong các box dưới đây.

    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		ru_tho.jpg
Lần xem:	12
Size:		32.7 KB
ID:		5344

    Chương trình của chúng ta sẽ có 2 biến để theo vết vị trí của rùa và thỏ. Chúng ta sẽ cho random 1 số từ nguyên x ( 0 < x < 10 ).
    Đối với rùa thì : nếu 1 <= x <= 5 thì là fast plod, khi 6 <= x <= 7 thì là slip còn khi 8 <= x <= 10 thì là slow pod.
    Đối với thỏ thì ta có 5 TH : sleep, big hop, big slip, small hop, và small slip, ta sẽ tự quyết định giá trị của x cho thỏ tương tự như Rùa.
    In ra màn hình chữ T tương trưng cho Thỏ và R tượng trưng cho rùa, mô phỏng lại chặng đua thú vị này.
    Nếu trường hợp 2 con trùng ô thì in ra “Ouch !!”.
    Nếu tại điểm xuất phát mà con nào lùi lại thì đưa nó lên lại vị trí xuất phát.

    -------------------------------------------------------------------------

    [HƯỚNG GIẢI QUYẾT]

    Đối với bài này, có nhiều hướng suy nghĩ cho bạn :

    - Thứ nhất, bạn có thể suy nghĩ đơn giản. Đây chỉ là một bài toán đơn giản, rèn luyện khả năng tư duy, khả năng lập trình ... Cho tất cả vào một file Program.cs là xong.

    - Thứ hai, bạn suy nghĩ theo hướng phức tạp hơn một chút. Tại sao lai không đóng gói thành class nhỉ ? An toàn và dễ sử dụng hơn nhiều ... Vậy là (có thể) bạn tạo các class như sau
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		rua_tho_class.jpg
Lần xem:	8
Size:		22.9 KB
ID:		5345

    (Chú ý là ko có Animal và Move nhe mọi người, tại tui chỉnh sửa từ cái sơ đồ cũ nên nó vẫn còn :">)

    - Thứ ba, suy nghĩ theo hướng cao hơn nữa.
    + Sao lại chỉ đua có thỏ và rùa ? Sao ko cho thành cuộc đua tập thể luôn ?
    + Sao lại có ít kiểu di chuyển vậy ? Sao ko cho thêm vào, kiểu move Hiphop chẳng hạn
    + Sao lại chỉ làm trên console ? Tui làm thêm GUI ko đc à ?

    Vậy là (có thể) bạn tạo kiến trúc chương trình như sau :
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		rua_tho_diagram.jpg
Lần xem:	5
Size:		35.6 KB
ID:		5346

    Xin chú ý với các bạn một điều, phải tùy tình huống mà làm cho phù hợp. Giả dụ bài này cho thi HK thời gian 60' mà bạn thiết kế lớp cho chi tiết thì bạn nắm chắc ... điểm thấp . Do ở đây tui căn cứ vào thời gian cho phép giải quyết bài này là 1 ngày (hoặc hơn) nên đề ra phương án như trên.

    Tạm thời tui mới chỉ có "suy nghĩ " đến mức như vậy à. Tui vẫn mong muốn vẫn còn chỗ nào đó có thể chia nhỏ hơn được nữa.

    Bạn nào có ý kiến xin ko ngần ngại đưa lên. Xin cám ơn các ý kiến tuyệt vời của các bạn (câu này chôm của Dr )

    (Còn tiếp)

    Xem thêm tại đây : Bài toán Rùa và Thỏ
    Đã được chỉnh sửa lần cuối bởi nhc1987 : 24-01-2008 lúc 11:25 AM.
    Keep moving forward!

    ... Retired ...

  2. #2
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Hông thấy ai có ý kiến hết vậy chài. Oke, vậy tui sẽ code dựa trên bản phân tích thứ 3 :

    Chúng ta sẽ bắt đầu với core của game : đó là 3 lớp : Animal, Move Game

    Thứ nhất, Animal.cs

    Visual C# Code:
    1. /*********************************************************************
    2.     File    :   Animal.cs
    3.     Date    :   23/1/2008   0:48
    4. ----------------------------------------------------------------------
    5. *   Name    :   Nguyen Hung Cuong
    6. *   Class   :   TH2005
    7. *   MSSV    :   0512085
    8. *   Mail    :   nhc.hcmuns@gmail.com
    9. ----------------------------------------------------------------------
    10.     Purpose :  
    11. **********************************************************************/
    12. using System;
    13. using System.Collections.Generic;
    14. using System.Text;
    15.  
    16. namespace RunningGame
    17. {
    18.     public abstract class Animal
    19.     {
    20.         protected int _CurrentPosition = 0;
    21.         public int CurrentPosition
    22.         {
    23.             get { return _CurrentPosition; }
    24.             set { _CurrentPosition = value; }
    25.         }
    26.  
    27.         public abstract String Name
    28.         {
    29.             get;
    30.         }
    31.  
    32.         protected List<Move> _MoveTypes;
    33.  
    34.         public Animal()
    35.         {
    36.  
    37.         }
    38.  
    39.         public Move MakeRandomMove()
    40.         {
    41.             int index = new Random().Next(_MoveTypes.Count);
    42.             return _MoveTypes[index];
    43.         }
    44.  
    45.         public Move Run()
    46.         {
    47.             Move move = MakeRandomMove();
    48.             move.CurrentPosition = _CurrentPosition;     // set current
    49.             move.GoGo();                                          // go
    50.             _CurrentPosition = move.CurrentPosition;     // update current
    51.  
    52.             return move;
    53.         }
    54.     }
    55. }

    Thứ hai, Move.cs

    Visual C# Code:
    1. /*********************************************************************
    2.     File    :   Move.cs
    3.     Date    :   23/1/2008   0:50
    4. ----------------------------------------------------------------------
    5. *   Name    :   Nguyen Hung Cuong
    6. *   Class   :   TH2005
    7. *   MSSV    :   0512085
    8. *   Mail    :   nhc.hcmuns@gmail.com
    9. ----------------------------------------------------------------------
    10.     Purpose :  
    11. **********************************************************************/
    12. using System;
    13. using System.Collections.Generic;
    14. using System.Text;
    15.  
    16. namespace RunningGame
    17. {
    18.     public abstract class Move
    19.     {
    20.         protected int _CurrentPosition;
    21.         public int CurrentPosition
    22.         {
    23.             get { return _CurrentPosition; }
    24.             set { _CurrentPosition = value; }
    25.         }
    26.  
    27.         protected abstract int _PercentageOfTime
    28.         {
    29.             get;
    30.         }
    31.  
    32.         protected abstract int _ActualMove
    33.         {
    34.             get;
    35.         }
    36.  
    37.         public Move()
    38.         {
    39.  
    40.         }
    41.  
    42.         public void GoGo()
    43.         {
    44.             _CurrentPosition = _CurrentPosition + _ActualMove;
    45.  
    46.             if (_CurrentPosition < Game.MIN_WIDTH)
    47.                 _CurrentPosition = Game.MIN_WIDTH;
    48.  
    49.             else if (_CurrentPosition > Game.MAX_WIDTH)
    50.                 _CurrentPosition = Game.MAX_WIDTH;
    51.         }
    52.  
    53.         public override string ToString()
    54.         {
    55.             return "Position = " + _CurrentPosition;
    56.         }    
    57.     }
    58. }

    Thứ ba, Game.cs

    Visual C# Code:
    1. /*********************************************************************
    2.     File    :   Game.cs
    3.     Date    :   23/1/2008   11:46
    4. ----------------------------------------------------------------------
    5. *   Name    :   Nguyen Hung Cuong
    6. *   Class   :   TH2005
    7. *   MSSV    :   0512085
    8. *   Mail    :   nhc.hcmuns@gmail.com
    9. ----------------------------------------------------------------------
    10.     Purpose :  
    11. **********************************************************************/
    12. using System;
    13. using System.Collections.Generic;
    14. using System.Text;
    15.  
    16. namespace RunningGame
    17. {
    18.     public abstract class Game
    19.     {
    20.         public static int MIN_WIDTH = 0;
    21.         public static int MAX_WIDTH = 0;
    22.  
    23.         /// <summary>
    24.         /// Set up game
    25.         /// </summary>
    26.         public abstract void Setup();
    27.  
    28.         /// <summary>
    29.         /// Play game
    30.         /// </summary>
    31.         public abstract void Play();
    32.     }
    33. }

    Sau khi có được 3 class này xem như ta đã giải quyết xong bài toán ở trên. Đặc biệt bạn có thể thấy được khả năng mở rộng của game này là rất cao ... Sau khi code cho bài nhỏ xíu ở trên, bạn có thể phát triển nó thành game bán kiếm tiền được đó ... Từ từ sẽ thấy rõ hơn

    Bạn nào có ý kiến xin ko ngần ngại đưa lên. Xin cám ơn các ý kiến tuyệt vời của các bạn (câu này chôm của Dr)

    Lưu ý : vẫn có thể còn bug do tui chưa test kĩ. Bạn nào thấy vui lòng thông báo nhé

    (Còn tiếp)

    Xem thêm tại đây : Bài toán Rùa và Thỏ
    Đã được chỉnh sửa lần cuối bởi nhc1987 : 24-01-2008 lúc 11:26 AM.
    Keep moving forward!

    ... Retired ...

  3. #3
    Ngày gia nhập
    08 2006
    Bài viết
    59

    Thân gửi bạn nhc,

    Tui nghĩ như vầy:

    1) nếu làm như bạn thì:
    - mỗi lần move là phải tạo và hủy 1 thực thể (instance) của lớp Move (nếu move 100 bước thì phải tạo và hủy 100 lần); và thời gian tồn tại của các thực thể này rất là ngắn (chỉ 1 bước move mà thôi)
    - để thay đổi thuộc tính position của lớp Thỏ và lớp Rùa => phải tạo 1 thực thể của lớp Move và truyền position của Thỏ/Rùa vô cho Move rồi Move thay đổi thuộc tính position (của Move) và trả ngược lại về thuộc tính position của Rùa/Thỏ => có vẻ không hợp lý cho lắm (chỉ cần thay đổi 1 thuộc tính của Thỏ/Rùa mà phải làm gián tiếp qua 1 thực thể Move; và các thuộc tính của thực thể Move thực chất chỉ là bản sao y chang của các thuộc tính của Thỏ/Rùa => tại sao không thay đổi trực tiếp ngay trong Thỏ/Rùa ???)

    2) có nên chăng làm như sau: thỏ và rùa có thuộc tính position. Thông thường thuộc tính được thay đổi thông qua các phương thức (method) => nên cài đặt thẳng các cách move vô lớp Thỏ và lớp Rùa (không cần các lớp Move/Hop/Slip/Sleep/.....)

    (hiểu biết nông cạn; có gì sai sót mong được góp ý; xin cám ơn)

    -thân

  4. #4
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    1) nếu làm như bạn thì:
    - mỗi lần move là phải tạo và hủy 1 thực thể (instance) của lớp Move (nếu move 100 bước thì phải tạo và hủy 100 lần); và thời gian tồn tại của các thực thể này rất là ngắn (chỉ 1 bước move mà thôi)
    ???)
    Thật ra, cách làm của mình đã tính tới chuyện sẽ lưu lại các bước di chuyển của các animals để cho user có thể replay, undo, redo, .... Do đó thực sự các bước move đó tồn tại trong suốt quá trình sống của object Hare, Tortoise

    - để thay đổi thuộc tính position của lớp Thỏ và lớp Rùa => phải tạo 1 thực thể của lớp Move và truyền position của Thỏ/Rùa vô cho Move rồi Move thay đổi thuộc tính position (của Move) và trả ngược lại về thuộc tính position của Rùa/Thỏ => có vẻ không hợp lý cho lắm (chỉ cần thay đổi 1 thuộc tính của Thỏ/Rùa mà phải làm gián tiếp qua 1 thực thể Move; và các thuộc tính của thực thể Move thực chất chỉ là bản sao y chang của các thuộc tính của Thỏ/Rùa => tại sao không thay đổi trực tiếp ngay trong Thỏ/Rùa
    Ở đây do chỉ là đơn giản nên tạm thời bạn chỉ thấy thay đổi ở position, thực tế nó còn percentageOfTime mình vẫn chưa xét tới. Và có thể thêm vào một số thông tin khác nữa mà sau này phát sinh.

    2) có nên chăng làm như sau: thỏ và rùa có thuộc tính position. Thông thường thuộc tính được thay đổi thông qua các phương thức (method) => nên cài đặt thẳng các cách move vô lớp Thỏ và lớp Rùa (không cần các lớp Move/Hop/Slip/Sleep/.....)
    Cách làm của bạn gây khó khăn rất nhiều cho việc bảo trì. Khi code như vậy bạn hoàn toàn ko tái sử dụng được gì cả .... Cách làm của bạn tương đương với suy nghĩ 1.

    Bạn có thể xem thêm bài trả lời cuối cùng của nhc tại thread : Bài toán rùa và thỏ

    Cám ơn bạn đã cho ý kiến :cheers:
    Keep moving forward!

    ... Retired ...

  5. #5
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Dr cũng có ý như Bete đó. OOP tức là nó giống với thực tế. Ở đây sẽ có 2 lớp Thỏ và Rùa, 2 lớp này có tất cả các thuộc tính như là Move, Hop, Slip, Sleep, ... Và một lớp để điều khiển cuộc chơi. Mọi người cho ý kiến nhé!

    Dr cũng đang nghiên cứu làm cái này trên C#, nhưng mà trình độ còn yếu quá, kèm theo bận bịu nhiều thứ. Thành thử làm hoài không được.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  6. #6
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Mặc định Tortoise and Hare tournament | Bài toán rùa và thỏ trong lập trình C#

    Oke, tiếp tục sẽ là các lớp inherit từ các lớp cha ở trên :

    Thứ nhất, chúng ta xét về Animal, bạn có thể dễ dàng nhận ra trong game này cần 2 con là Rùa và Thỏ. Vậy thì tạo 2 classes đi còn chờ gì nữa

    Hare.cs
    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4.  
    5. namespace RunningGame
    6. {
    7.     /// <summary>
    8.     /// Hare : Thỏ rừng # Rabbit : Thỏ nhà :D
    9.     /// </summary>
    10.     public class Hare : Animal
    11.     {
    12.         public override string Name
    13.         {
    14.             get { return "Hare"; }
    15.         }
    16.  
    17.         public override string ToString()
    18.         {
    19.             return "H";
    20.         }
    21.  
    22.         public Hare(int fieldWidth)
    23.         {
    24.             _CurrentPosition = new Random(DateTime.Now.GetHashCode()).Next(fieldWidth);
    25.  
    26.             _MoveTypes = new List<Move>();
    27.  
    28.             _MoveTypes.Add(new Sleep());      // sleep
    29.             _MoveTypes.Add(new BigHop());     // big hop
    30.             _MoveTypes.Add(new BigSlip());    // big slip
    31.             _MoveTypes.Add(new SmallHop());   // small hop
    32.         }
    33.     }
    34. }
    Tortoise.cs

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4.  
    5. namespace RunningGame
    6. {
    7.     /// <summary>
    8.     /// Tortoise : Rùa nước ngọt #  Turtle : Rùa biển :D
    9.     /// </summary>
    10.     public class Tortoise : Animal
    11.     {
    12.         public override string Name
    13.         {
    14.             get { return "Tortoise"; }
    15.         }
    16.  
    17.         public override string ToString()
    18.         {
    19.             return "T";
    20.         }
    21.  
    22.         public Tortoise(int fieldWidth)
    23.         {
    24.             _CurrentPosition = new Random().Next(fieldWidth);
    25.  
    26.             _MoveTypes = new List<Move>();
    27.  
    28.             _MoveTypes.Add(new FastFlod());      // fast flod
    29.             _MoveTypes.Add(new Slip());          // slip
    30.             _MoveTypes.Add(new SlowPlod());      // slow flod
    31.         }
    32.     }
    33. }
    Thứ hai, thêm các kiểu move vào ... và việc code các lớp này thực sự rất đơn giản, chỉ cần override lại 2 properties là PercentageOfTime và ActualMove

    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4.  
    5. namespace RunningGame
    6. {
    7.     public class BigHop : Move
    8.     {
    9.         public BigHop()
    10.         {
    11.  
    12.         }
    13.  
    14.         protected override int _PercentageOfTime
    15.         {
    16.             get { return 20; }
    17.         }
    18.  
    19.         protected override int _ActualMove
    20.         {
    21.             get { return 9; }
    22.         }
    23.     }
    24. }
    Visual C# Code:
    1.  
    2. using System;
    3. using System.Collections.Generic;
    4. using System.Text;
    5.  
    6. namespace RunningGame
    7. {
    8.     public class BigSlip : Move
    9.     {
    10.         public BigSlip()
    11.         {
    12.  
    13.         }
    14.  
    15.         protected override int _PercentageOfTime
    16.         {
    17.             get { return 10; }
    18.         }
    19.  
    20.         protected override int _ActualMove
    21.         {
    22.             get { return -12; }
    23.         }
    24.     }
    25. }
    Visual C# Code:
    1.  
    2. using System;
    3. using System.Collections.Generic;
    4. using System.Text;
    5.  
    6. namespace RunningGame
    7. {
    8.     public class FastFlod : Move
    9.     {
    10.         public FastFlod()
    11.         {
    12.  
    13.         }
    14.  
    15.         protected override int _PercentageOfTime
    16.         {
    17.             get { return 50; }
    18.         }
    19.  
    20.         protected override int _ActualMove
    21.         {
    22.             get { return 3; }
    23.         }
    24.     }
    25. }
    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4.  
    5. namespace RunningGame
    6. {
    7.     public class Sleep : Move
    8.     {
    9.         public Sleep()
    10.         {
    11.  
    12.         }
    13.  
    14.         protected override int _PercentageOfTime
    15.         {
    16.             get { return 20; }
    17.         }
    18.  
    19.         protected override int _ActualMove
    20.         {
    21.             get { return 0; }
    22.         }
    23.     }
    24.  
    25. }
    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4.  
    5. namespace RunningGame
    6. {
    7.     public class Slip : Move
    8.     {
    9.         public Slip()
    10.         {
    11.  
    12.         }
    13.  
    14.         protected override int _PercentageOfTime
    15.         {
    16.             get { return 20; }
    17.         }
    18.  
    19.         protected override int _ActualMove
    20.         {
    21.             get { return -6; }
    22.         }
    23.     }
    24. }
    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4.  
    5. namespace RunningGame
    6. {
    7.     public class SlowPlod : Move
    8.     {
    9.         public SlowPlod()
    10.         {
    11.  
    12.         }
    13.  
    14.         protected override int _PercentageOfTime
    15.         {
    16.             get { return 30; }
    17.         }
    18.  
    19.         protected override int _ActualMove
    20.         {
    21.             get { return 1; }
    22.         }
    23.     }
    24. }
    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Text;
    4.  
    5. namespace RunningGame
    6. {
    7.     public class SmallSlip : Move
    8.     {
    9.         public SmallSlip()
    10.         {
    11.  
    12.         }
    13.  
    14.         protected override int _PercentageOfTime
    15.         {
    16.             get { return 20; }
    17.         }
    18.  
    19.         protected override int _ActualMove
    20.         {
    21.             get { return -2; }
    22.         }
    23.     }
    24. }
    Keep moving forward!

    ... Retired ...

  7. #7
    Ngày gia nhập
    08 2006
    Bài viết
    59

    Thân gửi bạn nhc,

    Xin được thảo luận với bạn thêm 1 chút:

    1) Trước hết tui xin nhìn nhận là nếu cài đặt thẳng các cách move vô ở lớp Rùa và lớp Thỏ là rất dở vì không mở rộng được (tui đã đọc phần trả lời cuối cùng của bạn ở cái thread kia)

    2) Cách lập các lớp cho các cách move như bạn là mở rộng được (thêm 1 kiểu move mới, 2 con vật nào đó có thể có cùng 1 kiểu move nào đó)

    3) percentageOfTime không nên để ở trong lớp Move/Hop/Slip/.... mà nên để ở trong lớp Rùa và lớp Thỏ: con vật A có thể có cách move X với percentageOfTime là y% và con vật B khác có thể có cùng cách move X nhưng với z% (khác với y%)

    3) Để mở rộng được (thêm 1 kiểu move mới, 2 con vật nào đó có thể có cùng 1 kiểu move nào đó) mình có thể làm cách khác:

    a) định nghĩa enum MoveType = HOP (0), SLIP (1), Sleep (2), ....
    b) định nghĩa lớp Animal với thuộc tính validMoves, phương thức ActualMove và Move:
    Code:
    Animal::validMoves: list hoặc mảng (các phần tử là kiểu enum MoveType)
    Animal::ActualMove(move_type) {
      switch (move_type) { 
        case HOP: position = .....
       ....... 
      }
    }
    Animal::Move {
      idx = random(1 .. nValidMoves);
      move_type = ValidMoves[idx];
      ActualMove(move_type);
    }
    c) Lớp Rùa và lớp Thỏ thừa kế từ lớp Animal
    Rùa::validMoves = (SLIP, ...); (đặt dòng này trong constructor của lớp Rùa)
    Thỏ::validMoves = (HOP, ...); (đặt dòng này trong constructor của lớp Thỏ)

    Như vậy:
    - lớp Animal/Rùa/Thỏ có thuộc tính position
    - thuộc tính position được thay đổi bởi phương thức Move (move là 1 hành xử (behavior) tác động lên thuộc tính position: theo tinh thần của OOP)
    - dễ dàng thêm 1 loại Animal mới (thêm lớp Gà; khởi tạo Gà::validMoves trong constructor của lớp Gà), dễ dàng thêm 1 loại move mới (thêm phần tử HIPHOP vô enum MoveType; thêm "case HIPHOP" vô switch (chỉ thêm ở 1 chỗ trong Animal::ActualMove)), dễ dàng cho 2 loại animal xài chung 1 loại move nào đó (thêm loại move này khi khởi tạo validMoves trong 2 lớp ứng với 2 loại animal này)

    (enum MoveType chỉ được xài ở 2 chỗ: định nghĩa của enum & switch trong Animal::ActualMove()
    => dễ sửa code

    cài đặt cho các loại move khác nhau nằm tập trung ở 1 cái switch => dễ kiểm tra & dễ sửa)

    (hiểu biết nông cạn; có gì sai sót mong được góp ý; xin cám ơn)

    -thân
    Đã được chỉnh sửa lần cuối bởi bete : 24-01-2008 lúc 03:19 PM.

  8. #8
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    3) percentageOfTime không nên để ở trong lớp Move/Hop/Slip/.... mà nên để ở trong lớp Rùa và lớp Thỏ: con vật A có thể có cách move X với percentageOfTime là y% và con vật B khác có thể có cùng cách move X nhưng với z% (khác với y%)
    Cũng là một hướng phát triển hay

    3) Để mở rộng được (thêm 1 kiểu move mới, 2 con vật nào đó có thể có cùng 1 kiểu move nào đó) mình có thể làm cách khác:

    a) định nghĩa enum MoveType = HOP (0), SLIP (1), Sleep (2), ....
    b) định nghĩa lớp Animal với thuộc tính validMoves, phương thức ActualMove và Move:
    .............
    Oke, đó cũng là một cách làm. Nhưng tui vẫn thấy tiếc ở chỗ

    + phải duyệt qua nguyên một list các move types để có thể đến được move type đúng của nó 8-}

    + Bây giờ tui phát triển game, hỗ trợ save game, load game, undo, redo ... Bạn sẽ thêm vào một cái list các move để ghi nhớ lại vị trí ? Bạn sẽ thêm switch ... case trong save game, thêm switch ... case trong undo, trong redo, trong loadgame ? ... Lúc này thì ko đơn giản đâu à nha

    Mong bạn đưa ra cách giải quyết :cheers:

    [code]
    Keep moving forward!

    ... Retired ...

  9. #9
    Ngày gia nhập
    10 2007
    Nơi ở
    HCMUNS
    Bài viết
    459

    Bây giờ tới Game nhe bà con, món chính yếu đây :

    Visual C# Code:
    1. /*********************************************************************
    2.     File    :   Game.cs
    3.     Date    :   23/1/2008   0:49
    4. ----------------------------------------------------------------------
    5. *   Name    :   Nguyen Hung Cuong
    6. *   Class   :   TH2005
    7. *   MSSV    :   0512085
    8. *   Mail    :   nhc.hcmuns@gmail.com
    9. ----------------------------------------------------------------------
    10.     Purpose :  
    11. **********************************************************************/
    12. using System;
    13. using System.Collections.Generic;
    14. using System.Text;
    15.  
    16. namespace RunningGame
    17. {
    18.     public class GameConsole : Game
    19.     {
    20.         private const int _MAX_CONSOLE = 300;
    21.  
    22.         private List<Animal> _Competitors = new List<Animal>();
    23.  
    24.         public GameConsole()
    25.         {
    26.             _Competitors.Add(new Tortoise(MAX_WIDTH));  // tortoise
    27.             _Competitors.Add(new Hare(MAX_WIDTH));      // hare
    28.  
    29.             MIN_WIDTH = 0;
    30.             MAX_WIDTH = 70;
    31.         }
    32.  
    33.         public override void Setup()
    34.         {
    35.  
    36.             for (int i = 0; i < _MAX_CONSOLE; ++i )
    37.             {
    38.                 Utilities.GoToXY(i, MAX_WIDTH);
    39.                 Utilities.Out("|");
    40.                
    41.             }
    42.  
    43.             foreach (Animal animal in _Competitors)
    44.             {
    45.                 Utilities.GoToXY(0, animal.CurrentPosition);
    46.                 Utilities.Out(animal.ToString());
    47.             }
    48.         }
    49.  
    50.         public override void Play()
    51.         {
    52.             int index = 0;   // for display only
    53.             List<Animal> movedAnimals = new List<Animal>();
    54.  
    55.             while(true)
    56.             {
    57.                 foreach (Animal animal in _Competitors)
    58.                 {
    59.                     Move move = animal.Run();                       // animal move
    60.                     Utilities.GoToXY(index, move.CurrentPosition);  // move the cursor
    61.  
    62.                     if (movedAnimals.Count != 0)
    63.                     {
    64.                         SolveCollisionProblem(animal, movedAnimals); // collision ?
    65.                     }
    66.                     else
    67.                     {
    68.                         Utilities.Out(animal.ToString());
    69.                     }
    70.  
    71.                     movedAnimals.Add(animal);   // add to list contains moved animals
    72.  
    73.                     if (IsWin(animal))  // check for winning
    74.                     {
    75.                         Utilities.OutLine();
    76.                         Utilities.OutLine(animal.Name + " win !!!");
    77.                         return;
    78.                     }
    79.                 }
    80.  
    81.                 movedAnimals = new List<Animal>();  // renew list
    82.                 ++index;
    83.  
    84.                 if (index == _MAX_CONSOLE)   // check for draw situation
    85.                 {
    86.                     Utilities.OutLine("Draw");
    87.                     return;
    88.                 }
    89.  
    90.                 System.Threading.Thread.Sleep(300); // move slowly :D
    91.             }
    92.         }
    93.  
    94.         private Boolean IsWin(Animal animal)
    95.         {
    96.             if (animal.CurrentPosition == MAX_WIDTH)
    97.                 return true;
    98.  
    99.             return false;
    100.         }
    101.  
    102.         private void SolveCollisionProblem(Animal animal, List<Animal> list)
    103.         {
    104.             foreach (Animal movedAnimal in list)
    105.             {
    106.                 if(animal.CurrentPosition == movedAnimal.CurrentPosition)
    107.                 {
    108.                     Utilities.Out("OUCH!");
    109.                 }
    110.                 else
    111.                 {
    112.                     Utilities.Out(animal.ToString());
    113.                 }
    114.             }
    115.         }
    116.     }
    117. }

    Cái này thì tùy mọi ngừoi chỉnh. Xuất mấy câu thông báo yêu cầu gì gì đóa cũng được. Tui viết đơn giản vậy thoai
    Keep moving forward!

    ... Retired ...

  10. #10
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Ngưỡng mộ nhc ghê T_T ! Mặc dù không hiểu C# như description và design thật là ấn tượng . Rất bài bản và logic, all I have to say is awesome T_T! Nhìn thích ghê đó he he !
    @ : Làm sao vẽ được mấy cái UML đó đẹp quá vậy chỉ tui với hì hì !

Các đề tài tương tự

  1. Bài tập C++ Chạy đua rùa và thỏ
    Gửi bởi thanhhai94 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 2
    Bài viết cuối: 20-03-2013, 10:02 AM
  2. Thư giãn với bài học từ cuộc đua của thỏ và rùa
    Gửi bởi duynamdang trong diễn đàn Giải trí - Thư giãn
    Trả lời: 1
    Bài viết cuối: 02-11-2012, 04:56 PM
  3. [TopCoder] Practice Rooms => 1-Tournament => 1-Inv 2001 R1
    Gửi bởi bvKim trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 03-02-2010, 11:20 PM
  4. Bài tập lý thuyết C++ | Rùa và Thỏ tournament T_T
    Gửi bởi rox_rook trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 21
    Bài viết cuối: 24-01-2008, 02:30 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn