Logic đằng sau một trò chơi giống như trang sức


12

Trong một nguyên mẫu tôi đang làm, có một minigame tương tự như bejeweled. Sử dụng lưới là một mảng 2d ( int[,]) làm thế nào tôi có thể biết khi nào người dùng hình thành một trận đấu? Tôi chỉ quan tâm về chiều ngang và chiều dọc.

Ngoài đỉnh đầu tôi đang nghĩ mình sẽ chỉ nhìn từng hướng. Cái gì đó như:

int item = grid[x,y];
if(grid[x-1,y]==item)
{
    int step=x;
    int matches =2;
    while(grid[step-1,y]==item)
    {
        step++;
        matches++
    }
    if(matches>2)
        //remove all matching items
}
else if(grid[x+1,y]==item
    //....
else if(grid[x,y-1==item)
    //...
else if(grid[x,y+1]==item)
    //...

Có vẻ như nên có một cách tốt hơn. Lanhung?


Tôi nhớ rằng tôi đã viết tẻ nhạt cho vòng lặp để làm điều đó (cho một kết nối)
Ming-Tang

Câu trả lời:


6

Lặp lại qua từng mục trong cùng một trục (x hoặc y), nếu chúng giống với mục trước đó, chúng sẽ khớp với nhau. Khi mục tiếp theo trở nên khác nhau, hãy kiểm tra xem các kết quả khớp lớn hơn 3, gọi hàm có chức năng loại bỏ các mục phù hợp và tiếp tục.

Mã AS3:

var grid:Array = [[2,3,2,2,2,4],
                  [ .. ]]; //multidimensional array
var matches:uint;
var gemType:uint;
for(col = 0; col < grid.length; col++){
    matches = 0;        
    gemType = 0; //Reserve 0 for the empty state. If we make it a normal gem type, then only 2 are needed to match for the start.
    for(i = 0; i < grid[0].length; i++){
        if(grid[col][i] == gemType){
            matches++;
        }
        if(grid[col][i] != gemType || i == grid[0].length - 1){ //subtract 1 because arrays start at 0
            if(matches >= 3){
                removeMatches(blah);
            }
            gemType = grid[col][i];
            matches = 1;
        }
    }
}

Điều này chỉ dành cho trục x, đối với y, lưới [col] [i] sẽ trở thành lưới [i] [hàng], v.v ... Tôi chắc chắn bạn có thể tìm ra điều đó :)


4

Chỉ cần nghĩ rằng tôi sẽ cân nhắc với kinh nghiệm của chúng tôi trong việc xây dựng một trò chơi giống như Match-3.

Chúng tôi đã xây dựng một nguyên mẫu cho một trò chơi chữ dựa trên Match-3, giống như nghiền nát scrabble và Bejeweled. Chúng tôi đã sớm nhận ra rằng công cụ cung cấp đá quý / gạch mới để lấp đầy các khoảng trống sẽ phải có tính nội tâm cao (chúng tôi chạy phương pháp phỏng đoán lai và lấy mẫu MonteCarlo) để tạo cơ hội thực tế cho người chơi xâu chuỗi các chữ cái để tạo thành từ thông qua Cơ khí trận đấu 3. Nó phức tạp hơn so với mô tả nhưng tôi giữ nó ngắn gọn vì chúng tôi phải viết một bài báo.

Để trả lời OP - chúng tôi đang thực hiện kiểm tra mẫu để ghi điểm có bao nhiêu trận đấu trên bất kỳ gird nào, tại thời điểm hiện tại, thông qua một phương thức rất giống với đoạn mã "gladoscc". Mặc dù nó hoạt động mạnh mẽ, chi phí tính toán để chạy đệ quy trong quá trình phát tìm kiếm cây trở thành một gánh nặng đáng kể, vì vậy chúng tôi đang trong quá trình viết lại phần logic này và biểu diễn dữ liệu bằng phương pháp bảng bit ( thường được triển khai trong các trò chơi khác như trò chơi cờ vua, cờ đam, Othello, v.v.) Trong các thử nghiệm, chúng tôi đã chỉ ra rằng nó có thể chạy nhanh hơn 20 lần trong ActionScript, và vì vậy, đối với chúng tôi, cần phải thực hiện điều đó là một cú đánh trượt - và giải phóng các chu kỳ thiết yếu cho khả năng đáp ứng, âm thanh, hình ảnh động, v.v.


3
Câu trả lời của bạn nên là một câu trả lời và không thêm một câu hỏi khác. Nếu bạn có câu hỏi, vui lòng tạo một câu hỏi mới bằng nút "HỎI CÂU HỎI". Đây không phải là một diễn đàn thảo luận.
bummzack

1
bummzack .... cảm ơn bạn vì điều đó. Lý do của tôi là chúng tôi đã có một cái nhìn sâu sắc để cung cấp, đặc biệt là liên quan đến hiệu suất của những gì đã được đề xuất trước đó khi tìm kiếm / hướng nội cây được thêm vào bối cảnh. Và nó tiếp tục có liên quan vì chúng ta vẫn đang nói về "Logic đằng sau một trò chơi Bejeweled". Nếu điều này tiếp tục ở dạng xấu, tôi sẽ vui lòng chỉnh sửa / đăng lại theo lời khuyên của bạn.
Wissam

2
Tốt rồi. Nhưng bạn nên loại bỏ phần "câu hỏi" khỏi câu trả lời của bạn. Câu hỏi nên là câu hỏi mới và không phải là một phần của câu trả lời ...
bummzack

1
chỉnh sửa và đăng câu hỏi ở nơi khác
Wissam

2

Đệ quy, yo. Đó là khi bạn không biết ranh giới của mình.

   public int getHMatchSize(int row, int column)
    {
        int returnMe = getMatchValue(row, 0, column, 1);

        if (returnMe < 3)
        {
            return 0;
        }
        else return returnMe;
    }


    public int getVMatchSize(int row, int column)
    {
        int returnMe = getMatchValue(row, 1, column, 0);

        if (returnMe < 3)
        {
            return 0;
        }
        else return returnMe;
    }

    /// <summary>
    /// I return the match size.
    /// </summary>
    /// <param name="row"></param>
    /// <param name="rowDelta">1 means look vertically.  Dont set both deltas to 1.</param>
    /// <param name="column"></param>
    /// <param name="columnDelta">1 means look horizontally.  Dont set both deltas to 1.</param>
    /// <returns>The number of contiguous matching things</returns>
    public int getMatchValue(int row, int rowDelta, int column, int columnDelta)
    {
        int[] start = getEndItem(row, -1 * rowDelta, column, -1 * columnDelta);
        int[] end = getEndItem(row, rowDelta, column, columnDelta);

        int returnMe = 0;
        returnMe += end[0] - start[0];
        returnMe += end[1] - start[1];
        return returnMe;
    }

    /// <summary>
    /// I will return the end of a sequence of matching items.
    /// </summary>
    /// <param name="row">start here</param>
    /// <param name="column">start here</param>
    private int[] getEndItem(int row, int rowDelta, int column, int columnDelta)
    {
        Gem matchGem = new Gem(-1);
        int[] returnMe = new int[2];

        if (boardSpace[row + rowDelta][column + columnDelta] == boardSpace[row][column])
        {
            return getEndItem(row + rowDelta, rowDelta, column + columnDelta, columnDelta);
        }
        else
        {
            returnMe[0] = row;
            returnMe[1] = column;
            return returnMe;
        }
    }

0

Bạn có thể sử dụng thuật toán lấp lũ . Nó thực sự có thể sử dụng cho loại vấn đề này.


1
Không, thực sự nó không liên quan gì đến Câu hỏi. OP đang hỏi làm thế nào để phát hiện ba mục phù hợp liên tiếp.
Cyclops

2
Nếu bạn bắt đầu điền với phần tử lật, thuật toán sẽ đi qua các phần tử phù hợp. Nhưng chỉ cần kiểm tra 3 (và không nhiều hơn) phần tử phù hợp trong một hàng (và không có cột chéo), nó có thể là một quá mức cần thiết. Chúng tôi sử dụng điều này trong trò chơi Bubble Puzzle giống như trò chơi và thực hiện chính xác những gì chúng tôi cần.
ktornai

2
Bạn có thể nên giải thích nhiều hơn một chút so với việc "sử dụng lũ lụt" bởi vì tôi đã bối rối trong một giây về việc nó có liên quan đến vấn đề này như thế nào.
jhocking
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.