báo cáo bài tập môn công nghệ java | Đại học Xây Dựng Hà Nội

Java là một ngôn ngữ lập trình dạng lập trình hướng đối tượng (OOP). Khác với phần lớn ngôn ngữ lập trình thông thường, thay vì biên dịch mã nguồn thành mã máy hoặc thông dịch mã nguồn khi chạy, Java được thiết kế để biên dịch mã nguồn thành bytecode, bytecode sau đó sẽ được môi trường thực thi (runtime environment) chạy. Bằng cách này, Java thường chạy chậm hơn những ngôn ngữ lập trình thông dịch khác như C++, Python, Perl, PHP, C#.. Tài liệu giúp bạn tham khảo, học tập và đạt kết quả cao. Mời bạn đọc đón xem!

lOMoARcPSD|45222017
MỤC LỤC
TÓM TẮT ĐỀ TÀI................................................................................................................................3
CHƯƠNG 1. Cơ sở lý thuyết................................................................................................................3
1.1. Giới thiệu về ngôn ngữ Java..........................................................................................3
1.2. Một số tính chất của ngôn ngữ Java..............................................................................4
1.2.1. Đơn giản.........................................................................................................................4
1.2.2. Hướng đối tượng............................................................................................................4
1.2.3. Độc lập phần cứng và hệ điều hành..............................................................................5
1.2.4. Mạnh mẽ.........................................................................................................................6
1.2.5. Bảo mật...........................................................................................................................6
1.2.6. Phân tán.........................................................................................................................7
1.2.7. Đa luồng.........................................................................................................................7
1.2.8. Linh động.......................................................................................................................7
1.3. Công cụ sử dụng trong đề tài.......................................................................................14
CHƯƠNG 2. Xây dựng và triển khai ứng dụng..................................................................................7
2.1. Xác định yêu cầu:...........................................................................................................7
2.1.1. Yêu cầu chức năng:........................................................................................................8
2.1.2. Yêu cầu phi chức năng:..................................................................................................8
2.2. Triển khai ứng dụng......................................................................................................8
2.3. Kết quả............................................................................................................................17
KẾTLUẬN...............................................................................................................................30
TÓM TẮT ĐỀ TÀI
Java là một ngôn ngữ lập trình dạng lập trình hướng đối tượng (OOP). Khác với
phần lớn ngôn ngữ lập trình thông thường, thay biên dịch nguồn thành máy
hoặc thông dịch nguồn khi chạy, Java được thiết kế để biên dịch nguồn thành
bytecode, bytecode sau đó sẽ được môi trường thực thi (runtime environment) chạy.
Bằng cách này, Java thường chạy chậm hơn những ngôn ngữ lập trình thông dịch khác
như C++, Python, Perl, PHP, C#...
lOMoARcPSD|45222017
Ngôn ngữ lập trình Java được giới thiệu vào năm 1990. Sau đó không lâu, ngôn
ngữ này được sử dụng rộng rãi và phổ biến đối với các lập trình viên chuyên nghiệp cũng
như các nhà phát triển phần mềm.
Để hiểu hơn về Java nhóm chúng em đã tìm hiểu y dựng một chương trình
đơn giản Game Xếp Hình”. Hay còn được gọi Puzzle, nghĩa câu đố, đây
trò chơi thuộc thể loại game trí tuệ. Trò chơi này cũng giống như các trò chơi xếp hình,
đầu tiên với kích thước trò chơi 4x3, trạng thái ban đầu được khởi tạo ngẫu nhiên.
Nhiệm vụ của người chơi là phải tái tạo lại một hình ảnh hoàn chỉnh bằng cách di chuyển
và xếp các mảnh ghép với vị trí khác nhau để hình thành hình ảnh ban đầu. Người chơi
sẽ dịch chuyển các mảnh ghép theo các hướng lên, xuống, trái, phải khi ô cạnh ô
trống.
Chương 1. Cơ sở lý thuyết
1.1. Giới thiệu về ngôn ngữ Java:
Java một ngôn ngữ lập trình được Sun Microsystems giới thiệu o tháng 6 năm
1995. Từ đó, nó đã trở thành một công cụ lập trình của các lập trình viên chuyên nghiệp.
Java được y dựng trên nền tảng của C C++, do vậy nó sử dụng các pháp của C
và các đặc trưng hướng đối tượng của C++.
Vào năm 1991, một nhóm các kỹ của Sun Microsystems ý định thiết kế một
ngôn ngữ lập trình để điều khiển các thiết bị điện tử như tivi, máy giặt, lò nướng,… Mặc
dù C và C++ có khả năng làm việc này nhưng trình biên dịch lại phụ thuộc vào từng loại
CPU.
Trình biên dịch thường phải tốn nhiều thời gian để y dựng nên rất đắt, vậy đ
mỗi loại CPU có một trình biên dịch riêng là rất tốn kém. Do đó nhu cầu thực tế đòi hỏi
một ngôn ngữ chạy nhanh, gọn, hiệu quả và độc lập thiết bị tức là có thể chạy trên nhiều
loại CPU khác nhau, dưới các môi trường khác nhau. “Oak” đã ra đời và vào năm 1995
được đổi tên thành Java. Mặc dù mục tiêu ban đầu không phải cho Internet nhưng do đặc
trưng không phụ thuộc thiết bị nên Java đã trở thành ngôn ngữ lập trình cho Internet.
lOMoARcPSD|45222017
1.2. Một số tính chất của ngôn ngữ Java:
Java là ngôn ngữ lập trình được phát triển từ ngôn ngữ lập trình C/C++. Nó kế thừa,
phát huy các thế mạnh của ngôn ngữ C/C++ lược bỏ đi các pháp phức tạp của
C/C++. Ngôn ngữ lập trình Java một số đặc trưng tiêu biểu: đơn giản, hướng đối
tượng, độc lập phần cứng và hệ điều hành, mạnh mẽ, bảo mật, phân tán, đa luồng và linh
động.
1.2.1. Đơn giản:
Những người thiết kế mong muốn phát triển một ngôn ngữ dễ học và quen thuộc
với đa số người lập trình. Do vậy Java loại bỏ các đặc trưng phức tạp của C C++ như:
- Loại bỏ thao tác con trỏ, thao tác định nghĩa chồng toán tử
- Không cho phép đa kế thừa mà sử dụng các giao diện
- Không sử dụng lệnh “goto” cũng như file header (.h)
- Loại bỏ cấu trúc “struct” và “union”
1.2.2. Hướng đối tượng:
Java là ngôn ngữ lập trình thuần hướng đối ợng, mọi chương trình viết trên Java
đều phải được xây dựng trên các đối tượng. Nếu trong C/C++ ta thể tạo ra các hàm
(chương trình con không gắn với đối ợng nào) thì trong Java ta chỉ thể tạo ra các
phương thức (chương trình con gắn liền với một lớp cụ thể). Trong Java không cho phép
các đối tượng có tính năng đa kế thừa được thay thế bằng các giao diện (interface)
1.2.3. Độc lập phần cứng và hệ điều hành:
Đối với các ngôn ngữ lập trình truyền thống nC/C++, phương pháp biên dịch
được thực hiện như sau :
lOMoARcPSD|45222017
Hình 1.1: Các biên dịch chương trình hệ thống
Với mỗi nền phần cứng khác nhau, có một trình biên dịch khác nhau để biên
dịch mã nguồn chương trình cho phù hợp với nền phần cứng ấy. Do vậy, khi chạy trên
một nền phần cứng khác bắt buộc phải biên dịch lại mã nguồn.
Đối với các chương trình viết bằng Java, trình biên dịch Javac sẽ biên dịch
nguồn thành dạng bytecode. Sau đó, khi chạy chương trình trên các nền phần cứng khác
nhau, y ảo Java dùng trình thông dịch Java để chuyển bytecode thành dạng chạy
được trên các nền phần cứng ơng ứng. Do vậy, khi thay đổi nền phần cứng, không phải
biên dịch lại mã nguồn Java.
Hình 1.2: Biên dịch hệ thống java
1.2.4. Mạnh mẽ:
Java là ngôn ngữ yêu cầu chặt chẽ về kiểu dữ liệu.
- Kiểu dữ liệu phải khai báo tường minh.
- Java không sử dụng con trỏ và các phép toán con trỏ.
- Java kiểm tra tất cả các truy nhập đến mảng, chuỗi khi thực thi để đảm bảo rằng các
truy nhập đó không ra ngoài giới hạn kích thước
lOMoARcPSD|45222017
- Trong các môi trường lập trình truyền thống, lập trình viên phải tự mình cấp phát b
nhớ, trước khi chương trình kết thúc thì phải tự giải phóng bộ nhớ đã cấp. Vấn đề có
thể nảy sinh khi lập trình viên quên giải phóng bộ nhớ đã xin cấp trước đó. Trong
chương trình Java, lập trình viên không phải bận tâm đến việc cấp phát bộ nhớ. Quá
trình cấp phát, giải phóng được thực hiện tự động, nhờ dịch vụ thu nhặt những đối
tượng không còn sử dụng nữa (garbage collection).
- Cơ chế bẫy lỗi của Java giúp đơn giản hóa quá trình xử lý lỗi và hồi phục sau lỗi.
1.2.5. Bảo mật:
Java cung cấp một môi trường quản thực thi chương trình với nhiều mức để
kiểm soát tính an toàn:
- Ở mức thứ nhất, dữ liệu và các phương thức được đóng gói bên trong lớp. Chúng chỉ
được truy xuất thông qua các giao diện mà lớp cung cấp.
- Ở mức thứ hai, trình biên dịch kiểm soát để đảm bảo mã là an toàn, và tuân theo các
nguyên tắc của Java.
- Mức thứ ba được đảm bảo bởi trình thông dịch chúng kiểm soát xem bytecode
đảm bảo các quy tắc an toàn trước khi thực thi không.
- Mức thứ tư kiểm soát việc nạp các lớp vào bộ nhớ để giám sát việc vi phạm giới hạn
truy xuất trước khi nạp vào hệ thống.
1.2.6. Phân tán:
Java được thiết kế để hỗ trợ các ứng dụng chạy trên mạng bằng các lớp mạng
(java.net). Hơn nữa, Java hỗ trợ nhiều nền chạy khác nhau nên chúng được sử dụng rộng
rãi như là công cụ phát triển trên Internet - nơi sử dụng nhiều nền khác nhau.
1.2.7. Đa luồng
Chương trình Java cung cấp giải pháp đa luồng (Multithreading) để thực thi các
công việc đồng thời. Chúng cũng cung cấp giải pháp đồng bộ giữa các luồng. Đặc tính
hỗ trợ đa luồng này cho phép xây dựng các ứng dụng trên mạng chạy hiệu quả.
lOMoARcPSD|45222017
1.2.8. Linh động
Java được thiết kế như một ngôn ngữ động để đáp ứng cho những môi trường mở.
Các chương trình Java chứa rất nhiều thông tin thực thi nhằm kiểm soát truy nhập đối
tượng lúc chạ. Điều này cho phép khả năng liên kết mã động.
1.3. Công cụ được sử dụng trong đề tài
NetBeans là một môi trường phát triển tích hợp (IDE) cho Java. NetBeans cho phép
các ứng dụng được phát triển từ một tập hợp các thành phần phần mềm được gọi là
modules. NetBeans chạy trên Windows, macOS, Linux và Solaris. Ngoài việc phát
triển Java, nó còn có các phần mở rộng cho các ngôn ngữ khác như PHP, C, C++,
HTML5, và JavaScript. Các ứng dụng dựa trên NetBeans, bao gồm NetBeans IDE,
có thể được mở rộng bởi các nhà phát triển bên thứ ba.
Java Development Kit (JDK - Bộ công cụ cho người phát triển ứng dụng bằng ngôn
ngữ lập trình Java) là một tập hợp những công cụ phần mềm được phát triển bởi Sun
Microsystems dành cho các nhà phát triển phần mềm, dùng để viết những applet Java
hay những ứng dụng Java - bộ công cụ này được phát hành miễn phí gồm có trình biên
dịch, trình thông dịch, trình giúp sửa lỗi (debugger, trình chạy applet và tài liệu nghiên
cứu.
Kể từ khi ngôn ngữ Java ra đời, JDK là bộ phát triển phần mềm thông dụng nhất cho
Java. Ngày 17 tháng 11 năm 2006, hãng Sun tuyên bố JDK sẽ được phát hành dưới
giấy phép GNU General Public License (GPL), JDK trở thành phần mềm tự do. Việc
này đã được thực hiện phần lớn ngày 8 tháng 5 năm 2007 và mã nguồn được đóng góp
cho OpenJDK.
lOMoARcPSD|45222017
CHƯƠNG 2. Xây dựng và triển khai ứng dụng
2.1. Xác định yêu cầu
2.1.1. Yêu cầu chức năng
Game xếp hình (hay còn gọi là Puzzle) là một trò chơi điều khiển các mảnh ghép
trong một khung có hình ảnh ngẫu nhiên với một ô bị thiếu. Nhiệm vụ của chúng ta là
trượt các mảnh ghép đó sao cho kết quả được hình ảnh giống với ảnh ban đầu.
2.1.2. Yêu cầu phi chức năng:
Giao diện game đơn giản, thân thiện và dễ sử dụng với người chơi.
2.2. Triển khai ứng dụng
Import các thư viện và class cần thiết:
Lớp Puzzle kế thừa từ JFrame và triển khai giao diệnActionListener để xử lý sự kiện:
lOMoARcPSD|45222017
Lớp Puzzle có các thuộc tính (biến thành viên) sau:
Biến thành viên private kiểu JPanel để đại diện cho một panel nằm trung tâm của
frame.
Biến thành viên private kiểu JButton để tạo các nút được sử dụng trong trò chơi.
Biến thành viên private kiểu JLabel để hiển thị hình ảnh hoặc văn bản trên giao diện.
Biến thành viên private kiểu Image để lưu trữ nguồn hình ảnh cho trò chơi.
Sử dụng một mảng boolean check có kích thước 12, được sử dụng để kiểm tra trạng thái
của các mảnh ghép trong trò chơi. Mỗi phần tử trong mảng đại diện cho trạng thái kiểm
tra của một mảnh ghép.
Một mảng hai chiều pos được khai báo nhưng không được khởi tạo giá trị ban đầu, được
sử dụng để lưu vị trí của các mảnh ghép trong trò chơi.
Hai biến widthheight kiểu int để lưu chiều rộng và chiều cao của hình ảnh.
Các biến y sẽ được sử dụng để quản các thành phần giao diện người dùng hình
ảnh trong trò chơi xếp hình.
Contructor của lớp Puzzle:
Khởi tạo vị trí ban đầu của các miếng ghép hình với kích thước 3x4
Tạo JPanel để chứa nút và label, và cài đặt layout
Tạo ImageIcon từ tệp hình ảnh "nam.jpg" và lấy hình ảnh gốc
Lấy chiều rộng và chiều cao của hình ảnh nguyên thủy
lOMoARcPSD|45222017
Thêm rigid area vào BorderLayout.NORTH thêm centerPanel vào
BorderLayout.CENTER của JFrame
Tạo các miếng ghép hình từ hình ảnh gốc và thêm vào Vector<Image> tạo một hình
ảnh mới bằng cách cắt hình ảnh gốc (source image)
Khởi tạo mảng check để theo dõi trạng thái của các miếng ghép hình, sau đó tạo các nút
và label để tạo trò chơi ghép hình
Nếu đang ở ô cuối cùng của dòng thứ 4 (i = 3) và cột thứ 3 (j = 2), tạo một label trống để
tạo ô trống, thêm label trống vào centerPanel, tạo một JButton để chứa miếng ghép hình,
thêm ActionListener để xử lý sự kiện khi nút được nhấn, tạo một đối tượng Random để
tạo số ngẫu nhiên từ 0 đến 10.
Kiểm tra xem miếng ghép hình đã được sử dụng chưa, nếu đã được sử dụng, tạo một số
ngẫu nhiên mới, tiếp theo đặt hình ảnh cho Jbutton, đánh dấu miếng ghép hình đã được
sử dụng và thêm JButton vào centerPanel.
lOMoARcPSD|45222017
Cài đặt các thuộc tính cho Jframe và hiển thị nó
setSize(); sử dụng để đặt kích thước của cửa sổ. setTitle()
sử dụng để đặt tiêu đề cho cửa sổ.
setResizable() sử dụng để xác định xem cửa sổ có thể thay đổi kích thước hay không
khi người dùng kéo căn chỉnh kích thước cửa sổ. Trong trường hợp này, false được
truyền vào nghĩa là cửa sổ không thể thay đổi kích thước (không thể kéo căn chỉnh kích
thước cửa sổ).
setLocationRelativeTo() được sử dụng để đặt vị trí hiển thị của cửa sổ. Khi giá trị được
đặt là null, cửa sổ sẽ được hiển thị ở trung tâm của màn hình.
setDefaultCloseOperation() xác định hành động khi người dùng đóng cửa sổ. Trong
trường hợp này, khi cửa sổ được đóng, nó sẽ được giải phóng bộ nhớ và các tài nguyên
liên quan tới cửa sổ này sẽ được dọn dẹp (disposed).
lOMoARcPSD|45222017
setVisible() được gọi để hiển thị cửa sổ lên màn hình. Khi gọi phương thức này với giá
trị true, cửa sổ sẽ được hiển thị và trở thành focus để người dùng tương tác.
Phương thức main để chạy chương trình, tạo một đối tượng Puzzle khi chương trình chạy
Phương thức actionPerformed(ActionEvent e) là phương thức được triển khai từ
interface ActionListener được sử dụng để xử lý sự kiện khi người chơi tương tác với
các nút (JButton) trên giao diện.
Dimension size = button.getSize(); được sử dụng để lấy kích thước của JButton đã được
nhấn và lưu vào đối tượng size.
button.getSize() trả về kích thước hiện tại của JButton trong đối tượng
Dimension trả về chiều rộng chiều cao của JButton, cho biết kích thước của nút để
có thể thực hiện các tính toán hoặc điều chỉnh giao diện tương ứng.
label.getX()label.getY() lấy vị trí X và Y của JLabel, giả sử đã có một JLabel
đại diện cho ô trống trong trò chơi ghép hình. button.getX()button.getY() lấy vị
trí X và Y của JButton trong giao diện.
buttonX / size.width buttonY / size.height tính toán vị trí hàng cột của JButton
trong grid dựa trên kích thước của JButton.
pos[buttonPosY][buttonPosX] lấy ra index của JButton trong mảng pos, một cách để
xác định vị trí của JButton trong grid 2 chiều.
lOMoARcPSD|45222017
Di chuyển xuống:
Điều kiện: labelX == buttonX && (labelY - buttonY) == size.height
Nếu miếng ghép có thể di chuyển lên, labelIndex sẽ được tăng lên 3 (với giả định một
bố cục 3x3). Sau đó, miếng ghép hiện tại (button) sẽ được xóa khỏi centerPanel ở vị trí
buttonIndex và label sẽ được thêm vào vị trí buttonIndex, còn button sẽ được thêm vào
vị trí labelIndex.
Di chuyển lên:
Điều kiện: labelX == buttonX && (labelY - buttonY) == -size.height
Tương tự như trên nhưng ngược lại, label sẽ được thêm vào vị trí buttonIndex, còn button
sẽ được thêm vào vị trí labelIndex.
lOMoARcPSD|45222017
Di chuyển sang phải:
Điều kiện: labelY == buttonY && (labelX - buttonX) == size.width
Nếu miếng ghép có thể di chuyển sang phải, labelIndex sẽ tăng lên 1.
Miếng ghép hiện tại (button) sẽ được xóa khỏi centerPanel ở vị trí buttonIndex, label sẽ
được thêm vào vị trí buttonIndex, và button sẽ được thêm vào vị trí labelIndex.
Di chuyển sang trái:
Điều kiện: labelY == buttonY && (labelX - buttonX) == -size.width
Tương tự như trên nhưng ngược lại, label sẽ được thêm vào vị trí labelIndex, còn button
sẽ được thêm vào vị trí labelIndex.
2.3. Kết quả
Giao diện chương trình lúc hoàn chỉnh
lOMoARcPSD|45222017
TÀI LIỆU THAM KHẢO
[1] Ngô Công Thắng; Bài giảng Lập trình Java
[2] Phạm Quang Dũng Bài giảng lập trình Java Trường ĐH Nông Nghiệp Hà Nội 2009
[3] Bài giảng Java căn bản Aptech 2010
[4] Java cơ sở Trường ĐH Sư phạm k thuật Hưng Yên 2008
| 1/14

Preview text:

lOMoARcPSD| 45222017 MỤC LỤC
TÓM TẮT ĐỀ TÀI................................................................................................................................3
CHƯƠNG 1. Cơ sở lý thuyết................................................................................................................3 1.1.
Giới thiệu về ngôn ngữ Java..........................................................................................3 1.2.
Một số tính chất của ngôn ngữ Java..............................................................................4 1.2.1.
Đơn giản.........................................................................................................................4 1.2.2.
Hướng đối tượng............................................................................................................4 1.2.3.
Độc lập phần cứng và hệ điều hành..............................................................................5
1.2.4. Mạnh mẽ.........................................................................................................................6 1.2.5.
Bảo mật...........................................................................................................................6 1.2.6.
Phân tán.........................................................................................................................7 1.2.7.
Đa luồng.........................................................................................................................7 1.2.8.
Linh động.......................................................................................................................7
1.3. Công cụ sử dụng trong đề tài.......................................................................................14
CHƯƠNG 2. Xây dựng và triển khai ứng dụng..................................................................................7 2.1.
Xác định yêu cầu:...........................................................................................................7
2.1.1. Yêu cầu chức năng:........................................................................................................8
2.1.2. Yêu cầu phi chức năng:..................................................................................................8
2.2. Triển khai ứng dụng......................................................................................................8
2.3. Kết quả............................................................................................................................17
KẾTLUẬN...............................................................................................................................30 TÓM TẮT ĐỀ TÀI
Java là một ngôn ngữ lập trình dạng lập trình hướng đối tượng (OOP). Khác với
phần lớn ngôn ngữ lập trình thông thường, thay vì biên dịch mã nguồn thành mã máy
hoặc thông dịch mã nguồn khi chạy, Java được thiết kế để biên dịch mã nguồn thành
bytecode, bytecode sau đó sẽ được môi trường thực thi (runtime environment) chạy.
Bằng cách này, Java thường chạy chậm hơn những ngôn ngữ lập trình thông dịch khác
như C++, Python, Perl, PHP, C#... lOMoARcPSD| 45222017
Ngôn ngữ lập trình Java được giới thiệu vào năm 1990. Sau đó không lâu, ngôn
ngữ này được sử dụng rộng rãi và phổ biến đối với các lập trình viên chuyên nghiệp cũng
như các nhà phát triển phần mềm.
Để hiểu rõ hơn về Java nhóm chúng em đã tìm hiểu và xây dựng một chương trình
đơn giản là “Game Xếp Hình”. Hay còn được gọi là Puzzle, có nghĩa là câu đố, đây là
trò chơi thuộc thể loại game trí tuệ. Trò chơi này cũng giống như các trò chơi xếp hình,
đầu tiên với kích thước trò chơi là 4x3, trạng thái ban đầu được khởi tạo ngẫu nhiên.
Nhiệm vụ của người chơi là phải tái tạo lại một hình ảnh hoàn chỉnh bằng cách di chuyển
và xếp các mảnh ghép với vị trí khác nhau để hình thành hình ảnh ban đầu. Người chơi
sẽ dịch chuyển các mảnh ghép theo các hướng lên, xuống, trái, phải khi ô cạnh nó là ô trống.
Chương 1. Cơ sở lý thuyết 1.1.
Giới thiệu về ngôn ngữ Java:
Java là một ngôn ngữ lập trình được Sun Microsystems giới thiệu vào tháng 6 năm
1995. Từ đó, nó đã trở thành một công cụ lập trình của các lập trình viên chuyên nghiệp.
Java được xây dựng trên nền tảng của C và C++, do vậy nó sử dụng các cú pháp của C
và các đặc trưng hướng đối tượng của C++.
Vào năm 1991, một nhóm các kỹ sư của Sun Microsystems có ý định thiết kế một
ngôn ngữ lập trình để điều khiển các thiết bị điện tử như tivi, máy giặt, lò nướng,… Mặc
dù C và C++ có khả năng làm việc này nhưng trình biên dịch lại phụ thuộc vào từng loại CPU.
Trình biên dịch thường phải tốn nhiều thời gian để xây dựng nên rất đắt, vì vậy để
mỗi loại CPU có một trình biên dịch riêng là rất tốn kém. Do đó nhu cầu thực tế đòi hỏi
một ngôn ngữ chạy nhanh, gọn, hiệu quả và độc lập thiết bị tức là có thể chạy trên nhiều
loại CPU khác nhau, dưới các môi trường khác nhau. “Oak” đã ra đời và vào năm 1995
được đổi tên thành Java. Mặc dù mục tiêu ban đầu không phải cho Internet nhưng do đặc
trưng không phụ thuộc thiết bị nên Java đã trở thành ngôn ngữ lập trình cho Internet. lOMoARcPSD| 45222017 1.2.
Một số tính chất của ngôn ngữ Java:
Java là ngôn ngữ lập trình được phát triển từ ngôn ngữ lập trình C/C++. Nó kế thừa,
phát huy các thế mạnh của ngôn ngữ C/C++ và lược bỏ đi các cú pháp phức tạp của
C/C++. Ngôn ngữ lập trình Java có một số đặc trưng tiêu biểu: đơn giản, hướng đối
tượng, độc lập phần cứng và hệ điều hành, mạnh mẽ, bảo mật, phân tán, đa luồng và linh động. 1.2.1. Đơn giản:
Những người thiết kế mong muốn phát triển một ngôn ngữ dễ học và quen thuộc
với đa số người lập trình. Do vậy Java loại bỏ các đặc trưng phức tạp của C và C++ như:
- Loại bỏ thao tác con trỏ, thao tác định nghĩa chồng toán tử
- Không cho phép đa kế thừa mà sử dụng các giao diện
- Không sử dụng lệnh “goto” cũng như file header (.h)
- Loại bỏ cấu trúc “struct” và “union”
1.2.2. Hướng đối tượng:
Java là ngôn ngữ lập trình thuần hướng đối tượng, mọi chương trình viết trên Java
đều phải được xây dựng trên các đối tượng. Nếu trong C/C++ ta có thể tạo ra các hàm
(chương trình con không gắn với đối tượng nào) thì trong Java ta chỉ có thể tạo ra các
phương thức (chương trình con gắn liền với một lớp cụ thể). Trong Java không cho phép
các đối tượng có tính năng đa kế thừa mà được thay thế bằng các giao diện (interface)
1.2.3. Độc lập phần cứng và hệ điều hành:
Đối với các ngôn ngữ lập trình truyền thống như C/C++, phương pháp biên dịch
được thực hiện như sau : lOMoARcPSD| 45222017
Hình 1.1: Các biên dịch chương trình hệ thống
Với mỗi nền phần cứng khác nhau, có một trình biên dịch khác nhau để biên
dịch mã nguồn chương trình cho phù hợp với nền phần cứng ấy. Do vậy, khi chạy trên
một nền phần cứng khác bắt buộc phải biên dịch lại mã nguồn.
Đối với các chương trình viết bằng Java, trình biên dịch Javac sẽ biên dịch mã
nguồn thành dạng bytecode. Sau đó, khi chạy chương trình trên các nền phần cứng khác
nhau, máy ảo Java dùng trình thông dịch Java để chuyển mã bytecode thành dạng chạy
được trên các nền phần cứng tương ứng. Do vậy, khi thay đổi nền phần cứng, không phải
biên dịch lại mã nguồn Java.
Hình 1.2: Biên dịch hệ thống java 1.2.4. Mạnh mẽ:
Java là ngôn ngữ yêu cầu chặt chẽ về kiểu dữ liệu.
- Kiểu dữ liệu phải khai báo tường minh.
- Java không sử dụng con trỏ và các phép toán con trỏ.
- Java kiểm tra tất cả các truy nhập đến mảng, chuỗi khi thực thi để đảm bảo rằng các
truy nhập đó không ra ngoài giới hạn kích thước lOMoARcPSD| 45222017
- Trong các môi trường lập trình truyền thống, lập trình viên phải tự mình cấp phát bộ
nhớ, trước khi chương trình kết thúc thì phải tự giải phóng bộ nhớ đã cấp. Vấn đề có
thể nảy sinh khi lập trình viên quên giải phóng bộ nhớ đã xin cấp trước đó. Trong
chương trình Java, lập trình viên không phải bận tâm đến việc cấp phát bộ nhớ. Quá
trình cấp phát, giải phóng được thực hiện tự động, nhờ dịch vụ thu nhặt những đối
tượng không còn sử dụng nữa (garbage collection).
- Cơ chế bẫy lỗi của Java giúp đơn giản hóa quá trình xử lý lỗi và hồi phục sau lỗi. 1.2.5. Bảo mật:
Java cung cấp một môi trường quản lý thực thi chương trình với nhiều mức để kiểm soát tính an toàn:
- Ở mức thứ nhất, dữ liệu và các phương thức được đóng gói bên trong lớp. Chúng chỉ
được truy xuất thông qua các giao diện mà lớp cung cấp.
- Ở mức thứ hai, trình biên dịch kiểm soát để đảm bảo mã là an toàn, và tuân theo các nguyên tắc của Java.
- Mức thứ ba được đảm bảo bởi trình thông dịch chúng kiểm soát xem bytecode có
đảm bảo các quy tắc an toàn trước khi thực thi không.
- Mức thứ tư kiểm soát việc nạp các lớp vào bộ nhớ để giám sát việc vi phạm giới hạn
truy xuất trước khi nạp vào hệ thống. 1.2.6. Phân tán:
Java được thiết kế để hỗ trợ các ứng dụng chạy trên mạng bằng các lớp mạng
(java.net). Hơn nữa, Java hỗ trợ nhiều nền chạy khác nhau nên chúng được sử dụng rộng
rãi như là công cụ phát triển trên Internet - nơi sử dụng nhiều nền khác nhau. 1.2.7. Đa luồng
Chương trình Java cung cấp giải pháp đa luồng (Multithreading) để thực thi các
công việc đồng thời. Chúng cũng cung cấp giải pháp đồng bộ giữa các luồng. Đặc tính
hỗ trợ đa luồng này cho phép xây dựng các ứng dụng trên mạng chạy hiệu quả. lOMoARcPSD| 45222017 1.2.8. Linh động
Java được thiết kế như một ngôn ngữ động để đáp ứng cho những môi trường mở.
Các chương trình Java chứa rất nhiều thông tin thực thi nhằm kiểm soát và truy nhập đối
tượng lúc chạỵ. Điều này cho phép khả năng liên kết mã động. 1.3.
Công cụ được sử dụng trong đề tài
NetBeans là một môi trường phát triển tích hợp (IDE) cho Java. NetBeans cho phép
các ứng dụng được phát triển từ một tập hợp các thành phần phần mềm được gọi là
modules. NetBeans chạy trên Windows, macOS, Linux và Solaris. Ngoài việc phát
triển Java, nó còn có các phần mở rộng cho các ngôn ngữ khác như PHP, C, C++,
HTML5, và JavaScript. Các ứng dụng dựa trên NetBeans, bao gồm NetBeans IDE,
có thể được mở rộng bởi các nhà phát triển bên thứ ba.
Java Development Kit (JDK - Bộ công cụ cho người phát triển ứng dụng bằng ngôn
ngữ lập trình Java) là một tập hợp những công cụ phần mềm được phát triển bởi Sun
Microsystems dành cho các nhà phát triển phần mềm, dùng để viết những applet Java
hay những ứng dụng Java - bộ công cụ này được phát hành miễn phí gồm có trình biên
dịch, trình thông dịch, trình giúp sửa lỗi (debugger, trình chạy applet và tài liệu nghiên cứu.
Kể từ khi ngôn ngữ Java ra đời, JDK là bộ phát triển phần mềm thông dụng nhất cho
Java. Ngày 17 tháng 11 năm 2006, hãng Sun tuyên bố JDK sẽ được phát hành dưới
giấy phép GNU General Public License (GPL), JDK trở thành phần mềm tự do. Việc
này đã được thực hiện phần lớn ngày 8 tháng 5 năm 2007 và mã nguồn được đóng góp cho OpenJDK. lOMoARcPSD| 45222017
CHƯƠNG 2. Xây dựng và triển khai ứng dụng 2.1.
Xác định yêu cầu
2.1.1. Yêu cầu chức năng
Game xếp hình (hay còn gọi là Puzzle) là một trò chơi điều khiển các mảnh ghép
trong một khung có hình ảnh ngẫu nhiên với một ô bị thiếu. Nhiệm vụ của chúng ta là
trượt các mảnh ghép đó sao cho kết quả được hình ảnh giống với ảnh ban đầu.
2.1.2. Yêu cầu phi chức năng:
Giao diện game đơn giản, thân thiện và dễ sử dụng với người chơi. 2.2.
Triển khai ứng dụng
Import các thư viện và class cần thiết:
Lớp Puzzle kế thừa từ JFrame và triển khai giao diệnActionListener để xử lý sự kiện: lOMoARcPSD| 45222017
Lớp Puzzle có các thuộc tính (biến thành viên) sau:
Biến thành viên private kiểu JPanel để đại diện cho một panel nằm ở trung tâm của frame.
Biến thành viên private kiểu JButton để tạo các nút được sử dụng trong trò chơi.
Biến thành viên private kiểu JLabel để hiển thị hình ảnh hoặc văn bản trên giao diện.
Biến thành viên private kiểu Image để lưu trữ nguồn hình ảnh cho trò chơi.
Sử dụng một mảng boolean check có kích thước 12, được sử dụng để kiểm tra trạng thái
của các mảnh ghép trong trò chơi. Mỗi phần tử trong mảng đại diện cho trạng thái kiểm tra của một mảnh ghép.
Một mảng hai chiều pos được khai báo nhưng không được khởi tạo giá trị ban đầu, được
sử dụng để lưu vị trí của các mảnh ghép trong trò chơi.
Hai biến widthheight kiểu int để lưu chiều rộng và chiều cao của hình ảnh.
Các biến này sẽ được sử dụng để quản lý các thành phần giao diện người dùng và hình
ảnh trong trò chơi xếp hình.
Contructor của lớp Puzzle:
Khởi tạo vị trí ban đầu của các miếng ghép hình với kích thước 3x4
Tạo JPanel để chứa nút và label, và cài đặt layout
Tạo ImageIcon từ tệp hình ảnh "nam.jpg" và lấy hình ảnh gốc
Lấy chiều rộng và chiều cao của hình ảnh nguyên thủy lOMoARcPSD| 45222017 Thêm rigid area vào BorderLayout.NORTH và thêm centerPanel vào
BorderLayout.CENTER của JFrame
Tạo các miếng ghép hình từ hình ảnh gốc và thêm vào Vector và tạo một hình
ảnh mới bằng cách cắt hình ảnh gốc (source image)
Khởi tạo mảng check để theo dõi trạng thái của các miếng ghép hình, sau đó tạo các nút
và label để tạo trò chơi ghép hình
Nếu đang ở ô cuối cùng của dòng thứ 4 (i = 3) và cột thứ 3 (j = 2), tạo một label trống để
tạo ô trống, thêm label trống vào centerPanel, tạo một JButton để chứa miếng ghép hình,
thêm ActionListener để xử lý sự kiện khi nút được nhấn, tạo một đối tượng Random để
tạo số ngẫu nhiên từ 0 đến 10.
Kiểm tra xem miếng ghép hình đã được sử dụng chưa, nếu đã được sử dụng, tạo một số
ngẫu nhiên mới, tiếp theo đặt hình ảnh cho Jbutton, đánh dấu miếng ghép hình đã được
sử dụng và thêm JButton vào centerPanel. lOMoARcPSD| 45222017
Cài đặt các thuộc tính cho Jframe và hiển thị nó
setSize(); sử dụng để đặt kích thước của cửa sổ. setTitle()
sử dụng để đặt tiêu đề cho cửa sổ.
setResizable() sử dụng để xác định xem cửa sổ có thể thay đổi kích thước hay không
khi người dùng kéo căn chỉnh kích thước cửa sổ. Trong trường hợp này, false được
truyền vào nghĩa là cửa sổ không thể thay đổi kích thước (không thể kéo căn chỉnh kích thước cửa sổ).
setLocationRelativeTo() được sử dụng để đặt vị trí hiển thị của cửa sổ. Khi giá trị được
đặt là null, cửa sổ sẽ được hiển thị ở trung tâm của màn hình.
setDefaultCloseOperation() xác định hành động khi người dùng đóng cửa sổ. Trong
trường hợp này, khi cửa sổ được đóng, nó sẽ được giải phóng bộ nhớ và các tài nguyên
liên quan tới cửa sổ này sẽ được dọn dẹp (disposed). lOMoARcPSD| 45222017
setVisible() được gọi để hiển thị cửa sổ lên màn hình. Khi gọi phương thức này với giá
trị true, cửa sổ sẽ được hiển thị và trở thành focus để người dùng tương tác.
Phương thức main để chạy chương trình, tạo một đối tượng Puzzle khi chương trình chạy
Phương thức actionPerformed(ActionEvent e) là phương thức được triển khai từ
interface ActionListener được sử dụng để xử lý sự kiện khi người chơi tương tác với
các nút (JButton) trên giao diện.
Dimension size = button.getSize(); được sử dụng để lấy kích thước của JButton đã được
nhấn và lưu vào đối tượng size.
button.getSize() trả về kích thước hiện tại của JButton trong đối tượng
Dimension trả về chiều rộng và chiều cao của JButton, cho biết kích thước của nút để
có thể thực hiện các tính toán hoặc điều chỉnh giao diện tương ứng.
label.getX()label.getY() lấy vị trí X và Y của JLabel, giả sử đã có một JLabel
đại diện cho ô trống trong trò chơi ghép hình. button.getX()button.getY() lấy vị
trí X và Y của JButton trong giao diện.
buttonX / size.widthbuttonY / size.height tính toán vị trí hàng và cột của JButton
trong grid dựa trên kích thước của JButton.
pos[buttonPosY][buttonPosX] lấy ra index của JButton trong mảng pos, một cách để
xác định vị trí của JButton trong grid 2 chiều. lOMoARcPSD| 45222017 Di chuyển xuống:
Điều kiện: labelX == buttonX && (labelY - buttonY) == size.height
Nếu miếng ghép có thể di chuyển lên, labelIndex sẽ được tăng lên 3 (với giả định một
bố cục 3x3). Sau đó, miếng ghép hiện tại (button) sẽ được xóa khỏi centerPanel ở vị trí
buttonIndex và label sẽ được thêm vào vị trí buttonIndex, còn button sẽ được thêm vào vị trí labelIndex. Di chuyển lên:
Điều kiện: labelX == buttonX && (labelY - buttonY) == -size.height
Tương tự như trên nhưng ngược lại, label sẽ được thêm vào vị trí buttonIndex, còn button
sẽ được thêm vào vị trí labelIndex. lOMoARcPSD| 45222017 Di chuyển sang phải:
Điều kiện: labelY == buttonY && (labelX - buttonX) == size.width
Nếu miếng ghép có thể di chuyển sang phải, labelIndex sẽ tăng lên 1.
Miếng ghép hiện tại (button) sẽ được xóa khỏi centerPanel ở vị trí buttonIndex, label sẽ
được thêm vào vị trí buttonIndex, và button sẽ được thêm vào vị trí labelIndex. Di chuyển sang trái:
Điều kiện: labelY == buttonY && (labelX - buttonX) == -size.width
Tương tự như trên nhưng ngược lại, label sẽ được thêm vào vị trí labelIndex, còn button
sẽ được thêm vào vị trí labelIndex. 2.3. Kết quả
Giao diện chương trình lúc hoàn chỉnh lOMoARcPSD| 45222017
TÀI LIỆU THAM KHẢO
[1] Ngô Công Thắng; Bài giảng Lập trình Java
[2] Phạm Quang Dũng Bài giảng lập trình Java Trường ĐH Nông Nghiệp Hà Nội 2009
[3] Bài giảng Java căn bản Aptech 2010
[4] Java cơ sở Trường ĐH Sư phạm kỹ thuật Hưng Yên 2008