2013-07-23 31 views
8

Tôi đang cố gắng phát triển trò chơi bài xì phé đơn giản thông qua Javascript. Tôi đã liệt kê tất cả các kết hợp thẻ có thể một cầu thủ được có thể có trong tay nó ra lệnh bởi giá trị của nó, như thế này:Sử dụng một mảng thông qua câu lệnh switch() trong Javascript

switch(sortedHand) 
{   
//Pair 
    case [1,1,4,3,2]: sortedHand.push(1,"Pair"); break; 
    case [1,1,5,3,2]: sortedHand.push(2,"Pair"); break; 
    case [1,1,5,4,2]: sortedHand.push(3,"Pair"); break; 
    case [1,1,5,4,3]: sortedHand.push(4,"Pair"); break; 
    case [1,1,6,3,2]: sortedHand.push(5,"Pair"); break; 
    case [1,1,6,4,2]: sortedHand.push(6,"Pair"); break; 
    case [1,1,6,4,3]: sortedHand.push(7,"Pair"); break; 
    case [1,1,6,5,2]: sortedHand.push(8,"Pair"); break; 
    case [1,1,6,5,3]: sortedHand.push(9,"Pair"); break; 
    case [1,1,6,5,4]: sortedHand.push(10,"Pair"); break; 

Mặc dù "sortedHand" cửa hàng mảng giá trị thành công (như tôi đã nhìn thấy thông qua giao diện điều khiển. log), câu lệnh switch() luôn trả về trường hợp mặc định, và mọi người đều nhận được một lệnh flush thẳng. Tôi lo sợ đây là vấn đề của phương pháp theo nghĩa đen mà tôi đã sử dụng để khai báo các giá trị mảng có thể được so sánh với toàn bộ "sortHand", nhưng tôi không biết gì hơn. Thậm chí có thể sử dụng switch() theo cách như vậy không?

+0

trường hợp (Mảng) sẽ luôn là false ... – dandavis

Trả lời

12

Bạn có thể thử switch ing trên bản trình bày văn bản của mảng.

switch(sortedHand.join(' ')) 
{   
    //Pair 
    case '1 1 4 3 2': sortedHand.push(1,"Pair"); break; 
    case '1 1 5 3 2': sortedHand.push(2,"Pair"); break; 
    case '1 1 5 4 2': sortedHand.push(3,"Pair"); break; 
    case '1 1 5 4 3': sortedHand.push(4,"Pair"); break; 
    // etc. 
} 

Thay vì chỉ định từng trường hợp trực tiếp, có thể xây dựng bảng công văn bằng cách sử dụng đối tượng và loại bỏ hoàn toàn công tắc.

var dispatch = {}; 

// Build the table however you'd like, for your application 
for (var i = 0; i < 10; i++) { 
    (function(i) { 
     var hand = ...; // Add your hand logic here 
     dispatch[hand] = function() { sortedHand.push(i, "Pair"); }; 
    })(i); 
} 

// Execute your routine 
dispatch[sortedHand.join(' ')](); 
+0

Rực rỡ. Nó hoạt động hoàn hảo. –

6

switch() tuyên bố luôn luôn trả về trường hợp mặc định

Đó là bởi vì sự so sánh không kiểm tra các nội dung mảng, nhưng đối tượng mảng chính nó. Các đối tượng được coi là bình đẳng bởi danh tính của chúng, vì vậy không có gì sẽ bằng một đối tượng được khởi tạo bởi một chữ.

Thậm chí có thể sử dụng nút chuyển() theo cách như vậy không?

Có, bạn có thể sử dụng các đối tượng trong câu hỏi switch nhưng bạn phải sử dụng tham chiếu trong các trường hợp. Không áp dụng cho vấn đề của bạn.

Trong trường hợp của bạn, tôi muốn đề nghị một stringification:

switch(sortedHand.join()) 
{   
//Pair 
    case "1,1,4,3,2": sortedHand.push(1,"Pair"); break; 
    case "1,1,5,3,2": sortedHand.push(2,"Pair"); break; 
    case "1,1,5,4,2": sortedHand.push(3,"Pair"); break; 
    case "1,1,5,4,3": sortedHand.push(4,"Pair"); break; 
    case "1,1,6,3,2": sortedHand.push(5,"Pair"); break; 
    case "1,1,6,4,2": sortedHand.push(6,"Pair"); break; 
    case "1,1,6,4,3": sortedHand.push(7,"Pair"); break; 
    case "1,1,6,5,2": sortedHand.push(8,"Pair"); break; 
    case "1,1,6,5,3": sortedHand.push(9,"Pair"); break; 
    case "1,1,6,5,4": sortedHand.push(10,"Pair"); break; 

nhưng tôi đoán có một thậm chí tốt hơn, giải pháp số học để phát hiện các mẫu mà bạn đang theo đuổi. Điều đó sẽ ngắn hơn và nhanh hơn, nhưng tôi không chắc chính xác đoạn mã này được cho là sẽ làm gì.

1

Đó sẽ không hoàn toàn công việc khi bạn có nó, nhưng bạn có thể sử dụng sortedHand.join(',') và so sánh nó với [1,1,1,2,5].join(',') đó sẽ so sánh hai mảng và phải được sự thật nếu nội dung của họ là chính xác cùng (Hãy cẩn thận với number s gõ như strings !) Để công bằng, tuy nhiên, tôi không thể tưởng tượng tại sao bạn sẽ thiết kế logic của bạn như thế. Ngay cả một trò chơi bài giản dị cũng có hàng trăm ngàn bàn tay có thể. Bạn có thể làm tốt hơn bằng cách sử dụng các chức năng quản lý bộ sưu tập của underscore.js vì nó sẽ đơn giản hơn và thực hành tốt hơn.

1

một cách nhanh hơn, có khả năng tái sử dụng, và linh hoạt hơn để làm việc đó là sử dụng một đối tượng thay vì trường hợp:

var ok= { 
    '1 1 4 3 2':1, 
    '1 1 5 3 2':2, 
    '1 1 5 4 2':3, 
    '1 1 5 4 3':4 
}[ sortedHand.join(' ') ] ; 
if(ok){ sortedHand.push(ok ,"Pair"); } 

đối tượng làm việc tuyệt vời khi một đầu ra là bản lề trên một đầu vào. nếu bạn cần phải làm năm thứ trong mỗi trường hợp, thì bạn phải sử dụng case, nhưng nếu bạn chỉ cần X để biến thành Y, (a 1: 1), Look Up Tables trong hình dạng của Object là lý tưởng.

tôi tưởng tượng RegExp có thể hoạt động ở đây, tôi đã sử dụng chúng trên trò chơi connect4 để xác định 4 liên tiếp, nhưng bảng logic ở trên sẽ hoạt động tốt hoặc tốt hơn những gì bạn mô tả.

1

Có 1274 kết hợp có thể có 5 thẻ trong boong thông thường. Liệt kê tất cả chúng trong một tuyên bố chuyển đổi là hoàn toàn vô lý. Tại sao không chỉ có một chức năng đếm bất kỳ bản sao để kiểm tra 2,3,4-of-a-loại và sau đó kiểm tra cho straights? (Mảng của bạn không hiển thị phù hợp vì vậy tôi giả sử bạn đang rời khỏi nó ra).

Nhưng nếu bạn thực sự muốn làm theo cách đó, bạn có thể sử dụng một chuỗi. Các chuỗi hoạt động với các nút chuyển và thậm chí bạn có thể sử dụng chúng như các mảng. ví dụ. "123" [0] == '1'. Bạn có thể thay đổi chúng trở lại và ra các chức năng của người dùng như parseInt.

+0

Bạn nói đúng, tôi đã bỏ chúng ra. Các tầng được sáng tác bởi sáu cấp bậc chỉ, có 250 posibilities trong tổng số. Tôi đã sử dụng phương thức chuyển đổi vì tôi chưa tìm ra mối quan hệ số học giữa các kết hợp tay và điểm kết quả của nó. –

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