Lập trình game caro các bước xây dựng

42 6.9K 52
Lập trình game caro các bước xây dựng

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Các bước xây dựng game caro - kỹ thuật lập trình

Các bước xây dựng game caro Giới thiệu - Trò chơi đối kháng (two-agent,conflicting game ) : Gồm người chơi, đối thủ tìm cách dành chiến thắng trước đối thủ số hữu hạn nước đi, nước đuợc tạo dựa từ trạng thái trận đấu Nếu sau số giới hạn nước đi, chưa dành chiến thắng xem hồ Ngồi ra, thơng tin trận đấu hoàn toàn biết đuợc (perfect information) đối thủ - Cờ Carô (hay gọi Gomoku ) loại trò chơi đối kháng, đối thủ lượt chọn trống cịn lại bàn cờ (kẻ sẵn ô lưới ) cho tạo thành n liên tiếp để chiến thắng Nếu n = có tên khác Tic Tac Toe , bổ sung thêm luật cho đổi tên Penta,Pentix (có ăn qn) Ngồi ra, có luật thi đấu mà người ta chứng minh đuợc người truớc cung có thuật tốn để thắng (thơng tin đáng tin cậy khơng em hơng biết em có đọc qua tài liệu hì hì hì ), để hạn chế thuận lợi người trước, người ta đặt "luật rừng" sau ( luật sử dụng cho trình phát triển chương trình ) : + Bàn cờ có kích thước tuỳ ý NxN, chọn n = 16; + Quân cờ phải đánh lưới bàn cờ + Nếu tồn liên tiếp hàng thắng (chéo,ngang,dọc) [*] + Nếu hết chỗ bên hồ + Và số luật khác, để đon giản, em dẹp [*] : Luật gắt sau : Đúng không bị chặn hai đầu em để dành cho bác cải tiến Thuật ngữ Anh Việt - Để tiện cho bác đọc sau này, em xin giới thiệu số thuật ngữ sau, dĩ nhiên mớ em tự dịch xem tài liệu nên khơng tránh đuợc sai sót chưa xác mong bác thơng cảm góp ý (1) Giới thiệu khơng gian tìm kiếm nước : - Như bác biết, trò chơi Caro, sau nước cờ, đối thủ chọn từ ô trống (empty - not occupied) để đi, đó, sau nước số trống cịn lại giảm Như vậy, việc tìm nước cho trạng thái có sẵn việc tìm kiếm trống cịn lại, đồng thời, khơng gian tìm kiếm thu hẹp theo số nước tạo Em nói đến điều để sau cải tiến thêm việc gia tăng độ sâu tính tốn cho chương trình nước cờ tàn Như vậy, để chọn nước từ trạng thái bàn cờ có sẵn, ta phải tìm kiếm nước - Không gian chọn nước từ trạng thái ban đầu hữu hạn, khơng gian tìm kiếm (searching space) nước dẫn đến chiến thắng hữu hạn ln (? hì ? hì ? hì ) rõ ràng số lượng phần tử hai không gian đuợc so sánh giống hạt cát sa mạc ( tập số tự nhiên vô hạn đếm đuợc, tập số hữu tỉ vô hạn đếm đuợc mà số lượng phần tử Q so với N trời vực ) Do ta khơng thể vét khơng gian tìm kiếm nước ( làm đuợc điều làm cịn giải cờ cần học thuộc cờ xong ) mà ta phải giới hạn khơng gian tìm kiếm - Một khơng gian tìm kiếm thực theo dạng đa phân bình thường Data Struct định nghia, lúc đuợc gọi tìm kiếm, trò chơi ( Searching Tree,Game Tree), nút (Node) mức thể lựa chọn nước có sẵn, mức (Ply) thể cho việc đánh giá khoảng cách từ nút gốc đến nút Nếu số nút mức nhiều, tức có nhiều khả chọn lựa nước từ trạng thái trước, độ phân nhánh ( Branching factor) lớn - Dựa vào trò chơi định nghĩa trên, việc tìm kiếm nước chọn nút ( mức 1) cho nước tốt ( tốt đuợc hiểu đánh giá thui, nước tốt nước phụ thuộc trình độ, khả người chơi cờ ), theo thông thường chơi, nước tốt hay không phụ thuộc vào khả dành chiến thắng cao hay thấp sau nước đuợc "made" (tức "đi"), đó, muốn chọn nước tốt dựa vào cờ chưa đủ, mà phải biết thông tin cờ sau chọn nước để Ví dụ chơi trị Carơ, bác lại chọn nước vào ô để chận đuờng hở hai đầu đối thủ (Opponent, Enemy) bác biết khơng nuớc thua nửa nước tiếp theo, tức trạng thái thua chưa biết đuợc sau chọn ô khác để xuất phát trạng thái Khái niệm độ sâu cung nảy sinh từ đây, đon giản độ sâu (Depth) khả "nhìn thấy trước" (looking ahead) nước tốt sau loạt nước xuất phát từ , ví dụ từ trạng thái này, bác nhận biết đuợc sau thắng (tức bên con), độ sâu tính tốn bác >= [not 3], ví dụ cung chưa xác lắm, ví dụ khác nhá : trạng thái tại, bác chọn nuớc "tốt" theo tính tốn mình, bác dự đốn sau chưa thua, thực tế sau nuớc (mỗi bên con) bác bị thua ( hi hi hi ), đó, rõ ràng "thua" trạng thái mà bác không nhận thấy chọn nước tốt trên, tức độ sâu tính tốn bác trường hợp xác 3, cung gọi độ sâu lớn (Max Depth) mà bác đạt đuợc tìm kiếm Như vậy, Max depth thể khả & trình độ người chơi cờ, bác chơi hay giá trị lớn ( rõ ràng thằng độ sâu max chơi với thằng độ sâu max thằng (6) khơng ăn đuợc thằng (8), hiển nhiên ) Khi Max Depth = ==> No thinking ahead - Lại nói viết chương trình cho máy tính chơi cờ tức máy tính phải tự tìm nước đưa vào trạng thái bàn cờ bất kì, khơng gian tìm kiếm q lớn (coi vơ hạn) nên giới hạn cho máy tính chi tìm kiếm đến độ sâu mà thơi (cách thực giống chơi cờ thui ), độ sâu tìm kiếm lớn thể khả chương trình, cố gắng nâng cao giá trị cách cài đặt thêm tri thức cờ cho (Heuristic, Knowledge ), tức sau chạy chương trình, máy tính phải biết chọn nước tốt mớ trống cịn lại cho chưa bị thua sau loạt nước (= MAXDEPTH [not MAXDEPTH*2]) - Một số thuật ngữ[*] : Game Tree : trò chơi Searching Tree : Cây tìm kiếm Ply : mức (Level) Depth : độ sâu (max Ply) Iterative Deepening : Tìm kiếm sâu dần Quiescence depth : độ sâu tĩnh Branching factor : độ phân nhánh Parent Node : nút cha Children Node : nút Leave Node : nút Max Node : nút nước đối thủ Min Node : nút nước đối thủ vừa Evaluation : Sự lượng giá Evaluate : Lượng giá Static/Dynamic Evaluate : Lượng giá tinh/động Lazy Evaluation : Lượng giá lười Extension Knowledge - Extension Heuristic : Tri thức bổ sung Upperbound : Chận Lowerbound : Chận Make Move : Uýnh nước chọn NULL-Move : nước trống Move Ordering : Sắp xếp nội nước Move Generation : Sinh nuớc Capture : "Đớp" Generation Move : Nước Dangerous Gen-Move : Nuớc nguy hiểm (đe doạ) Winning thread : Nhánh dẫn đến thắng Straight four : bị chận đầu (XOOOO*, * ô trống) Opened three : Đuờng mở đầu (**OOO**,X*OOO** ) Broken three : đuờng gãy không bị chận đầu (*OO*O*) Winning line : Đuờng thắng (ví dụ : Straight four,Open three,Broken three ) Tranpositon Table : Bảng truyền Hash Table : Bảng băm Offense/Defense - Offensive/Defensive - Aggressive Attack : Các chế độ chiến đấu chương trình Prune, Pruning, Cut Off, : Cắt nhánh Horizontal Effect : Hiệu ứng đuờng chân trời,đuờng ngang Back Tracking : Quay lui tìm tới Opening Books : Mở Book-Database Search by MinMax/AlphaBeta/NegaScout/MTD(f)/PVS Algorithms : Các thuật tốn tìm kiếm [*] : Những thuật ngữ có mớ giới thiệu, mớ cịn lại đuợc giới thiệu Viết chương trình Game Gomoku a Mục tiêu : - Viết chương trình mà máy có khả "biết chơi" cờ carơ (tức biết uýnh luật hì hì ) - Chương trình phải đánh thắng người hơng biết đánh cờ carơ (biết đuợc đuờng thắng ), ngồi phải cho cao thủ người phải "e ngại" chương trình có tính người (có suy nghi đàng hồng) - Các khả cịn lại chương trình bác (dzí dụ : cài đặt để máy "uýnh" dzới máy, "uýnh" mạng, "uýnh" multiplayer : người chơi với máy bồ hi hi hi ) b Khởi động[*] : - Chọn cấu trúc liệu thích hợp để lưu trạng thái ô bàn cờ (lưu thông tin ơ) - Chọn CTDL thích hợp để lưu trạng thái bàn cờ : Board (dzí dzụ mảng chiều đặc, chiều, danh sách liên kết, cây, chuỗi ) - Chọn phương pháp đánh giá nước tốt nước nhu cho đon giản hiệu (Evaluation) - Chọn thuật tốn thích hợp để tìm kiếm nước (No thinking ahead, Simple Breadth First Search, Simple Depth First Search, MinMax, AlphaBeta, NegaScout, MTD(f), PVS ) - Chọn phương pháp cải tiến để nâng cao khả choi cờ (Heuristic : Opening books, Iterative Deepening, Lazy Evaluation, Knowledge Base, Static/Dynamic Evaluation, Winning Threads,Best score, Best move, Deep thought, Quiescence Depth, Transition Table, Hash Table, Score Table ) - Chọn loại ngơn ngữ lập trình để thực (C,C++,C#,Pascal,Object Pascal,Basic,Java ) - Tối ưu hoá chọn lựa thành thể thống c Phân tích thiết kế giải thuật d Hiện thực chương trình e Dạy cho chương trình ( Machine Learning): tay, mạng neural f Xách gà đá : tổ chức thi nho nhỏ chương trình [*] : Ghi : - Em trình bày phần a,b,c,d,e Cịn fần f dành cho Admin bác Mod đuợc - Chương trình dùng Alpha Beta để tìm kiếm, kỹ thuật cịn lại nói sơ wa - Các kĩ thuật phần cải tiến nâng cao chương trình cờ, em trình bày số, số cịn lại em trình bày kỹ thuật, ý tưởng thui !(do em em nhường lại cho bác khác Post lên thảo luận ) - Em dùng C/C++ for DOS (WIN-Console) để giải wuyết vấn đề - Ở phần e), trình độ có hạn nên em luyện cho chương trình tay, cịn dùng mạng Neural dính tới TTNT nhiều wá mà em chưa biết rõ, đợi em hiểu "múa mỏ" hic,hic Viết chương trình chơi Caro - Phần PHÂN TÍCH VẤN ĐỀ - Như đề cập trước, để tiện cho việc testing, designing, improvement optimizing em sử dụng C++ for DOS để thực, trình biên dịch cụ thể MS VC++ 6.0 Chương trình thực nhiều lớp bác "thừa kế" để viết cho số chương trình cờ khác : Cờ vua(Chess or King Chess),cờ tướng(Chinese Chess) nói chung việc thiết kế cho hướng đối tượng - Sẽ có câu hỏi nhỏ đặt : + Q1: Tại lại C++? ==> A: Đơn giản ngơn ngữ lập trình mà em thành thạo (trong số ngôn ngữ mà em biết hic ) có lẽ ngơn ngữ "đại chúng" (vì học việc tạo cho để học tiếp ngơn ngữ khác sau biết Pascal!) + Q2: Tại lại Object Orient? ==> A: Vì để tiện cho phát triển sau này, chương trình phát triển cách thoải mái "inherit" từ lớp Các bác chưa wen dzới lập trình hướng đối tượng hơng seo từ từ mà học hì hì hì + Q3: Tại C++ for DOS ? ==> A: Có lẽ câu hỏi khó trả lời, mà dễ dàng nhận điều "Tốt gỗ tốt nước sơn" cụ thể "ruột" khơng vẻ bề ngồi xếp vào hạng "lơng" thui khơng hạng "fly" nữa! Em nói điều lý do, thứ có nhiều chương trình đánh khơng (hic, nói tục "bèo cục c mèo!") mà lo làm giao diện tùm lum,tà la khơng cả! thứ hai chương trình Gomoku em thiết kế đánh không ai, với ruột dzậy rùi làm vỏ cho đẹp làm chi, chừ mừ bác cải tiến cho nh "trâu" lúc lo làm thứ râu ria cho Package-Release Tuy nhiên hì hì lý khác giao diện Windows đơi lúc làm em bác bối rối em hứa cố gắng hết loạt có source for Win với đầy đủ "strength power like a buffalo" cho bác! Nói nhỏ nhe : em hay thất hứa hì hì - Kết thúc cho vấn đề lời "nhỏ to tâm sự" : hic q trình phân tích thiết kế sau này( mà có lẽ đây), class mà em đưa chưa hợp lý với tơn "thiết kế hướng đối tượng", đó, bác góp ý em cố gắng xem xét sửa đổi hi vọng bác khơng "refuse" Nào, nói câu tiếng Anh chơi : "thanh kjù du"! THIẾT KẾ MỘT CHƯƠNG TRÌNH GOMOKU TỔNG QUÁT - Bi vào phần phân tích-thiết kế chương trình cho dzui dzui tí, em cố gắng trình bày "chi chít" ý lộn ! "chi tiết" cách thiết kế lớp, mã nguồn chưa tối ưu chạy rầm rầm hề việc tối ưu làm sau chương trình hồn chỉnh - Chương trình thiết kế dựa lớp, lớp sau : CBaseSearching, CAlphaBeta, CCell, CNode, CBoard, CGomokuInterface, CGomoku Cái q đơn giản nên hơng cần Hierarchy chart * Giải thích : - Lớp CBaseSearching: lớp tích lũy tính cho chế searching for moves ( tìm kiếm nước đi) Đây base class chưa đầy đủ tính để đáp ứng cho cơng việc trên, hầu hết member virtual cháu tự "múa máy", nhiên cháu nhiều có đầy đủ phương thức để tương tác với bạn bè đồng nghiệp Các lớp cháu thừa kế để tạo khả (ability) tìm kiếm theo thuật tốn khác ví dụ bác thấy loạt cháu thằng CNoThinkingAhead, CExhaustiveSearch, CMinMax, CMTDf, CAlphaBeta, CNagaScout - CAlphaBeta: nói trên, lớp kế thừa từ lớp CBaseSearching có nhiệm vụ tìm kiếm nước cho chương trình theo thuật tốn tìm kiếm cổ điển Alpha-Beta Prunning Vì chương trình phiên "bèo" nên có khả tìm kiếm Alpha-Beta, phần cịn lại bác Nếu sau muốn cải tiến bác việc kế thừa từ CBaseSearching thêm số đặc trưng cho searching algorith bác (như em gợi ý ) - Lớp CCell phần thực cho cấu trúc ô bàn cờ, bao gồm thơng tin điểm đối phương (Score of Friend and Enemy), trạng thái ô (Status of cell), cờ Carơ trạng thái EMPTY,HUM,COM,HEDGE (tức rỗng, bị chiếm, vùng "bờ giậu", kỹ thuật Hedge nói đến thực ) Và câu hỏi đặt lại chọn cách thiết kế ? Đó để phù hợp với tư tưởng "OO" tức Object Orient, sau lỡ bác chuyển wa viết cờ tướng hay cờ vua đơn giản thay đổi thông tin ô thành trường khác phù hợp với chương trình cờ SCORES,CAPTURE:(HAS_BEEN_CAPTURE, OCCUPIED), STATUS:(EMPTY,ANY_PIECES_OF_HUM or COM or MAN ) xài lại lớp - CNode: lớp đáng quan tâm "cốt lõi" việc tìm kiếm nước đi, Node node tìm kiếm ( Game-Tree, Searching Tree), Node nước thơng tin Node chứa CCell, CNode có nên kế thừa từ CCell hay khơng ? Câu trả lời theo em không ( mà hông biết giải thích sao, hì hì ) mà nên thêm trường "CCell cell;" phần member attribute CNode Cách thiết kế tạo nên tính linh động cho node, khơng thiết phải dạng nước cụ thể mà đơn giản "node" tìm kiếm với property khác Nói nói kế thừa từ CCell hợp lý Chờ đánh giá bác cho vấn đề - Bi lớp CBoard, lớp wen thuộc thiết kế trò chơi Board (như : loại cờ, puzzle, brick-game, destroy-ship (bắn tàu) trị chơi mang tính "chiến thuật ô lưới" máy super lẫn vi tính Mộc đế chiến kỳ, Heroes thiết kế zdậy, khác Board chứa đối tượng "animate" hơng phải đơn giản số 0,1 em mà thui!!!) Thấy em xạo có lợi hại hơng ? hí hí nói cho vui thơi CBoard chứa mảng CCell, kích thước mảng kích thước bàn cờ dzí dzụ ta khai báo "CCell board[BOARD_SIZE];", dzới BOARD_SIZE kích thước bàn cờ ... chương trình chưa thật hồn thành, có phương thức giao diện (very simple) cách thức chơi xây dựng, vấn đề trọng tâm (tức máy chơi ) trình bày tiếp vấn đề đáng để sâu vào - Vì phần xây dựng cho... Thơi muốn biết chương trình tiếp diễn xem hồi sau rõ Viết chương trình chơi Caro - Phần Trong phần này, để thực cho phân tích trên, em trình bày chương trình cụ thể test thử cách đánh chế độ "HUM... Orient? ==> A: Vì để tiện cho phát triển sau này, chương trình phát triển cách thoải mái "inherit" từ lớp Các bác chưa wen dzới lập trình hướng đối tượng hơng seo từ từ mà học hì hì hì +

Ngày đăng: 18/08/2012, 12:02

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan