2009-03-04 26 views
10

Tôi muốn triển khai điểm số cao trên internet cho trò chơi của mình. Và cung cấp phản hồi cho người chơi nơi họ có (không chỉ top100 hoặc một cái gì đó như thế). Trong SQL bình thường nó sẽ trông như thế:Cách triển khai điểm số cao trên Internet trong Google App Engine

SELECT COUNT (*) FROM Điểm ĐÂU điểm>: newUsersPoints

và GQL có một cái gì đó tương tự

db.GqlQuery ("SELECT * FROM Điểm ĐÂU điểm >: 1 ", newUsersPoints) .count()

nhưng vì count() chỉ giới hạn ở 1000, nó sẽ không hữu ích trong trường hợp của tôi. Bạn có ý tưởng nào về cách thực hiện điều này không?

Tôi có hai

Đầu tiên:

  1. Sử dụng quầy sharding ý tưởng (http://code.google.com/intl/pl/appengine/articles/sharding_counters.html) Tạo mới "bảng" mà các cửa hàng có bao nhiêu điểm là trong một số phạm vi (from_points, to_points)

  2. Tổng hợp tất cả các quầy từ bảng trên, trong đó dải ô.to_points < newUsersPoints

  3. Tìm số điểm lớn hơn điểm số trong phạm vi mà điểm số mới là db.GqlQuery ("SELECT * FROM Score WHERE points>: 1 AND points> =: 2 AND points <: 3", newUsersPoints, range.from_points , range.to_points) .count() + sumfrom2

  4. Find phạm vi trong đó điểm mới là trong và tăng truy cập của nó

  5. Chia dao động mà truy cập lớn hơn 1000 (hoặc 999) để 3. wouldn không đạt đến giới hạn

  6. Thêm điểm mới vào bảng điểm số

Điều này khá phức tạp và dễ xảy ra lỗi. Chúng tôi có thể tăng một số phạm vi và Thời gian chờ trước khi thêm điểm số. (Không giao dịch)

Thứ hai ý tưởng:

Từ bất cứ lúc nào (? Một lần mỗi ngày) sắp xếp tất cả điểm số của điểm và cung cấp cho họ những vị trí mới (kịch bản có thể thời gian chờ vì vậy chúng tôi phải làm điều đó trong khối)

Để tìm hiểu mà tại đó diễn ra điểm mới là chúng tôi chỉ làm

db.GqlQuery ("SELECT * FROM điểm ĐÂU điểm>: 1 LIMIT 1", newUsersPoints). .get() precalculated_position + 1

Bất kỳ ý tưởng nào khác?

Trả lời

4

Điều này có thể sẽ được quan tâm thread on the google-appengine group. Nó cũng giống như có một thư viện, ranklist, đặc biệt cho điều này.

Về cơ bản, có vẻ như họ đã làm điều gì đó tương tự như các bộ đếm được phân loại.

5

Tôi đã triển khai Trình xếp hạng trong một số ứng dụng GAE. Họ là những ứng dụng Facebook có hàng ngàn đến hàng trăm ngàn người chơi. Nó hoạt động tốt, nhưng đối với mục đích của tôi nó có một nhược điểm lớn: bạn cần phải khai báo trước phạm vi thức trên đó điểm số của người tham gia sẽ rơi vào Vì vậy, đây là xấu vì hai lý do:.

  1. nếu bạn có một cuộc thi mà không có kết thúc, nơi mà điểm số của mọi người có thể tiếp tục leo lên mà không có giới hạn trên, bạn bị hoop.

  2. khi bắt đầu cuộc thi, khi mọi người được nhóm lại gần nhau, cấu trúc cây được ranker.py sử dụng không hiệu quả. cây đi rất sâu và sử dụng hầu như không có bề rộng của nó.

Nói cách khác, ranker.py là tuyệt vời cho trường hợp bạn có thí sinh có điểm số được phân phối ngẫu nhiên ngay cả trên phạm vi giá trị đã biết. Đối với các ứng dụng khác, nó ít hơn tối ưu.

Tôi hy vọng sẽ sớm phát triển một công cụ xếp hạng hữu ích hơn. Chắc chắn sẽ cập nhật chủ đề này khi điều đó xảy ra!

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