Vì vậy, tôi muốn có thể phân tích cú pháp và đánh giá "biểu thức xúc xắc" trong C#. Biểu thức xúc xắc được xác định như sau:Phân tích biểu thức súc sắc (ví dụ: 3d6 + 5) trong C#: bắt đầu từ đâu?
<expr> := <expr> + <expr>
| <expr> - <expr>
| [<number>]d(<number>|%)
| <number>
<number> := positive integer
Vì vậy, ví dụ: d6+20-2d3
sẽ được phép, và nên đánh giá như
rand.Next(1, 7) + 20 - (rand.Next(1, 4) + rand.Next(1, 4))
Cũng d%
nên tương đương với d100
.
Tôi biết tôi có thể hack cùng một số giải pháp, nhưng tôi cũng biết rằng điều này có vẻ như một vấn đề khoa học máy tính rất điển hình, vì vậy phải có một số giải pháp siêu thanh lịch mà tôi nên xem xét.
Tôi muốn kết quả của phân tích cú pháp của tôi để có những khả năng:
- tôi sẽ có thể sản xuất một hình thức bình thường của biểu thức; Tôi đang suy nghĩ xúc xắc đầu tiên, được sắp xếp theo kích thước súc sắc, và luôn luôn với một tiền tố. Vì vậy, ví dụ: mẫu trên sẽ trở thành
1d6-2d3+20
. Ngoài ra, mọi trường hợpd%
sẽ trở thànhd100
ở dạng được chuẩn hóa. - Tôi sẽ có thể đánh giá biểu thức theo ý muốn, luân phiên các số ngẫu nhiên khác nhau mỗi lần.
- Tôi sẽ có thể đánh giá biểu thức với tất cả các cuộn xúc xắc được phóng to, vì vậy ví dụ: mẫu trên sẽ đưa ra (xác định)
1*6+20+2*3 = 32
.
Tôi biết rằng đây chính là loại điều Haskell, và có thể là các ngôn ngữ kiểu hàm khác, sẽ rất tuyệt, nhưng tôi muốn ở lại C# nếu có thể. Ý tưởng ban đầu của tôi có xu hướng hướng tới đệ quy, danh sách, và có thể một số LINQ, nhưng một lần nữa, nếu tôi cố gắng mà không có một số gợi ý từ những người biết mọi thứ, tôi chắc chắn nó sẽ trở thành một mớ hỗn độn không thích hợp.
Một chiến thuật khác có thể hoạt động sẽ là chuỗi thay thế dựa trên regex ban đầu để biến các biểu thức xúc xắc thành các cuộc gọi rand.Next
, sau đó đánh giá hoặc biên dịch trực tuyến ... thực sự có hiệu quả không? Làm thế nào tôi có thể tránh tạo một đối tượng rand
mới mỗi lần?
random.Next là toàn diện và đó là tham số thứ hai là độc quyền. http://msdn.microsoft.com/en-us/library/2dx6wyd4%28VS.95%29.aspx – Domenic
đủ công bằng :) – annakata
Tôi đoán bạn có nghĩa là: rand.Next (1, 7) + 20 - (rand. Tiếp theo (1, 4) + rand.Next (1, 4)) –