2011-11-15 28 views
8

Tôi hiện đang tạo trò chơi pacman trong java. Tôi có một câu hỏi về những con ma mặc dù.Pacman Ghost AI

Tôi hiểu rằng những con ma không phải tất cả đều có cùng kiểu tấn công. Lần đầu tiên tôi muốn làm việc trên những điều cơ bản để có được con ma đi sau pacman và không lo lắng về sự khác biệt nào được nêu ra.

Câu hỏi của tôi đối với bạn những người thông minh ngoài kia là cách tốt nhất để làm cho những con ma đuổi theo pacman nhưng đôi khi chuyển hướng ngẫu nhiên một cách ngẫu nhiên. Tôi hiện đang sử dụng một mảng 21 21 21 cho biết tường là ở đâu và vì vậy tôi đã suy nghĩ làm cho nó nhiều thử và đầu cho vị trí lưới điện hiện tại của pacman. (ví dụ đi đến 10,14) Tất nhiên trong khi tránh đi qua các bức tường như pacman. Tôi tự hỏi làm thế nào tôi có thể làm cho nó làm điều này và cũng có những bóng ma đôi khi dừng lại và đi một hướng khác hoặc một cái gì đó để nó không phải luôn luôn là một đuổi theo liên tục và pacman có cơ hội để có được đi. Có lẽ một số bạn đã lập trình một trò chơi pacman hoặc chỉ biết một cách tốt cho việc này. Mọi sự trợ giúp sẽ rất được trân trọng.

(Xin lưu ý Tôi hiện đang ở trong một Lớp 11 Khoa học Máy tính và nửa học kỳ đầu tiên của java học.)

+0

Lớp 11 là gì, đối với những người trong chúng ta chống lại sự đồng hóa của Anglosaxoborg? –

+0

@larsmans Đây là khóa học năm thứ 3 ở trường trung học mặc dù tôi đang học năm thứ hai trung học nhưng tôi không thể chờ đợi để tham gia khóa học. – ComputerLocus

+0

Tôi có thể thấy rằng trên hồ sơ người dùng của bạn, tất nhiên :) –

Trả lời

6

Nếu bạn chỉ muốn những con ma không cư xử như nhau, mỗi lần họ gặp một giao lộ, hãy quyết định một cách ngẫu nhiên một số mặc định hợp lý theo đuổi (chẳng hạn như tiếp tục đường với khoảng cách ngắn nhất tới Pacman - Sử dụng Dijkstra's algorithm trên tất cả những người kế vị để chọn người tốt nhất) và lựa chọn ngẫu nhiên.

+0

Vì vậy, câu nói của bạn làm cho họ chọn một lượt ngẫu nhiên từ giao lộ nhưng làm cho nó có lẽ nhiều hơn rằng họ sẽ đi theo hướng pacman là đi? – ComputerLocus

+1

@Chính xác nhất. Các giá trị ngăn cản các bóng ma liên kết với nhau nhưng giữ cho trò chơi thú vị sẽ phải được xác định bằng các thí nghiệm (tùy thuộc vào hình dạng mê cung), nhưng tôi đoán 50% lựa chọn ngẫu nhiên - 50% con đường ngắn nhất sẽ cho kết quả chấp nhận được. –

+0

Ok Tôi thích ý tưởng và rất có thể sẽ sử dụng một cái gì đó dọc theo dòng câu trả lời này hoặc @larsmans. – ComputerLocus

4

tôi thấy rất hữu ích bài viết này: Understanding Pac-Man Ghost Behavior, vì nó giải thích chỉ là những gì bạn cần .

+0

Có Tôi biết mỗi con ma có hành vi riêng của nó nhưng chúng tôi không phải là tất cả mong đợi trong khóa học tôi đang trong chương trình một trò chơi phức tạp như vậy. Tôi chỉ muốn thêm một hệ thống đuổi theo cơ bản không phải là phương pháp tiên tiến này. – ComputerLocus

4

Đây là một khả năng: đối với tất cả các bước mà con ma có thể thực hiện, tính toán liệu bước đó có mang nó đến gần Pacman hơn không. Điều đó có thể được thực hiện với Manhattan distance, trong đó lưới 2d chỉ là khoảng cách x + khoảng cách y. Sau đó, chọn ngẫu nhiên một bước, với xác suất cao hơn được gán cho các bước thực sự sẽ đưa nó đến gần hơn.

Nếu bạn có một mảng steps với n_closing_in bước đầu tiên đại diện cho bước mà sẽ lấy ma gần gũi hơn với Pacman, sau đó bạn có thể gán những tổng xác suất prob_closing_in với

double total_probility = 1.; 
for (int i=0; i<n_closing_in; i++) { 
    step_prob[i] = prob_closing_in/n_closing_in; 
    total_probability -= prob_closing_in/n_closing_in; 
} 

Sau đó, tương tự như phân phối những gì còn lại trong total_probability qua các bước sẽ đưa con ma xa hơn từ Pacman.

Step random_step(Step[] possible_steps, double[] step_prob) { 
    double r = Math.random(); 

    int i; 
    for (i=0; i<possible_steps.length(); i++) { 
     if (r < step_prob[i]) 
      break; 
     r -= step_prob[i]; 
    } 
    return possible_steps[i]; 
} 

Nếu mê cung không phải là quá phức tạp và khả năng đóng cửa tại là >.5, những bóng ma sẽ xuất hiện để đuổi theo sau Pacman, nhưng theo một cách lộn xộn.

Nâng cao prob_closing_in về hướng 1. sẽ khiến trò chơi trở nên khó khăn hơn.

(Tất cả các mã trên là chưa được kiểm tra và có thể chứa lỗi. Tôi không quá giỏi trong Java.)

+0

Vâng, bạn đã đánh mất tôi ở đó. Tôi chưa từng học về các bước trước đây. – ComputerLocus

+0

@Fogest: Tôi đã suy nghĩ dọc theo dòng của 'enum Step {LEFT, RIGHT, UP, DOWN}'. –

+0

Vẫn không hiểu ... – ComputerLocus

1

Đối với trình độ cao đẳng AI khóa học của tôi, tôi đã làm một số công việc với phiên bản cũ của Ghost Pacman AI framework. Có vẻ như phiên bản hiện tại có thể được tìm thấy tại đây http://www.pacman-vs-ghosts.net/software (Now DEAD). Trong này, bạn sẽ phát triển các đại lý Ghost của riêng bạn để thử và nắm bắt một đại lý hoặc người dùng kiểm soát Pacman.

Điều này rất hữu ích khi chơi với các kỹ thuật AI khác nhau.

Thêm vào câu hỏi của bạn, các cấp trong khung đó thực sự được xây dựng trên biểu đồ chứ không phải mảng 2d. Bạn có thể xem mã để xem chúng hoạt động như thế nào.

Liên kết ban đầu đã chết và cho đến nay vẫn chưa thể tìm thấy máy nhân bản chính thức. Tuy nhiên, dưới đây có lẽ sẽ được giúp đỡ:

Understanding Pac Man Ghost Behavior Ms Pac Man Vs Ghost AI (GitHub) PacMan_v6.2 (GitHub)

+0

Hãy nhìn vào nó nhưng xem xét mức độ kỹ năng của tôi. – ComputerLocus

+0

thử thách bản thân! ;-) – Casey

+0

Liên kết đó đã cũ. – jumpnett

0

triển khai dễ nhất của như một AI sẽ sử dụng một thuật toán tìm kiếm đồ thị dưới ngây thơ. BFS sẽ là một trong những đơn giản mà sẽ làm việc. Tuy nhiên, bạn muốn thực hiện một heuristic để tối ưu hóa thời gian chạy tốt hơn của khóa học, do đó, một khoảng cách Manhattan đơn giản từ đại lý ma để Pac-man sẽ đủ.

Tóm tắt: BFS với ước tính khoảng cách Manhattan.

Nếu bạn muốn trở nên giàu có hơn, và làm cho ma của bạn hiệu quả hơn trong săn bắn, bạn có thể thực hiện trạng thái trò chơi heuristic (dựa trên khoảng cách từ ma đến Pac-man, và bao nhiêu chấm Pac-man đã ăn cho đến nay , ví dụ) để sử dụng khi ma phải chọn bước di chuyển tiếp theo. Bạn có thể sử dụng pruning techniques để rút ngắn thời gian chạy trong trường hợp này.