TRƯỜNG ĐẠI HỌC NHA TRANG Khoa: Công nghệ Thông tin PHIẾU THEO DÕI TIẾN ĐỘ VÀ ĐÁNH GIÁ BÁO CÁO THỰC TẬP CƠ SỞ Tên đề tài: MINH HỌA GIẢI BÀI TOÁN 8 QUÂN HẬU BẰNG THƯ VIỆN ĐỒ HỌA Giảng viê
Trang 1BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC NHA TRANG KHOA CÔNG NGHỆ THÔNG TIN
MINH HỌA GIẢI BÀI TOÁN 8 QUÂN HẬU BẰNG THƯ VIỆN
ĐỒ HỌA
Giảng viên hướng dẫn: ThS Đoàn Vũ Thịnh
Sinh viên thực hiện: Lê Hoàng Nam
Mã số sinh viên: 61133986
Khánh Hòa - 2021
Trang 2TRƯỜNG ĐẠI HỌC NHA TRANG
KHOA CÔNG NGHỆ THÔNG TIN
BỘ MÔN HỆ THỐNG THÔNG TIN
MINH HỌA GIẢI BÀI TOÁN 8 QUÂN HẬU BẰNG THƯ VIỆN
ĐỒ HỌA
Giảng viên hướng dẫn: ThS Đoàn Vũ Thịnh
Sinh viên thực hiện: Lê Hoàng Nam
Mã số sinh viên: 61133986
Khánh Hòa - Tháng 12/2021
Trang 3TRƯỜNG ĐẠI HỌC NHA TRANG
Khoa: Công nghệ Thông tin
PHIẾU THEO DÕI TIẾN ĐỘ VÀ ĐÁNH GIÁ BÁO CÁO THỰC TẬP CƠ
SỞ Tên đề tài: MINH HỌA GIẢI BÀI TOÁN 8 QUÂN HẬU BẰNG THƯ VIỆN ĐỒ
HỌA
Giảng viên hướng dẫn: ThS Đoàn Vũ Thịnh
Sinh viên được hướng dẫn: Lê Hoàng Nam
MSSV: 61133986
1 7/12/2020 Nhận đề tài hướng dẫn và định
hướng giải quyết vấn đề Sinhviên trình bày kế hoạch thựchiện
Sinh viên và GVHD traođổi nội dung của đề tài.Phân chia công việc theotừng thời gian sao cho phùhợp với yêu cầu
2 14/12/2020 Sinh viên trình bày việc mô
phỏng thuật toán chính dựatrên kiến thức đã được học ởmôn kỹ thuật đồ họa và cáckiến thức thu nhận được từInternet để minh họa bài toán
đa dạng nhất có thể
Sinh viên hiểu được vấn đềcần phải thực hiện và cógiải pháp cho từng vấn đề
cụ thể Tuy nhiên trình bàycòn thiếu sót và cần đầu tưthời gian hơn cho thuậttoán
3 21/12/2020 Sinh viên hoàn thiện các thuật
toán đã đề ra với dữ liệu đầuvào được nhập từ bàn phím
Trình bày thuật toán với cáctrường hợp sai và chỉ ra đượchướng khắc phục cho cáctrường hợp đó
Sinh viên hiểu nội dung củathuật toán với các trườnghợp hạn chế của thuật toánnhưng chưa đủ Các chứcnăng khác phụ trợ cho việcminh họa bài toán đã hoànthành
4 4/01/2021 Sinh viên nộp bản thảo của báo
cáo thực tập lần thứ 1 và tiếnhành chỉnh sửa
Báo cáo chỉ trình bày chungchung chưa đi vào cụ thểphân tích các yêu cầu củabài toán, hình ảnh, bảngbiểu chưa trình bày rõ ràng.Cần hiệu chỉnh theo yêu
Trang 4cầu của GVHD.
5 11/01/2021 Sinh viên nộp bản thảo lần 2
và tiến hành chỉnh sửa
Sinh viên nộp bản thảo lần
2 Đã tìm hiểu thuật toánđầy đủ
6 18/1/2021
Sinh viên nộp bản thảo lầncuối sau khi đã chỉnh sửa cácyêu cầu như đã đề ra
Sinh viên nghiêm túc chỉnhsửa báo cáo theo địnhhướng của GVHD
Nhận xét chung (sau khi sinh viên hoàn thành ĐA/KL):
Điểm hình thức: …./10 Điểm nội dung: … /10 Điểm tổng kết: … /10
Đồng ý cho sinh viên: Được bảo vệ: Không được bảo vệ:
Khánh Hòa, ngày 20 tháng 01 năm 2021
Cán bộ hướng dẫn
(Ký và ghi rõ họ tên)
Trang 5MỤC LỤC
TÓM TẮT 4
1 GIỚI THIỆU 5
1.1 Bài toán 8 quân hậu: 5
1.2 Đệ quy: 5
1.3 Thuật toán quay lui: 6
1.4 Visual Studio Code và thư viện Graphics: 6
2 PHƯƠNG PHÁP NGHIÊN CỨU 8
2.1 Cài đặt Visual Studio Code và thư viện graphics.h: 8
2.2 Sử dụng thuật toán quay lui giải bài toán: 10
2.2.1 Tạo các biến chuẩn bị cho cài đặt thuật toán: 10
2.2.2 Cài đặt thuật toán quay lui và đệ quy: 10
2.2.3 Toàn bộ thuật toán quay lui: 13
2.3 Các hàm khác trong chương trình: 13
2.3.1 Hàm vebanco (vẽ bàn cờ): 13
2.3.2 Hàm menu và ktramenu: 14
2.4 Hàm floodfill và cách xác định vị trí quân cờ trên bàn cờ: 15
2.5 Hàm main: 16
3 KẾT QUẢ 17
4 KẾT LUẬN 23
5 TÀI LIỆU THAM KHẢO 24
Trang 6TÓM TẮT
Bài toán 8 quân hậu là một trong những bài toán logic kinh điển từ giữa thế kỷXIX Sau được tổng quát và biết đến nhiều hơn với cách gọi bài toán xếp hậu (bài toánxếp n quân hậu trên bàn cờ n×n) Ở dạng tổng quát này, ta có thể tìm ra hàng tỷ cáchgiải với điều kiện n đủ lớn Đây là bài toán có thể ứng dụng trong nhiều mục đích nhưgiải trí và học tập Việc giải bài toán với mô tả theo cách trực quan sẽ đem đến cáinhìn sâu hơn về bài toán cũng như thuật toán đã cài đặt để giải bài toán này
Sử dụng đồ họa máy tính, một lĩnh vực của Công Nghệ Thông Tin dùng đểnghiên cứu về cơ sở toán học, thuật toán và các kĩ thuật tạo, hiển thị, sử dụng hình ảnhđược hiển thị trên máy tính Đây là lựa chọn tối ưu để tạo nên góc nhìn trực quan.Cùng với thuật toán quay lui và đệ quy, 2 thuật toán cơ bản đã được học và tìm hiểu,báo cáo này sẽ thể hiện, mô tả, giải đáp và kết luận toàn bộ quá trình giải bài toán 8quân hậu trên máy tính
Thông qua bài báo cáo, người đọc có thể xác định được ý tưởng về cách giải bàitoán 8 quân hậu, quy luật cũng như các quy ước khi giải bài Biết được cách cài đặtVisual Studio Code và thư viện đồ họa Quan trọng nhất, người đọc sẽ có được cáinhìn tổng quan về thuật toán quay lui và đệ quy, hiểu được cách thuật toán được sửdụng ra sao để giải bài toán 8 quân hậu Cùng với đó là các thông tin liên quan đến đồhọa, các hàm có trong thư viện
Trang 71 GIỚI THIỆU
1.1 Bài toán 8 quân hậu:
Bài toán 8 quân hậu được đưa ra vào năm 1848 bởi kỳ thủ Max Bezzel Bàitoán yêu cầu sắp xếp 8 quân hậu (hoặc n quân hậu dưới dạng bài toán xếp hậu tổngquát) trên bàn cờ kích thước 8×8 (hoặc n×n dưới dạng bài toán xếp hậu tổng quát) Saocho không có bất kì quân hậu nào có thể “ăn” được các quân hậu khác bằng cách dichuyển chính nó theo luật của cờ vua
Hình trên là thể hiện của 1 lời giải 8 quân hậu trong đó bàn cờ được thể hiệnbằng hình vuông đen viền trắng và các ô cờ được thể hiện bằng 64 hình vuông viềntrắng bên trong bàn cờ Các ô cờ được tô màu xanh lá cây thể hiện lần lượt vị trí của 8
ô cờ có thể đặt quân hậu thỏa mãn yêu cầu bài toán
Một trong số các lời giải bằng số học có dạng dãy số:
1.2 Đệ quy:
Theo Wikipedia, các tính chất (hoặc cấu trúc) được gọi là đệ quy nếu trong đó
một lớp các đối tượng hoặc phương pháp được xác định bằng việc xác định một số rất
Minh họa lời giải bài toán 8 quân hậu
Trang 8ít các trường hợp hoặc phương pháp đơn giản (thông thường chỉ một) và sau đó xácđịnh quy tắc đưa các trường hợp phức tạp về các trường hợp đơn giản.
Trong lập trình, có thể hiểu đơn giản, nếu trong quá trình chạy chương trình con(hàm, thủ tục), nếu chương trình con (hàm, thủ tục) này gọi lại chính nó thì có thểđược gọi là đệ quy
Với bài toán 8 quân hậu này, đệ quy sẽ chỉ được dùng như cơ sở của thuật toánquay lui
1.3 Thuật toán quay lui:
Quay lui là một thuật toán phát triển dựa trên đệ quy, thường xuyên được dùng
để giải các bài toán thõa mãn ràng buộc (Các bài toán thỏa mãn ràng buộc là các bàitoán có một lời giải đầy đủ, trong đó thứ tự của các phần tử không quan trọng Các bàitoán này bao gồm một tập các biến mà mỗi biến cần được gán một giá trị tùy theo cácràng buộc cụ thể của bài toán) Việc quay lui giúp ta có thể thử tất cả các tổ hợp để tìm
ra tất cả lời giải Rất phù hợp cho các bài toán như bài toán 8 quân hậu
Ví dụ về trường hợp quay lui:
Xét các ô cờ trên cột chưa xét tiếp theo (cột thứ 7) ta thấy tất cả các ô trên cộtđều không thỏa yêu cầu bài toán 8 quân hậu:
Lúc này thuật toán sẽ quay lui và tiếp tục xét các ô cờ khả thi của cột 6 (ô thứ 6,
7, 8)
1.4 Visual Studio Code và thư viện Graphics:
Theo Wikipedia (https://vi.wikipedia.org/wiki/Visual_Studio_Code) Visual
Studio Code là một trình biên tập mã được phát triển bởi Microsoft dành
Minh họa ví dụ về quay lui trong bài toán 8 quân hậu
Trang 9cho Windows, Linux và macOS Nó dựa trên Electron, một nền tảng được sử dụng đểtriển khai các ứng dụng Node.js máy tính cá nhân chạy trên động cơ bố trí Blink Mặc
dù sử dụng nền tảng Electron[5] nhưng phần mềm này không phải là một bản kháccủa Atom, nó thực ra được dựa trên trình biên tập của Visual Studio Online
Visual Studio Code được công bố, ra mắt phiên bản thử nghiệm vào ngày 29tháng 4 năm 2015 bởi Microsoft tại hội nghị Build 2015 Vào ngày 14 tháng 4 năm
2016 Visual Studio Code hoàn tất thử nghiệm và được phát hành chính thức
Visual Studio Code là một trình biên tập mã Nó hỗ trợ nhiều ngôn ngữ và chứcnăng tùy vào ngôn ngữ sử dụng theo như trong bảng sau Nhiều chức năng của VisualStudio Code không hiển thị ra trong các menu tùy chọn hay giao diện người dùng.Thay vào đó, chúng được gọi thông qua khung nhập lệnh hoặc qua một tập tin json (ví
dụ như tập tin tùy chỉnh của người dùng) Khung nhập lệnh là một giao diện theo dònglệnh Tuy nhiên, nó biến mất khi người dùng nhấp bất cứ nơi nào khác, hoặc nhấn tổhợp phím để tương tác với một cái gì đó ở bên ngoài đó Tương tự như vậy với nhữngdòng lệnh tốn nhiều thời gian để xử lý Khi thực hiện những điều trên thì quá trình xử
lý dòng lệnh đó sẽ bị hủy
Thư viện Graphics.h (Borland Graphics Interface – còn được biết đến với têngọi BGI) là một thư viện đồ họa rất phổ biến trên DOS và các máy tính chạy hệ điềuhành Windows thời kì đầu như Windows 95, Windows 98
Thư viện này cung cấp cho người dùng 2 file: graphics.h và graphics.lib để cóthể sử dụng được với ngôn ngữ C/C++ cũng như module graph nếu người dùng sửdụng ngôn ngữ Pascal Bộ thư viện này đi kèm với IDE Borland C++ 3.1 (1992) Nóchứa một số hàm vẽ ảnh và cách tạo ảnh chuyển động, in chữ
Một trong những điểm mạnh của thư viện này là việc khởi tạo cũng như sử dụngrất đơn giản, vì vậy mặc dù ra đời rất lâu nhưng hiện tại vẫn có rất nhiều trường đạihọc sử dụng cho mục đích giảng dạy
Thư viện winbmin Đồ họa C sử dụng các hàm WinBGIm (Windows 7) có thể
được sử dụng để vẽ các hình dạng khác nhau, hiển thị văn bản trong các phông chữkhác nhau, thay đổi màu sắc và nhiều hơn nữa Thư viện winbgim cho phép bạn sửdụng các thói quen đồ họa BGI và hỗ trợ chuột đơn giản cho các ứng dụng Windows
mà bạn viết bằng trình biên dịch mingw32 gnu C ++ của CS1300 hoặc với trình biêndịch Borland C ++ (phiên bản 5.0) Nó cũng có thể hoạt động với các trình biên dịchWindows khác
Trang 102 PHƯƠNG PHÁP NGHIÊN CỨU 2.1 Cài đặt Visual Studio Code và thư viện graphics.h:
Để cài đặt Visual Studio Code bản 2019 về máy, vào đường dẫn:(https://visualstudio.microsoft.com/download)
Tiến hành tải và cài đặt theo hướng dẫn tại đường dẫn:(https://duythanhcse.wordpress.com/2019/04/03/huong-dan-tai-cai-dat-va-su-dung-visual-studio-2019)
(https://github.com/thinhdoanvu/ComputerGraphics/tree/master/Coding/library)
Không như cách cài Graphics cho DevC, để sử dụng thư viện Graphics trên
Visual Studio Code bạn cần cài đặt thêm TDM-GCC theo đường dẫn:
(https://jmeubank.github.io/tdm-gcc), và thiết lập Visual Studio Code theo hướng dẫntại: (https://www.youtube.com/watch?v=J0_vt-7Ok6U)
Bạn cũng có thể thay thế Visual Studio Code bằng phần mềm DevC và thựchiện cài đặt thư viện đồ họa theo 5 bước:
Bước 1: Copy tập tin 6-ConsoleAppGraphics, ConsoleApp_cpp_graph đến đường dẫn C:\Program Files\Dev-Cpp\Templates
Bước 2: Copy tập tin graphics, winbgim đến thư mục C:\Program
Files\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include
Bước 3: Copy tập tin libbgi.a đến đường dẫn C:\Program Files\Dev-Cpp\
MinGW64\x86_64-w64-mingw32\lib
Bước 4: Hiệu chỉnh phiên bản TDM-GCC cho phù hợp với hệ điều hành trong
phần mềm DevC/C++ theo đường dẫn sau: Tools - Compiler Option ta chọn
TDM-GCC 4.9.2 32bit Release
Thiết lập phiên bản TDM-GCC phù hợp với DevC/C++ phiên bản 32 bit
Trang 11Bước 5: Tạo mới dự án (Project) đồ họa sử dụng thư viện graphics.h theo các
bước sau: File New Project Console Graphics Application với tên project
được đánh dấu bởi vùng màu đỏ (Hình 2)
Thiết lập project khởi động đồ họa sử dụng thư viện graphics.h
Dưới đây là một đoạn code minh họa trong đồ họa
Code sau khi chạy:
Chương trình chạy minh họa Code minh họa trong đồ họa
Trang 122.2 Sử dụng thuật toán quay lui giải bài toán:
2.2.1 Tạo các biến chuẩn bị cho cài đặt thuật toán:
Trước khi sử dụng giải thuật để giải bài toán Sử dụng các biến mảng có kiểu
dữ liệu Boolean để lưu các trạng thái các hàng và đường chéo Từ đó sử dụng các dữliệu này để biết được các hàng, đường chéo đã có quân hậu hay chưa
Đầu tiên, nếu các chỉ số dòng, cột được đánh số từ trên xuống dưới, từ trái sangphải theo cách đánh số của ma trận Thì ta có thể thấy các tính chất:
Quy ước giá trị False của phần tử thứ n biểu thị trạng thái chưa có quân hậu trên hàng hoặc đường chéo thứ n Ví dụ: phần tử hang[8] có giá trị False biểu thị hàng
thứ 8 chưa có bất kì ô cờ nào đã đặt quân hậu
Tiếp tục tạo biến mảng để lưu kết quả:
Cuối cùng ta khởi tạo giá trị toàn bộ các biến mảng này là False tại hàm main(),
biểu trị bàn cờ trống:
Trang 132.2.2 Cài đặt thuật toán quay lui và đệ quy:
Tạo hàm quay lui tên giai() với tham số truyền vào là số thứ tự của cột:
Với tham số này, thuật toán sẽ xét lần lượt các cột và không cần biến mảng đểghi trạng thái của các cột
Bắt đầu cài đặt thuật toán, đầu tiên tạo vòng lập for với biến đếm j = 1 biểu thị cho hàng đang xét, cùng biểu thức điều kiện j bé hơn hoặc bằng số hàng trong bàn cờ:
Trong vòng lập for tạo câu lệnh điều kiện để xét vị trí ô cờ đó có nằm trên hàng,đường chéo cộng, đường chéo trừ nào đã được đặt quân hậu hay chưa
Trường hợp thỏa điều kiện (có quân cờ cùng hàng hoặc cùng đường chéo): Lưu kết quả và gán giá trị True để biểu thị hàng, đường chéo cộng, đường chéo
trừ đang xét hiện tại đã được đặt quân hậu Sau đó tô màu vàng ô cờ bằng hàm
floodfill() nhằm biểu thị ô cờ đã được đặt quân hậu và dung hàm delay để thể quá trình
giải của thuật toán:
Tiếp tục sử dụng câu lệnh điều kiện nếu cột đã xét là cột cuối của bàn cờ thì tôxanh các ô cờ đã tô vàng (tô dựa theo các giá trị đúng gán trong mảng ketqua đã khai
báo) Dùng hàm getch() để giữ màn hình hiển thị kết quả cho người dùng Tô vàng các
ô theo cách tô xanh kết quả để tiếp tục xét các trường hợp kế tiếp Trong trường hợp
Trang 14không thỏa điều kiện (chưa xét đến cột cuối của bàn cờ), đệ quy hàm giai() để tiếp tục
xét các cột kết tiếp:
Kế đến gán giá trị phần tử trong mảng hàng, đường chéo cộng, đường chéo trừ
chứa ô đang xét thành False:
tô đen ô cờ để thể hiện bỏ chọn ô cờ đang xét:
Trường hợp không thỏa điều kiện (không có quân hậu cùng hàng và đường chéo):
Tô màu đỏ, sau khi delay 1 khoảng thời gian nhất định, tô đen ô cờ, điều nàykhi hiển thị trên màn hình thể hiện ô cờ đang xét đã không thỏa mãn yêu cầu bài toán
đã đặt ra:
Trang 152.2.3 Toàn bộ thuật toán quay lui:
2.3 Các hàm khác trong chương trình:
2.3.1 Hàm vebanco (vẽ bàn cờ):
Hàm vẽ bàn cờ sử dụng các hàm có sẵn trong thư viện graphics.h để vẽ bàn cờ.Bàn cờ vẽ trên màn hình đồ họa có độ lớn 400×400 pixel, có 2 đỉnh có tọa độ là(10;10) và (410;410) Các ô cờ có độ lớn 50×50 pixel, tất cả được thể hiện bằng các
đường thẳng trắng Hàm sẽ được gọi trong hàm main() trước khi gọi hàm giai().
Trang 16(450;350) và (600;400) Hàm sẽ được gọi trong hàm main() trước hoặc sau khi vẽ bàn
cờ
Trong khi đó, hàm ktramenu() sẽ kiểm tra xem người dùng có click chuột trong lúc sử dụng chương trình không Hàm sẽ được gọi trong vòng lặp for của hàm
Trang 17giai() (mỗi khi xét các ô mới trong bàn cờ sẽ đồng thời xét xem có thao tác click chuột
hay không) Khai báo các biến để lưu tọa độ nhấp chuột là mx và my sau dùng hàm
getmouseclick() để gán hoành độ x của click chuột cho mx và tung độ y của click
chuột cho my
Nếu có, tùy theo vị trí tọa độ nhấp chuột trong màn hình đồ họa nằm trong ô tùychọn nào của menu mà sẽ có các lệnh khác nhau như tăng tốc, giảm tốc hoặc thoát.Ngược lại nếu người dùng không click chuột hoặc click chuột vào tọa độ không nằmtrong bất kì ô tùy chọn nào của menu, câu lệnh sẽ được bỏ qua
Với tùy chọn × toc do hoặc / toc do Ta khai báo biến tocdo với giá trị 400 và truyền vào các hàm delay() trong hàm giai() để thể hiện quá trình giải cho mắt thường
có thể theo dõi Nếu người dùng chọn × toc do ta gán tocdo = tocdo/2, nếu là / tocdo
ta gán tocdo = tocdo×2 Đồng thời phải đặt điều kiện cho giá trị tốc độ trước khi gán
giá trị để tránh trường hợp biến tocdo bị chia lấy nguyên về giá trị 0 hoặc thời gian delay() quá lớn (ở đây đặt tocdo phải trên 10 và dưới 4000 tương đương 0.01 giây và 4
giây)
2.4 Hàm floodfill và cách xác định vị trí quân cờ trên bàn cờ:
Hàm floodfill() là hàm có sẵn của thư viện graphics.h, cho phép tô màu các
pixel xung quanh tọa độ chỉ định có giá trị màu bằng hoặc chênh lệch 1 khoảng giá trị
cho phép với pixel ở tọa độ đó Sử dụng hàm floodfill() ta sẽ tô các ô cờ theo quy ước
các ô cờ đang xét thỏa điều kiện màu vàng, các ô cờ đang xét không thỏa điều kiệnmàu đỏ, các ô cờ đã xét và tạo thành 1 lời giải màu xanh lá cây
Tuy nhiên, để tô màu các ô cờ ta phải xác định tọa độ để truyền vào hàm như 1tham số Với bàn cờ tạo từ 2 đỉnh đối nhau là (10;10) và (410;410), độ lớn là 400×400pixel, cùng các ô cờ lớn 50×50 pixel, ta dùng các chỉ số hàng và cột có sẵn để tạo
thành công thức tính tọa độ tô màu ô cờ thuộc cột i hàng j:
x = (i-1) × 50 + a và y = (j-1) × 50 + b Với a,b ∈ (0;50)