Xin lỗi vì tiêu đề kém nhưng tôi không có cách nào tốt hơn để diễn đạt nó ...
Vì vậy, có trò chơi tuyệt vời này của Nintendo (vâng!) Trên Wii có tên WiiPlay . Có 9 minigame trong đó, và cái yêu thích của tôi được gọi là Tanks! . Đó là về việc tiêu diệt xe tăng COM của kẻ thù mà không khiến bản thân bị phá hủy. Đây là một ảnh chụp màn hình của một cấp độ:
Một cách để tiêu diệt xe tăng là bắn đạn. Có xe tăng địch màu xanh lá chanh này bắn ra những viên đạn tốc độ cao bắn ra (chống lại các bức tường và khối) hai lần. Bạn có thể thấy xe tăng của người chơi có thể bị phá hủy ngay lập tức như thế nào nếu nó ở ngay bây giờ, vì bể vôi ở trung tâm có thể bắn một viên đạn đi theo con đường màu xanh lá cây tôi vẽ trên hình ảnh.
Là một lập trình viên nghiệp dư, tôi đã tự hỏi làm thế nào chiếc xe tăng vôi có thể xác định được hướng nào nên bắn vào để đánh bật chiếc xe tăng của người chơi.
Tôi đã nghĩ về nó nhưng không nghĩ ra bất kỳ thuật toán nào có thể. Tôi sẽ giải thích kết luận của tôi trong trường hợp họ truyền cảm hứng cho ai đó. Chỉ để đơn giản trong lời giải thích của tôi, tôi giả sử một bức tường là bất kỳ bề mặt nào mà viên đạn có thể bắn lại . Một hình chữ nhật cô lập của các khối do đó tạo thành bốn bức tường.
Tôi đã kết luận rằng 2 điểm tại đó các viên đạn luôn luôn nằm ở một bên của hình bình hành hoặc trở thành các đỉnh đối diện của hình bình hành. Xe tăng địch bắn và xe tăng người chơi mà nó nhắm không nhất thiết phải là 2 đỉnh còn lại, nhưng chắc chắn nằm trên các đường thẳng tới một trong bốn cạnh của hình bình hành. Dưới đây là một minh họa về 4 cách có thể hình thành một hình bình hành:
HOR-VER có nghĩa là viên đạn đầu tiên chạm vào một bức tường nằm ngang, sau đó nó bắn vào một bức tường thẳng đứng.
Và rồi tôi bị mắc kẹt. Tôi nghĩ về việc di chuyển xung quanh một đường nối giữa xe tăng địch và xe tăng người chơi quanh bản đồ để xem liệu nó có tạo thành hình bình hành với bất kỳ hai cú đánh nào với bất kỳ bức tường nào không, nhưng điều này không phải lúc nào cũng hoạt động vì xe tăng địch và xe tăng người chơi không nhất thiết phải trùng với các đỉnh của hình bình hành.
Ngoài ra, tôi không chắc chắn về dòng chảy chung của thuật toán. Thuật toán có bất kỳ cấu trúc nào trong 2 cấu trúc sau đây không, hoặc có thể tôi sai với cả hai cấu trúc này?
- Tiếp tục tìm ra những con đường có thể và luôn đánh dấu một con đường là tốt nhất (có thể là ngắn nhất, khó hiểu nhất, khó hiểu nhất, hoặc đánh giá kết hợp và có trọng số dựa trên nhiều tiêu chí) và quên đi phần còn lại. Người còn lại sau khi tính toán là người giỏi nhất.
- Trước tiên, xác định tất cả các bức tường có thể tiếp cận đầu tiên bằng viên đạn (viên đạn không cần phải bắn vào bất kỳ bức tường nào khác để tiếp cận từng bức tường này), sau đó xác định tất cả các phạm vi có thể tiếp cận trên mỗi bức tường này (đôi khi không thể đạt đến điểm xa một bức tường không có ricochet nếu một bức tường khác đứng gần bạn), sau đó một lần nữa xác định tất cả các bức tường có thể tiếp cận với một ricochet, và tất cả các phạm vi có thể tiếp cận trên các bức tường này. Cả 4 quá trình này có thể được thực hiện bằng một cách tương tự như dò tia. Trong mỗi quá trình, nếu xe tăng của người chơi bị trúng bất kỳ tia nào, hãy tìm ra đường đạn theo tia đó.
Theo tôi, thuật toán này rất khó để tìm ra vì:
- một viên đạn có thể được bắn theo bất kỳ hướng nào; và
- có vô số điểm trên bất kỳ bức tường nào, như trong toán học, nơi có vô số điểm trên một đường thẳng.
Nhưng mọi người Nintendo đã tạo ra nó, vì vậy ... bất cứ ai có ý tưởng?