CÁC CÔNG CỤ HỖ TRỢ XÂY DỰNG PHẦN MỀM
Đặc tả bài toán
Xây dựng trò chơi cờ caro cho máy vi tính hoặc laptop với đầy đủ chức năng, xử lý thắng thua theo luật chơi Việt Nam Trò chơi cần có giao diện thân thiện, gần gũi với người dùng và đảm bảo hoạt động ổn định, tin cậy.
Lựa chọn công cụ
Xây dựng trò chơi cờ caro chạy trên máy vi tính hoặc laptop được viết bởi ngôn ngữ lập trình C# sử dụng công cụ lập trình Microsoft Visual Studio 2010 [1]
Hình 2.1: Giao diện của môi trường MS Visual 2010
Microsoft Visual Studio 2010 là một IDE mạnh mẽ từ Microsoft, cho phép phát triển ứng dụng cho hệ điều hành Windows, cũng như tạo ra các trang web, ứng dụng web và dịch vụ web.
The studio utilizes Microsoft's software development platforms, including Windows API, Windows Forms, Windows Presentation Foundation, Windows Store, and Microsoft Silverlight, enabling it to produce both machine code and managed code.
Visual Studio là một công cụ phát triển mạnh mẽ với trình soạn thảo mã hỗ trợ IntelliSense và cải tiến mã nguồn Nó tích hợp trình gỡ lỗi cho cả mã nguồn và mã máy, giúp lập trình viên dễ dàng phát hiện và sửa lỗi Ngoài ra, Visual Studio còn cung cấp các công cụ thiết kế cho giao diện ứng dụng, thiết kế web, thiết kế lớp và thiết kế giản đồ cơ sở dữ liệu, hỗ trợ tối đa trong quá trình phát triển phần mềm.
Nó hỗ trợ các plug-in mở rộng chức năng ở nhiều cấp độ, bao gồm việc tích hợp hệ thống quản lý phiên bản như Subversion và cung cấp các bộ công cụ mới cho biên tập và thiết kế trực quan, phù hợp với các miền ngôn ngữ cụ thể, cũng như các khía cạnh khác trong quy trình phát triển phần mềm.
Visual Studio hỗ trợ đa dạng ngôn ngữ lập trình, cho phép biên tập mã và gỡ lỗi cho hầu hết các ngôn ngữ Các ngôn ngữ tích hợp bao gồm C, C++, C++/CLI (thông qua Visual C++), VB.NET (thông qua Visual Basic.NET), C# (thông qua Visual C#) và F# (được hỗ trợ bởi Visual Studio).
Visual Studio 2010 hỗ trợ nhiều ngôn ngữ lập trình như J++/J#, Python và Ruby thông qua dịch vụ cài đặt riêng Ngoài ra, nó cũng tương thích với các công nghệ như XML/XSLT, HTML/XHTML, JavaScript và CSS Microsoft khẳng định rằng Visual Studio 2010 được phát triển dựa trên tiêu chí ALM độc lập, nhằm đáp ứng nhu cầu của nhà phát triển, thúc đẩy đổi mới ứng dụng và theo kịp các xu hướng công nghệ mới.
Hãng phần mềm đang có kế hoạch "phá bỏ hàng rào ngăn cách" giữa các đối tượng tham gia vào chu trình phát triển và vòng đời ứng dụng, bao gồm kiến trúc sư phần mềm, nhà phát triển và chuyên gia thử nghiệm.
Architectural Explorer là một tính năng mới khác trong phiên bản Visual Studio
Vào năm 2010, VSTS 2010 giới thiệu tính năng cho phép các nhà kiến trúc phần mềm xây dựng mô hình đồ họa, thể hiện rõ mối liên hệ và tính độc lập của từng phần mã nguồn Ngoài ra, phiên bản này còn tích hợp quy trình thử nghiệm ứng dụng mới, giúp loại bỏ các lỗi có thể tái diễn và cải thiện tính bảo mật cho ứng dụng.
Có chức năng đi lại và tải lại màn hình
Kêt thúc trận đấu khi thắng thua đã được quyết định và tải lại bàn cờ mới để chơi ván đấu mới
4 Tiềm năng cần khai thác và phương hướng phát triển
Phần mềm trò chơi cờ caro chỉ đáp ứng các yêu cầu giải trí cơ bản, nhưng vẫn thiếu sự phấn khích và có thể dẫn đến nhàm chán khi người chơi tương tác với máy hoặc với nhau Trong bối cảnh internet phát triển mạnh mẽ, nó đã trở thành một phần không thể thiếu trong cuộc sống, kết nối người dùng và tạo điều kiện cho việc trao đổi thông tin mà không còn bị rào cản về khoảng cách địa lý.
Mạng Internet mang lại nhiều lợi ích, mở ra tiềm năng lớn cho phát triển phần mềm Để tận dụng những lợi ích này, chúng ta cần tập trung vào việc phát triển phần mềm thông qua lập trình mạng Socket.
Vậy lập trình socket là gì ?
Lập trình socket là phương pháp cho phép kết nối giữa các máy tính để truyền tải và nhận dữ liệu qua mạng Socket được thiết lập thông qua địa chỉ mạng, giúp thiết lập giao tiếp hiệu quả giữa các thiết bị.
IP và cổng Port là giao diện lập trình ứng dụng cho phép thiết lập các kênh giao tiếp giữa hai đầu kênh được xác định bởi các cổng port Thông qua các cổng này, máy tính có thể nhận biết dịch vụ nào đang được sử dụng.
Có 2 loại socket gồm : TCP/UDP
TCP/IP : Giao thức mạng truyền tin cậy ( thường được sử dụng cho các dịch vụ đòi hỏi trong quá trình trao đổi ,dữ liệu phải được toàn vẹn)
UDP : Giao thức mạng truyền tin không tin cậy ( chỉ sử dụng cho các trường hợp trao đổi dữ liệu không quan tâm tới sự toàn vẹn dữ liệu)
Hình 2.3 : Mô hình Client – Server
Mô hình Client/Server là một cấu trúc phổ biến, cho phép một server kết nối với nhiều server khác để nâng cao hiệu suất Khi nhận yêu cầu từ client, server có thể chuyển tiếp yêu cầu đến server khác, chẳng hạn như database server, nếu nó không thể xử lý yêu cầu đó Server có khả năng thực hiện các nhiệm vụ từ đơn giản đến phức tạp; ví dụ, khi client yêu cầu thông tin về thời gian, server sẽ xử lý yêu cầu theo tiêu chuẩn đã định và trả lại thông tin cần thiết Mặc dù có nhiều dịch vụ server hoạt động trên mạng, tất cả đều tuân theo nguyên tắc nhận yêu cầu từ client, xử lý và trả kết quả Thông thường, server và client hoạt động trên hai máy khác nhau, và quá trình tương tác giữa chúng bắt đầu từ phía client khi gửi tín hiệu yêu cầu.
Mô hình P2P ( Mạng ngang hàng ):
Hình 2.4 : Mô hình mạng ngang hàng P2P
Mạng ngang hàng (peer-to-peer network) là một loại mạng máy tính mà hoạt động chủ yếu dựa vào khả năng tính toán và băng thông của các máy tham gia, thay vì tập trung vào một số máy chủ trung tâm như mạng truyền thống Mạng đồng đẳng thường được sử dụng để kết nối các máy thông qua các kết nối ad hoc Các ứng dụng phổ biến của mạng ngang hàng bao gồm chia sẻ tệp tin (âm thanh, hình ảnh, dữ liệu) và truyền dữ liệu thời gian thực như điện thoại VoIP.
Một mạng đồng đẳng thực sự không phân biệt máy chủ và máy khách; tất cả các máy đều bình đẳng và được gọi là peer, với vai trò đồng thời là máy khách và máy chủ Khi áp dụng vào việc phát triển tiềm năng cho phần mềm trò chơi cờ caro, có hai hướng đi quan trọng cần chú ý.
Phát triển lập trình mạng theo mô hình Client – Server
Phát triển lập trình mạng theo mô hình Client – Server kết hợp với P2P
4.1 Phát triển theo hướng áp dụng mô hình Client – Server
Tiềm năng cần khai thác và phương hướng phát triển
Phần mềm trò chơi cờ caro, dù đáp ứng yêu cầu giải trí cơ bản, vẫn chỉ là một trò chơi giữa người chơi và máy hoặc giữa người chơi với nhau, dẫn đến sự nhàm chán theo thời gian Trong bối cảnh internet phát triển mạnh mẽ, nó đã trở thành công cụ kết nối người dùng, cho phép trao đổi dữ liệu và thông tin mà không bị giới hạn bởi khoảng cách địa lý.
Mạng Internet mang lại tiềm năng lớn cho phát triển phần mềm, đặc biệt khi áp dụng lợi ích của nó Do đó, chúng ta cần tập trung vào việc phát triển phần mềm theo hướng lập trình mạng Socket để tận dụng tối đa những cơ hội này.
Vậy lập trình socket là gì ?
Lập trình socket là phương pháp cho phép kết nối giữa các máy tính để truyền tải và nhận dữ liệu qua mạng Socket được thiết lập thông qua địa chỉ IP, giúp các thiết bị giao tiếp hiệu quả.
IP và cổng Port là giao diện lập trình ứng dụng cho phép thiết lập kênh giao tiếp giữa hai đầu kênh được đánh dấu bởi các cổng port Qua cổng port, máy tính có thể nhận biết dịch vụ nào đang được sử dụng.
Có 2 loại socket gồm : TCP/UDP
TCP/IP : Giao thức mạng truyền tin cậy ( thường được sử dụng cho các dịch vụ đòi hỏi trong quá trình trao đổi ,dữ liệu phải được toàn vẹn)
UDP : Giao thức mạng truyền tin không tin cậy ( chỉ sử dụng cho các trường hợp trao đổi dữ liệu không quan tâm tới sự toàn vẹn dữ liệu)
Hình 2.3 : Mô hình Client – Server
Mô hình Client/Server là một cấu trúc phổ biến, trong đó một server có thể kết nối với nhiều server khác để nâng cao hiệu quả và tốc độ xử lý Khi nhận yêu cầu từ client, server có khả năng chuyển tiếp yêu cầu đó đến một server khác, chẳng hạn như database server, nếu nó không thể xử lý yêu cầu trực tiếp Server có thể thực hiện các nhiệm vụ từ đơn giản đến phức tạp, ví dụ như cung cấp thông tin về thời gian hiện tại khi client gửi yêu cầu theo tiêu chuẩn đã định Các dịch vụ server trên mạng hoạt động theo nguyên lý nhận yêu cầu từ client, xử lý và trả kết quả Thông thường, chương trình server và client được chạy trên hai máy khác nhau, và mặc dù server luôn sẵn sàng nhận yêu cầu, quá trình tương tác thực sự bắt đầu từ phía client khi gửi tín hiệu yêu cầu đến server.
Mô hình P2P ( Mạng ngang hàng ):
Hình 2.4 : Mô hình mạng ngang hàng P2P
Mạng ngang hàng (peer-to-peer network) là một loại mạng máy tính mà hoạt động chủ yếu dựa vào khả năng tính toán và băng thông của các máy tham gia, không tập trung vào một số máy chủ trung tâm như các mạng thông thường Mạng đồng đẳng thường được sử dụng để kết nối các máy qua các kết nối ad hoc và có nhiều ứng dụng đa dạng Ứng dụng phổ biến nhất của mạng này là chia sẻ tệp tin, bao gồm âm thanh, hình ảnh, dữ liệu, và truyền dữ liệu thời gian thực như điện thoại VoIP.
Một mạng đồng đẳng thực sự không phân biệt giữa máy chủ và máy khách, với tất cả các máy tham gia đều bình đẳng và được gọi là peer Mỗi nút mạng vừa đóng vai trò là máy khách, vừa là máy chủ cho các nút khác Trong việc phát triển tiềm năng từ phần mềm trò chơi cờ caro, có hai hướng đi quan trọng cần lưu ý.
Phát triển lập trình mạng theo mô hình Client – Server
Phát triển lập trình mạng theo mô hình Client – Server kết hợp với P2P
4.1 Phát triển theo hướng áp dụng mô hình Client – Server
Chúng ta cần phát triển một hệ thống máy chủ (Host) để lưu trữ và quản lý dữ liệu, cho phép người dùng kết nối và chơi game trực tuyến Điểm khác biệt so với chế độ chơi với máy tính (Player vs Com) là người chơi không bị giới hạn bởi một trình độ hay phong cách chơi cố định Mỗi tuần, quản trị viên có thể thiết lập chế độ chơi, độ khó và phong cách mới, tạo ra sự hưng phấn và thử thách cho người dùng Hơn nữa, mô hình này cho phép tích hợp các công cụ như đăng nhập, lưu điểm và công bố danh sách vinh danh trên website, cũng như tổ chức các chương trình trúng thưởng ngẫu nhiên Người dùng còn có thể gửi phản hồi qua email cho quản trị viên, từ đó nâng cao chất lượng dịch vụ.
4.2 Phát triển theo hướng áp dụng mô hình Client – Server kết hợp với P2P
Phát triển theo hướng này sẽ giúp chúng ta tận dụng tối đa các điểm mạnh từ các phiên bản trước và phần mềm trò chơi đã lập trình, đồng thời mở ra cơ hội phát triển cao hơn Người dùng có thể đăng nhập vào hệ thống trò chơi và không chỉ thi đấu với máy chủ mà còn mời nhau tham gia các trận giao hữu, tính điểm thưởng phạt sau mỗi trận, từ đó tạo ra sự cạnh tranh và kịch tính hơn cho trò chơi Hơn nữa, tính năng trò chuyện giữa người chơi sẽ tăng thêm sự thú vị Dựa trên nền tảng này, quản trị viên có thể tổ chức các giải đấu thường xuyên, thi đấu theo cặp, vòng tròn tính điểm hoặc loại trực tiếp, với phần thưởng hấp dẫn cho người chiến thắng, mang lại niềm vui và sự hứng khởi cho người chơi.
XÂY DỰNG PHẦN MỀM
Tạo giao diện cho trò chơi
Sử dụng các MenuStrip, Panel, Picturebox, Buttton và groupBox đã được hỗ trợ tại ToolBox trong Visual Studio 2010 để thiết lập nên giao diện như sau :
Hình 3.1 : Giao diện trò chơi
menuStrip1 : Hiển thị các thực đơn danh sách các thao tác và thiết lập đối với trò chơi
PictureBox : Hiển thị logo hình ảnh minh họa
groupBox1 : Hiển thị luật chơi để người chơi nắm rõ
Button : Các nút thiết lập chế độ
- Player vs Player : chơi hai người với nhau trên cùng một bàn cờ
- Player vs Com : Người dùng đấu tay đôi với máy tính
- Thoát : thoát ra khỏi trò chơi
Chơi mới : Thiết lập lại bàn cờ mới để chơi trận đấu tiếp theo
Xây dựng bàn cờ và chức năng
Để chơi cờ hiệu quả, chúng ta cần xây dựng các ô cờ trên bàn cờ, giúp xác định vị trí các nước đi Điều này sẽ hình thành thế trận thi đấu và tạo ra các phương thức xử lý trong quá trình chơi.
Xây dựng các class như sau :
Chứa các biến, phương thức sau :
Const int ChieuDai Biến chiều dài cho ô Const int ChieuRong Biến chiều rộng cho ô Int SoHuu Phục vụ cho kiểm tra lượt đi
Void VeOCo() Vẽ nên ô cờ
Chứa các biến, phương thức sau :
Int SoDong Số dòng của bàn cờ
Int SoCot Số cột của bàn cờ
Void VeBanCo() Vẽ bàn cờ
Void VeQuanCo Vẽ quân cờ lên bàn cờ khi chơi cờ
AI Trí tuệ nhân tạo phục vụ cho lượt chơi là máy
Chứa các biến, phương thức sau :
MangOCo[,] Xây dựng mảng của các ô cờ
BanCo Xây dựng bàn cờ
Int LuotDi Kiểm tra lượt đi để điền nước đi
Bool SanSang Khởi tạo bàn cờ
Void KhoiTaoMangOCo() Tạo mảng ô cờ cho thi đấu
Void VeBanCo() Vẽ nên bàn cờ
Hàm Void XacDinhOCo() được sử dụng để xác định các ô cờ nhằm xử lý các sự kiện trong trò chơi Hàm Void ChoiHaiNguoi() khởi tạo các biến cần thiết cho chế độ chơi hai người, trong khi hàm Void ChoiVoiMay() phục vụ cho việc chơi với máy Hàm Bool DuyetChienThang() thực hiện việc duyệt qua các khả năng chiến thắng, và Stack Cacnuocdadi được dùng để kiểm tra các nước đã đi trong quá trình chơi.
AI Trí tuệ nhân tạo phục vụ cho lượt chơi là máy
Xây dựng các thuộc tính cho lớp ô cờ để xác định nên ô cờ :
- Xử lý ô cờ theo dòng và cột
- Sở hữu của ô cờ để xác định lượt đi cho người chơi
Sau khi đã xây dựng xong được ô cờ chúng ta sẽ vẽ bàn cờ :
Xác định các thuộc tính số dòng, số cột, mảng ô cờ
Phương thức vẽ bàn cờ sẽ vẽ bằng Line – Graphics bàn cờ theo yêu cầu public void VeBanCo(Graphics g,O_Co[,] Mang_O_Co)
Mang_O_Co[i, j] = new O_Co(new Point(j * O_Co.iChieuDai_O, i
* O_Co.iChieuCao_O), new Point(j * O_Co.iChieuDai_O +
O_Co.iChieuDai_O, i * O_Co.iChieuCao_O + O_Co.iChieuCao_O));
Mang_O_Co[i, j].Ve_O_Co(g, Color.Black);
Xử lý trò chơi
Chúng ta tạo ra các quân cờ và nước đi trên bàn cờ thông qua sự kiện MouseClick của Panel bàn cờ, sử dụng phương thức public bool DanhCo(int MouseX, int MouseY, Graphics g).
{ if (MouseX % OCo._ChieuRong == 0 || MouseY % OCo._ChieuCao == 0) return false; int Cot = MouseX / OCo._ChieuRong; int Dong = MouseY / OCo._ChieuCao; if (_MangOCo[Dong, Cot].SoHuu != 0) return false; switch (_LuotDi)
_BanCo.VeQuanCo(g, _MangOCo[Dong, Cot].ViTri, sbB); break; default:
MessageBox.Show("Co lỗi"); break;
//_BanCo.VeQuanCo(g, _MangOCo[Dong, Cot].ViTri, sbB); list_CacNuocDaDi.Add(_MangOCo[Dong, Cot]); return true;
Ta sử dụng các ô được tô màu trắng và đen đại diện cho các quân cờ của hai địch thủ : public static SolidBrush sbW; public static SolidBrush sbB;
Xử lý thắng thua
Khi xét về thắng thua trong chơi cờ caro chúng ta sẽ nghĩ đến các trường hợp như sau:
Hòa cờ ( khi bàn cờ đã đầy các nước đi)
Máy thắng được sử dụng để xử lý tình huống hòa cờ, khi cả hai bên đã đi hết tất cả các ô trên bàn cờ mà chưa có ai chiến thắng theo luật (5 ô liên tiếp không bị chặn ở 2 đầu) Để xác định kết quả, chúng ta sẽ xem xét lại danh sách các ô đã đi qua hàm public bool Kiem_Duyet_Chien_Thang().
{ if (l_Cac_Nuoc_Da_Di.Count == 400)
MessageBox.Show("Hòa cờ"); bReady = false; return false;
{ if (Mang_O_Co[i, j].ISo_Huu == 1)
{ if (Kiem_Tra_Player(i, j, 1)) return true;
} if (Mang_O_Co[i, j].ISo_Huu == 2)
{ if (Kiem_Tra_Player(i, j, 2)) return true;
} Đối với 3 trường hợp còn lại, tức là sẽ có một bên thắng chúng ta cần phải duyệt qua các tình huống sau :
Duyệt dọc: khi 5 ô liên tiếp theo phương dọc không bị chặn 2 đầu
Hình 3.2 Duyệt dọc kiểm tra chiến thắng Chúng ta xét như sau: private bool Duyet_Phuong_Doc(int Current_Dong, int Current_Cot, int
{ if (Current_Dong > 15) return false; long iDem; for (iDem = 1; iDem < 5; iDem++)
{ if (Mang_O_Co[Current_Dong + iDem, Current_Cot].ISo_Huu !Player_SoHuu) return false;
} if (Current_Dong == 0 || Current_Dong + iDem == BanCo.ISoDong) return true; else
{ if (Mang_O_Co[Current_Dong - 1, Current_Cot].ISo_Huu == 0 ||
Mang_O_Co[Current_Dong + iDem, Current_Cot].ISo_Huu == 0) return true; else return false;}}
Duyệt ngang: khi 5 ô liên tiếp theo phương ngang không bị chặn 2 đầu
Hình 3.3 : Duyệt ngang kiểm tra chiến thắng Chúng ta xét như sau: private bool Duyet_Phuong_Ngang(int Current_Dong, int Current_Cot, int
{ if (Current_Cot > 15) return false; long iDem; return true; else
{ if (Mang_O_Co[Current_Dong, Current_Cot - 1].ISo_Huu == 0 ||
Mang_O_Co[Current_Dong, Current_Cot + iDem].ISo_Huu == 0) return true; else return false;
Duyệt chéo kiểu 1 : khi 5 ô liên tiếp theo phương chéo không bị chặn 2 đầu
In the provided code snippet, the function `Duyet_Cheo_Xuoi` checks for a winning condition in a game It takes the current row (`Current_Dong`), current column (`Current_Cot`), and the player's identifier (`Player_SoHuu`) as parameters The function first verifies that the current row and column are within valid limits, specifically not exceeding 15 If either exceeds this limit, it returns false The function then proceeds with a loop to evaluate potential winning scenarios.
{ if (Mang_O_Co[Current_Dong + iDem, Current_Cot + iDem].ISo_Huu ! Player_SoHuu) return false;
} if (Current_Cot == 0 || Current_Dong == 0 || Current_Cot + iDem =BanCo.ISoCot || Current_Dong + iDem == BanCo.ISoDong) return true; else
{ if (Mang_O_Co[Current_Dong - 1, Current_Cot - 1].ISo_Huu == 0 ||
Mang_O_Co[Current_Dong + iDem, Current_Cot + iDem].ISo_Huu == 0) return true; else return false;
Duyệt chéo kiểu 2 : khi 5 ô liên tiếp theo phương chéo không bị chặn 2 đầu private bool Duyet_Cheo_Nguoc(int Current_Dong, int Current_Cot, int
{ if (Current_Dong > 15 || Current_Cot < 4) return false; long iDem; for (iDem = 1; iDem < 5; iDem++)
{ if (Mang_O_Co[Current_Dong + iDem, Current_Cot - iDem].ISo_Huu ! Player_SoHuu) return false;
} if (Current_Cot == BanCo.ISoCot - 1 || Current_Dong == 0 || Current_Cot - iDem == 0 || Current_Dong + iDem == BanCo.ISoDong) return true; else
{ if (Mang_O_Co[Current_Dong - 1, Current_Cot + 1].ISo_Huu == 0 ||
Mang_O_Co[Current_Dong + iDem, Current_Cot - iDem].ISo_Huu == 0) return true; else return false;
Vấn đề trí tuệ nhân tạo (AI) trong trò chơi
5.1 Sơ lƣợc về trí tuệ nhân tạo
- Lĩnh vực của trí tuệ nhân tạo:
Thiết kế và nghiên cứu các hệ thông máy tính có xử lý thông minh
- Chương trình trí tuệ nhân tạo:
Tập trung vào các tính toán và suy diễn thông minh
-Tại sao AI quan trọng?
+ Cho phép giải quyết các bài toán khó (hard problems)
+ Hiểu được bản chất của trí tuệ con người[2]
5.2 Trí tuệ nhân tạo đƣợc ứng dụng trong bài toán lập trình trò chơi cờ caro Trí tuệ nhân tạo trong các loại trò chơi đánh cờ đa phần được ứng dụng nhiều bằng kiến trúc cây tìm kiếm với mục tiêu tìm kiếm được con đường đi có lợi nhất [2]
Trong đánh cờ, có hai hướng đi song song mà cả trí tuệ nhân tạo cũng phải tuân thủ khi thi đấu, được thể hiện qua sơ đồ cây tìm kiếm.
Các nước đi tiếp theo cần phải tuân thủ luật chơi, và mục tiêu cuối cùng là đạt được trạng thái chiến thắng hoặc ít nhất là thế cờ có lợi nhất có thể.
Để tuân thủ luật chơi, người chơi không được di chuyển vào ô đã có nước đi trước đó, vì điều này sẽ được coi là vật cản AI cần phân tích các khả năng có thể xảy ra để xác định nước đi tiếp theo cho phe mình, bao gồm việc xem xét các hướng di chuyển khác nhau.
Hình 3.8 : Các hướng đi tiếp theo có thể xảy ra của quân cờ
5.3 Xác định phương hướng áp dụng trí tuệ nhân tạo
Trong trò chơi cờ, có tối đa 8 khả năng di chuyển cho nước đi tiếp theo, tuy nhiên số lượng này có thể giảm nếu có vật cản Để tìm ra nước đi phù hợp nhất, cần xem xét hai hướng đi chính: tấn công và phòng ngự AI sẽ quét qua tất cả các hướng di chuyển khả thi và đánh giá từng hướng dựa trên điểm số tấn công và phòng ngự Nước đi nào mang lại lợi ích tối ưu cho cả tấn công lẫn phòng ngự sẽ được AI chọn làm nước đi tiếp theo Các điểm đánh giá này được xây dựng dựa trên hàm đánh giá heuristic.
5.4 Thiết kế các vấn đề cần xử lý Định lượng 2 mảng điểm tấn công và phòng ngự
Ta tiến hành vét cạn các vị trí ô còn trống trên bàn cờ
Mỗi ô cờ được tính điểm tấn công và phòng ngự theo 4 phương 8 hướng Tùy thuộc vào hướng thi đấu, chúng ta có thể điều chỉnh điểm phòng ngự hoặc tấn công để tối ưu hóa chiến thuật cho máy, ưu tiên cho lối đánh phòng ngự hoặc tấn công.
- Tìm ra nước đi có số điểm cao nhất và chọn nước đi đó làm nước đi tiếp theo cho máy
- Các ô đã được đánh sẽ được xem như các vật cản, không đánh vào đó nữa
Sau khi quyết định xong, máy sẽ tự động cấp nước vào, trả lượt đi cho người chơi và tiến hành kiểm tra các cơ hội chiến thắng theo luật chơi đã được quy định.
5.5 Lập trình AI trong trò chơi cờ caro
Ta khai báo 2 mảng điểm cho tấn công và phòng ngự : public long[] Defend_Score = new long[7] { 0, 3, 27, 99, 729, 6561, 59049 }; public long[] Attack_Score = new long[7] { 0, 9, 54, 162, 1458, 13112, 118008 };
Khởi động lượt đi với nước đi đầu tiên và tìm kiếm nước đi cho máy : public void Khoi_Dong_Computer(Graphics g)
{ if (l_Cac_Nuoc_Da_Di.Count == 0)
BanCo.Ve_Quan_Co(g, 9, 9, ImageO, Mang_O_Co);
Mang_O_Co[9, 9].ISo_Huu = 1; l_Cac_Nuoc_Da_Di.Add(Mang_O_Co[9, 9]);
O_Co o_Co_Danh = Tim_Kiem_Nuoc_Di();
BanCo.Ve_Quan_Co(g, o_Co_Danh.IDong, o_Co_Danh.ICot, ImageO, Mang_O_Co);
Mang_O_Co[o_Co_Danh.IDong, o_Co_Danh.ICot].ISo_Huu = 1; l_Cac_Nuoc_Da_Di.Add(Mang_O_Co[o_Co_Danh.IDong, o_Co_Danh.ICot]);
Chúng ta tạo phương thức tìm kiếm nước đi tiếp theo cho máy : public O_Co Tim_Kiem_Nuoc_Di()
O_Co o_CoTemp = new O_Co(); long diem = 0; for (int i = 0; i < BanCo.ISoDong; i++)
{ long diemtancong = 0; long diemphongngu = 0; if (Mang_O_Co[i, j].ISo_Huu == 0)
{ diemtancong = Score_Attack_Duyet_Doc(i, j) +
Score_Attack_Duyet_Ngang(i, j) + Score_Attack_Duyet_Cheo_Nguoc(i, j) + if (diemphongngu