Assignment 01: Trò chơi bắn máy bay


Hạn nộp: 23:59' 16/10/2010.
Nộp tại Bitbucket.

Cách nộp bài

Mỗi sinh viên phải có một tài khoản bitbucket với username trùng với username tại bbc.vnu.edu.vn.
Bài nộp phải được đặt trong project (tại bitbucket) có tên oop-asg01
Project oop-asg01 phải cấp quyền đọc (read permission) cho user chauttm (chauttm là người sẽ thu bài các lớp CA, CD, sinh viên các lớp khác cần liên hệ với giáo viên để hỏi username của người thu bài lớp/nhóm mình)
Đến hạn nộp, giáo viên sẽ lấy phiên bản mới nhất của project bằng lệnh
hg clone http://bitbucket.org/username/oop-asg01
Chú ý thực hiện hướng dẫn một cách chính xác. Sinh viên nên tự thử lệnh trên để kiểm tra xem phiên bản tại bitbucket có đúng là phiên bản cần nộp

Bài nộp gồm các file mã nguồn và một file dạng text có tên README. Trong file README cần có các thông tin cá nhân như tên, lớp, số sinh viên, và hướng dẫn biên dịch (nếu cần). Các file để nguyên trong thư mục project, không nén, không tạo các thư mục con.

Đề bài

Bạn cần viết một chương trình cho phép chơi trò bắn máy bay theo tọa độ cho phép một người chơi dò bắn một máy bay ẩn trên bản đồ.

Hoạt động của chương trình

Mỗi lần chạy, chương trình cho phép người chơi chơi một ván. Mỗi ván bắt đầu bằng việc chương trình nạp bản đồ từ một file text. Sau đó, người chơi bắt đầu bắn theo tọa độ. Tại mỗi lượt bắn, người chơi nhập các tọa độ bắn từ bàn phím. Nếu tọa độ nhập vào là nằm trong phạm vi bản đồ thì chương trình ghi nhận phát đạn là trúng hay trượt (chương trình có thể hiển thị bản đồ để người chơi tiện theo dõi và xác định tọa độ bắn), tọa độ bắn, kết quả trúng hay trượt, và tình trạng bản đồ được chương trình ghi ra một file log (nhật trình). Nếu tọa độ nhập vào nằm ngoài bản đồ, chương trình bỏ qua lượt bắt này và không ghi gì vào nhật trình. Chương trình kết thúc khi người chơi đã bắn cháy hoàn toàn chiếc máy bay. Tọa độ của lưới bản đồ được xác định là một cặp số nguyên x,y trong khoảng từ 0 đến 9, với dòng 0 là dòng trên cùng, cột 0 là cột đầu tiên bên trái. Dưới đây là ví dụ về bản đồ ở thời điểm một máy bay đã bị bắn cháy hoàn toàn khi hiển thị trên màn hình. Các ô 'x' là các tọa độ mà máy bay bị bắn trúng, '.' là các ô chưa hề bị bắn. ' ' là các ô đã bị bắn nhưng máy bay lại không nằm tại tọa độ đó (bắn trượt).
 
    0 1 2 3 4 5 6 7 8 9
  _____________________
0 | . . . . . . . . . .
1 | . . . . . . . . . .
2 | . . . x . . . . . .
3 | x x x x x x x . . .
4 | . . . x           .
5 | . . . x . . . . . .
6 | . . x x x . . . . .
7 | . . . . . . . . . .
8 | . . . . . . . . . .
9 | . . . . .   . . . .

Các quy định về vào ra dữ liệu và chạy chương trình

Dữ liệu vào
Có hai phần: cấu hình trò chơi và tọa độ bắn.

1. Cấu hình trò chơi được nạp từ một file text với định dạng như sau: dòng đầu ghi 2 số nguyên m, n trong khoảng từ 1 đến 10. m dòng sau, mỗi dòng ghi n số 0 hoặc 1, biểu diễn lưới vuông kích thước mxn là bản đồ bầu trời, trong đó các ô 1 biểu diễn vị trí và hình ảnh của máy bay. Chương trình KHÔNG phải kiểm tra tính hợp lệ của file cấu hình. Tên file cấu hình được xác định bởi tham số đầu tiên trong lệnh chạy chương trình (xem chi tiết ở ví dụ bên dưới).

2. Tọa độ bắn (số nguyên) được người dùng nhập từ bàn phím dưới dạng x y (x là tọa độ dòng, y là tọa độ cột), hai số x, y được viết cách nhau ít nhất 1 kí tự trắng. Chương trình KHÔNG phải kiểm tra tình trạng người dùng có nhập số nguyên hay không (người dùng chắc chắn sẽ nhập các số nguyên).

Dữ liệu ra:
Có hai phần: giao diện với người dùng trên màn hình và file nhật trình.

1. Giao diện với người dùng, chẳng hạn vẽ bản đồ lên màn hình và lời mời nhập tọa độ bắn, cũng như thông báo trúng/trượt tại màn hình là do lập trình viên tự quyết định và thiết kế và KHÔNG có yêu cầu cụ thể.

2. Phần nhật trình (log) của mỗi ván chơi được ghi ra 1 file và phải tuân thủ CHÍNH XÁC quy định sau đây về định dạng dữ liệu trong file: với mỗi phát đạn của người chơi, chương trình cần ghi những nội dung sau vào file nhật trình:

- 01 dòng tọa độ bắn theo định dạng:

x<tab>y<tab>result
trong đó x, y lần lượt là các tọa độ dòng và cột của phát đạn, <tab> là 01 kí tự tab, result là miss hay hit tùy theo kết quả là trượt hay trúng.
- Lưới ô vuông m x n chứa các ô 0 hoặc 1 lưu trữ tình trạng bản đồ sau phát bắn. Trong đó các ô 1 biểu thị các tọa độ máy bay chưa bị bắn trúng, còn lại là các ô 0. Có đúng 01 kí tự space (' ') đứng sau mỗi kí hiệu 0 hay 1. Ngoài ra, không được thiếu/thừa bất cứ dòng trắng hay kí tự trắng nào. Tên file nhật trình là tham số thứ hai của dòng lệnh chạy chương trình, nếu lệnh chỉ có 1 tham số thì tên file nhật trình là tên của file cấu hình cộng thêm chuỗi '.log' vào cuối (xem chi tiết tại ví dụ bên dưới).

Ví dụ đoạn nhật trình của một phát bắn:

 
3	3	hit
0 0 0 0 0 0 0
0 0 0 1 0 0 0
0 1 1 1 1 1 0
0 0 0 0 0 0 0
0 0 0 1 0 0 0
0 0 1 1 1 0 0
0 0 0 0 0 0 0

Chạy chương trình:

Chương trình được chạy từ màn hình console (cmd trong môi trường DOS, terminal trong môi trường Linux) bằng dòng lệnh
java <tên chương trình> <tên file cấu hình> <tên file nhật trình>
hoặc
java <tên chương trình> <tên file cấu hình>
Ví dụ,
java Game test1.in test1.out
chương trình tại class Game sẽ nạp cấu hình bản đồ từ test1.in và ghi nhật trình ra test1.out
java Game test1.in
chương trình tại class Game sẽ nạp cấu hình bản đồ từ test1.in và ghi nhật trình ra test1.in.log

Minh họa:

Xem sample.zip