Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 43 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
43
Dung lượng
696,26 KB
Nội dung
ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN Tel (84-236) 736 949, Fax (84-236) 842 771 Website: itf.ud.edu.vn, E-mail: cntt@edu.ud.vn BÁOCÁOĐỒÁNCƠSỞNGÀNHMẠNG Đà Nẵng - 5/2017 BáocáođồánCơSởNgànhMạng MỤC LỤC BáocáođồánCơSởNgànhMạng DANH SÁCH HÌNH VẼ BáocáođồánCơSởNgànhMạng DANH SÁCH BẢNG BIỂU BáocáođồánCơSởNgànhMạng LỜI MỞ ĐẦU Nguyên lý hệ điều hành Lập trình Mạng tảng mà người lập trình phải hiểu rõ để nắm bắt kiên thức cao Hệ điều hành thành phần trung gian, cầu nối cho giao tiếp người dung máy tính Thông qua hệ điều hành, người sử dụng dễ dàng làm việc khai thác hiệu thiết bị phần cứng Cũng vậy, với phát triển lĩnh vực mạng nay, việc nghiên cứu, nắm vững Mạng thực quan trọng người lập trình Dựa hiểu biết tham khảo thêm, em thực hiện, nghiên cứu đề tài: Tìm hiểu kỹ thuật Hook, xây dựng chương trình gõ tắt Xây dựng game cờ gánh cho phép nhiều người chơi mạng Em xin chân thành cảm ơn thầy cô giáo khoa Công Nghệ Thông Tin, hết thầy Nguyễn Tấn Khôi nhiệt tình theo dõi, hướng dẫn em nhiệt tình trình em thực đề tài Em cố gắng hoàn thành đề tài, tránh khỏi thiếu sót, mong nhận góp ý thầy cô để em hoàn thiện đề tài Sinh viên thực Phan Thanh AnBáocáođồánCơSởNgànhMạng PHẦN 1: NGUYÊN LÝ HỆ ĐIỀU HÀNH TIÊU ĐỀ: XÂY DỰNG ỨNG DỤNG GÕ TẮT Tìm hiêu kỹ thuật lập trình Hook Xây dựng ứng dụng gõ tắt Sử dụng ngôn ngữ lập trình C# CHƯƠNG CƠSỞ LÝ THUYẾT Giới thiệu Hook Trong Windows, thực thao tác nhấp chuột, nhấn phím… hệ điều hành chuyển kiện thành thông điệp (message) đưa vào hàng đợi (queue) hệ thống Sau đó, thông điệp trao lại cho ứng dụng cụ thể để xử lý Hook chế mà ứng dụng chặn kiện, thông điệp, thao tác chuột, bàn phím Hàm dùng để chặn loại kiện riêng biệt gọi hook procedure/ hook function Mỗi nhận kiện, hook procedure thay đổi chí hủy bỏ kiện Xét phạm vi hoạt động có loại Hook: - Local hook (thread hook): có ảnh hưởng phạm vi thread - Global hook: có ảnh hưởng toàn hệ thống Trường hợp này, hook procedure phải chứa thư viện DLL Một số ví dụ sử dụng hook: - Tạo chức debug - Tạo chương trình record play back macro - Bắt giả lập kiện bàn phím chuột - Tạo chức Help(F1) cho ứng dụng - Tạo ứng dụng computer-based training (CBT) Cơ chế Hook – Hook chain Hệ điều hành trì danh sách hook procedure cho loại kiện Mỗi danh sách Hook procedure gọi hook chain Bản chất hook chain dãy trỏ hàm trỏ đến Hook procedure Khi hệ thống thực kiện đó, tìm kiếm hook chain tương ứng với kiện Nếu hook procedure phù hợp tìm thấy, hệ thống thực lấy lại quyền điều khiển sau hook chain kết thúc Vì hook procedure thực xong, phải thực việc chuyển quyền điều khiển cho hook procedure hook chain Tuy nhiên chế tùy thuộc vào loại hook Như số loại hook theo dõi thông điệp, cho dù hook procedure có chuyển quyền BáocáođồánCơSởNgànhMạng điều khiển cho hook procedure hay không, hệ thống tự động làm việc Hook kỹ thuật xử lý thông điệp mạnh cho phép can thiệp sâu vào tiến trình khác nhau, làm ảnh hưởng tới tốc độ hệ thống, hook system-wide, tất kiện hệ thống định hướng tới hàm đó, rõ ràng điều làm hệ thống chậm đáng kể Vì ta hên hook thông điệp thật cần thiết kết thúc việc hook không dùng đến Hình Hook chain Các loại Hook Có nhiều loại hook phân biệt dựa vào kiện, thông điệp mà Hook procedure can thiệp vào Danh sách liệt kê loại hook kèm với link dẫn đến tham khảo từ MSDN: - WH_CALLWNDPROC and WH_CALLWNDPROCRET - WH_CBT - WH_DEBUG - WH_FOREGROUNDIDLE - WH_GETMESSAGE - WH_JOURNALPLAYBACK - WH_JOURNALRECORD - WH_KEYBOARD_LL - WH_KEYBOARD - WH_MOUSE_LL - WH_MOUSE BáocáođồánCơSởNgànhMạng - WH_MSGFILTER and WH_SYSMSGFILTER - WH_SHELL Hook Procedure Hook procedure loại callback function Hệ thống gọi hàm kiện, thông điệp tương ứng với loại hook Mỗi loại hook có hook procedure khác có tham số cú pháp bên Với hook procedure khác việc xét giá trị tham số khác Lập trình viên sử dụng dụng hàm SetWindowsHookEx để cài đặt hook procedures vào hook chain Một hook procedures có cú pháp sau: LRESULT CALLBACK HookProc( int nCode, WPARAM wParam, LPARAM lParam ) { //process event return CallNextHookEx(NULL, nCode, wParam, lParam); } Ý nghĩa tham số truyền vào hàm: nCode : tham số thường gọi “hook code”, Hook procedure sử dụng giá trị để định cách thức xử lý kiện Giá trị hook code tùy thuộc vào loại hook cụ thể, loại hook có tập hợp giá trị hook code đặc trưng riêng Có quy luật mà dường Hook procedure loại hook cần tuân thủ: Window truyền cho hàm giá trị hook code âm, Hook procedure không xử lý kiện mà phải gọi hàm CallNextHookEx với tham số mà hệ điều hành truyền cho Sau đó, phải trả giá trị trả hàm CallNextHookEx wParam, lParam: Đây thông tin cần thiết cho Hook procedure trình xử lý kiện Các giá trị có ý nghĩa khác tuỳ thuộc vào loại hook BáocáođồánCơSởNgànhMạng Ví dụ: Hook procedure gắn với hook WH_KEYBOARD nhận mã phím ảo (Virtual-Key Code) từ wParam, đồng thời có từ lParam thông tin mô tả trạng thái bàn phím kiện gõ phím xảy Cài đặt hook 5.1 Cài đặt Filter Function vào chuỗi Filter Function Tác vụ thực thông qua hàm SetWindowsHookEx Cú pháp: HHOOK WINAPI SetWindowsHookEx( _In_ int idHook, _In_ HOOKPROC lpfn, _In_ HINSTANCE hMod, _In_ DWORD dwThreadId ); Tham số: - idHook: Xác định loại hook mà ta muốn cài đặt, tham số giá trị sau: • WH_CALLWNDPROC : đặt thủ tục hook quản lý thông điệp trước lúc hệ thống gởi chúng tới cửa sổ đích • WH_CALLWNDPROCRET : đặt thủ tục hook quản lý thông điệp sau chúng xử lý thủ tục cửa sổ đích • WH_CBT : đặt thủ tục hook nhận thông báocó ích tới ứng dụng huấn luyện sở tính toán (CBT) • WH_DEBUG : đặt thủ tục hook có ích cho việc debug thủ tục hook khác • WH_FOREGROUNDIDLE : đặt thủ tục hook gọi thread foreground ứng dụng trở thành không dùng đến Hook có ích cho hoạt động nhiệm vụ (task) độ ưu tiên thấp thời gian không dùng đến • WH_GETMESSAGE : đặt thủ tục hook quản lý thông điệp post tới hàng đợi thông điệp •WH_JOURNALPLAYBACK : đặt thủ tục hook post thông điệp ghi trước thủ tục hook WH_JOURNALRECORD •WH_JOURNALRECORD : đặt thủ tục hook ghi thông điệp đầu vào post tới hàng thông điệp hệ thống Hook có ích cho việc ghi macro BáocáođồánCơSởNgànhMạng • WH_KEYBOARD : đặt thủ tục hook quản lý thông điệp keystroke • WH_MOUSE : đặt thủ tục hook quản lý thông điệp chuột • WH_MSGFILTER: đặt thủ tục hook quản lý thông điệp kết sinh kết cuả kiện đầu vào dialog box, message box, menu hay scroll bar • WH_SYSMSGFILTER : đặt ứng dụng thông điệp kết sinh kết kiện đầu vào dialog box, message box, menu hay scroll bar Thủ tục hook quản lý thông điệp cho tất ứng dụng hệ thống Mỗi giá trị xác định loại hook mà ta muốn cài đặt, loại hook có ý nghĩa tình sử dụng khác - lpfn: Địa Hook procedure mà ta muốn gắn với hook - hMod: Handle module chứa hook procedure Nếu ta cài đặt hook cục (nghĩa thực thi hook procedure ảnh hưởng tiến trình cài đặt hook), tham số phải NULL Còn muốn có hook với phạm vi toàn hệ thống (tức tiến trình hữu chịu ảnh hưởng hook procedure chúng ta), tham số Handle DLL chứa hook procedure - dwThreadID: Định danh thread ứng với hook cài đặt Nếu tham sốsố khác 0, hook procedure gắn với hook gọi ngữ cảnh thread xác định Còn dwThreadID = 0, hook procedure có phạm vi toàn hệ thống, dĩ nhiên, gọi ngữ cảnh thread tồn HĐH Có thể sử dụng hàm GetCurrentThreadId để lấy handle thread muốn cài đặt hook Một hook sử dụng mức hệ thống, mức cục bộ, hai mức vừa nêu Bảng sau mô tả loại hook tầm ảnh hưởng nó: Bảng Các loại hook tầm ảnh hưởng Name Valu Scope e Hook procedure WH_CALLWNDPROC CallWndProc WH_CALLWNDPROCRE T 12 Thread or global Thread or global CallWndRetProc 10 BáocáođồánCơSởNgànhMạng Hàm gộp mảngmảng byte: public static byte[] prepareData(byte signal, byte[] arrData) { int len = * arrData.length + + 1; for(byte[] buf:arrData) len += buf.length; byte[] data = new byte[len]; int pos = 5; data[0] = signal; System.arraycopy(Util.intToByteArray(arrData.length), 0, data, 1, 4); for(byte[] buf:arrData) { System.arraycopy(Util.intToByteArray(buf.length), 0, data, pos, 4); System.arraycopy(buf, 0, data, pos + 4, buf.length); pos += buf.length + 4; } return data; } 4.3 Xử lý liệu sau nhận Khi liệu gửi đóng gọi cần xư lý liệu sau nhận được, hàm praseData lớp Helper.java đảm nhận việc public static ArrayList parseData(byte[] data) { //skip byte first int len = Util.byteArrayToInt(new byte[]{data[1], data[2], data[3], data[4]}); ArrayList arlData = new ArrayList(len); int idx = 5; for(int i = 0; i < len; i++) { int blen = Util.byteArrayToInt(new byte[]{data[idx], data[idx + 1], data[idx + 2], data[idx + 3]}); byte[] buf = new byte[blen]; System.arraycopy(data, idx + 4, buf, 0, blen); arlData.add(buf); idx += blen + 4; } return arlData; } Byte mang giá trị CTRL tách khỏi mảng 4.4 Giá trị điều khiển Cả client server chứa lớp CTRL.java định nghĩa số để xác định loại tin nhắn gửi đên public final class CTRL { public static final byte public static final byte public static final byte public static final byte SIGNUP = 0; LOGIN = 1; ENTER_TABLE = 3; ENTER_GAME = 4; 29 BáocáođồánCơSởNgànhMạng public static final byte MOVE = 5; …… } Khi nhận gói liệu nhận chương trình so sánh byte mảng liệu với số lớp CTRL.java để biết liệu có ý nghĩa Ví dụ: Client đăng nhập gửi mảng byte, byte liệu gửi có giá trị 1(CTRL.LOGIN) 4.5 Phòng chơi Lớp Table.java chứa trạng thái phòng chơi bao gồm tên người chơi trạng thái phòng chơi, thời gian chơi… Một danh sách đối tượng Table tạo để quản lý đối tượng phòng chơi Khi trao đổi liệu client server dựa vào id table để xác định thay đổi Table 4.6 Bàn cờ quân cờ Lớp Chessman.java đối tượng quân cờ, bao gồm vị trí, kiểu, màu sắc quân cờ bàn cờ Lớp Board.java chứa trạng thái bàn chơi, xử lý nước đi, cách ăn quân Các quân cờ quản lý danh sách (ArrayList armies;) đối tượng lớp Chessman.java lớp Board.java Do mục đích bên client-server khác nên việc tạo đối tượng bàn cờ quân cờ bên khác : - Client : trình khởi chạy có đối tượng lớp Board.java khởi tạo Các quân cờ đồng từ phía server nhảy vào bàn chơi - Server : đối tượng lớp Table chứa đối tượng lớp Board.java, quân cờ khởi tạo bàn cờ khởi tạo 4.7 Thuật toán 4.7.1 Tìm nước hợp lệ quân cờ Trên bàn cờ gánh có tất 25 vị trí mà quân cờ tới để xác định nước hợp lệ, cần xây dựng hàm trả mảng các điểm tới từ vị trí Các vị trí bàn cờ đánh số từ -> 24 theo chiều từ trái qua phải, từ xuống dưới, điểm bên trái có giá trị Hàm sau trả mảng vị trí mà quân cờ tới từ vị trí pos ban đầu : public int[] goTo(int pos) { 30 BáocáođồánCơSởNgànhMạng /* > ** | ** v */ switch(pos){ case 0: return case 1: return case 2: return case 3: return case 4: return case 5: return case 6: return case 7: return case 8: return case 9: return case 10: return case 11: return case 12: return case 13: return case 14: return case 15: return case 16: return case 17: return case 18: return case 19: return case 20: return case 21: return case 22: return case 23: return case 24: return default: return new int[]{1, 5, 6}; new int[]{0, 2, 6}; new int[]{1, 3, 6, 7, 8}; new int[]{2, 4, 8}; new int[]{3, 8, 9}; new int[]{0, 6, 10}; new int[]{0, 1, 2, 5, 7, 10, 11, 12}; new int[]{2, 6, 8, 12}; new int[]{2, 3, 4, 7, 9, 12, 13, 14}; new int[]{4, 8, 14}; new int[]{5, 6, 11, 15, 16}; new int[]{6, 10, 12, 16}; new int[]{6, 7, 8, 11, 13, 16, 17, 18}; new int[]{12, 8, 14, 18}; new int[]{8, 9, 13, 18, 19}; new int[]{10, 16, 20}; new int[]{10, 11, 12, 15, 17, 20, 21, 22}; new int[]{12, 16, 18, 22}; new int[]{12, 13, 14, 17, 19, 22, 23, 24}; new int[]{14, 18, 24}; new int[]{15, 16, 21}; new int[]{20, 16, 22}; new int[]{16, 17, 18, 21, 23}; new int[]{22, 18, 24}; new int[]{23, 18, 19}; new int[]{}; 31 BáocáođồánCơSởNgànhMạng } } Hàm goTo trả vị trí tới trường hợp bàn cờ trống Vì để xác định vị trí hợp lệ cần loại loại bỏ điểm mà có quân cờ trước Hàm guest(int pos) lấy nước hợp lệ public int[] guest(int pos) { int[] gt = goTo(pos); ArrayList arl = new ArrayList(); for(int p:gt) { boolean f = false; for(Chessman ch:armies) if(f = (ch.pos == p)) break; if(!f) arl.add(p); } int[] gst = new int[arl.size()]; for(int i = 0; i < arl.size(); i++) gst[i] = arl.get(i); return gst; } 4.7.2 Xác định trạng thái ăn quân đối phương Có hai cách để ăn quân cờ đối phương gánh vây, ta xây dựng hai giải thuật để tìm kiếm quân cờ đối phương trạng thái gánh vây 4.7.2.1 Xác định nước gánh Hai quân cờ đối phương bị gánh có nước tới trung điểm quân cờ Vì ta tìm quân cờ đối phương nằm lân cận quân cờ vừa đi, kiểm tra trạng thái Lần lượt kiểm tra cặp quân cờ xem có nằm đường thẳng hay không? Nếu nằm đường cặp quân cờ bị gánh Hàm sau tìm quân cờ bị gánh: public ArrayList between(boolean type, int npos) { ArrayList alPos = getChessmanEnemy(type, npos); ArrayList pair = new ArrayList(); int cp = npos % 5; int rp = npos / 5; for(int i = 0; i < alPos.size(); i++) for(int j = i + 1; j < alPos.size(); j++) { Pair pr = new Pair(alPos.get(i), alPos.get(j)); boolean f = false; 32 BáocáođồánCơSởNgànhMạng for(Pair ppr:pair) if(f = ppr.compare(pr)) break; if(f) continue; int col = alPos.get(i) % 5; int row = alPos.get(i) / 5; int c = alPos.get(j) % 5; int r = alPos.get(j) / 5; if((c == col && Math.abs(r - row) == && cp == c) || (r == row && Math.abs(c - col) == && rp == r) || (Math.abs(c - col) == Math.abs(r - row) && Math.abs(r - row) == && Math.abs(rp - r) == Math.abs(rp - row) && Math.abs(cp - c) == Math.abs(cp - col))) pair.add(pr); } return pair; } public ArrayList getChessmanEnemy(boolean type, int npos) { int[] next = goTo(npos); ArrayList alPos = new ArrayList(); for(int p:next) { Chessman c = findChessman(p); if(c == null) continue; if(c.type == type) continue; alPos.add(p); } return alPos; } 4.7.2.2 Kiểm tra quân cờ trạng thái vây Một quân cờsở trang thái vây xung quang toàn quân cờ đối phương quân cần lân cận bị vây Các bước để xác định quân cờ trạng thái vây là: B1 Khởi tạo danh sách allPos chứa tất điểm mà có quân cờ kiểu Tìm tất điểm xung quanh đưa điểm có quân cờ kiểu vào allPos (dùng hàm goTo() để lấy giá trị xung quanh) B2 Duyệt từ đầu đến cuối danh sách allPos Với điểm allPos ta tìm điểm lân cận điểm đưa điểm có quân cờ kiểu vào allPos (không lấy vị trí có) B3 Duyệt lại danh sách allPos, với giá trị allPos ta tìm vị trí lân cận tới (hàm goTo()) Nếu có vị trí chưa có quân cờ trả false quân cờ chưa bị vây Nếu trả true quân cờ bị vây 33 BáocáođồánCơSởNgànhMạng Các hàm sau tìm kiếm danh sách quân cờ bị vây sau nước đi: private ArrayList siege(boolean type, int pos) { ArrayList near = new ArrayList(); near.add(pos); addArrayList(near, nearPosition(type, pos)); ArrayList distint = new ArrayList(); while(!near.isEmpty()) { int p = near.get(0); near.remove(0); boolean skip = false; for(int i:distint) if(skip = (i == p)) break; if(skip) continue; distint.add(p); addArrayList(near, nearPosition(type, p)); } for(int ppos:distint) { int[] around = goTo(ppos); boolean stop = false; for(int jpos:around) { Chessman ch = findChessman(jpos); if(stop = (ch == null)) break; } } if(stop) return new ArrayList(); return distint; } private ArrayList nearPosition(boolean type, int pos) { ArrayList near = new ArrayList(); int[] around = goTo(pos); for(int i = 0; i < around.length; i++) { Chessman ch = findChessman(around[i]); if(ch != null && ch.type == type) near.add(around[i]); } return near; } private void addArrayList(ArrayList a, ArrayList b) { for(int c:b) a.add(c); 34 BáocáođồánCơSởNgànhMạng } 4.7.3 Xác định trạng thái thắng người chơi Sau quân cờ đánh ta kiểm tra số quân cờ người chơi bàn cờ người chơi có 16 quân cờ người dành chiến thắng Ngược lại không quân cờ bàn cờ người thua public boolean checkWin(boolean type) { for(Chessman ch:armies) if(ch.type != type) return false; return true; } CHƯƠNG TRIỂN KHAI ĐÁNH GIÁ KẾT QUẢ Triển khai 1.1 Môi trường phát triển ứng dụng: Ứng dụng phát triển Eclipse IDE for Java Developers Version: Neon.3 Release (4.6.3) 1.2 Cấu trúc chương trình Chương trình Server: Hình Cấu trúc project Game Server Trong đó: 35 BáocáođồánCơSởNgànhMạng + Package org.thanhan.game chứa lớp quản lý thủ tục xử lý liệu, số trạng thái, hàm main khởi chạy Server + Package socket.io chứa lớp quản lý thủ tục kết nối, gửi nhận liệu, interface quản lý kiện trước, sau kết nối Client với Server Đây package dùng chung cho chương trình Client Server nhắc phần Phân tích đề tài Chương trình Client: 36 BáocáođồánCơSởNgànhMạng Hình 10 Cấu trúc Cờ Gánh Client Trong đó: + Package application chứa các số trạng thái, hàm khởi chạy Client, hàm khởi tạo giao diện,… 37 BáocáođồánCơSởNgànhMạng + Package application.controller chứa hàm kết nối, lắng nghe kiện từ Server, lắng nghe xử lý kiện gửi lên Server,… + Package assets.images chứa hình ảnh phục vụ cho việc xây dựng giao diện + Package assets.layout chứa file giao diện nhắc phần Yêu cầu giao diện + Package assets.sounds chứa file âm phục vụ cho game + Package socket.io package dùng chung có thành phần chương trình Server Kết Hình 11 Giao diện đăng nhập 38 BáocáođồánCơSởNgànhMạng Hình 12 Giao diện đăng kí 39 BáocáođồánCơSởNgànhMạng Hình 13 Màn hình Hình 14 Giao diện bàn chơi 40 BáocáođồánCơSởNgànhMạng Hình 15 Giao diện chơi game Đánh giá kết Nhìn chung xây dựng thành công trò chơi cờ gánh cho phép nhiều người chơi Trò chơi đáp ứng yêu cầu đặt Nhưng nhiều thiếu sót cần bổ sung sau lưu lại trạng thái chiến thắng, bảng kết quả… KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN Những kết đạt Nắm bắt vận dụng lớp Socket java để xây đựng game chơi qua mạng Biết chế truyền liệu thông qua mạng Xây dựn game cờ gánh chơi nhiều người qua mạng Những vấn đề tồn Trong trình chơi game phát sinh số lỗi không mong muốn, đôi lúc client chưa nhận liệu từ server nên trận đánh tiếp tục Hướng phát triển Khắc phục lỗi tồn Lưu trữ trình chơi sở liệu để xem sau KẾT LUẬN CHUNG Qua đồán giúp em hoàn thiện kiến thức học trường biết cách vận dụng vào dự án thực tế Về em hoàn thành yêu cầu đề đồánsởngànhmạng Xây dựng thành công chương trình hoạt động 41 BáocáođồánCơSởNgànhMạng tốt Tuy nhiên, chương trình tồn thiếu sót hạn chế cần phải khắc phục 42 BáocáođồánCơSởNgànhMạng TÀI LIỆU THAM KHẢO [1] YinYang's Programing Blog, Win32 – Giới thiệu kĩ thuật Hook khái niệm https://yinyangit.wordpress.com/2011/08/07/win32-introduction-tohook-and-some-basic-concepts/ [2] Miscrosoft Developer Network, Hooks Overview https://msdn.microsoft.com/en-us/library/ms644959(v=vs.85).aspx [3] Wikipeadia, Mạng Máy Tính https://vi.wikipedia.org/wiki/M%E1%BA%A1ng_m%C3%A1y_t%C3%ADnh [4] Wikipedia, Cờ Gánh https://vi.wikipedia.org/wiki/C%E1%BB%9D_g%C3%A1nh [5] O7planning, Hướng dẫn lập trình Java Socket http://o7planning.org/vi/10393/huong-dan-lap-trinh-java-socket [6] Oracle Docs, Package java.net https://docs.oracle.com/javase/7/docs/api/java/net/packagesummary.html [7] Evatotus+, Instroduction to JavaFx for Game Development https://gamedevelopment.tutsplus.com/tutorials/introduction-to-javafxfor-game-development cms-23835 [8] Code.makery.ch, JavaFx Event Handling Examples http://code.makery.ch/blog/javafx-8-event-handling-examples/ 43 .. .Báo cáo đồ án Cơ Sở Ngành Mạng MỤC LỤC Báo cáo đồ án Cơ Sở Ngành Mạng DANH SÁCH HÌNH VẼ Báo cáo đồ án Cơ Sở Ngành Mạng DANH SÁCH BẢNG BIỂU Báo cáo đồ án Cơ Sở Ngành Mạng LỜI MỞ ĐẦU... thảo văn 18 Báo cáo đồ án Cơ Sở Ngành Mạng PHẦN 2: LẬP TRÌNH MẠNG TIÊU ĐỀ: XÂY DỰNG GAME CỜ GÁNH Sử dụng Socket Java xây dựng trò chơi Cờ gánh Online theo mô hình Client-Server CHƯƠNG CƠ SỞ LÝ THUYẾT... text Cơ sở liệu Chương trình sử dụng sqlite để lưu trữ kí tự ví tắt Các từ viết tắt nghĩa lưu trữ table word Hình Cấu trúc table word 15 Báo cáo đồ án Cơ Sở Ngành Mạng CHƯƠNG TRIỂN KHAI ĐÁNH GIÁ