2008-10-14 30 views
6

Tôi đã suy nghĩ về việc bắt đầu một dự án phụ ở nhà để luyện tập trí não của tôi một chút. Reversi trông giống như một trò chơi đơn giản, nơi tính di động có ảnh hưởng sâu sắc đến chơi trò chơi. Đó là ít nhất là một bước lên từ tic tac toe. Điều này sẽ là một cầu thủ duy nhất chống lại một AI của một số loại.Bạn sẽ làm thế nào để thực hiện trò chơi đảo ngược? (othello)

Tôi đang cố thử tính năng này trong C++ trên PC.

Tôi có khả năng gặp phải vấn đề gì?

Bạn sẽ giới thiệu thư viện đồ họa nào?

Tôi không đủ thông minh để tự hỏi mình?

+1

Bạn đang nói về việc triển khai chiến lược cho đảo ngược hay chỉ để hai người chơi phát trên máy tính? – Barth

+0

một chiến lược. câu hỏi hay. – EvilTeach

Trả lời

2

Nói chung, các vấn đề mà bạn sẽ kết thúc chạy sẽ phụ thuộc vào bạn và cách tiếp cận của bạn. Bạn bè có xu hướng nói rằng phức tạp là đơn giản từ quan điểm khác nhau.

Chọn thư viện đồ họa phụ thuộc vào loại trò chơi bạn sẽ viết? OpenGL là lựa chọn phổ biến trong loại dự án này, nhưng bạn cũng có thể sử dụng một số thư viện GUI hoặc trực tiếp chỉ sử dụng các thư viện riêng của windows hoặc xorg. Nếu bạn định làm gì đó, chỉ cần sử dụng OpenGL.

Câu hỏi bạn nên hỏi:

Lựa chọn hợp lý của C++ cho dự án này? Xem xét C và/hoặc python là tốt.Câu trả lời của tôi cho điều này sẽ là nếu bạn chỉ muốn viết đảo ngược, hãy đi python. Nhưng nếu bạn muốn học một ngôn ngữ cấp thấp, hãy làm C trước. C++ là một phần mở rộng đến C, do đó có nhiều thứ để học ở đó hơn là ở C. Và với thẩm phán của tôi, bạn càng phải học lên C++ thì không đáng để thử.

Bạn sử dụng thư viện đồ họa như thế nào? Nếu bạn định tạo hiệu ứng lạ mắt, hãy vào biểu đồ cảnh. Thay vào đó, bạn chỉ có thể hiển thị lưới đảo ngược bằng các nút trên đó.

Cách bạn triển khai giao diện người dùng, bạn có nên sử dụng các khái niệm giao diện người dùng chung không? Các khái niệm UI thông thường (cửa sổ, khung, nút, thanh thực đơn, hộp thoại) không tốt như mọi người nghĩ, có rất nhiều công việc trong việc triển khai chúng đúng cách. Áp dụng biểu đồ cảnh để giải thích đầu vào và thử các cách thông minh khác nhau để kiểm soát trò chơi. Tránh các menu giới thiệu (chúng là công việc ngu ngốc và vô dụng), sử dụng các đối số dòng lệnh cho hầu hết cấu hình.

Tôi chưa cung cấp cho bạn một số ý tưởng để giúp bạn bắt đầu:

Ban Othello là 8x8, 64 ô nói chung. Bạn có thể gán một byte cho mỗi ô, làm cho nó là 64 byte cho mỗi trạng thái bảng. Đó là 8 ints dài, không phải là rất nhiều ở tất cả! Bạn có thể lưu trữ toàn bộ tiến trình của trò chơi và người chơi thậm chí không thể nhận thấy nó. Do đó, nên thực hiện bảng othello như một cấu trúc bất biến mà bạn luôn sao chép khi bạn thay đổi trạng thái. Nó cũng sẽ giúp bạn sau này với AI của bạn và thực hiện một 'undo' -feature.

Vì một byte có thể lưu trữ nhiều thông tin hơn ba trạng thái (EMPTY, BLACK, WHITE), tôi khuyên bạn cũng sẽ cung cấp hai trạng thái bổ sung (BLACK_ALLOWED, WHITE_ALLOWED, BOTH_ALLOWED). Bạn có thể tính toán các giá trị này trong khi bạn sao chép trạng thái mới.

Thuật toán để kiểm tra nơi bạn có thể đặt khối, có thể đi từng bảng một, sau đó theo dõi từ ô trống đến mọi hướng cho mẫu regex: B + W => W ^, W + B => B^Bằng cách này, bạn có thể đóng gói các quy tắc trò chơi bên trong một giao diện đơn giản mà sẽ xử lý tất cả.

+1

Tư vấn kém. C++ không chỉ là một phần mở rộng, nó là một cách tiếp cận khác. Điều duy nhất họ thực sự chia sẻ là một số cú pháp, không quá C++ chia sẻ với javascript. C++ sẽ cung cấp cho bạn rất nhiều lợi ích, như quản lý bộ nhớ tốt hơn (thông qua tăng thậm chí), mẫu, đối tượng, v.v. sẽ giúp ích. Thật khó để theo dõi trạng thái chương trình mà không có đối tượng để trợ giúp, vì bạn không thể có dữ liệu độc lập, hoặc toàn cầu hoặc trên ngăn xếp trong C. –

3

Sự cố ...

Vâng, hãy chắc chắn khi viết phần chiến lược của trò chơi, không chỉ đơn giản là di chuyển mang lại cho bạn nhiều tác phẩm nhất. Bạn cũng phải cung cấp trọng lượng cho vị trí hội đồng quản trị. Ví dụ, với cơ hội để đặt một mảnh trong một góc bảng nên được ưu tiên hơn bất kỳ di chuyển khác (bên cạnh chiến thắng trong trò chơi) như mảnh đó không bao giờ có thể được quay trở lại. Và, đặt một mảnh liền kề với một điểm góc chỉ là về di chuyển tồi tệ nhất mà bạn có thể thực hiện (nếu không gian góc được mở).

Hy vọng điều này sẽ hữu ích!

2

Như đã đề cập bởi những người khác, tôi sẽ bắt đầu bằng cách hiểu sâu về cách chơi và chiến lược cũng như các thuật toán liên quan. Liên kết này có thể hữu ích đối với bạn, nó mô tả chiến lược Othello cơ bản và các thuật toán:

http://www.site-constructor.com/othello/Present/Basic_Strategy.html

2

Như những kẻ đã cho thấy ý tưởng của tôi nói cho bạn để suy nghĩ đầu tiên cho các thuật toán và logic trò chơi. Câu trả lời tiếp theo cho tôi là thư viện đồ họa, nó phụ thuộc vào nền tảng đích, ngôn ngữ lập trình, khung công tác của bạn. Nhưng như tôi đề nghị, hãy sử dụng C# với thư viện đồ họa Cairo 2D mà bạn có thể đạt được điều này bằng cách sử dụng khung Mono (sau đó bạn có thể nhắm mục tiêu cả ba các hệ điều hành chính để trò chơi của bạn hoạt động) -> www.mono-project.org. Trong khi đó tôi thấy điều này tôi nghĩ rằng và loại tài nguyên này sẽ giúp bạn: http://home.datacomm.ch/t_wolf/tw/misc/reversi/html/index.html. Nhưng nếu bạn hoàn thành việc này, bạn có thể thử triển khai Sudoku.

2

Bạn sẽ muốn xem xét minimax với việc cắt tỉa alpha-beta nếu bạn viết AI để chống lại. Công cụ tìm kiếm yêu thích của bạn sẽ có nhiều điều để nói về chủ đề này.

2

Sau khi bạn đã tự mình thực hiện bản thân trò chơi, hãy đọc chương 18 của cuốn sách nổi bật của Peter Norvig Paradigms of AI Programming. (Mã nguồn here.) Nó có một chương trình khá ngắn và cực kỳ dễ đọc, có thể đá vào bất kỳ mông nào của con người; bạn nên học rất nhiều bằng cách so sánh giải pháp của bạn với nó.

0

Reversi phải là một trò chơi rất đơn giản để triển khai. Nó là hoàn hảo để tìm hiểu một số thuật toán cơ bản của lý thuyết trò chơi (cụ thể là min-max) trong quá trình thực hiện AI.

Một điều cần lưu ý trên AI là hoàn toàn có thể tạo ra AI hoàn hảo cho Reversi (một chiến thắng luôn luôn thắng bất kể di chuyển của đối thủ của nó). Vì vậy, về mặt chiến lược, nếu AI của bạn bị mất, bạn vẫn có việc phải làm :)

+0

Tôi không chắc liệu điều này có đúng không nếu đối thủ cũng là AI . Wikipedia nói chơi hoàn hảo với trò chơi này được cho là kết thúc với một trận hòa. – Cheery

+0

Tôi không nhớ chính xác, nhưng có vẻ như với tôi rằng với hai người chơi AI, một trong những màu sắc luôn luôn thắng (Tôi không biết nếu nó là màu trắng hoặc đen), bởi chính xác một điểm. –

+0

Điều đó không đúng. Reversi chưa được giải quyết. –

0

Tôi đã viết một trò chơi đảo ngược nhiều năm trước, khi tôi còn ở trường. Chiến lược của nó là rất đơn giản, nó chỉ cho số lượng tối đa của miếng, nhưng trọng số để nó ưa thích các cạnh và đặc biệt là các góc và không thích hình vuông có nguy cơ cho đi các góc.

Điều này làm việc khá tốt đối với những người chưa làm việc ra những gì nó đã làm, nhưng một khi bạn đã có nó rất dễ sử dụng chiến lược của nó chống lại nó. Tuy nhiên, tôi không tự hào khi nói rằng nó đánh tôi vài lần đầu tiên mặc dù tôi đã viết nó!

Một AI thích hợp với một vài chuyển động của lookahead phức tạp hơn nhiều. Nên là một vấn đề thú vị, nhưng tại thời điểm đó tôi đã quan tâm nhiều hơn đến giao diện người dùng.

+0

Tối đa hóa dẫn trực tiếp đến sự mất mát sớm. – EvilTeach

1

Có rất nhiều thư viện trên mạng nhưng theo như tôi có thể nghĩ trò chơi của bạn sẽ cần thư viện sự kiện và đồ họa .... và thư viện âm thanh để vui hơn! Allegro 5 là lựa chọn tốt nhất ... Thư viện Tất cả trong một. http://liballeg.org/ dù được viết bằng ngôn ngữ C, bạn có thể tạo chương trình hướng đối tượng.

và Một hướng dẫn cho điều này ...

http://fixbyproximity.com/2d-game-development-course/

hoặc bạn có thể sử dụng các API cấp thấp như .. OpenGL cho đồ họa. OpenAL cho âm thanh. glfw cho các sự kiện.

nhưng OpenGL là một vấn đề lớn bởi vì bạn phải tạo bộ xử lý trang tính của riêng bạn và tất cả những thứ 2d đó.

Đi với allegro ... Hoàn thành trò chơi của bạn và sau đó đi cho OpenGL!

Các vấn đề liên quan