AI không hoàn hảo


19

Vì vậy, tôi bắt đầu tìm hiểu Java và một số OpenGL trong khi sử dụng LWJGL. Để bắt đầu dễ dàng, tôi đang viết một bản sao của Atari Pong. Tôi đã thiết lập chính xác màn hình trò chơi, phát hiện va chạm và tất cả các trò chơi hầu như đều hoạt động, thực sự, nếu bây giờ là trò chơi 2 người chơi, nhưng tôi đang lên kế hoạch thực hiện trò chơi một người chơi này , Tôi phải nghĩ ra một AI đơn giản để điều khiển người chơi thứ hai.

Biết nơi bóng sẽ đánh có vẻ khá tầm thường và tạo ra một AI luôn luôn chạm bóng có vẻ như là một điều dễ dàng để làm, nhưng tôi muốn trò chơi có thể giành chiến thắng, vì vậy tôi không thể luôn làm cho IA đánh trái bóng.

Vì vậy, đây là câu hỏi của tôi, làm thế nào tôi nên mã hóa điều này để thêm những điểm không hoàn hảo giống con người vào AI. Tôi có nên quyết định ngẫu nhiên nếu AI sẽ thất bại tại một thời điểm nhất định không? Hoặc có một điều thông minh hơn (hoặc có thể chỉ rõ ràng) tôi đang thiếu ở đây?

Cảm ơn nhiều.


5
Nói chung, bạn làm cho dơi AI chỉ di chuyển một tốc độ nhất định vì vậy nếu quả bóng được người chơi đặt đúng vị trí thì AI không thể chạm tới nó ..

4
Tôi sẽ bắt đầu bằng cách giới hạn tốc độ AI có thể di chuyển mái chèo và / hoặc xây dựng trong thời gian trễ ngẫu nhiên (ngắn) trước khi AI bắt đầu phản ứng với một cú đánh.


4
@ byte56 Tôi thực sự sẽ không gọi nó là bản sao của câu hỏi đó. Cảm giác giống như ví dụ được đưa ra ở đây blog.stackoverflow.com/2011/01/ trên mục "Nếu bạn sẽ đóng câu hỏi của người dùng dưới dạng trùng lặp, thì đó phải là một bản sao thực sự". Câu hỏi đó là một tài nguyên tốt (và ai đó có lẽ có thể sử dụng câu hỏi đó để tự mình đưa ra câu trả lời cho nội dung đó), nhưng tôi không thực sự trả lời các chi tiết cụ thể của câu hỏi này, tôi không nghĩ vậy.
Tetrad

1
@Tetrad Tôi nghĩ rằng các câu trả lời cuối cùng rất giống nhau, nhưng, bạn nói đúng, các câu hỏi khác nhau. Tôi nghĩ rằng câu hỏi này là một phiên bản cụ thể hơn của câu hỏi được liên kết. Nếu OP đã nhìn thấy người khác trước, tôi không chắc câu hỏi này có được hỏi không. Khi tôi bỏ phiếu, tôi đã không quyết định nên cả hai đều nêu lên câu hỏi và câu trả lời và bỏ phiếu là một bản sao. Nó có thể đi một trong hai cách cho tôi.
MichaelHouse

Câu trả lời:


20

AI pong không hoàn hảo yêu thích của tôi rất đơn giản, nhưng cho phép một người làm một số thất bại AI khá tốt.

Bóng vô hình AI

Thiết lập AI : Khi quả bóng phản xạ khỏi mái chèo của bạn, bạn sẽ biết nó ở đâu và tốc độ của nó. Sinh ra một quả bóng vô hình ở điểm đó nhưng với tốc độ lớn hơn. Nó sẽ cuộn lên nơi bóng có thể nhìn thấy. Mỗi khung hình, có AI di chuyển về phía vị trí của quả bóng vô hình. Dừng quả bóng vô hình một khi nó chạm tới cạnh của AI, vì vậy đó là nơi AI sẽ di chuyển mái chèo của nó.

Kết quả : AI có vẻ như đang cố gắng dự đoán đường đi của quả bóng. Nói rằng người chơi đã phản xạ bóng ở một góc dốc để nó sẽ bật ra khỏi một bức tường. AI sẽ theo dõi bóng xuống một chút, và sau đó - chậm hơn bóng - sẽ không theo dõi nó đủ nhanh. Bạn đã lừa được AI, và nó có vẻ khá logic theo quan điểm của con người. Bạn có thể thấy máy tính đang cố gắng dự đoán quả bóng sẽ đi đến đâu, và sau đó - ồ, nó bị trượt, quá chậm và bạn đã giành được một điểm.

Điều này tốt hơn đáng kể so với việc chèn ngẫu nhiên, vì nó làm cho AI trông tương đối thông minh. Một đối thủ xứng đáng. Nó cũng cho phép AI chơi theo các quy tắc chính xác giống như con người, trông người chơi sẽ tốt hơn và giúp công việc của bạn dễ dàng hơn.

Cài đặt : Bạn cũng có thể điều chỉnh tốc độ của quả bóng vô hình, vì điều đó sẽ quyết định AI sẽ lên kế hoạch bao xa. Bóng vô hình càng nhanh, mái chèo sẽ càng phải di chuyển để chặn, và người chơi sẽ phải nhắm tốt hơn.


Tất cả các câu trả lời được cung cấp cung cấp thông tin thực sự tốt, nhưng vì tôi phải đánh dấu một câu là câu trả lời đúng, tôi đã chọn câu trả lời này vì tôi thực sự thích cách tiếp cận của bạn. Điều này, kết hợp với một số điều khác được nói trong các câu trả lời khác (như chơi với thời gian phản ứng) có thể có được một AI thực sự giống con người và với một khó khăn có thể điều chỉnh dễ dàng
Setzer22

Điều này hoạt động hoàn hảo cho thiết lập của tôi vì tôi có các góc, vận tốc và gia tốc thay đổi dựa trên một số chuyển động đặc biệt, do đó, quả bóng có thể ở khắp mọi nơi. AI đã được sở hữu, nhưng bây giờ nó tốt hơn nhiều. Tôi có thể thấy lý do tại sao phương pháp này không phải là tốt nhất cho tốc độ khóa và góc 45deg, nhưng đó hoàn toàn không phải là trò chơi của tôi.
jackrugile

1
Trong khi tôi thích cách tiếp cận này, tôi đã có vấn đề với việc thực hiện của mình. Vấn đề là vì quả bóng đánh dấu di chuyển nhanh hơn quả bóng mà nó đại diện, nó có thể bỏ lỡ một số va chạm sẽ xảy ra với quả bóng mà nó đại diện. Lý do là, tất nhiên, rằng bóng theo dõi sẽ di chuyển một khoảng cách lớn hơn giữa các khung.
Wolfgang Schreurs

Nếu bạn muốn độ trung thực cao hơn, bạn có thể tính toán lại vị trí bóng theo dõi hai lần trên mỗi khung và giảm một nửa tốc độ cho mỗi phép tính.
DDR

22

Các trò chơi Pông mà tôi đã chơi dường như hành xử theo cách sau: Người chèo thuyền được điều khiển bằng AI biết quả bóng sẽ đánh vào đâu nhưng bị giới hạn về tốc độ có thể đạt đến vị trí đó. Vì vậy, đôi khi nó bỏ lỡ. Tôi nghĩ rằng đây là cách rõ ràng nhất để làm điều đó.


Điều này. Không giúp AI biết quả bóng sẽ chạm vào đâu nếu nó chỉ có thể di chuyển, giả sử, 3px trên mỗi khung hình và nó phải di chuyển từ trên xuống dưới.
KeithS

14

Khi tôi tạo một bản sao gần như cực kỳ tuyệt vời trên TI83 của mình? Máy tính, vấn đề lớn nhất tôi gặp phải là "bóng ma" quá nhanh. Tôi phải làm chậm chúng lại bằng cách nào đó. Vì vậy, tôi đặt một tội lỗi lớn (cos (tan (tọa độ x))) ở đó. Các cấp độ dễ hơn sẽ thực hiện phép tính đó một vài lần và các cấp độ khó hơn sẽ chỉ thực hiện một trong các thao tác.

Vấn đề là, THỜI GIAN PHẢN ỨNG. Nghiên cứu thời gian phản ứng điển hình của con người là gì và thêm 10ms vào đó. Sử dụng đó như là một điểm khởi đầu. Khi các cấp độ trở nên khó khăn hơn, hãy loại bỏ thời gian khỏi thời gian phản ứng ... có thể đơn giản Thread.sleep(time);đối với AI. Đợi khoảng thời gian đó trước khi AI bắt đầu di chuyển.

Bạn cũng có thể kiểm soát tốc độ di chuyển của mái chèo, hoặc, nếu bạn THỰC SỰ muốn phức tạp, hãy xác định bóng sẽ dựa vào mức độ thông tin khác nhau ... chỉ nói 2 pixel thay vì một vectơ. Thêm bộ điều chỉnh góc vào các bức tường để thêm một mức độ ngẫu nhiên, buộc AI phải tính toán lại.


2
Bạn có thể giải thích tại sao chính xác bạn sử dụng sin(cos(tan(x)))?
nullpotent

5
bởi vì tôi còn trẻ, ngu ngốc và trên TI83, sin (cos (tan (x))) đã tạo ra một đơn vị độ trễ tốt trong AI. Ngoài ra, theo hiểu biết tốt nhất của tôi, máy tính không có lệnh chờ có thể sử dụng mili giây. Có lẽ một số sự rõ ràng: Tôi đã không sử dụng tập hợp hoặc tập lệnh vi mô hoặc bất kỳ ngôn ngữ nào bạn có thể biên dịch để chạy trên những thứ đó. Tôi đã sử dụng mã lập trình trong phần sụn (nút prgm). Tôi đã có MAXIMUM 8 dòng mã trên màn hình tại bất kỳ thời điểm nào. Tôi không thể nhớ bất cứ điều gì phức tạp hơn cho một thời gian trễ.
Russell Uhl

2
Tôi đã học cách lập trình trên mã trong phần sụn của TI83. Sau đó tôi phải học lại chương trình có cấu trúc trong C ++. Tôi muốn nói TI83 đã dạy cho tôi mã chuỗi spaghetti là gì và tại sao nó xấu. Tôi đã không sử dụng một tuyên bố goto kể từ đó. Thời gian tốt đẹp
ContextSwitch

2
Chúa ơi, gotos. Tôi xem lại mã mỗi lần và sau đó .... và nhanh chóng bỏ cuộc. Tôi không biết làm thế nào tôi quản lý để lập trình điều này trong một vài tuần trong các lớp học toán của tôi.
Russell Uhl

1
Không cần phải phòng thủ về sự chậm trễ trig của bạn. Toán học dấu phẩy động trong một vòng lặp là một cách phổ biến để tạm dừng các chương trình được viết cách đây vài thập kỷ và hiệu suất / khả năng của máy tính của bạn phù hợp với một máy tính thời kỳ đầu thập niên 80.
Dan Neely

6

Nếu bạn chỉ đơn giản là làm chậm mái chèo, thì bất cứ khi nào bạn đánh bóng ở góc nhọn (nghĩa là di chuyển lên xuống nhiều thay vì thẳng sang phía bên kia), máy tính sẽ hầu như luôn bỏ lỡ vì bóng đang di chuyển lên / xuống nhanh hơn mái chèo có thể bù.

Thay vào đó, những gì tôi sẽ làm là chơi với tốc độ của mái chèo, và điểm mà AI phản ứng. Ví dụ:

  • khi người dùng đánh bóng
    • AI có thể phản ứng ngay lập tức và đi đến nơi bóng sẽ đến. Nếu nó đủ nhanh, nó sẽ đến đó kịp thời
  • khi bóng đi qua giữa sân
    • AI phải đợi cho đến khi nó băng qua giữa sân trước khi phản ứng

Một điều khác để thay đổi là cách AI phản ứng. Bạn đã nêu bật một chiến lược mà mái chèo luôn di chuyển đến vị trí mà bóng sẽ ở. Một người không thể luôn luôn làm điều đó. Họ có nhiều khả năng theo bóng lên xuống, không biết chính xác bóng sẽ ở đâu khi nó đến với họ do tất cả các cú nảy.

Do đó, một phương pháp phản ứng của con người hơn là luôn luôn tiến về phía quả bóng. Ví dụ, nếu quả bóng đang di chuyển lên, thì mái chèo di chuyển lên. Nếu mái chèo đủ nhanh, nó có thể phản ứng với các cú nảy ra khỏi đỉnh và đáy. Nếu nó chèo không đủ nhanh, thì nó sẽ bù quá mức bằng cách di chuyển lên khi bóng di chuyển lên, nhưng sau đó khi nó nảy lên, mái chèo có thể không thể di chuyển xuống đủ nhanh.

Cuối cùng, bạn cũng có thể chơi với kích thước mái chèo để tăng / giảm độ khó.


2

Một yếu tố cần xem xét là tính ngẫu nhiên - người chơi con người luôn có một số mức độ khác nhau trong cách chơi của họ, vì vậy nếu bạn muốn AI của mình trông giống con người thì bạn cũng muốn có một số biến thể trong cách chơi của họ.

Bạn có thể thiết lập phạm vi cho:

  • Thời gian phản ứng (AI bắt đầu di chuyển nhanh như thế nào)
  • Tốc độ (AI di chuyển mái chèo nhanh như thế nào)
  • Độ chính xác (AI sẽ tiến gần đến nơi mà nó thực sự muốn di chuyển mái chèo của họ, tạo cơ hội để cởi quần áo hoặc vượt quá nơi họ muốn)

Sau đó, trên mỗi đòn tấn công của đối thủ, AI có thể chọn một giá trị trong các phạm vi đó và đưa ra quyết định (và chuyển động) dựa trên đó. Đối với các đối thủ AI dễ dàng hơn, bạn có thể làm cho các phạm vi đó trở nên khá nghèo nàn, nhưng cũng có phạm vi rộng để cung cấp cho AI một số "bức ảnh may mắn". Đối với các đối thủ khó khăn hơn, bạn có thể thắt chặt các phạm vi đó và đặt tất cả chúng trong phạm vi "tốt".


2

Tôi sẽ đề xuất một giải pháp tổng quát hơn mà không cụ thể chỉ là pong. Tôi tin rằng điều này có thể được áp dụng cho bất kỳ trò chơi nào - không chỉ pong. Bạn muốn con người thích hành vi, phải không? Vì vậy, một con người có thể cảm thấy như họ đang chơi một con người ... và do đó bằng cách mở rộng hy vọng sẽ giành chiến thắng. Vậy bạn làm gì?

Quan sát một con người! Làm thế nào một người chơi có thể thua tại pong? Chà, nếu chúng ta xem hai người chơi pong thì điều đó khá rõ ràng. Thông thường, mất mát là vì bóng đơn giản là quá nhanh và thời gian phản ứng của người chơi bị trì hoãn. Đó là hai thông số, một trong số đó có thể điều chỉnh. Cái khác là người chơi có khả năng bấm đúng hướng. Vì vậy, bạn có tần số lỗi và tần số phản ứng - cả hai có thể được điều chỉnh tùy thuộc vào độ khó.

Một AI dễ dàng sẽ có độ trễ đầu vào cao hơn và có xu hướng mắc lỗi ngẫu nhiên nhiều hơn - khi mà một AI khó khăn hơn sẽ được điều chỉnh để làm cho các tham số này trở nên khó khăn.

Điều này có thể được áp dụng cho gần như bất kỳ trò chơi nào - ngay cả một trò chơi như tic tac toe hoặc các mô hình phức tạp hơn. Cách tiếp cận này phá vỡ trong các kịch bản phức tạp hơn nhưng nó đủ để các trò chơi trong đó số lượng tham số và phạm vi hẹp.


1

Dưới đây là danh sách một vài tùy chọn, một số trong đó đã được đề cập:

  • Làm cho người chơi máy tính thông minh hơn nhắm bóng để người chơi khó tiếp cận hơn với nhiều cú nảy và làm điều ngược lại cho các đối thủ dễ chơi.
  • Một người chơi thông minh sẽ di chuyển mái chèo của họ về phía giữa trong khi quả bóng đang trên đường tới đối thủ và họ không biết nó sẽ quay về đâu.
  • Trước khi nảy lần cuối, con người khó dự đoán bóng sẽ kết thúc ở đâu. Làm cho AI có một sự thiếu chính xác tương tự.
  • Giới hạn tốc độ của mái chèo để nó chậm hơn quả bóng. Nó cần phải ít hơn một nửa tốc độ dọc để bỏ lỡ với chơi hoàn hảo.
  • Tăng tốc độ của bóng dựa trên độ khó, thời lượng trận đấu, v.v.
  • Con người không phản ứng tức thời. Người chơi AI cũng không nên.
  • Cho AI cơ hội ngẫu nhiên mắc lỗi và bỏ lỡ bóng.

0

Tôi cũng đã làm một bản sao nhỏ của Pông (trong LUA).

AI của tôi rất đơn giản nhưng nó không tệ đến thế, imho.

Tôi chỉ kiểm tra vị trí y của quả bóng và nếu thấp hơn tôi di chuyển mái chèo xuống, nếu cao hơn tôi di chuyển mái chèo lên.

Sau đó, để tinh chỉnh độ khó, tôi tăng hoặc giảm khoảng cách từ quả bóng mà từ đó mái chèo máy tính bắt đầu di chuyển.

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.