TRÒ CHƠI GAME CARO
1-Cách tạo một chương trình caro & cách chơi
_Chương trình gồm có
+ Lớp frmMain – cửa sổ chính của chương trình.
+ Lớp frmOption – cho phép ngươi chơi đánh trước hay sau
+ Lớp EvalueBoard – lớp dùng để thiết lập một bảng lượng giá cho các loại bàn cờ !
+ Lớp GomokuBoard – Bàn cờ caro, chứa một lớp bao EvalueBoard.
2-Thuật Toán:
+ Đối với những trò chơi thuộc dạng Game Board, để thiết lập khả năng tự chơi với người nó phải có 2 điều kiện : Kinh nghiệm và độ thông minh.
1/. EvalueBoard – Lượng giá tĩnh thế cờ : Đây là kinh nghiệm đánh giá thế cờ mà người viết nhập vào.
+ Ta duyệt từng lượt 5 ô liên tiếp trên hàng - , cột | , đường chéo lên / , đường chéo xuống /, lượng giá như sau:
· Gặp 1 quân ta > 4 * Gặp 1 quân địch.
· Gặp 2 quân ta > 4 * Gặp 2 quân địch.
· Gặp 3 quân ta > 4 * Gặp 3 quân địch.
· Gặp 4 quân ta > 4 * Gặp 4 quân địch.
_ Tùy theo kinh nghiệm của từng người mà ta có cách lượng giá khác nhau. Cộng dồn các giá trị lượng giá vào các ô trống trong 5 ô mà ta đang xét.
_ Đánh giá như vậy thì những ô nào sẽ có giá trị lượng giá lớn nhất ? – đó là những ô càng gần quân cờ được phát hiện thì giá trị càng lớn, đồng thời những ô giao nhau giữa 2 đường thì sẽ có giá trị lớn hơn => đó là ý nghĩa của việc cộng dồn… do có nhiều kỹ thuật lượng giá khác nhau ( Duyệt trên 9 ô, phát hiện các trường hợp giao nhau, phân tích từng trường hợp là những cách phức tạp và hao tốn nhiều CPU ).
2/. Kỹ thuật sinh nước đi – độ thông minh của máy :
_ Có khá nhiều kỹ thuật sinh nước đi cho Game Board, ở chương trình này ta dùng kỹ thuật sinh dần các nước đi – Increasing Generation.
+ Mã giả như sau :
* Search : Generate move-gen (step 0)
for (i = 0;i < BOARD_SIZE;i++)
if (IsLegalMove(i))
if (IsHasOutlook(i)) // có triển vọng ...
if (IsNotInGenMove(i)) StoreGenMove(i)
* Đưa vào Stack ... * Tăng chiều sâu và lặp lại cho đến khi đến chiều sâu giới hạn ==> Cắt nhánh ==> * Trở lại bước 0 + Kỹ thuật này khá hay, Một nhược điểm đó là chưa chắc tìm thấy một nước đi tốt nhất (vì nó đã lỡ cắt nhánh ở 1 nước đi mà tưởng rằng là tốt nhất, hiện tượng này cũng có thể gọi là "cực đại cục bộ") ...
- Ý tưởng : Từ trạng thái ban đầu, sinh 1 vài nước đi "nhạy cảm" (có triển vọng đưa đến chiến thắng), kiểm tra xem những nước đi này sau một vài độ sâu kế tiếp xem có thật sự là thắng chưa ? Nếu chưa thì tiếp tục sinh những nước đi khác rồi kiểm tra tiếp ...
- Phân tích : tính sâu vào những nước "tốt" (theo quan điểm của mình) để mong chờ search-algorithm cắt nhánh sớm trước khi mình tiếp tục sinh thêm những nước lằng nhằng khác ... Tuy nhiên, nếu ở 1 trạng thái nào đó, nước đi tốt không nằm ở trong số những nước đi có triển vọng thì mình vẫn phải tiếp tục sinh ... cách cài đặt sẽ trở nên phức tạp.
3/. Đánh giá:
_ Chương trình có khả năng dự đoán tối đa 21 nước đi.
_ Trong quá trình đánh chương trình sẽ thông báo khi nhìn thấy đường có thể thắng đối thủ - Chắc chắn khoảng 90% ( không thể 100% vì ta phải giới hạn chiều rộng phân nhánh để tránh các nước đi vô ích ). => đây chính là nhược điểm cần khắc phục => ta có thể dùng các biến toàn cục để kiểm tra đường thắng đó có chắc hay không, nhưng làm vậy tốn nhiều thời gian, và độ chính xác còn phụ thuộc vào cách đánh giá của người viết.
_ Đối với vài trường hợp đặc biệt ( chỉ xảy ra khi ta chọn đối thủ trình độ thấp ). Không chận các đường thua trước mắt… Nhưng vị trí mà mày đánh sẽ là đường đánh thắng của đối thủ trong nước kế tiếp – Tức là máy trong tình trạng thua chắc !
HÌNH ẢNH
THÔNG TIN TÁC GIẢ
Đinh Thị Hoàng Yến
Hà Duy Khang
Hoàng Đỗ Yến Linh
Phan Thanh Liêm
Trinh Chí Đức
TRƯỜNG ĐẠI HỌC LẠC HỒNG
KHOA CÔNG NGHÊ THÔNG TIN
LỚP 07CT_112_NHÓM_2
Nguồn: Sharecode.vn