Điều gì sẽ là cách tốt nhất để tìm một không gian mở trong một cấp độ?


7

Tôi đang làm việc trên một trò chơi 2D trong đó bạn sử dụng sơn để thêm các ô ở cấp độ và ngay bây giờ tôi đang làm việc để thêm các ô dọc. Tôi đã thiết lập nó để các loại sơn định hướng nhất định sử dụng hai điểm (bắt đầu và kết thúc) để xác định hướng nào các ô sẽ chỉ (trái, phải, lên, xuống.) Các gạch dọc có các điểm này, nhưng chúng sẽ là được thêm vào hai danh sách khác (bắt đầu và kết thúc warp). Cách thức hoạt động của các sợi dọc là: nếu người chơi chạm vào một ô, họ sẽ được dịch chuyển đến ô dọc tương ứng. Bây giờ, nếu tôi làm cho nó hoạt động bình thường, tôi cần phải làm cho nó để người chơi không thể bị dịch chuyển vào tường hoặc ra khỏi bản đồ. Vì vậy, tôi cần di chuyển điểm đến một ô mở chính xác một khoảng cách từ bất kỳ bức tường nào.

cách nào tốt nhất để làm việc này?


Bạn đang thiết lập các điểm warp này trước hay chúng được tạo tự động bằng cách nào đó?
Richard Marskell - Drackir

Xem câu trả lời và mô tả của tôi về Sự cố Đóng gói tại gamedev.stackexchange.com/questions/16054/iêu
Kỹ sư

@Drackir Sơn chỉ là một vệt hạt không biến mất hoặc di chuyển và mỗi hạt đều có điểm riêng để ánh xạ vị trí của nó. Vì vậy, tôi đã tạo một vòng lặp for để kiểm tra từng vị trí hạt, xem gạch đó có mở không, thay đổi bản đồ va chạm cho phù hợp và sau đó loại bỏ hạt. Đồ họa gạch được vẽ theo bản đồ va chạm.
IronGiraffe

Tôi bối rối không thể tin được. Có lẽ một hình ảnh sẽ giúp mọi người thấy những gì bạn đang cố gắng làm và cung cấp cho bạn câu trả lời chắc chắn.
Richard Marskell - Drackir

@Drackir Đây là video của trò chơi cho đến nay. Mỗi khi bạn đặt các ô xếp xuống, bạn thay đổi các giá trị tại vị trí đó trên bản đồ va chạm (một mảng int.) Với các ô dọc tôi cần 9 ô có giá trị không gian mở (tất cả 9 ô đều bằng 0) và các ô dọc là được tạo ở điểm cuối của đường màu tím (trong đó các cờ xuất hiện lúc 1:32.) Điều tôi cần là cách sử dụng thuật toán tìm kiếm để tìm xung quanh điểm cũ để biết điểm mới phù hợp với hướng dẫn của tôi (8 ô trống xung quanh điểm mới cũng trống.) Ví dụ.
IronGiraffe

Câu trả lời:


3

Nếu tất cả những gì bạn muốn làm là đảm bảo rằng các ô được nhấp vào có các ô mở xung quanh nó, tôi sẽ chỉ tạo một hàm kiểm tra các ô xung quanh nó. Và sau đó gọi nó trên gạch nhấp chuột.

Bạn có thể thiết lập nó trong một vòng lặp (lồng nhau) hoặc chỉ tạo các câu lệnh if cho nó. Vì vậy, trong mã giả:

function IsTileOpen(tile)
  if tile NOT open
    return false because if the clicked tile isn't open, why check any others
  if tile on top row
    return false because we're against the top wall
  if tile on left column
    return false because we're against the left wall
  if tile on right column
    return false because we're against the right wall
  if tile on bottom row
    return false because we're against the bottom wall
  if top left tile NOT open
    return false
  if top tile NOT open
    return false
  if top right tile NOT open
    return false
  if left tile NOT open
    return false
  if right tile NOT open
    return false
  if bottom left tile NOT open
    return false
  if bottom tile NOT open
    return false
  if bottom right tile NOT open
    return false
  return true because all the surrounding tiles were open
end function

Chỉnh sửa dựa trên nhận xét

Có hai cách bạn có thể xử lý tình huống:

  1. (Dễ nhất) Bạn chỉ có thể phát âm thanh và cho biết vị trí họ chọn không hợp lệ và họ cần chọn tùy chọn khác.
  2. Sử dụng một thuật toán tìm kiếm để tìm một lát mở. Tuy nhiên, tôi nghĩ nên có giới hạn về cách bạn sử dụng điều này. Lấy ví dụ, một tình huống mà họ nhấp vào bên trái của bản đồ và điểm mở duy nhất nằm ở phía bên phải. Thuật toán tìm kiếm của bạn tìm thấy điểm mở đó và đặt các sợi dọc khác ở đó. Điều này có vẻ không trực quan và có thể gây bực bội. Đề xuất của tôi trong trường hợp này (giả sử bạn không muốn làm số 1, đó là đề xuất chính của tôi), là chỉ tìm kiếm các ô xung quanh ô hiện tại (có thể trong bán kính n-gạch). Bằng cách này, cổng warp sẽ không xuất hiện quá xa so với nơi bạn nhấp. Để thực hiện tìm kiếm như thế này (giả sử bán kính 1 ô), bạn chỉ cần gọi hàm trên trên tám ô xung quanh ô hiện tại (giả sử hiện tại không có sẵn). Bạn có thể làm điều này trong một vòng lặp hoặc, một lần nữa, với câu lệnh if.

Tôi biết cách thực hiện điều đó, nhưng tôi không chắc làm thế nào tôi có thể sử dụng thuật toán tìm kiếm để tìm điểm mới khi điểm cũ không mở. Tôi đã đọc về tìm đường và có vẻ như tôi có thể làm điều gì đó tương tự, nơi tôi sẽ sử dụng thuật toán của Dijkstra hoặc thuật toán A * để tìm không gian mở gần nhất. Tôi chỉ không chắc làm thế nào tôi có thể làm điều đó, bởi vì tôi chưa bao giờ lập trình bất cứ điều gì như thế trước đây. Xin lỗi vì đã làm phiền như vậy, tôi là người mới lập trình, vì vậy tôi chưa thực sự biết điều đó nhiều.
IronGiraffe

@IronGiraffe - Ồ, tôi hiểu ý của bạn. Ok, tôi sẽ cập nhật câu trả lời của tôi.
Richard Marskell - Drackir

@IronGiraffe - Cập nhật.
Richard Marskell - Drackir

Tốt hơn nên làm điều đó "xem nếu gạch mở" trong khi tải hoặc tạo mức và lưu kết quả. Bạn thường phải vượt qua tất cả các ô (ít nhất là tất cả các ô được tải / hiển thị nếu bạn lười đánh giá) vào thời điểm này, dù sao thì việc làm thêm nhỏ đó không thành vấn đề và các bit bộ nhớ thêm không quan trọng trên hầu hết các nền tảng hoặc.
Martin Sojka

@Martin - Từ những gì tôi hiểu, cấp độ thay đổi khi bạn chơi. Xem video. Và, tôi vẫn đề xuất tùy chọn 1 ở trên, nhưng nếu họ phải thực hiện tùy chọn thứ hai, thì đó chỉ là nhấp chuột nên không chắc nó sẽ gây ra bất kỳ cú đánh đáng chú ý nào đối với hiệu suất.
Richard Marskell - Drackir

0

Tôi nghĩ rằng bạn sẽ cần phải tìm hình chữ nhật "miễn phí" gần nhất cho một ô dọc, nơi người chơi có thể vừa.

Có một câu hỏi tương tự trên stackoverflow. Nhấn vào đây để xem .

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.