Tuy rằng, lĩnh vực xây dựng trò chơi game không còn mới mẻ, nhưng qua 9 kỳ học tập, nghiên cứu với mong muốn vận dụng kiến thức đã học vào triển khai một đề tài thiết kế một trò chơi gam
Trang 1MỤC LỤC
MỤC LỤC 0
Lời nói đầu 2
Lời cảm ơn Error! Bookmark not defined Lời cam đoan Error! Bookmark not defined CHƯƠNG 1 3
LÝ DO CHỌN ĐỀ TÀI 3
1.1 GIỚI THIỆU VỀ CÔNG NGHỆ TRI THỨC 3
1.1.1 Giới thiệu về tri thức 3
1.1.2 Giới thiệu về lý thuyết trò chơi 4
1.2 GIỚI THIỆU VỀ GAME 5
1.2.1 Lịch sử cờ vây 5
1.2.2 Lịch sử trò chơi xếp hình 5
1.2.3 Lý do chọn đề tài 6
CHƯƠNG 2: 8
CƠ SỞ LÝ THUYẾT 8
2.1 GIỚI THIỆU VỀ JAVA [2] 8
2.1.1 Lịch sử phát triển 8
2.1.2 Các đặc điểm của Java 8
2.1.3 JDK – Java Development Kit - Bộ công cụ phát triển Java 10
2.1.4 Các đặc điểm cơ bản của các thành phần AWT 11
2.1.5 Các thành phần của AWT được sử dụng 12
2.1.6 Đối tượng đồ hoạ 16
2.1.7 Xử lý sự kiện 20
2.1.8 WindowListener 23
2.1.9 Phân tuyến và đa tuyến 24
2.1.10 Interface 25
2.2 GIỚI THIỆU VỀ TRÍ TUỆ NHÂN TẠO [1] 26
2.2.1 Lịch sử hình thành và phát triển của trí tuệ nhân tạo 26
2.2.2 Định nghĩa trí tuệ nhân tạo 28
Trang 22.2.3 Thử nghiệm Turing 28
2.2.4 Khái quát các lĩnh vực ứng dụng của trí tuệ nhân tạo 29
2.2.5 Không gian trạng thái 32
2.2.6 Chiến lược tìm kiếm tối ưu 33
2.2.7 Tìm kiếm có đối thủ 35
CHƯƠNG 3: 40
XÂY DỰNG CÁC CHƯƠNG TRÌNH TRÒ CHƠI 40
3.1 XÂY DỰNG CHƯƠNG TRÌNH TRÒ CHƠI CỜ VÂY 40
3.1.1 Ý tưởng 40
3.1.2 Thiết kế chương trình 45
3.1.3 Đánh giá chương trình 53
3.2 XÂY DỰNG TRÒ CHƠI XẾP HÌNH 54
3.2.1 Ý tưởng 54
3.2.2 Thiết kế chương trình 56
3.2.3 Đánh giá chương trình 60
KẾT LUẬN 61
TÀI LIỆU THAM KHẢO 62
Trang 3Lời nói đầu
Ngày nay với sự phát triển không ngừng của khoa học kỹ thuật đặc biệt công nghệ thông tin là lĩnh vực luôn được đưa lên hàng đầu thúc đẩy sự tăng trưởng phát triển nền kinh tế của mỗi quốc gia Công nghệ thông tin dần khẳng định được vai trò của mình trong các lĩnh vực khoa học, kỹ thuật và giải trí Xuất khẩu phần mềm trò chơi giải trí luôn mang lại lợi nhuận cao cho các quốc gia có ngành tin học phát triển mạnh
Khi chiếc máy tính cá nhân đã trở thành một phần của đời sống con người, thì những sản phẩm giải trí trên máy ngày càng có cơ hội để phát triển, đặc biệt là những game mini như những game chơi cờ Tuy nhiên yêu cầu đối với một game hay cũng rất cao, đồ họa, xử lý sự kiện…Do đó viết game vừa là cơ hội vừa là thách thức đối với người lập trình và đó cũng là một phương pháp tốt để hoàn thiện kĩ năng lập trình của lập trình viên
Hiện nay, có rất nhiều ngôn ngữ lập trình có thể dùng để viết game, Java cũng là một trong những ngôn ngữ ấy, với kĩ thuật xử lí hình ảnh, âm thanh đã được hỗ trợ sẵn, Java có đầy đủ sức mạnh để xây dựng một game hoàn hảo, đó cũng chính là lí do để Java được chọn làm ngôn ngữ viết lên game được trình bày trong đề tài này
Game viết trong báo cáo cũng chỉ dừng ở mức tìm hiểu, chưa thể trở thành một game thương mại, nhưng cũng giúp người đọc hiểu được những điều
cơ bản khi viết một game, và những hỗ trợ của Java đối với game
Tuy rằng, lĩnh vực xây dựng trò chơi game không còn mới mẻ, nhưng qua 9 kỳ học tập, nghiên cứu với mong muốn vận dụng kiến thức đã học vào triển khai một đề tài thiết kế một trò chơi game; em đã lựa chọn đề tài tốt nghiệp là: Áp dụng trí tuệ nhân tạo xây dựng các chương trình trò chơi bằng ngôn ngữ lậ trình Java
Trang 4CHƯƠNG 1:
LÝ DO CHỌN ĐỀ TÀI 1.1 GIỚI THIỆU VỀ CÔNG NGHỆ TRI THỨC
1.1.1 Giới thiệu về tri thức
Tri thức là những hiểu biết được kiểm nghiệm Tri thức là sức mạnh, tài nguyên nó trở thành tiềm lực cạnh tranh Hiện nay, trí tuệ nhân tạo đang trên đà phát triển và đã đạt được những thành tựu rực rỡ đóng góp vào nền tảng của công nghệ thông tin cũng như tạo ra các sản phẩm liên quan đến việc sử dụng công nghệ tri thức trên máy tính Trí tuệ nhân tạo và tạo dụng tri thức có mối quan hệ gắn bó mật thiết với nhau hình thành lên một lĩnh vực mới đó là khoa học tri thức
Tạo dụng tri thức là một tập hợp quá trình điều hành sự sáng tạo, phổ biến và sử dụng tri thức để đạt được mục tiêu của mình
Khoa học tri thức được chọn là một trong ba khoa học (cùng với khoa học thông tin và khoa học vật liệu) được thiết lập và phát triển tại viện Khoa Học và Công nghệ tiên tiến Nhật Bản viết tắt là JAIST Mục tiêu chính của nó
là thúc đẩy sự phát triển của tạo dụng tri thức và tiến hành nghiên cứu liên qua đến nền tảng cho một xã hội tri thức dựa trên sự kết hợp của khoa học quản lý, khoa học hệ thống và khoa học thông tin
Trong nhiều tình huống, sẽ không có sẵn tri thức do vậy: Kỹ sư tri thức cần thu thập tri thức từ các chuyên gia lĩnh vực, cần hiểu biết các luật mô tả lĩnh vực cụ thể
Các hệ thống học được mô hình dưới dạng số liên quan đến các kỹ thuật nhằm tối ưu các tham số Học theo dạng số bao gồm mạng Neural nhân tạo, giải thuật di truyền, bài toán tối ưu truyền thống Các kỹ thuật học theo số không tạo
ra cơ sở tri thức tường minh
Trí tuệ nhân tạo là một nhánh của khoa học và công nghệ liên quan đến việc làm cho máy tính có năng lực của trí tuệ con người, tiêu biểu như các khả năng “suy nghĩ”, “hiểu ngôn ngữ” và biết “học tập” của máy Máy tính sinh ra chủ yếu thực hiện việc tính toán, trí tuệ nhân tạo nhằm cho máy biết lập luận,
có “trí thông minh”
Trang 5Một thí dụ về sự đóng góp của trí tuệ nhân tạo trong các sản phẩm của công nghệ thông tin là cuộc đọ trí của Deep Junior và Gary Karparov đầu năm
2003 sau chiến thắng của Deep Blue trước nhà vô địch cờ vua giữa năm 1997
Bản chất của trí tuệ nhân tạo là làm sao đưa được tri thức con người vào
để máy hiểu được và cung cấp cho máy khả năng suy diễn khai thác tri thức này
Tạo ra và sử dụng tri thức là cốt tử trong mọi hoạt động kinh tế xã hội, khoa học, quản lý… và liên quan chặt chẽ đến tiến bộ của khoa học công nghệ đặc biệt là tiến bộ của công nghệ thông tin Tạo dụng tri thức cần được tìm hiểu một cách sâu rộng hơn
1.1.2 Giới thiệu về lý thuyết trò chơi
John von Newmann là người đầu tiên hình thức ra lý thuyết trò chơi cho đến đầu những năm 1970, lý thuyết trò chơi bắt đầu được áp dụng cho nghiên cứu trong các ngành khoa học, từ Sinh học tới Triết học Cuối cùng, lý thuyết trò chơi gần đây đã thu hút được sự chú ý của các nhà Khoa học máy tính do ứng dụng của nó trong trí tuệ nhân tạo và Điều khiển học
Lý thuyết trò chơi là một nhánh của toán học ứng dụng, nghiên cứu các tình huống chiến thuật trong đó các đối thủ lựa chọn các hành động khác nhau để
cố gắng làm tối đa các kết quả nhận được Trong lý thuyết trò chơi có năm yếu tố
cơ sở: Người chơi (players), giá trị gia tăng (Added values), Quy tắc (Rules), chiến thuật (Tacties), phạm vi (Scope) Năm yếu tố hợp thành PARTS như các thành phần của cuộc chơi
Các trò chơi game giải trí cũng áp dụng những chiến thuật cơ bản trong lý thuyết trò chơi ví dụ các trò chơi đối kháng, một chương trình máy tính có thể chơi các trò chơi đấu trí như các trò chơi cờ Vua, cờ Tướng, cờ Vây, go, checker… các trò chơi này là các trò chơi đối kháng, diễn ra giữa hai đấu thủ người chơi luôn mong muốn tới đích trước dành chiến thắng trong cuộc chơi (ván chơi) Đặc điểm của trò chơi này là:
* Có hai đấu thủ, mỗi người chỉ đi một nước khi tới lượt
* Các đấu thủ đều biết về tình trạng trận đấu
Trang 6* Trận đấu không kéo dài vô tận, phải diễn ra hoà, hoặc một bên thắng và bên kia thua
Thông thường ta hay gọi các trò chơi này là các loại cờ Đôi khi ta còn gọi là trò chơi MiniMax (dựa trên tên các thuật toán tìm kiếm cơ bản áp dụng cho chúng)
1.2 GIỚI THIỆU VỀ GAME
1.2.1 Lịch sử cờ vây
Cờ vây là loại cờ cổ, được chơi cách đây khoảng 4000 năm bắt nguồn từ nước Trung Hoa Cờ vây ngày nay rất phổ biến ở vùng Đông Á Nhật hiện nay là nước có số người chơi cờ rất cao Cờ vây đã tới Nhật từ thế kỷ thứ 7 và đến đầu thế kỷ 13, nó được chơi rộng rãi khắp mọi nơi trên đất nước này Sự phát triển của Internet cũng đã làm cho nó phổ biến hơn trên khắp thế giới và đến nay đã có
36 triệu người yêu thích môn cờ này (thống kê của hiệp hội cờ Vây nghiệp dư thế giới năm 1999)
Môn cờ vây cũng đã được người Việt Nam biết tới từ lâu, nhưng qua thời gian, chiến tranh nên đã hầu như không còn ai biết cách chơi Nó được phổ biến lại tại Việt Nam vào năm 1993 nhân dịp có một giảng viên không chuyên từ Trung Quốc sang giảng dạy giúp cho ngành thể dục thể thao Hà Nội
Cờ vây có từ xa xưa, nhưng không hề bị biến đổi theo thời gian như các trò chơi cổ khác Lý do là luật chơi của cờ vây hết sức đơn giản, người nào cũng
có thể chơi được, không cần đến trí thông minh ưu việt Trong cờ vây quân nào cũng như quân nào, giá trị y hệt nhau, không quân nào có tên tuổi, không có vua,
có tướng Cờ vây muốn biết chơi thì quá dễ, nhưng để chơi tới được thành “cao cờ” thì rất khó
1.2.2 Lịch sử trò chơi xếp hình
Nguồn gốc của trò chơi xếp hình (Jigsaw puzzle) phải quay về những năm
1790 khi các nhà làm bản đồ châu Âu dán các bản đồ trên gỗ và cắt chúng thành những mảnh nhỏ (Dissected map) là một loại đồ chơi mang tính giáo dục thành công nhất từng có Trẻ em các nước vẫn còn học địa lý thông qua việc chơi với bản đồ xếp hình của Hoa Kỳ hay thế giới Các nghệ nhân sáng tạo trò chơi xếp
Trang 7hình ở thế kỳ 17 hẳn sẽ vô cùng sửng sốt trước những biến đổi qua hơn 230 năm qua Các bộ xếp hình dành cho trẻ em từ các bài học đến giải trí, thể hiện nhiều loại sự vật khác nhau như các con thú, thơ ca mẫu giáo (nursery ryhmes), các câu truyện với những siêu anh hùng và Disney Nhưng bất ngờ lớn nhất là sự ra đời của bộ xếp hình dành cho cả người lớn vào những năm đầu thế kỷ 20
Các mảnh ghép càng ngày càng được cắt chính xác trên những đường kẻ màu không có các mảnh chuyển tiếp có hai màu đỏ ra đen, ví dụ như vùng màu nâu (mái nhà) xếp gần những mảnh màu xanh (bầu trời) những năm tiếp theo mang đến hai sự cách tân đáng kể chúng được cải tiến từ nguyên liệu ban đầu là
gỗ giá thành tương đối đắt sang nguyên liệu là bìa cứng cùng với đó là số lượng các mảnh ghép ngày càng tăng
Ngày nay, sự phát triển của internet góp phần làm cho trò chơi này được phổ biến rộng rãi hơn và thu hút sự chú ý của mọi giới và mọi lứa tuổi
Trò chơi xếp hình đòi hỏi sự kiên nhẫn, ráp nhanh hay chậm tuỳ thuộc vào khả năng nhạy bén của mỗi người nhưng có một vài nguyên tắc chung giúp cho việc ghép hình thuận lợi hơn là ráp các mảnh ngoài bìa trước, tìm chỗ nối tiếp thông qua màu sắc, hình thái gom các mảnh cùng màu vào một chỗ
1.2.3 Lý do chọn đề tài
Như chúng ta đã biết lý thuyết xây dựng game đặc biệt là các game chơi
cờ, xếp hình cần sử dụng nhiều thuật toán có độ khó cao, các kỹ thuật lập trình game, lập trình giao diện, các chức năng đồ hoạ sử dụng trong game… Đề tài em thực hiện áp dụng lý thuyết trò chơi, các thuật toán tìm kiếm có đối thủ, tìm kiếm tối ưu: Thuật toán MiniMax, phương pháp cắt cụt alpha-beta, thuật toán A* trong trí tuệ nhân tạo và các kỹ thuật lập trình game bằng ngôn ngữ lập trình Java Trong thời gian tìm hiểu và nghiên cứu, tiến hành xây dựng hoàn chỉnh game cờ mini, trò chơi xếp hình em đã củng cố và bổ sung được nhiều kiến thức về trí tuệ nhân tạo, công nghệ tri thức và lập trình hướng đối tượng với Java
Những phân tích trên chính là lý do để em chọn đề tài này vì rất muốn sử dụng khả năng đồ hoạ của Java để xây dựng chương trình game, muốn áp dụng
lý thuyết trò chơi, các thuật toán tìm kiếm trong trí tuệ nhân tạo để xây dựng
Trang 8chương trình game chơi cờ, xếp hình Các game này được đón nhận trong mọi giới nó không mất quá nhiều thời gian và phù hợp với thời lượng làm đồ án
Chương trình của em gồm ba chức năng cơ bản sau: Tạo một ván cờ mới Người chơi với máy ở các cấp độ khác nhau dễ, trung bình, khó Hai người chơi với nhau
Chương trình xếp hình của em gồm có chức năng chọn hình, tự động xếp hình Chương trình được thiết kế với bàn cờ là một ma trận n*n có hai loại quân, mỗi loại quân lần lượt được chọn nước đi của mình và trạng thái trên bàn
cờ tương ứng với một nút trên cây trò chơi Như vậy, tại mỗi lượt đi bạn phải tìm một trạng thái tốt nhất Cái tốt ở đây chính là do hàm đánh giá chỉ ra mà số lượng trạng thái trên bàn cờ rất nhiều vậy không thể đi tất cả các nút được phải có cách giảm đi số lượng các nút và thuật toán alpha-beta là câu trả lời
Trò chơi xếp hình dựa trên cơ sở bài toán 8 số (bài toán Ta canh) sử dụng thuật toán tối ưu trong trí tuệ nhân tạo để giải trong đó A* là lựa chọn tốt nhất cho ta một kết quả như mong đợi với thời gian thực hiện chấp nhận được
Trang 9CHƯƠNG 2:
CƠ SỞ LÝ THUYẾT 2.1 GIỚI THIỆU VỀ JAVA [2]
2.1.1 Lịch sử phát triển
Java ra đời vào những năm 90 của thế kỉ 20, đầu tiên xuất hiện với cái tên Oak trong một dự án nhằm xây dựng một phần mềm lập trình cho các mặt hàng điện dân dụng với mục tiêu là nhỏ gọn và tương thích với nhiều thiết bị phần cứng khác nhau Lúc đầu sự xuất hiện của Java không gây được nhiều sự chú ý, song đến năm 1993 khi hệ thống web thế giới ra đời, Java lúc đó đã khẳng định
là một công cụ lập trình hoàn hảo trên web Từ đó đến nay Java không ngừng phát triển và trở thành một công cụ lập trình đầy sức mạnh, đặc biệt là trong lĩnh vực phát triển các ứng dụng internet, mà không hề thua kém bất cứ một ngôn ngữ lập trình nào khác
2.1.2 Các đặc điểm của Java
2.1.2.1 Đơn giản
Một trong những mục tiêu khi xây dựng Java là nhỏ gọn và đơn giản, Java không cần một sự hướng dẫn đặc biệt hay kéo dài Mặc dù để đi hết được các ngõ ngách của Java cũng là một vấn đề khó với lập trình viên Khá dễ viết, dễ biên dịch Mặt khác kích thước của Java nhìn chung là nhỏ gọn hơn hẳn VB hay Visual C
2.1.2.2 Hướng đối tượng
Java được thiết kế trên những ngôn ngữ hướng đối tượng mạnh, mọi ứng dụng viết trên Java đều phải được xây dựng trên các đối tượng, và thông qua các đối tượng, chúng ta không thể tạo ra hàm phổ dụng với Java như với C++
Java không hỗ trợ đa kế thừa
Một lớp trong Java bao gồm các vùng hay là các trạng thái của đối tượng, các phương thức (method) là các chức năng của đối tượng dùng để trả lời các tác động của các đối tượng khác
Trang 10Lớp trong Java có thể là lớp trừu tượng, là những lớp tập hợp những trạng thái chung và các thông tin về ứng xử Tuy vậy lớp dẫn xuất của nó hoàn toàn có thể là những đối tượng thật
2.1.2.3 Phân tán
Java được thiết kế để hỗ trợ các ứng dụng phân tán bằng các lớp mạng thuộc gói java.net Ngoài ra các lớp còn được chuẩn bị để thiết lập các kết nối ở mức ổ cắm, nghĩa là chỉ cần cắm vào hay kết nối được là có thể chạy như trên cùng một máy
2.1.2.4 Thông dịch
Java là một ngôn ngữ thông dịch, Các ứng dụng Java có thể chạy trên các nền phần cứng khác nhau, miễn là có bộ thông dịch, bộ gỡ rối, và thư viện thời gian động Khi đó các lập trình viên chỉ cần chú ý đến các thư viện module dùng chung mà không còn cần lệ thuộc vào ngôn ngữ máy
Java không hỗ trợ biến con trỏ
Trang 112.1.2.9 Hiệu quả cao
Với tính năng giao diện đồ họa, sự đơn giản, nhỏ gọn, tính khả chuyển có thể nói Java có tính hiệu quả hơn hẳn C/C++
Chỉ có điều Java tương đối chậm so với những ngôn ngữ khác
2.1.2.10 Đa tuyến
Java hỗ trợ tính năng đa tuyến, cho phép thực hiện nhiều tiến trình song song, và tương hỗ với nhau tránh được tính tuần tự nhàm chán và những thời gian chết trong khi chờ đợi
2.1.2.11 Linh động
Vì dùng trình thông dịch nên Java là ngôn ngữ rất năng động Trong khi chạy môi trường Java có thể tự mở rộng để liên kết với các lớp mới có thể ở một máy chủ ở xa trên mạng
2.1.3 JDK – Java Development Kit - Bộ công cụ phát triển Java
Java được xây dựng chủ yếu trong bộ công cụ phát triển Java JDK như là thư viện chuẩn Trong đó chứa các trình thông dịch, biên dịch, giúp đỡ, soạn tài liệu…Đó chính là cái nền phát triển các ứng dụng của Java
JDK có các hàm giao diện AWT, thư viện dùng lại độc lập JavaBeans, JFC…Java ngày càng phát triển làm cho kích thước của Java phình to hơn, tuy nhiên tốc độ cũng được cải thiện hơn hẳn
Có thể download bộ JDK từ trang web của nhóm JavaTeam:
http://java.sun.com/products/jdk1.5/index.html Java cho phép người lập trình tạo ra các ứng dụng windows không thua bất cứ một ngôn ngữ lập trình nào Java cung cấp cho chúng ta thư viện AWT với đầy đủ các đối tượng cần thiết như: nút nhấn, danh sách, ô văn bản, thanh trượt…để lắp ghép và tạo nên một ứng dụng windows thường có AWT được các nhà thiết kế trừu tượng hóa ở mức cao, nó không phụ thuộc vào bất cứ hệ điều hành nào sử dụng giao diện windows Do đó, ta không cần phải lo lắng về cách thức sử dụng các hàm API nữa, với AWT ta có thể thiết kế được giao diện với các thành phần sau:
Trang 12Sơ đồ kế thừa của các thành phần trong thư viện AWT
2.1.4 Các đặc điểm cơ bản của các thành phần AWT
Để có thể sử dụng được các thành phần trong thư viện AWT cần phải:
- Khởi tạo nó bằng các phương thức khởi tạo, vd: public Button(String label)
Component
MenuComponent
nt
Checkbox Container
TextComponent Button
Applet
Trang 13- Gắn nó vào một đối tượng khung chứa cụ thể nào đó, có thể là một Applet, Panel hay một Frame, bằng phương thức public void add(component cp)
- Gắn máy nghe sự kiện tương ứng cho nó, để tiếp nhận các tác động từ người dùng và trả lời cho các tác động ấy
2.1.5 Các thành phần của AWT được sử dụng
2.1.5.1 Khung chứa – Frame
Các khung chứa có thể đưa các đối tượng vào hoặc loại các đối tượng ra bằng các phương thức:
- Public void add(component cp), public synchronized Component add(Component cp)
- Public synchronized void remove(component cp), public synchronized void removeAll()
Khung chứa quản lí việc lưu giữ các đối tượng, nó dùng để cất nhiều đối tượng khác nhau, giống như ta lưu giữ các đối tượng trong một mảng, hay trong một đối tượng vector Mỗi đối tượng mà ta đưa vào khung chứa đều được cấp một chỉ số index
Frame là một trong những thành phần mạnh mẽ nhất của thư viện AWT
Nó giúp tạo ra một cửa sổ hẳn hoi như các ứng dụng windows thường gặp Có thể nói một ứng dụng windows chỉ là một cửa sổ, trong đó chứa các thành phần con khác như nút bấm, hình ảnh…Một cửa sổ như vậy được Java thể hiện qua khung chứa Frame Các ứng dụng windows độc lập thường lấy Frame làm nền
a Tạo đối tượng khung chứa Frame
Tạo đối tượng khung chứa Frame đơn giản bằng cách gọi phương thức khởi dựng của nó: public Frame(), hoặc public Frame(String FrameTitle)
Thường các ứng dụng windows được xây dựng là các dẫn xuất của các khung chứa để tiện cho việc quản lí các đối tượng và thực hiện các thao tác đồ họa, xử lí ảnh…trên đó thông qua phương thức: public void paint(Graphics g) có sẵn của các khung chứa
Chương trình chơi cờ đặt tên là LPGAME là dẫn xuất của đối tượng khung chứa Frame:
Trang 14//tạo lớp chính là lớp dẫn xuất (lớp con) của Frame
Public class LPGAME extends Frame implements
ActionListener,MouseListener,Runnable,ItemListener{…}
Lớp LPGAME là lớp chính cho nên ta tạo ra đối tượng Frame từ chính hàm main() của lớp LPGAME:
//tạo Frame (cửa sổ) là đối tượng có tên là lp
LPGAME lp=new LPGAME();
b Các đặc điểm của khung chứa Frame
Muốn cho một Frame hiện hữu ta phải định lại kích thước cho cửa sổ bằng phương thức setSize(Dimension), trong đó đối tượng Dimension là một đối tượng xác định kích thước về chiều rộng và chiều cao của đối tượng
//xác định kích thước cho cửa sổ:
lp.setSize(new Dimension(500,600) );
Sau đó đưa cửa sổ ra màn hình
//đưa cửa sổ ra màn hình
lp.setVisible(true);
Nếu muốn cho một Frame được phép thay đổi hoặc không thay đổi kích
cỡ ta dùng hàm: public void setResizable(boolean allow)
//không cho phép thay đổi kích cỡ cửa sổ
Như các khung chứa khác ta có thể đưa các đối tượng cần sử dụng vào trong Frame Trong chương trình không sử dụng phương thức khởi tạo mà tạo một hàm khởi tạo cho cửa sổ để có thể tạo một ván cờ mới nếu muốn Trong hàm khởi tạo các thành phần khác được đưa vào khung chứa
Trang 15Frame không chỉ có thể giữ các đối tượng khác, mà còn có thể cho phép
vẽ trên đó thông qua hàm: public void paint(Graphics g) Chi tiết về phần đồ họa
sẽ được đề cập trong phần sau
Frame cũng cần được gắn các bộ lắng nghe sự kiện để tiếp nhận và trả lời cho các tác động từ phía người dùng
2.1.5.2 Trình đơn menu
a Các thành phần của trình đơn
Trình đơn mà Java cung cấp sẽ gồm các đối tượng sau:
Mục chọn có khả năng đánh dấu CheckboxMenuItem
Dùng đối tượng MenuBar ta có thể tạo một thanh trình đơn và gắn nó vào một cửa sổ ứng dụng bằng cách:
- Tạo một thanh trình đơn: MenuBar mb=new MenuBar();
- Gắn thanh trình đơn vào cửa sổ bằng phương thức
setMenuBar(MenuBar mb)
//Tạo và gắn MenuBar trong chương trình
MenuBar mb;
mb=new MenuBar();
setMenuBar(mb); //do MenuBar được gắn ngay trong hàm khởi tạo
Sau đó ta tạo ra các trình đơn và gắn nó vào trong thanh trình đơn
//Tạo Menu file và gắn nó vào Menubar mb
Menu m,m1;
m=new Menu("file");
mb.add(m);
Trang 16Sau khi có menu ta cần phải gắn các mục chọn (item) vào đó, một menu phải có mục chọn thì mới có ý nghĩa Ta có thể đưa mục chọn trực tiếp vào menu hay tạo riêng rồi mới chọn:
- m.add(new MenuItem(“itemname”));
- MenuItem name=new MenuItem(“itemname”);
Mỗi mục chọn có thể ở trạng thái được chọn hoặc không
//Tạo mục chọn và gắn vào menu
MenuItem it1;
it1=new MenuItem("* human");
m1=new Menu("* computer");
Ta có thể thêm đường phân cách: m.addSeparator();
Tạo Menu con, và đưa Menu con vào Menu chính
//Tạo Menu con computer tạo các mục chọn cho nó và đưa vào Menu
//Tạo mục chọn guider có khả năng đánh dấu
Trang 17CheckboxMenuItem it3;
it3=new CheckboxMenuItem("* guider");
m.add(it3);
//Xác định trạng thái được chọn hay không
it3.getState() trả về giá trị boolean
b Sử dụng trình đơn Menu
Để mỗi mục chọn tương tác và nhận được tình huống khi người dùng chọn
nó ta cần cài đặt giao tiếp ActionListener và gắn nó cho từng mục chọn
//Cài đặt giao tiếp Actionlistener
public class LPGAME extends Frame implements
Các hàm API mà JVM sẽ cung cấp cho chúng ta những chức năng đồ họa thông thường nhất mà bất cứ hệ windows nào cũng phải có, mà không cần quan tâm đến các hàm API riêng của mỗi hệ Lớp thư viện AWT mà ta đã nghiên cứu
ở chương trước sẽ cung cấp các chức năng đồ họa ở mức độ thấp hơn: vẽ từng đường thẳng, từng điểm ảnh…Tất cả các chức năng này được tập trung vào đối tượng đồ họa Graphics và được thể hiện thông qua phương thức paint(Graphics g)
2.1.6.2 Các phương thức paint(), repaint() và update()
Muốn vẽ một cái gì đó lên khung vẽ hay lên khung chứa thì cần phải cài
đặt phương thức: public void paint(Graphics g) {…}
Trang 18Tất cả các hình ảnh được vẽ lên đều phải dùng đến đối tượng Graphics g, g
ở đây giống như một cây bút vẽ, nếu không có nó ta sẽ không thể vẽ được bất cứ
thứ gì
Nhưng không nhất thiết phải gọi lại phương thức paint vì nó rất chậm, giải
pháp mỗi khi cần vẽ lại là dùng phương thức repaint() để vẽ lại toàn bộ, nếu chỉ
muốn vẽ lại một phần thì dùng phương thức:
Public void repaint(int x, int y, int width, int height): cho phép ta vẽ lại một vùng có tọa độ góc trái là (x,y) và có chiều rộng là width, chiều cao là
height
Phương thức repaint sẽ gọi phương thức update(), phương thức này sẽ
thực hiện một số thao tác như xóa sạch vùng cần vẽ lại, đặt mầu nền…Sau đó
chuyển giao đối tượng Graphics này cho hàm paint
Thường phương thức repaint gây ra hiệu ứng giật màn hình do phải gọi lại
hàm update, do đó người ta có một cách để hạn chế việc màn hình bị giật là viết
đè hàm update trong đó gọi lại hàm paint:
Lớp Graphics cung cấp cho ta một số phương thức để vẽ những hình đồ
họa cơ bản sau:
Hình chữ nhật, đa giác Rectangle, Polygon
Văn bản với các font chữ khác nhau Text và Font
Trang 19Chú ý rằng hệ tọa độ ở đây ngược với hệ tọa độ thông thường, nếu vectơ
(x,y) bình thường gồm có x: hoành độ, y: tung độ Thì hệ tọa độ khi ta vẽ là ngược
lại
2.1.6.4 Một số phương thức vẽ được sử dụng trong chương trình
- Public void drawLine(int x1, int y1, int x2, int y2): cho phép ta vẽ một
đường thẳng nối hai điểm có tọa độ (x1,y1), (x2,y2)
Trong chương trình phương thức này dùng để vẽ bàn cờ:
//vẽ bàn cờ bằng phương thức drawLine
for(i=1;i<=9;i++)
{ g.setColor(Color.blue);
g.drawLine(50,i*50,450,i*50);
g.drawLine(i*50,50,i*50,450);
}
- Public void drawOval(int x, int y, int width, int height): vẽ hình elip nằm
trọn trong một hình chữ nhật có tọa độ góc trái trên cùng là (x,y), và có chiều dài,
rộng lần lượt là height và width
- Public void filloval(int x, int y, int width, int height): tương tự cũng để
vẽ một hình elip, nhưng hàm bên trên để vẽ “đường”, còn hàm này dùng để tô
màu cho hình elip
Trong chương trình các hàm fillOval dùng để vẽ các ô được phép đi nhằm
trợ giúp người chơi
//vẽ các ô được phép đi
if(sp&&b[i][j]==6&&b[x][y]==1)
{g.setColor(Color.yellow);g.fillOval(i*50+15,j*50+15,20,20); }
Trang 20else
if(sp&&b[i][j]==7&&b[x][y]==2)
{g.setColor(Color.blue);g.fillOval(i*50+15,j*50+15,20,20);}
- Public void draw3Drect(int x, int y, int width, int height, boolean raised):
vẽ hình chữ nhật 3D, các thông số x, y, width, height tương tự còn raised là giá trị kiểu boolean cho phép đối tượng nổi lên
Hình chữ nhật được dùng trong chương trình để vẽ khung ghi nhận điểm:
width, int heigth, ImageObserver ob)… Để vẽ ảnh vào trong ứng dụng
Tuy nhiên, để vẽ được ảnh cần phải chỉ ra được đường dẫn tới file ảnh cần
vẽ Do đó để vẽ ảnh trong một ứng dụng độc lập ta có cách nạp ảnh là sử dụng phương thức getImage của đối tượng Toolkit
Toolkit là một đối tượng dùng để lấy hay xử lí tài nguyên ở máy cục bộ, vd:
Trang 212.1.7 Xử lý sự kiện
2.1.7.1 Khái quát
Đối tượng nào sản sinh ra sự kiện gọi là nơi phát sinh sự kiện, đối tượng nào tiếp nhận và xử lý các sự kiện được phát sinh ra được gọi là đối tượng listener
Ví dụ như khi ta nhấn một nút nhấn là ta đã sinh ra một sự kiện, việc còn lại sau đó là phải “trả lời” các sự kiện đó như thế nào?
Khi tạo một ứng dụng cửa sổ thì các thành phần của cửa sổ phải có khả năng tiếp nhận sự kiện do người dùng tác động và sau đó chương trình sẽ có những hành động để trả lời cho những tác động đó Vì vậy các thành phần AWT cần được gắn với các Listener tương ứng Java đã thiết kế sẵn các đối tượng listener như sau:
Trang 22ComponentListener Nhận biết các sự kiện khi đối tượng bị
thay đổi kích thước, di chuyển, hiện
ra, dấu đi
FocusListener Nhận biết sự kiện Focus (luôn dành
được nhiều quyền ưu tiên nhất)
MouseListener Nhận biết các sự kiện nhấn, kích
chuột MouseMotionListener Nhận biết các sự kiện di chuyển chuột WindowListener Nhận biết sự kiện một cửa sổ được
đóng lại, mở ra, thu nhỏ…
ActionListener Nhận biết sự kiện mà đối tượng phải
thực thi một tác vụ nào đó AdjustmentListener Nhận biết sự kiện mà đối tượng thay
đổi giá trị ItemListener Nhận biết một sự kiện mà một đối
tượng thay đổi trạng thái
Có hai cách để tạo đối tượng listener để có thể tiếp nhận sự kiện mà hệ thống đem đến:
- Tạo một đối tượng listener riêng biệt, sau đó các thành phần sẽ đăng ký với hệ thống đối tượng listener này
- Chính bản thân các lớp chứa các thành phần sẽ cài đặt cho các giao tiếp listener này và đăng kí với hệ thống thông qua biến this
Trang 23Public void mouseClicked(MouseEvent ev) {} …}
Ví dụ cách 2:
Public class vd extends Panel implements MouseListener{
Public void mouseClicked(MouseEvent ev) {}
…}
2.7.1.2 MouseListener
MouseListener là listener nhận biết sự kiện nhấn hay kích chuột Bất cứ một listener nào cũng là một interface (giao tiếp) do đó muốn cài đặt nó thì bắt buộc phải hiện thực hóa cho nó
Lớp MouseListener có các hàm như sau:
Public void mouseClicked(MouseEvent ev) Xử lý sự kiện kích chuột
Public voidmousePressed(MouseEvent ev) Xử lý sự kiện nhấn chuột
Public void mouseExited(MouseEvent ev) Xử lý sự kiện con trỏ thoát khỏi
cửa sổ Public void mouseEntered(MouseEvent ev) Xử lý sự kiện con trỏ di chuyển
vào cửa sổ Public void mouseReleased(MouseEvent ev) Xử lý sự kiện người dùng thôi
không kích hay nhấn chuột nữa
//Xử lý sự kiện thôi không nhấn chuột nữa
public void mouseReleased(MouseEvent ev){
sp=false;
repaint();
}
Trang 24Vì MouseListener là một giao tiếp do đó ta bắt buộc phải cài hết các hàm của nó mặc dù không dùng khi tiến hành hiện thực hóa cho nó Trong chương trình sự kiện kích chuột dùng để nắm bắt và xử lý các tọa độ mà người chơi chọn nước đi trên bàn cờ, đó cũng là tình huống để kiểm tra và xử lý tính hợp lệ của nước đi
Sự kiện nhấn chuột là để dành cho việc trợ giúp người chơi nhận biết được các nước đi có thể có của mình Khi biến sp=true, hàm paint() sẽ vẽ ra các hình tròn có màu tương ứng tại các ô có thể đi của người chơi Khi người chơi thôi không nhấn chuột nữa thì hàm paint() cũng sẽ thôi không vẽ những chỉ dẫn đó nữa
2.7.1.3 ActionListener
Là Listener nhận biết các sự kiện mà đối tượng sẽ phải thực thi một số tác
vụ nào đó ActionListener được gắn cho các đối tượng như nút bấm, mục chọn, ô văn bản…Listener này có phương thức:
public void actionPerformed(ActionEvent ev){}: để xử lý các sự kiện Cài đặt giao tiếp ActionListener trong chương trình nhằm xử lý các tình huống khi người chơi chọn các mục chọn trong menu:
//Xử lý các sự kiện liên quan đến ActionListener
public void actionPerformed(ActionEvent ev){
Trang 25LPGAME lp=new LPGAME();
lp.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
} }
);
2.1.9 Phân tuyến và đa tuyến
2.1.9.1 Khái quát
Một trong những đặc điểm của Java là tích hợp khả năng đa tuyến
Thread là một đơn vị hành động của hệ điều hành, một chương trình có thể
bị chia nhỏ thành nhiều Thread Khi thực hiện đa nhiệm hệ điều hành cho mỗi chương trình một tiến trình, trên đó lại chia thành các Thread Các Thread trong mỗi tiến trình sẽ được thực hiện một cách tuần tự, nhưng là luân phiên giữa các chương trình
Khái niệm về Thread trong Java là tương tự như trong hệ điều hành Trong một chương trình có nhiều Thread các Thread hoạt động gần như đồng thời với nhau và giao tiếp với nhau qua các interface hay đồng bộ hóa
2.1.9.2 Tạo và sử dụng Thread
Có hai cách tạo Thread:
- Tạo lớp con từ lớp Thread của Java
- Cài đặt giao tiếp Runnable
Khi cài đặt giao tiếp Runnable ta phải cài đặt phương thức run() là phương thức mà thực hiện tất cả các việc phải làm của từng Thread
Sau đó ta khai báo Thread như một vùng dữ liệu của lớp
Khởi tạo đối tượng Thread và cho thực hiện bằng phương thức start() Chấm dứt một Thread bằng phương thức stop()
//Hiện thực hóa giao tiếp runnable
Public class LPGAME extends Frame implements
ActionListener,MouseListener,Runnable,ItemListener{}
Trang 26//Cài đặt phương thức run
public void run(){
đó
Giao tiếp được khai báo gần giống như một lớp với các vùng và các phương thức tuy nhiên các vùng của nó là các hằng, các phương thức là các hàm trừu tượng (abtract) nghĩa là các phương thức của nó đều rỗng Trong các lớp hiện thực hóa các giao diện này ta phải cài đặt tất cả các phương thức của giao diện
//Khai báo một giao tiếp
Public interface giaoTiep{
Static final int bien=2007;
…
Public int ham(); …}
Giao tiếp cũng có thể là con của một giao tiếp khác, tuy nhiên giao tiếp khác lớp ở chỗ nó có thể được kế thừa từ nhiều giao tiếp
Trang 272.2 GIỚI THIỆU VỀ TRÍ TUỆ NHÂN TẠO [1]
2.2.1 Lịch sử hình thành và phát triển của trí tuệ nhân tạo
Những năm gần đây, khá nhiều sách, báo công trình nghiên cứu khoa học
đề cập đến các kỹ thuật tính toán, người ta hay nhắc nhiều đến thuật ngữ như: máy tính thông minh, máy tính thế hệ V, hệ chuyên gia, mạng ngữ nghĩa các ngôn ngữ lập trình như LISP, PROLOG mở đường áp dụng hàng loạt các hệ thống chương trình có khả năng “thông minh”
Trước đây, khi nói đến trí tuệ nhân tạo (TTNT) người ta thường quan tâm đến việc tạo lập các máy tính có khả năng “suy nghĩ” Thậm trí trong một phạm
vi hẹp nào đó, có thể cạnh tranh hoặc vượt quá khả năng bộ não của con người Nhưng hy vọng này trong một thời gian dài đã ảnh hưởng rất nhiều đến các nghiên cứu trong phòng thí nghiệm Mặc dù những mô hình tương tự như máy thông minh đã được đưa ra hàng nhiều năm trước, nhưng chỉ từ khi Alan Turing công bố những kết quả nghiên cứu quan trọng đầu tiên, người ta mới bắt đầu thực
sự nghiên cứu đến các vấn đề TTNT một cách nghiêm túc Phát hiện của Turing cho rằng chương trình có thể được lưu trữ trong bộ nhớ để sau đó được thực hiện trên cơ sở các phép toán cơ bản thao tác với các bit 0,1 Điều này đã tạo lên nền tảng của máy tính hiện đại việc lưu trữ chương trình trong máy cho phép thay đổi chức năng của nó một cách nhanh chóng và dễ dàng thông qua việc nạp một chương trình mới vào bộ nhớ Theo một nghĩa nào đó, khả năng làm cho máy tính có khả năng học và suy nghĩ Đó chính là một trong những biểu hiện quan trọng đầu tiên của những máy tính được trang bị TTNT
Năm 1956, chương trình dẫn xuất kết luận trong hệ hình thức đã được công bố Tiếp theo đó, năm 1959 chương trình chứng minh các định lý hình học phẳng và chương trình giải quyết bài toán vạn năng (GPS- General Problem Solving) đã được đưa ra Tuy vậy chỉ cho đến khoảng năm 1960 McCathy ở MIT (Massachussets Instutite Of Technology) đưa ra ngôn ngữ lập trình đầu tiên dùng cho trí tuệ nhân tạo LISP (List Procesing), các nghiên cứu về TTNT mới phát triển mạnh mẽ, thuật ngữ TTNT do Marvin Misky một chuyên gia nổi tiếng cũng
ở MIT đưa ra năm 1961 trong một bài báo “Steps Forwards To Artificial
Trang 28Intelligence” Những năm 60 có thể xem là một mốc quan trọng trong quá trình xây dựng các máy có khả năng suy nghĩ Các chương trình chơi cờ và các chương trình chứng minh định lý toán học đầu tiên cũng được công bố trong thời gian này
Đến cuối những năm 70, một số những nghiên cứu cơ bản trong các lĩnh vực như xử lý ngôn ngữ tự nhiên, biểu diễn tri thức, lý thuyết giải quyết vấn đề
đã đem lại diện mạo mới cho TTNT Thị trường tin học đã bắt đầu đón nhận những sản phẩm TTNT ứng dụng đầu tiên mang tính thương mại Đó là các hệ chuyên gia được áp dụng trong các lĩnh vực khác nhau Hệ chuyên gia là các phần mềm máy tính, chứa các thông tin và tri thức về một lĩnh vực cụ thể nào đó
có khả năng giải quyết những yêu cầu của người dùng ở mức độ nào đó với trình
độ như một chuyên gia có kinh nghiệm lâu năm Một trong những hệ chuyên gia (HCG) đầu tiên được sử dụng thành công trong thực tế là hệ MYCIN Được thiết
kế và cài đặt tại trường đại học Stanford
Một sự kiện quan trọng đánh dấu sự phát triển của khoa học TTNT là sự
ra đời của ngôn ngữ PROLOG do Alain Calmerauer đưa ra vào năm 1972 Năm
1981, dự án của Nhật Bản xây dựng các máy tính thế hệ thứ V lấy ngôn ngữ PROLOG như là ngôn ngữ cơ sở đã làm thay đổi khá nhiều tình hình phát triển TTNT ở Mỹ cũng như châu Âu
Giai đoạn 1981 trở đi người ta cảm nhận khá rõ nét rằng các chuyên gia TTNT đang dần chuyển các kết quả nghiên cứu từ phòng thí nghiệm sang cài đặt các ứng dụng cụ thể Có thể nói đây là giai đoạn cạnh tranh ráo riết của các công
ty, các viện nghiên cứu hàng đầu nhằm đưa ra thị trường các sản phẩm phần mềm ứng dụng kỹ thuật TTNT
Cuối những năm 80, đầu những năm 90 thị trường các sản phẩm dân dụng
đã có khá nhiều sản phẩm ở trình độ cao như máy giặt, máy ảnh,… sử dụng TTNT Các hệ thống nhận dạng và xử lý hình ảnh, tiếng nói đang thúc đẩy sự phát triển kỹ thuật mạng Neuron Sự xích lại của hai cách tiếp cận: Tiếp cận mờ trong lập luận xấp xỉ và kỹ thuật mạng Neuron đã và đang gây được sự quan tâm đặc biệt của các chuyên gia tin học Bên cạnh sự xuất hiện của các HCG, các ứng
Trang 29dụng công nghiệp và quản lý xã hội là sự ra đời của các hệ thống xử lý tri thức -
dữ liệu tích hợp
Thế giới đang chuyển mình trong những nghiên cứu về TTNT Tuy vậy câu hỏi liệu kỹ thuật TTNT có tạo nên những bước nhảy vọt trong công nghệ tin học, đặc biệt là trong công nghệ máy tính như người ta đã mong đợi hay không vẫn chưa có lời giải đáp thoả đáng
2.2.2 Định nghĩa trí tuệ nhân tạo
Các tác giả đã đưa ra rất nhiều định nghĩa về trí tuệ nhân tạo Em xin dẫn
ra dưới đây một số định nghĩa:
“Trí tuệ nhân tạo là sự nghiên cứu các năng lực trí tuệ thông qua việc sử dụng các mô hình tính toán – Charniak and McDormott, 1985”
“Trí tuệ nhân tạo là nghệ thuật tạo ra các máy thực hiện các chức năng đòi hỏi sự thông minh khi được thực hiện bởi con người – Kurzweil, 1990”
“Trí tuệ nhân tạo là lĩnh vực nghiên cứu tìm cách giải thích và mô phỏng các hành vi thông minh trong thuật ngữ các quá trình tính toán – Schalkoff, 1990”
“Trí tuệ nhân tạo là sự nghiên cứu các tính toán để có thể nhận thức lập luận và hành động – Winston, 1992”
“Trí tuệ nhân tạo là một nhánh của khoa học máy tính liên quan tới sự tự động hoá các hành vi thông minh – luger and Stubblefield, 1993”
2.2.3 Thử nghiệm Turing
Alan Turing (1950) đã xác định các hành vi thông minh như là các hành vi trong các nhiệm vụ nhận thức đạt tới mức độ có thể đánh lừa được con người Sau đây là dạng tổng quát của thử nghiệm Turing Một người hỏi là người ngồi ở một phòng Đối tác của người hỏi là một máy tính được đặt ở phòng khác Hai bên trao đổi thông tin với nhau thông qua các phương tiện truyền tin hiện đại Nếu máy tính có thể làm cho người hỏi tưởng lầm là có người khác đang nói chuyện với mình thì máy tính được xem là thông minh
Bây giờ chúng ta xét xem, để thực hiện được các hành vi được xem là thông minh, các tác nhân thông minh (TNTM) cần có khả năng gì?
Trang 30• TNTM cần có khả năng ghi nhớ và lập luận Nó sử dụng các tri thức đã lưu trữ, và bảng lập luận để rút ra các kết luận đáp ứng các câu hỏi mà người hỏi đặt ra
Biểu diễn tri thức và lập luận là lĩnh vực nghiên cứu trung tâm của
có khả năng học để có thể đưa ra hành động thích ứng với hoàn cảnh mới
Học máy là một lĩnh vực nghiên cứu của TTNT đang phát triển mạnh mẽ
và có nhiều ứng dụng trong các lĩnh vực khác nhau, chẳng hạn trong khám phá tri thức và khai thác dữ liệu
• Người hỏi có thể đưa ra một số hình ảnh về các đối tượng và kiểm tra khả năng nhận biết các đối tượng đó của TNTM
Nhìn máy là lĩnh vực nghiên cứu để máy tính có thể hiểu được cấu trúc và
các tính chất của các đối tượng trong không gian ba chiều từ các hình ảnh hai chiều
• Khi được cho các nhiệm vụ cần thực hiện, TNTM cần có khả năng suy
ra các mục đích cần đạt được và đưa ra một dãy các hành động mà nó cần thực hiện để đạt được các mục đích đó Quá trình này được gọi là lập kế hoạch
Lập kế hoạch là một lĩnh vực nghiên cứu quan trọng của TTNT
2.2.4 Khái quát các lĩnh vực ứng dụng của trí tuệ nhân tạo
Hai mối quan tâm nền tảng nhất của các nhà nghiên cứu TTNT là biểu diễn tri thức và tìm kiếm Sự quan tâm thứ nhất chú ý đến vấn đề nắm bắt theo một ngôn ngữ hình thức Trong khi, tìm kiếm là lĩnh vực giải quyết vấn đề theo cách khảo sát có hệ thống một không gian trạng thái bài toán
Trang 31Giống như tất cả các ngành khoa học khác, TTNT cũng được phân thành các ngành con Trong khi chia sẻ một tiếp cận giải quyết vấn đề cơ bản, các ngành con này quan tâm đến các ứng dụng khác nhau như: Tìm kiếm, trò chơi, Robot đưa thư, hệ chuyên gia…
2.2.4.1 Trò chơi
Ngay thời gian đầu của việc nghiên cứu vấn đề tìm kiếm trong không gian trạng thái, người ta đã tiến hành thử nghiệm bằng cách sử dụng các trò chơi thông dụng có bàn cờ như cờ vây, cơ vua và trò đố 15 ô Ngoài sức quyến rũ do tính chất trí óc vốn có trong các trò chơi có bàn cờ, có nhiều tính nhất định làm cho chúng trở thành một đối tượng lý tưởng của thời kỳ này Hầu hết các trò chơi đều sử dụng một tập hợp các luật chơi được xác định rõ ràng Điều này làm cho việc phát sinh không gian tìm kiếm trở lên dễ dàng và giải phóng nhiều nghiên cứu khỏi những sự mơ hồ và phức tạp vốn có của những bài toán ít cấu trúc hơn Hình dạng của bàn cờ sử dụng trong các trò chơi này dễ dàng biểu diễn vào máy tính, trong khi không đòi hỏi một hình thức khó hiểu cần thiết nào để nắm bắt những tinh tế và ngữ nghĩa trong những lĩnh vực bài toán phức tạp hơn Do có thể chơi các trò chơi một cách dễ dàng nên việc thử nghiệm các chương trình chơi trò chơi không phải trả một gánh nặng nào về tài chính hay đạo đức
Các trò chơi có thể phát sinh ra một số lượng không gian tìm kiếm cực kỳ lớn Những không gian này đủ lớn và phức tạp để đòi hỏi những kỹ thuật mạnh nhằm quyết định xem những lựa chọn nào cần được khảo sát trong không gian bài toán Những kỹ thuật này được gọi là heuristic, nhiều thứ mà chúng ta gọi là thông minh thuộc về các heuristic được người sử dụng để giải quyết các vấn đề
Hầu hết chúng ta đều có một số kinh nghiệm với những trò chơi đơn giản này, nên chúng ta cũng có khả năng nghĩ ra và kiểm nghiệm tính hiệu quả của các heuristic của chính mình Chúng ta không cần đi tìm và hỏi ý kiến chuyên gia trong một số lĩnh vực chuyên môn sâu như y học hay toán học (Các trò chơi cờ, xếp hình là một ngoại lệ dễ thấy với qui tắc này) Vì những lý do đó, các trò chơi cung cấp một không gian mênh mông cho việc nghiên cứu các tìm kiếm heuristic Các chương trình chơi trò chơi, trái ngược với tính đơn giản của chúng,