tiện ích online

TIỆN ÍCH ONLINE

Tin tức cập nhật

Thống kê

  • truy cập   (chi tiết)
    trong hôm nay
  • lượt xem
    trong hôm nay
  • thành viên
  • thống kê truy cập

    free counters

    HỌP MẶT VIOLET OPEN HÈ 2017

    Gốc > Lập trình Flash >

    Bài 55: Phím Back Space và Enter

    Phím Back Space và Enter
    [Hoàng Ngọc Giao]
    Để thực hiện trò chơi điền từ, bạn đã đưa bộ câu hỏi vào chương trình, đã hiển thị được câu hỏi đầu tiên và xử lý tình huống gõ phím, giúp người chơi nhập từ vào chỗ chừa trống trong câu. Khi xử lý tình huống gõ phím, ta cần cho phép người chơi xóa ký tự vừa nhập khi gõ nhầm. Theo lệ thường, việc xóa ký tự vừa nhập được thực hiện bằng phím xóa trái (Back Space). Việc kiểm tra từ được nhập vào chỗ trống cần được thực hiện khi người chơi gõ phím Enter. Nghĩa là trong hàm doKeyDown, bạn cần xét riêng hai tình huống gõ phím điều khiển đặc biệt: gõ phím Back Space và gõ phím Enter. Bạn chỉnh sửa hàm doKeyDown như sau:

    ...

    var chars = "";

    function doKeyDown() {

      var code = Key.getCode();

     

      if(code == Key.ENTER) {

        check();

      }

      else if(code == Key.BACKSPACE) {

        chars = chars.substring(0, chars.length-1);

        displayChars();

      }

      else {

        var ch = String.fromCharCode(Key.getAscii());

        if(ch == "")

          return;

        chars += ch;

        displayChars();

      }

    }

     

    function displayChars() {

      var str = words[index][0];

      var ndx = str.indexOf("_");

      var ndx2 = str.lastIndexOf("_");

      str = str.substring(0, ndx) + chars + str.substring(++ndx2);

      sentence.text = str;

    }

     

    function check() {

     

    }

    ...

    Trong hàm doKeyDown, để nhận biết tình huống gõ phím Back Space hoặc Enter, ta dùng hàm Key.getCode để đọc mã phím. Nếu phím được gõ là Enter, ta gọi hàm check gì đó để kiểm tra từ được nhập. Tạm thời ta thêm hàm check trống rỗng.
    Nếu phím được gõ là Back Space, ta bỏ bớt ký tự cuối của chuỗi chars và gọi hàm displayChars để hiển thị lại câu hỏi. Bạn để ý, việc bỏ bớt ký tự cuối của chuỗi chars được thực hiện bởi câu lệnh chars = chars.substring(0, chars.length - 1);. Thực chất, câu lệnh này tạo ra chuỗi con trích từ chuỗi chars, từ ký tự đầu (chỉ số 0) đến trước ký tự cuối (chỉ số chars.length - 1, trong đó chars.length là chiều dài của chuỗi, tức số ký tự hiện có trong chuỗi). Chuỗi con như vậy được gán trở lại vào biến chars.
    Nếu phím được gõ không phải là Enter, cũng không phải là Back Space, ta mới thêm ký tự được gõ vào chỗ trống trong câu hỏi.
    Thử ấn Ctrl + Enter để biên dịch và chạy thử chương trình, gõ thử vài phím và gõ phím Back Space để xóa ký tự vừa gõ, bạn thấy phím Back Space không có tác dụng. Số là phím Back Space và cả phím Enter không có tác dụng khi bạn chạy chương trình trong Flash vì hai phím đó đã được "trưng dụng" cho chức năng của riêng Flash.
    Muốn phím Back Space và Enter có hiệu lực trong chương trình của mình, bạn phải chạy trò chơi điền từ bên ngoài Flash. Cụ thể, bạn ấn tổ hợp phím Windows + E để mở chương trình Windows Explorer, tìm đến thư mục chứa tập tin SWF vừa được tạo ra (do biên dịch tập tin FLA nằm trong cùng thư mục) và bấm kép vào tập tin SWF. Chương trình của bạn sẽ chạy trong cửa sổ Flash Player. Bạn thấy phím Back Space thực sự có hiệu lực.
    Bạn cũng có thể dùng trình duyệt (Firefox, IE, Chrome,...) để chạy chương trình của mình: mở trình duyệt, ấn Ctrl + O, tìm đến thư mục chứa tập tin SWF và mở tập tin đó. Mỗi lần bạn sửa chương trình và biên dịch lại, bạn chuyển qua cửa sổ trình duyệt, gõ phím F5 để chạy lại chương trình. Như vậy, trong trường hợp này, việc dùng trình duyệt để chạy chương trình SWF thuận tiện hơn so với Flash Player.
    Hoạt động của phím Back Space đã ổn, ta bắt đầu xét đến những việc cần làm trong hàm check. Việc trước tiên là kiểm tra từ được nhập, xem có đúng hay không, nếu đúng thì thêm điểm cho người chơi. Việc thứ hai là chọn câu hỏi tiếp theo để hiển thị. Bạn thực hiện hai việc ấy như sau:

    ...

    var score = 0;

    function check() {

      if(chars == words[index][1]) {

        score++;

      }

      else {

      }

      selectQuestion();

    }

     

    function selectQuestion() {

     

    }

    Để kiểm tra từ được nhập, bạn so sánh nội dung của biến chars với đáp án của câu hỏi đang xét trong dãy words (phần tử của dãy ở hàng index, cột 1). Nếu chúng khớp nhau, ta ghi điểm bằng cách tăng trị số của biến score thêm 1. Nếu người chơi nhập từ sai, có lẽ nên làm gì đó (trừ điểm chăng?). Tạm thời, ta cứ bỏ ngỏ trường hợp này, chưa làm gì cả.
    Việc chọn câu hỏi tiếp theo để hiển thị được thực hiện bởi hàm selectQuestion. Trước mắt, ta cứ chọn giải pháp đơn giản: cho trị số của biến index tăng thêm 1 để hiển thị câu hỏi tiếp theo trong dãy words. Có điều cần xem xét ngay: nếu chỉ số index bằng hoặc vượt số câu hỏi trong dãy words (tức words.length) thì kết thúc cuộc chơi.
    Bạn viết hàm selectQuestion như sau:

    ...

    var done = false;

    function selectQuestion() {

      chars = "";

      index++;

      if(index >= words.length) {

        done = true;

        sentence.text = "Done. Press ENTER to replay.";

      }

      else {

        displayQuestion();

      }

    }

    ...

    Mỗi lần hàm selectQuestion được gọi, ta cần xóa nội dung hiện có của biến chars (chứa từ vừa nhập) bằng cách gán chuỗi rỗng cho biến chars. Sau khi tăng trị số của biến index, nếu thấy trị số ấy đã "tới hạn", ta gán trị true cho biến done và hiển thị thông báo "Done. Press ENTER to replay.", nhắc người chơi rằng cuộc chơi đã kết thúc và họ có thể gõ phím Enter để chơi lại. Biến done có tác dụng như một cờ hiệu.
    Nếu trị số của biến index chưa "tới hạn", ta gọi hàm displayQuestion() để hiển thị câu hỏi tiếp theo.
    Do có yêu cầu người chơi gõ phím Enter để chơi lại, bạn cần xét thêm tình huống đặc biệt này trong hàm doKeyDown:

    ...

     

    var chars = "";

    function doKeyDown() {

      var code = Key.getCode();

     

      if(done) {

        if(code == Key.ENTER)

          reset();

        return;

      }

     

      if(code == Key.ENTER) {

        check();

      }

      else if(code == Key.BACKSPACE) {

        chars = chars.substring(0, chars.length-1);

        displayChars();

      }

      else {

        var ch = String.fromCharCode(Key.getAscii());

        if(ch == "")

          return;

        chars += ch;

        displayChars();

      }

    }

    ...

     

    var done = false;

    function selectQuestion() {

      chars = "";

      index++;

      if(index >= words.length) {

        done = true;

        sentence.text = "Done. Press ENTER to replay.";

      }

      else {

        displayQuestion();

      }

    }

     

    function reset() {

     

    }

    Ở đầu hàm doKeyDown, ta cẩn thận xét biến done, xem có trị true hay không. Nếu done có trị true (cuộc chơi đã kết thúc), ta tiếp tục xét phím vừa được gõ, xem có phải là phím Enter hay không. Nếu đúng là phím Enter, ta gọi hàm reset gì đó để bắt đầu lại trò chơi. Tạm thời, bạn viết thêm hàm reset trống rỗng.
    Bạn ấn Ctrl + Enter để biên dịch lại và đóng chương trình trong Flash. Chuyển qua cửa sổ trình duyệt, bạn gõ F5 để khởi động lại trò chơi điền từ, thử xem những gì ta vừa bổ sung có hiệu lực ra sao.

    Nhắn tin cho tác giả
    Đỗ Thanh Dương @ 07:59 06/04/2012
    Số lượt xem: 1138
    Số lượt thích: 0 người
     
    Gửi ý kiến

    HỖ TRỢ QUẢN TRỊ WEBSITE

    Thay tên website / Chọn thư mục / Mở ra
    Giao diện Module Thư mục Thành viên Tài nguyên Xóa Code
    http://