Chương 5: Grid World, phần 1

Trở về Mục lục cuốn sách

5.1  Khởi động

Bây giờ đã đến lúc ta bắt đầu làm Nghiên cứu cụ thể về kì thi Khoa học máy tính AP; nghiên cứu này xoay quanh một chương trình có tên GridWorld. Đầu tiên, hãy cài đặt GridWorld; bạn có thể tải chương trình này về từ Hội đồng tuyển sinh Hoa Kì: http://www.collegeboard.com/student/testing/ap/compsci_a/case.html.

Khi giải nén mã nguồn này, bạn sẽ thu được một thư mục mang tên GridWorldCode trong đó chứa projects/firstProject, và bản thân thư mục này lại chứa BugRunner.java.

Hãy sao chép tập tin BugRunner.java vào một thư mục khác rồi nhập nó từ môi trường phát triển mà bạn đang dùng. Bạn có thể tham khảo hướng dẫn: http://www.collegeboard.com/prod_downloads/student/testing/ap/compsci_a/ap07_gridworld_installation_guide.pdf.

Một khi chạy BugRunner.java, bạn hãy tải Bản hướng dẫn thực hành GridWorld từ http://www.collegeboard.com/prod_downloads/student/testing/ap/compsci_a/ap07_gridworld_studmanual_appends_v3.pdf.

Bản hướng dẫn thực hành này có dùng những thuật ngữ mà tôi chưa trình bày. Bởi vậy để bạn quen được, sau đây là một danh sách giới thiệu tóm tắt:

  • Các thành phần của GridWorld, bao gồm Bugs, Rocks và bản thân Grid đều là những đối tượng.
  • Constructor là một phương thức đặc biệt để tạo nên những đối tượng mới.
  • Lớp là một tập hợp các đối tượng; mỗi đối tượng đều thuộc một lớp nhất định.
  • Đối tượng còn được gọi là thực thể, vì nó thuộc về một lớp.
  • Thuộc tính là một đơn vị thông tin về một đối tượng, chẳng hạn màu sắc hay tọa độ (vị trí) của đối tượng đó.
  • Phương thức truy cập là một phương thức nhằm trả lại thuộc tính của một đối tượng.
  • Phương thức sửa đổi nhằm thay đổi thuộc tính của một đối tượng.

Bây giờ bạn đã có thể đọc được Phần 1 của cuốn Hướng dẫn thực hành và làm các bài tập.

5.2  BugRunner

BugRunner.java chứa mã lệnh sau:

import info.gridworld.actor.ActorWorld; 
import info.gridworld.actor.Bug; 
import info.gridworld.actor.Rock; 
public class BugRunner { 
  public static void main(String[] args) { 
    ActorWorld world = new ActorWorld(); 
    world.add(new Bug()); 
    world.add(new Rock()); 
    world.show(); 
  } 
}

Ba dòng đầu tiên là các câu lệnh import; chúng liệt kê các lớp trong GridWorld được dùng đến ở chương trình này. Bạn có thể tìm tài liệu cho những lớp này tại http://www.greenteapress.com/thinkapjava/javadoc/gridworld/.

Cũng như những chương trình khác ta đã gặp, BugRunner định nghĩa lớp có nhiệm vụ cung cấp phương thức main. Dòng đầu tiên trong main tạo ra một đối tượng ActorWorld. Ở đây, new là từ khóa Java để tạo nên đối tượng mới.

Hai dòng kết tiếp tạo ra một Bug (con bọ) và một Rock (tảng đá), rồi bổ sung chúng vào world (môi trường). Dòng cuối cùng hiển thị môi trường lên màn hình.

Hãy mở tập tin BugRunner.java để chỉnh sửa và thay dòng này:

    world.add(new Bug());

bằng các dòng này:

    Bug redBug = new Bug(); 
    world.add(redBug);

Dòng đầu tiên gán Bug cho một biến có tên redBug; ta có thể dùng redBug để kích hoạt những phương thức của Bug. hãy thử lệnh này:

    System.out.println(redBug.getLocation());

Chú ý: Nếu bạn chạy lệnh này trước khi bổ sung Bug vào world, thì kết quả sẽ là null, bởi đối tượng Bug này chưa có một vị trí cụ thể.

Hãy kích hoạt những phương thức truy cập khác rồi in ra các thuộc tính của con bọ vừa tạo ra. Kích hoạt các phương thức canMovemove và turn đồng thời đảm bảo rằng bạn nắm được tác dụng của chúng.

5.3  Bài tập

Bài tập 1

  1. Hãy viết một phương thức có tên moveBug để nhận vào tham số là con bọ rồi kích hoạt move. Kiểm tra phương thức vừa viết ra bằng cách gọi nó từ main.
  2. Sửa chữa moveBug để nó kích hoạt canMove rồi di chuyển con bọ chỉ khi nó chuyển động được.
  3. Sửa chữa moveBug để nó nhận một tham số là số nguyên n, rồi di chuyển con bọ n lần (nếu có thể).
  4. Sửa chữa moveBug sao cho nếu con bọ không chuyển động được thì phương thức này sẽ kích hoạt turn.
Bài tập 2

  1. Lớp Math cung cấp một phương thức mang tên random để trả lại một số phẩy động giữa 0.0 và 1.0 (không bao gồm 1.0).
  2. Hãy viết một phương thức mang tên randomBug để nhận tham số là một Bug rồi đặt hướng của con bọ này là một trong những giá trị 0, 90, 180 hoặc 270 theo xác suất bằng nhau, rồi cho con bọ chuyển động nếu nó có thể.
  3. Sửa chữa randomBug để nhận vào số nguyên n rồi thực hiện lặp lại n lần thao tác trên.Kết quả sẽ là một quá trình “bước ngẫu nhiên”, mà bạn có thể xem thêm ở http://en.wikipedia.org/wiki/Random_walk.
  4. Để quan sát quá trình bước ngẫu nhiên dài hơn, bạn có thể cho ActorWorld một không gian rộng hơn. Ở trên đầu file BugRunner.java, hãy bổ sung câu lệnh import sau:
    import info.gridworld.grid.UnboundedGrid;

    Bây giờ, hãy thay dòng lệnh tạo nên ActorWorld với dòng lệnh sau:

        ActorWorld world = new ActorWorld(new UnboundedGrid());

    Bạn có thể trình diễn bước ngẫu nhiên với vài nghìn bước di chuyển (có thể phải kéo thanh trượt để tìm con bọ).

Bài tập 3  GridWorld dùng các đối tượng Color, vốn được định nghĩa trong một thư viện Java. Bạn có thể đọc tài liệu ở   http://download.oracle.com/javase/6/docs/api/java/awt/Color.html.Để tạo nên nhiều con bọ với các màu sắc khác nhau, bạn phải nhập Color:

import java.awt.Color;

Khi đó bạn sẽ truy cập được các màu đã định sẵn, như Color.blue, hay một màu mới như sau:

    Color purple = new Color(148, 0, 211);

Hãy tạo ra một vài con bọ với màu sắc khác nhau. Tiếp theo, hãy viết một phương thức có tên colorBug để nhận tham số là một con bọ, đọc vào tọa độ của nó, rồi đặt màu.

Đối tượng Location mà bạn đã lấy từ getLocation có chứa những phương thức mang tên getRow và getCol vốn trả lại những số nguyên. VÌ vậy bạn có thể lấy tọa độ x của con bọ như sau:

    int x = bug.getLocation().getCol();

Hãy viết một phương thức có tên makeBugs để nhận vào một ActorWorld và một số nguyên n rồi tạo nên n con bọ có màu sắc tùy thuộc theo tọa độ của chúng. Hãy dùng số thứ tự dòng để điều khiển mức sắc đỏ và thứ tự cột để điều khiển mức sắc lam.

22 bình luận

Filed under Think Java

22 responses to “Chương 5: Grid World, phần 1

  1. Pingback: Think Java: Cách suy nghĩ như nhà khoa học máy tính | Blog của Chiến

  2. bạn ơi giúp mình vs mình đọc phần hướng dẫn cài đặt nhưng ko hiểu bạn đã cài đặt bao giờ chưa

  3. bạn ơi bài tập nó bảo truyền vào phương thức moveBug 1 tham số Bug nhưng mình ko biết Bug nó kiểu tham số gì ,int String double đều sai

    • Đề bài nói rằng phương thức moveBug nhận tham số là con bọ. Vậy kiểu Bug này phải được định nghĩa từ trước. Có thể phải có dòng này:
      import info.gridworld.actor.Bug;
      Bạn cần viết phương thức moveBug trong file BugRunner.java đầy đủ.

      • thế phương thức moveBug của mình này có sai chỗ nào không,sai thì sửa giúp mình vs :

        public static void main(String[] args)
        {

        }
        public static void moveBug(){
        ActorWorld World = new ActorWorld();
        Bug aBug = new Bug();
        World.add(aBug);
        World.add(new Rock());
        World.show();
        aBug.move();

        }

      • Viết thế này thì thiếu mất tham biến trong phương thức. Viết kiểu như sau:
        public static void moveBug(aBug) {

        }
        Bạn đọc kĩ đề bài sẽ thấy trong phương thức này chỉ cần kích hoạt phương thức .move() thôi.

      • thanks bạn nhiều

  4. bạn có thường xuyên rảnh rỗi ko ,cho mình tên facebook mình kết bạn cho tiện

  5. bạn ơi mình ko hiểu ý 1va2 của bài 2 ,phần 1 thì giới thiệu phương thức Math.random thì hiểu nhưng tự yên lại cho phần 2 ko biết có sử dụng Math.random ko. tóm lại chẳng hiểu 2 phần đấy liên quan gì đến nhau .@@

  6. bạn ơi giúp mình ý 3 bài 2 vs mình không biết viết gì để cho nó lặp lại n lần ,và đây là code của mình:
    public static void randomBug(Bug aBug, int n) {

    double ran = Math.random();
    ran *= 360;
    int N = (int) Math.round(ran);
    if (N == 0 || N == 90 || N == 180 || N == 270) {
    aBug.setDirection(N);
    } else {
    randomBug(aBug, n);

    }

    }

    • Có lẽ bạn chưa hiểu lắm. Ý 3 là đặt một vòng lặp n lần. Trong mỗi lần thì gọi randomBug. Còn randomBug không nhận tham số n; mà nó chỉ đặt bọ hướng ngẫu nhiên và di chuyển bọ nếu có thể.

      • mình cũng từng nghĩ phương án như bạn nhưng mình đọc câu “randomBug để nhận vào số nguyên n” thì hơi rối cám ơn bạn

  7. ban oi minh chay thi chang thay gi thay doi ca code minh nhu sau :
    public class BugRunner {
    public static void main(String[] args) {
    ActorWorld world = new ActorWorld();

    Bug redBug = new Bug();
    world.add(redBug);
    world.add(new Rock());
    world.show();
    int n =0;
    while(n<=5){
    randomBug(redBug);
    n++;
    }
    }

    public static void randomBug(Bug aBug) {

    double ran = Math.random();
    ran *= 360;
    int N = (int) Math.round(ran);
    if (N == 0 || N == 90 || N == 180 || N == 270) {
    aBug.setDirection(N);
    } else {
    randomBug(aBug);
    }

    }

    • Mã lệnh tương đối phức tạp rồi, bạn phải chịu khó rà soát lỗi bằng công cụ debug, hoặc comment lần lượt từng câu lệnh để xem máy thực hiện thế nào thôi. Có điều cái phương thức randomBug của bạn không hay. Đề bài yêu cầu phát sinh ra một trong 4 giá trị (0 hoặc 90 hoặc 180 hoặc 270) một cách ngẫu nhiên, còn bạn lại phát sinh ra một số tùy ý gì đó rồi mới làm tròn nên không được. Do mình ko có thời gian nữa nên bạn tự phân tích và sửa lỗi nhé.

  8. Ẩn danh

    sao nó ghi là Unable to find an Ant file to run

    • Bạn có dùng Eclipse không, hay biên tập file bằng notepad? Nếu dùng eclipse thì trên mạng có gợi ý thế này
      progrepo.blogspot.com/2012/10/eclipse-unable-to-find-ant-file-to-run.html

  9. Ẩn danh

    Error: A JNI error has occurred, please check your installation….em bi loi nay, anh giup em voi

Gửi phản hồi cho Dương Nguy Hủy trả lời