Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 30 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
30
Dung lượng
0,99 MB
Nội dung
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG ~~~~~~*~~~~~~ BÁO CÁO BÀI TẬP LỚN MÔN HỌC PROJECT I Giảng viên hướng dẫn Sinh viên thực : ThS Trịnh Thành Trung : Đỗ Khắc Linh -20132259 Nguyễn Đức Long-20132374 Trần Văn Lộc-20132437 Ngô Đức Nhật-20132860 Phạm Thu Nga-20132739 Hà Nội – Tháng 12/2015 Mục lục Danh sách hình vẽ Error! Bookmark not defined LỜI CÁM ƠN GIỚI THIỆU CHUNG I Tổng quan kiến thức liên quan Mô hình lập trình hướng đối tượng Giới thiệu chủ đề tập lớn – Trò chơi game nhập vai 11 II Phân tích thiết kế mức kiến trúc 13 Biểu đồ USE – CASE 13 Biểu đồ lớp 15 III Thiết kế chi tiết giải pháp kỹ thuật 18 Thiết kế chi tiết lớp 18 IV Kết luận đánh giá 28 V Tài liệu tham khảo 28 LỜI CÁM ƠN Chúng em sinh viên Công nghệ thông tin, hai năm học qua, chúng em chưa thực hiểu sâu ngành, chưa có nhận thức đắn ngành mà học, nghĩ học công nghệ thông tin cần lập trình giỏi Khi tham gia môn học Hướng đối tượng, hướng dẫn thầy Trịnh Thành Trung tham gia làm đồ án môn học, chúng em học tập nhiều kĩ năng: kĩ làm việc nhóm, kĩ báo cáo, kĩ lập trình…và quan trọng hết hiểu rõ quy trình làm phần mềm Trong trình làm đồ án, có nhiều sai sót chúng em xin hứa cố gắng để hoàn thiện chương trình Chúng em xin gửi lời cám ơn đến thầy Trịnh Thành Trung dạy giúp đỡ chúng em hoàn thiện đồ án GIỚI THIỆU CHUNG Mục đích thực tập lớn Công nghệ thông tin, từ xuất tới phát triển qua nhiều giai đoạn, với đột phá phần cứng lẫn phần mềm Đặc biệt phát triển phần mềm gắn với bước phát triển mô hình lập trình (Programming paradigm), mô hình: lập trình thủ tục (Procedural progaramming), lập trình hướng đối tượng (object – oriented programming, lập trình logic ( logic programming), lập trình hàm (functional programming)… Trong đó, mô hình lập trình hướng đối tượng mô hình lập trình sử dụng rộng rãi Chính từ thực tiễn đó, đòi hỏi người sinh viên ngành công nghệ thông tin phải nắm tất kiến thức, nội dung kỹ thuật mô hình lập trình này, thời áp dụng mô hình lập trình để tạo ứng dụng mạnh mẽ, mang tính thực tiễn cao, nâng cao phong cách kỹ thuật lập trình để đủ khả tiếp tục tiến lên hành trình khám phá giới công nghệ thông tin thân sinh viên Mục đích thực tập lớn chúng em để tìm hiểu kiến thức lập trình hướng đối tượng, đồng thời sử dụng kiến thức học để xây dựng chương trình theo mô hình lập trình hướng đối tượng Chương trình chúng em chọn để thực trò chơi xây tháp canh( Tower Defense) Phạm vi kiến thức tìm hiểu: - Các nội dung, kỹ thuật lập trình hướng đối tượng - Cách xây dựng chương trình mô hình lập trình hướng đối tượng - Cách để thiết kế xây dựng nên trò chơi với kiến trúc tốt, có khả sửa lỗi, thay đổi mở rộng Phương pháp thực tập lớn: - Nắm kiến thức kỹ thuật mà giảng viên truyền đạt lớp, đồng thời thực hành nội dung nhiều lần qua tập trình thực tập lớn để thực hiểu sử dụng hiệu - Tham khảo thêm kiến thức Mạng, sách lập trình, học hỏi kinh nghiệm từ anh chị khóa để mở rộng hiểu biết lập trình hướng đối tượng - Tham khảo tập lớn, chương trình mã nguồn mở từ mạng để hiểu cách thiết kết lập trình ứng dụng thực tế, từ học hỏi áp dụng học vào thực tập lớn - Học tập cách làm việc nhóm, cách phân chia công việc cho thành viên nhóm cho thành viên độc lập nhiệm vụ, thống hành động phát huy mạnh khả thành viên trình thực tập lớn -Thực tập lớn theo quy trình, bước giai đoạn chung phát triển phần mềm, tuân thủ quy tắc, không chạy theo tiến độ mà đốt cháy giai đoạn I Tổng quan kiến thức liên quan 1.1 Mô hình lập trình hướng đối tượng Lập trình hướng đối tượng gì? Lập trình hướng đối tượng mô hình lập trình sử dụng phổ biến Nó mô hình lập trình có kế thừa phát triển từ mô hình lập trình trước đó, phát triển gắn liền với trình trừu tượng hóa lập trình Nếu lập trình assembly trừu tượng hóa mã máy(mã nhị phân) thành thị điều khiển kiểu liệu bản, lập trình thủ tục trừu tượng hóa thị kiểu liệu thành trạng thái câu lệnh điều khiển thay đổi trạng thái, trừu tượng hóa lập trình lên mức cao nữa, chia chương trình thành chức nhỏ, chức lại chia thành chức nhỏ Khi công việc thực đơn vị, gọi hàm(hay thủ tục) Chương trình thực thực hàm để xử lý biến đổi liệu theo luồng điều khiển, tư tưởng lập trình hàm ”chương trình = cấu trúc liệu + giải thuật” Chúng ta thấy, lập trình hàm có trừu tượng hóa lên tới mức cao, phù hợp với nhiều toán thực tiễn, mô hình lập trình mô hình lập trình chủ yếu thời gian dài Tuy nhiên với mở rộng ngày lớn quy mô độ phức tạp chương trình ngày lớn, lập trình hướng đối tượng bộc lộ nhược điểm tách rời liệu xử lý Khi đó, lâp trình hướng đối tượng ra, tiếp tục nâng cao mức độ trừu tượng hóa, sử dụng khái niệm – đối tượng, để trừu tượng hóa liệu, tức với liệu định liền với cách thức để xử lý với liệu đó, liệu với phương thức xử lý liệu đóng gói lại thành thực thể, gọi đối tượng Tư tưởng lập trình hướng đối tượng Alan Kay trình bày sau: - Tất đối tượng Chương trình phần mềm coi tập hợp đối tượng tương tác với Mỗi đối tượng phần mềm có liệu độc lập chiếm nhớ riêng cho Mỗi đối tượng có dạng đặc trưng lớp đối tượng Tất đối tượng thuộc lớp có hành vi giống Mô hình lập trình hướng đối tượng hiểu trừu tượng hóa toán thành đối tượng tương tác đối tượng đó, đối tượng đóng gói thuộc tính phương thức xử lý thuộc tính Các nguyên lý lập trình hướng đối tượng 1.2 Lập trình hướng đối tượng gồm nguyên lý sau: - Nguyên lý trừu tượng hóa: - - - + Trừu tượng hóa trình loại bỏ thông tin cụ thể giữ lại thông tin chung, tập trung vào đặc điểm loại thực thể, giúp phân biệt thực thể với loại thực thể khác + Trừu tượng hóa trình thực mô tả thực thể thực tiễn vào toán, người lập trình định quan trọng không quan trọng toán Do trừu tượng hóa phụ thuộc vào yêu cầu toán đối tượng , tức trình trừ tượng hóa phụ thuộc vào góc nhìn Nguyên lý đóng gói: + Đóng gói trình che giấu, ẩn chi tiết thực bên (dữ liệu phương thức private) Khi thực đóng gói, người sử dụng đối tượng thấy tất thuộc tính phương thức bên đối tượng, mà sử dụng đối tượng thông qua giao diện người viết lớp thiết lập + Đóng gói cho phép người thiết kế lớp bảo vệ liệu thông qua việc kiểm soát mà người dùng bên truy cập vào đối tượng Đồng thời nguyên tắc đóng gói cho phép thay đổi thiết kế bên lớp không làm ảnh hưởng tới người sử dụng đối tượng lớp đó, trường hợp giao diện lớp không bị thay đổi Nguyên lý Module hóa: + Module hóa trình người sử dụng chia hệ thống thành đơn vị chức năng, đơn vị có tính độc lập với nhau, kết nối với để tạo thành hệ thống hoàn chỉnh + Nguyên lý module sử dụng giúp chia nhỏ hệ thống phức tạp thành thành phần nhỏ hơn, đơn giản Đồng thời trình thiết kế triển khai hệ thống, nguyên lý mô đun giúp phân chia công việc cách hiệu quả, đồng thời cho phép người sử dụng dễ dàng nâng cấp, bảo trì, sửa lỗi hệ thống, kiểm soát tiến độ chất lượng thành phần hệ thống Nguyên lý phân cấp + Nguyên lý phân cấp trình người lập trình xếp mức độ trừu tượng hóa đối tượng vào cấu trúc Hệ thống phân cấp nhiều cách khác nhau, tùy yêu cầu người thiết kế, phân cấp kết tập, phân cấp lớp, phân cấp phạm vi, phân cấp kế thừa, phân cấp thành phần… + Quá trình phân cấp giúp cho người lập trình thiết kế hệ thống cách khoa học, tránh dư thừa không cần thiết, lỗi phát sinh từ dư thừa đó, đồng thời cho phép người lập trình tái sử dụng thành phần chung Quá trình phân cấp giúp cho hệ thống trở nên gọn nhẹ, chặt chẽ, hiệu dễ dàng quản lý, nâng cấp sửu chữa Phân tích thiết kế hướng đối tượng 1.3 Phương pháp luận (methodology) PT&TK phần mềm thông thường định nghĩa tập trình thao tác để tìm khám phá cách giải toán phần mềm Phân tích thiết kế hướng đối tượng phương pháp luận hiệu để phá triển phần mềm Phương pháp phân tích thiết kế hướng đối tượng gồm có sáu giai đoạn: - Giai đoạn 0: Lập kế hoạch (make a plan) Giai đoạn 1: Xác định mục tiêu - làm (what are we making) Giai đoạn 2: Xác định cách làm (how to build it) Giai đoạn 3: Xây dựng phần lõi - Building the core Giai đoạn 4: Lặp lại (hiệu chỉnh) trường hợp sử dụng Giai đoạn 5: Phát triển (evolution) 1.3.1 Lập kế hoạch Ở giai đoạn lập kế hoạch, cần xác định cần thiết để bắt đầu dự án, yếu tố đầu vào, đầu dự án như: - - Các mốc thời gian quan trọng dự án: Ngày bắt đầu, lịch làm việc, mốc thời gian nhận, trả nhiệm vụ, thời hạn chót cho phần công việc, thời điểm bắt đầu dự án Các nguồn lực vốn đầu tư cho dự án Các nguồn lực người cho dự án: Số lượng thành viên, trình độ thành viên dự án Mục tiêu đề thực dự án, yêu cầu đặt dự án hoàn thành Các đầu vào khác dự án: Công nghệ áp dụng dự án, phạm vi triển khai dự án, đối tác tham gia phát triển với dự án, phương án dự trù tương lai cho dự án 1.3.2 Xác định mục tiêu Trong giai đoạn này, có nhiệm vụ xác định cụ thể mục tiêu, chức nhiệm vụ mà phần mềm xây dụng phải đáp ứng Để xác định mục tiên, cần tiến hành phân tính yêu cầu mô tả hệ thống việc sử dụng ký pháp kỹ thuật Use case để mô tả yêu cầu 1.3.3 Xác định cách làm Sau xác định mục tiêu, ta cần xác định phương pháp phương tiện để thực mục tiêu đó, tìm cách giải toán đặt mô hình lập trình hướng đối tượng Trong giai đoạn này, nhiệm vụ người lập trình tìm kiếm trình tự công việc phải làm để thực yêu cầu mô tả phần Biểu đồ use case, từ xây dựng lên biểu đồ trình tự cho toán, từ xây dựng kiến trúc cho toàn toán đặt Sau xây dựng phần kiến trúc, tiến hành tìm kiếm xây dựng đối tượng có mặt thiết kế đó, với thuộc tính phương thức mà kiến trúc yêu cầu Bước xây dựng đối tượng liền với việc phát đối tượng có chung nguyên mẫu( tức có chung kiểu thuộc tính chung hành động) từ tiến hành phát triển xây dựng lớp đối tượng có hệ thống Việc phát hiện, mô tả xây dựng đối tượng tuân thủ theo bước sau đây: - - - - Phát đối tượng (Object discovery) Bước thực giai đoạn phân tích chương trình Chúng ta phát đối tượng nhờ yếu tố bên đặc điểm bên Lắp ráp đối tượng (Object assembly) Bước tìm kiếm đặc điểm đối tượng để thêm vào thuộc tính, hàm thành phần cho đối tượng Xây dựng hệ thống (System construction) Trong giai đoạn phát triển đối tượng, xem xét tương tác đối tượng để hình thành hệ thống hoạt động Mở rộng hệ thống (System extension) Khi thêm vào tính hệ thống, cần thêm lớp mới, đối tượng tương tác đối tượng với đối tượng có hệ thống Tái sử dụng đối tượng (Object reuse) Đây thử nghiệm quan trọng đối tượng lớp thiết kế phần mềm Chúng ta cần phải sử dụng lại lớp đối tượng phần mềm (thông qua tính kế thừa tương tác đối tượng) Trong phát triển khai lớp, cần lưu ý đặc điểm sau đây: - Chúng ta cần phân biệt rõ việc tạo lớp, sau nghĩa tới việc phát triển hoàn thiện lớp trình giải toán Việc phát lớp cần thiết cho chương trình nhiệm vụ thiết kế hệ thống, có lớp (trong thư viện lớp chẳng hạn) công việc dễ dàng 10 + Thiết lập phương thức hoạt động cho hệ thống (vòng lặp game, biến kiểm tra trạng thái game, biến kiểm soát tốc độ đối tượng game ) - + Cung cấp cho trạng thái game phương tiện để triển khai nội dung trạng thái game: Cung cấp đối tượng đồ họa, inputListener, biến kiểm soát tốc độ theo thời gian delta, phương thức kiểm soát trạng thái game + Quản lý danh sách trạng thái game có hệ thống, thiết lập trạng thái game lựa chọn để thể hình người chơi thời điểm tại, chuyển đổi trạng thái sang trạng thái game khác Các hình game trò chơi thiết kế thành module chính, module ghép nối vào module lõi( module lõi quản lý danh sách module này) Các module có nhiệm vụ sau: + Xây dựng nội dung module theo chức module + Sử dụng thành phần mà module lõi cung cấp cho trạng thái game để thực công việc: vẽ hình ảnh lên hình đối tượng đồ họa cung cấp, cập nhật đối tượng theo thời gian delta mà module lõi cung cấp cho + Sử dụng phương thức module lõi để chuyển sang hình game khác thay đổi trạng thái trò chơi ( tạm dừng, tiếp tục hay kết thúc trò chơi….) Sau thiết kế kiến trúc cho trò chơi, triển khai biểu đồ use case thành biểu đồ trình tự dựa kiến trúc thiết kế Biểu đồ lớp Biểu đồ lớp cho toàn hệ thống 16 Hình 7: Biểu đồ lớp cho GameState 17 Hình 2: Biểu đồ lớp cho giao diện trò chơi 18 Hình 3: Biểu đồ lớp cho Enemy III Thiết kế chi tiết giải pháp kỹ thuật Thiết kế chi tiết lớp 19 - Lớp GameState Là lớp trừu tượng cho cho lớp sau kế thừa Lớp MenuState Các thuộc tính: private imge menustate : icon ảnh button private image diamond: icon lúc chọn private int curentOption : đánh dấu nhận dạng vị trí menu state Các phương thức: public void init():dùng để load ảnh public void update() :update trạng thái đối tương public void draw(Graphics2D): dùng để vẽ hình ảnh load private void selectOption(): dùng chọn chuyển sang mà hình sau chọn 20 private void selectOption() { if (currentOption == 0) { gsm.setState(GameStateManager.PLAY); } if (currentOption == 1) { gsm.setState(GameStateManager.ABOUTSTATE); } if (currentOption == 2) { gsm.setState(GameStateManager.HIGHSCORE); } if (currentOption == 3) { System.exit(0); } } Lớp Highscore lớp About kế thừa từ lớp GameState Và có phương thức tương tự lớp MenuState - Class: InterfaceGame Các thuộc tính: private Image background: chứa hình ảnh cho giao diện private Image port0: chưa hình ảnh điểm dịch chuyển Các phương thức: Int(): load ảnh cho toàn map Update(): Cập nhập trạng thái cho toàn map 21 Checkscore(): Kiểm tra điểm đủ số lượng điểm định qua map public void checksocre() { if (robot.getScore() == && robot.getcenterX() < 100 && robot.getcenterY() > 400) { gsm.setState(2); } } Draw(Graphics): vẽ hình ảnh lên map public void draw(Graphics2D g2) { g2.drawImage(background, 0, 0, null); g2.drawImage(huyhieu, 1150, 0, null); for (int i = 0; i < arraytile.size(); i++) { Tile t = arraytile.get(i); g2.drawImage(t.getImage(), t.getTlx(), t.getTly(), null); g2.drawRect((int)t.getRectangle().getX(),(int)t.getRectangle().getY(), (int)t.getRectangle().getWidth(), (int)t.getRectangle().getHeight()); } if (robot.getScore() == 5) { g2.drawImage(port0, 100, 500, null); } robot.paint(g2); enemygirl.paint(g2); enemybone1.paint(g2); enemybone2.paint(g2); enemyspider1.paint(g2); enemyspider2.paint(g2); enemyeagle.paint(g2); enemyeagle2.paint(g2); } keyType(), keyPressed(), keyArratile(), keyType(): dùng để lắng nghe kiện nhập từ bàn phím public void keyPressed(KeyEvent e) { switch (e.getKeyCode()) { case KeyEvent.VK_RIGHT: 22 robot.moveRight(); break; case KeyEvent.VK_LEFT: robot.moveLeft(); break; case KeyEvent.VK_UP: robot.movetop(); break; case KeyEvent.VK_DOWN: robot.movebottom(); break; case KeyEvent.VK_SPACE: robot.shoot(); break; } robot.setmove(true); } - Class: Robot 23 - Các thuộc tính: speedX,speedY: tốc dộ di chuyển map nhân vật centerX,centerY: tọa độ chảu nhân vật đồ Health: máu nhân vật Rect,rect2: vẽ hình chữ nhật xét va chạm Score : điểm người chơi Các phương thức: ImageHealth(): load ảnh máu nhân vật bị công moveLeft(), moveRight(),movebottom(),moveRight(): phương thức di chuyển nhân vật stop(): trạng thái dừng nhân vật shoot(): phương thức công nhân vật Class Tile Các thuộc tính: Tly, tlx tỉ lệ theo chiều x y đồ Type: loại map R: thuộc tính dùng để vẽ hình chữ nhật, xét va chạm Các phương thức: getTlx,getTLy dùng để lấy tỉ lệ theo chiều x,y; setTlx,setTly dùng để gán giá trị cho tỉ lệ theo x y getType: lấy giá trị loại map tương ứng Phương thức khởi tạo cho tile: public Tile(int tlx, int tly, int type,Robot robot) throws IOException { this.robot = robot; init(); r = new Rectangle(); this.tlx = tlx * 70; this.tly = tly * 70; this.type = type; if (type == 3) { image = tree; 24 } else if (type == 4) { image = f21; } else if (type == 5) { image = f22; } else if (type == 2) { image = f23; } else if (type == 1) { image = null; } } Class MapData Class chưa phương thức load map cho toàn trò chơi: public void loadmap(String map, int c, Robot robot) throws IOException { ArrayList lines = new ArrayList(); int width = 0; int height = 0; String path = "/Maps/" + map; InputStream in = getClass().getResourceAsStream(path); BufferedReader reader = new BufferedReader( new InputStreamReader(in) ); while (true) { String line = reader.readLine(); if (line == null) { reader.close(); break; } if (!line.startsWith("!")) { lines.add(line); width = Math.max(width, line.length()); } } height = lines.size(); for (int i = 0; i < height; i++) { 25 String line = (String) lines.get(i); for (int j = 0; j < width; j++) { if (j < line.length()) { char ch = line.charAt(j); if (c == 1) { Tile t = new Tile(j, i, Character.getNumericValue(ch), robot1); arraytile.add(t); } else if (c == 2) { Tile t = new Tile(j, i, Character.getNumericValue(ch), robot2); arraytile2.add(t); } else if (c == 3) { Tile t = new Tile(j, i, Character.getNumericValue(ch), robot3); arraytile3.add(t); } } } } } Class Enemy: Class chưa thuộc tính phương thức chung toàn quái vật đồ Speed: tốc độ di chuyển quái 26 Power: sức mạnh quái công người chơi centerX, centerY: tọa độ quái vật map Image: chứa ảnh quái Các phương thức set, get quái vật, Các phương thức lại định nghĩa cụ thể cho loại quái vật, Mỗi quái vật kế thứu từ lớp tự định nghĩa riêng Lớp EnemyFishBig Lớp kế thừa từ Enemy, nên có đầy dủ thuộc tính phương thức Enemy Các thuộc tính: Các thuộc tính left, right,top,down cho biết quái di chuyên theo chiều Health: cho biết máu quái vật R: biến thuộc tính vẽ hình chữ nhật, xét va chạm Các phương thức: checkCollision() : phương trừ máu bị công, cập nhập lại máu private synchronized void checkCollision() { if (r.intersects(InterfaceGamemap2.getRobot().bound)) { if (InterfaceGamemap2.getRobot().getFight() == true) { if (health > 0) { health -= 1; InterfaceGamemap2.getRobot().setFight(false); System.out.println(health); } if (health == 0) { centerX = -300; int score = InterfaceGamemap2.getRobot().getScore(); score += 1; InterfaceGamemap2.getRobot().setScore(score); } } 27 if (centerX > InterfaceGamemap2.getRobot().getcenterX()) { st = GameState1.FightLeft; } else { st = GameState1.FightRight; } int health = InterfaceGamemap2.getRobot().getHealth(); health -= 1; InterfaceGamemap2.getRobot().setHealth(health); } else { st = GameState1.NotFight; } for (int i = 0; i < array.size(); i++) { Tile t = array.get(i); if (r.intersects(t.getRectangle()) && t.getType() == 2) { if (state == GameState.Right) { state = GameState.Left; } else { state = GameState.Right; } } } if (state == GameState.Right && st == GameState1.NotFight) { image = fishbigleft.getImage(); speed = -1; } else if (state == GameState.Left && st == GameState1.NotFight) { image = fishbigright.getImage(); speed = 1; } if (st == GameState1.FightLeft) { image = fishbigattackleft.getImage(); speed = 0; } else if (st == GameState1.FightRight) { image = fishbigattackright.getImage(); speed = 0; } 28 switch (health) { case 6: imhealth = imhealth2; break; case 5: imhealth = imhealth3; break; case 4: imhealth = imhealth4; break; case 3: imhealth = imhealth5; break; case 2: imhealth = imhealth6; break; case 1: imhealth = imhealth7; break; } } Phương thức công quái attack(), phương thức chết die(); Các class quái vật loại khác khác hình ảnh, máu phương thức công nên tương tự class IV Kết luận đánh giá - Kết thực được: + Hoàn thành trò chơi với đầy đủ chức năng: Chơi game với đầy đủ chức game + Hoàn thiện báo cáo với đầy đủ biểu đồ use case, biểu đồ trình tự, biểu đồ lớp + Qua trình làm tập lớn, chúng em hoàn thiện kĩ lập trình, kĩ làm việc nhóm, kĩ viết báo cáo, làm slide thuyết trình - Phân công việc nhóm 29 + Nhóm làm việc sau: Một tuần họp lần thời gian làm việc trao đổi qua internet, có khó khăn nhóm tổ chức họp giải vấn đề cho +Trần Văn Lộc : Thiết kế gói data, giao diện + Ngô Đức Nhật : Thiết kế gói map1,chỉnh sửa lỗi, thiết kế in HighScore file txt, tìm kiếm liệu (music, image); + Phạm Thu Nga : Thiết kế gói map2, làm Slide + Đỗ Khắc Linh: Thiết kế gói manager, main, utils, vẽ map1, map2 + Nguyễn Đức Long: Thiết kế gói gamestate, quay video, tester, làm hướng dẫn V Tài liệu tham khảo - Cách làm game 2d www manhhunggame.info 30 [...]... GameState.Left; } else { state = GameState.Right; } } } if (state == GameState.Right && st == GameState1.NotFight) { image = fishbigleft.getImage(); speed = -1; } else if (state == GameState.Left && st == GameState1.NotFight) { image = fishbigright.getImage(); speed = 1; } if (st == GameState1.FightLeft) { image = fishbigattackleft.getImage(); speed = 0; } else if (st == GameState1.FightRight) { image = fishbigattackright.getImage();... InterfaceGamemap2.getRobot().getcenterX()) { st = GameState1.FightLeft; } else { st = GameState1.FightRight; } int health = InterfaceGamemap2.getRobot().getHealth(); health -= 1; InterfaceGamemap2.getRobot().setHealth(health); } else { st = GameState1.NotFight; } for (int i = 0; i < array.size(); i++) { Tile t = array.get(i); if (r.intersects(t.getRectangle()) && t.getType() == 2) { if (state == GameState.Right) { state = GameState.Left;... (r.intersects(InterfaceGamemap2.getRobot().bound)) { if (InterfaceGamemap2.getRobot().getFight() == true) { if (health > 0) { health -= 1; InterfaceGamemap2.getRobot().setFight(false); System.out.println(health); } if (health == 0) { centerX = -300; int score = InterfaceGamemap2.getRobot().getScore(); score += 1; InterfaceGamemap2.getRobot().setScore(score); } } 27 if (centerX > InterfaceGamemap2.getRobot().getcenterX())... module quản lý game (GameStateManager) Module này có các nhiệm vụ sau: + Thiết lập môi trường chạy hệ thống (đồ họa, âm thanh, bộ nghe sự kiện) 15 + Thiết lập phương thức hoạt động cho hệ thống (vòng lặp game, các biến kiểm tra trạng thái game, biến kiểm soát tốc độ các đối tượng trong game ) - + Cung cấp cho các trạng thái game các phương tiện để triển khai nội dung của trạng thái game: Cung cấp đối... thành biểu đồ trình tự dựa trên kiến trúc được thiết kế 2 Biểu đồ lớp Biểu đồ lớp cho toàn bộ hệ thống 16 Hình 7: Biểu đồ lớp cho GameState 17 Hình 2: Biểu đồ lớp cho 1 giao diện trò chơi 18 Hình 3: Biểu đồ lớp cho Enemy III 1 Thiết kế chi tiết và giải pháp kỹ thuật Thiết kế chi tiết các lớp 19 - Lớp GameState Là lớp trừu tượng cho các cho các lớp sau kế thừa Lớp MenuState Các thuộc tính: private imge... (currentOption == 0) { gsm.setState(GameStateManager.PLAY); } if (currentOption == 1) { gsm.setState(GameStateManager.ABOUTSTATE); } if (currentOption == 2) { gsm.setState(GameStateManager.HIGHSCORE); } if (currentOption == 3) { System.exit(0); } } Lớp Highscore và lớp About đều kế thừa từ lớp GameState Và có các phương thức tương tự như lớp MenuState - Class: InterfaceGame Các thuộc tính: private Image... thống Đồng thời trong quá trình phát triển, có thể mở rộng thêm hệ thống để đáp ứng các nhu cầu mới Giới thiệu về chủ đề bài tập lớn – Trò chơi game nhập vai Với những nền tảng kiến thức đã tiếp thu được như trên, nhóm chúng em đã đề xuất chủ đề cho bài tập lớn là trò chơi game nhập vai 2 2 .1 Nội dung trò chơi Trên màn hình trò chơi, sẽ có map có nhân vật do người chơi điều khiển và những quái vật di chuyển... vấn đề cho nhau +Trần Văn Lộc : Thiết kế gói data, giao diện + Ngô Đức Nhật : Thiết kế gói map1,chỉnh sửa lỗi, thiết kế in HighScore ra file txt, tìm kiếm dữ liệu (music, image); + Phạm Thu Nga : Thiết kế gói map2, làm Slide + Đỗ Khắc Linh: Thiết kế các gói manager, main, utils, vẽ map1, map2 + Nguyễn Đức Long: Thiết kế gói gamestate, quay video, tester, làm hướng dẫn V Tài liệu tham khảo - Cách làm game. .. inputListener, biến kiểm soát tốc độ theo thời gian delta, các phương thức kiểm soát trạng thái game + Quản lý danh sách trạng thái game có trong hệ thống, thiết lập trạng thái game được lựa chọn để thể hiện ra màn hình người chơi ở thời điểm hiện tại, chuyển đổi trạng thái hiện tại sang các trạng thái game khác Các màn hình game trong trò chơi được thiết kế thành các module chính, các module này sẽ ghép nối... trạng thái cho toàn bộ map 21 Checkscore(): Kiểm tra điểm nếu đủ 1 số lượng điểm nhất định sẽ qua map public void checksocre() { if (robot.getScore() == 5 && robot.getcenterX() < 10 0 && robot.getcenterY() > 400) { gsm.setState(2); } } Draw(Graphics): vẽ các hình ảnh lên map public void draw(Graphics2D g2) { g2.drawImage(background, 0, 0, null); g2.drawImage(huyhieu, 11 50, 0, null); for (int i = ... Giới thiệu chủ đề tập lớn – Trò chơi game nhập vai 11 II Phân tích thiết kế mức kiến trúc 13 Biểu đồ USE – CASE 13 Biểu đồ lớp 15 III Thiết kế chi... } else { st = GameState1.FightRight; } int health = InterfaceGamemap2.getRobot().getHealth(); health -= 1; InterfaceGamemap2.getRobot().setHealth(health); } else { st = GameState1.NotFight; }... == GameState.Right) { state = GameState.Left; } else { state = GameState.Right; } } } if (state == GameState.Right && st == GameState1.NotFight) { image = fishbigleft.getImage(); speed = -1;