1. Trang chủ
  2. » Luận Văn - Báo Cáo

Báo cáo chuyên Đề học phần lập trình java Đề ti lập trình game pacman

59 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Lập Trình Game Pacman
Tác giả Lê Quang Sơn, Lê Huy Đồng, Nguyễn Viết Tiến
Người hướng dẫn Ths. Trần Hữu Phi
Trường học Trường Đại Học Điện Lực
Chuyên ngành Công Nghệ Thông Tin
Thể loại Báo Cáo Chuyên Đề
Năm xuất bản 2022
Thành phố Hà Nội
Định dạng
Số trang 59
Dung lượng 12,98 MB

Nội dung

Bomb là đối tượng mà Bomber sẽ đặt và kích hoạt tại các ô Grass.Bomber có một lần được đi từ vị trí đặt Bomb ra vị trí bên cạnh.. Grass là đối tượng mà Bomber và Enemy có thể di chuyển x

Trang 1

TRƯỜNG ĐẠI HỌC ĐIỆN LỰC

KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO CHUYÊN ĐỀ HỌC PHẦN

Hà Nội, tháng 11 năm 2022

Trang 2

PHIẾU CHẤM ĐIỂM Sinh viên thực hiện:

Trang 3

MỤC LỤC

I Giới thiệu bài tập lớn “Lập trình ứng dụng game Bomberman” 1

II Danh sách thành viên thực hiện và đóng góp của các thành viên 1

III Mô tả các tính năng của ứng dụng 2

1 Tổng quát về chương trình 2

2.file res……… .8

3.file src……….26

IV.Mô tả API(thư viện)chính được sử dụng trong code………45

1.Thư viện javafx……… 45

2.Thư viện Java.util………

51 V Demo ứng dụng 53

VI Kết luận 59

Trang 4

I Giới thiệu bài tập lớn “Lập trình ứng dụng game Bomberman”

Lời đầu tiên bọn em xin gửi lời cảm ươn thầy đã hướng dẫn môn Lậptrình java trong kì này , môn học quan trọng để bọn em có thể có kinh nghiệmtrong việc thực tập

Về lí do chọn đề tài , Game đặt Bomb đã là một thể loại Game mà ai cũngtừng chơi khi nhỏ , và khi thầy cho bọn em tự chọn đề tài thì cả 3 bọn em đềumuốn tạo dựng một Game đặt Bomb do chính tay bọn em làm Đề tài giúp bọn

em hiểu hơn về Java và quy trình làm game ạ

Đi sơ qua về game thì bọn em tạo dựng đầy đủ các yếu tố chính , và nóđược chia làm 2 loại là nhóm đối tượng động (Bomber, Enemy, Bomb) và nhómđối tượng tĩnh (Grass, Wall, Brick, Portal, Item)

[09/05/2023 18:34:16] Đỗ Đăng Quyền: Các đối tượng

Nếu bạn đã từng chơi Bomberman, bạn sẽ cảm thấy quen thuộc với nhữngđối tượng này Chúng được được chia làm hai loại chính là nhóm đối tượngđộng (Bomber, Enemy, Bomb) và nhóm đối tượng tĩnh (Grass, Wall, Brick,Portal, Item)

Bomber là nhân vật chính của trò chơi Bomber có thể di chuyển theo 4hướng trái/phải/lên/xuống theo sự điều khiển của người chơi

Bomb là đối tượng mà Bomber sẽ đặt và kích hoạt tại các ô Grass.Bomber có một lần được đi từ vị trí đặt Bomb ra vị trí bên cạnh Sau khi kíchhoạt 2s, Bomb sẽ tự nổ, các đối tượng Flame được tạo ra

Grass là đối tượng mà Bomber và Enemy có thể di chuyển xuyên qua, vàcho phép đặt Bomb lên vị trí của nó

Wall là đối tượng cố định, không thể phá hủy bằng Bomb cũng nhưkhông thể đặt Bomb lên được, Bomber và Enemy không thể di chuyển vào đốitượng này

Brick là đối tượng được đặt lên các ô Grass, không cho phép đặt Bomblên nhưng có thể bị phá hủy bởi Bomb được đặt gần đó Bomber và Enemythông thường không thể di chuyển vào vị trí Brick khi nó chưa bị phá hủy

1

Trang 5

Portal là đối tượng được giấu phía sau một đối tượng Brick Khi Brick đó

bị phá hủy, Portal sẽ hiện ra và nếu tất cả Enemy đã bị tiêu diệt thì người chơi cóthể qua Level khác bằng cách di chuyển vào vị trí của Portal

Các Item cũng được giấu phía sau Brick và chỉ hiện ra khi Brick bị pháhủy Bomber có thể sử dụng Item bằng cách di chuyển vào vị trí của Item

SpeedItem tăng vận tốc di chuyển của bomber

FlameItem tăng độ dài các Flame khi bomb nổ

BombItem giúp tăng số lượng Bomb có thể đặt thêm một

LifeItem tăng số mạng của bomber lên một

TimeItem tăng thời gian chơi

StrengthItem làm cho bomb có thể nổ xuyên tường (và item)

DetonatorItem giúp cho bomber có khả năng kích hoạt bomb nổ sớmbằng cách bấm phím D

Enemy là các đối tượng mà Bomber phải tiêu diệt hết để có thể qua Level Balloom là Enemy đơn giản nhất, di chuyển ngẫu nhiên với vận tốc cốđịnh

Oneal di chuyển "thông minh" hơn, biết tìm đường để đuổi bomber

Broom có khả năng đi xuyên qua gạch

Bear có tốc độ di chuyển nhanh, có khả năng đuổi theo bomber ở mộtmức độ nhất định

Frog khi chết sẽ tạo ra 2 Balloom tại vị trí của nó

Fire di chuyển nhanh, có thể phá hủy item khi chạm vào

Mô tả game play, xử lý va chạm và xử lý bom nổ

II Danh sách thành viên thực hiện và đóng góp của các thành viên

Phân tích chức năng yêu cầu ứng dụng, giải pháp

Lập trình thực thi

Viết mô

tả tài liệu

Trang 7

III Mô tả các tính năng của Ứng dụng

1 Tổng quát về chương trình

P

trong game(âm thanh,hình

game

Trang 8

2 File res

Đây là nơi chứa các dữ liệu cần xây dựng trong trò chơi hoạt động Sau

đây là các lớp có trong res

a audio

Đây là nơi chứa những đoạn âm thanh của game

- bom.wav là phần chứa video âm thanh khiđặt bom ,và đây là âm thanh của nó

- clear.wav là âm thanh khi chạy lại từ đầu

- dead1.wav là âm thanh khi chết lần 1

- dead2.wav là âm thanh khi chết lần 2 trở đi

- gameaudio.wav là âm thanh trò chơi

- getitem.wav là âm thanh khi nhận các itemtrong game

- homestay.mp3 là âm thanh khi ở màn hìnhchính

-intro.wav là âm thanh giới thiệu

-putbomb.wav là âm thanh khi đặt bom

Trang 9

+MINECRAFT.TTF

Trang 10

+UPHEAVTT.TTF

7

Trang 11

c.fxmlbên trong

Đây là một tệp FXML được sử dụng để định dạng giao diện người dùng cho mộtứng dụng JavaFX Tệp được viết bằng ngôn ngữ đánh dấu XML và chứa các thành phần giao diện như VBox, Label và Button

Trong tệp này, có một VBox được sử dụng để định dạng giao diện người dùng VBox này có thuộc tính alignment được đặt là CENTER và thuộc tính spacing được đặt là 20.0, cho phép các thành phần con trong VBox được căn giữa và có khoảng cách 20 đơn vị giữa chúng

Trong VBox, có hai thành phần con: một Label với văn bản "Bomberman" và một Button với fx:id là "playButton" và văn bản "Play" Button này có một xử lý

sự kiện onAction được đặt là "#switchToGame", cho phép khi người dùng nhấp vào nó, ứng dụng chuyển sang giao diện trò chơi

Cuối cùng, VBox có một thuộc tính padding được đặt với giá trị của Insets, cho phép đặt khoảng cách giữa các cạnh của VBox và các thành phần con bên trong

Trang 12

d.level

- bản đồ của level 0 :

+Đây là một bản đồ cho trò chơi, được biểu diễn bằng các ký tự Mỗi ký tựtương ứng với một vật thể trên bản đồ:

"#" đại diện cho tường

" " đại diện cho một ô trống

"p" đại diện cho nhân vật chính

"f" đại diện cho một quái vật

"*" đại diện cho một vật phẩm

9

Trang 13

"1", "2", "5", "6" đại diện cho các cửa chìa khóa, và chúng cần một chìa khóatương ứng để mở ra.

"t" đại diện cho một chìa khóa

"s" đại diện cho một cửa ra

"b" đại diện cho một quả bom

"d", "w", "x" đại diện cho các cửa đi qua, và chúng có thể mở hoặc đóng lạiBản đồ này có kích thước 13x19 và bao gồm các phần bên trong khoảng trống

và các vật thể, hình ảnh một màn chơi của trò chơi

- Bản đồ level 1 :

+Đây là một bản đồ cho trò chơi, được biểu diễn bằng các ký tự Mỗi ký

tự tương ứng với một vật thể trên bản đồ:

"#" đại diện cho tường

" " đại diện cho một ô trống

"p" đại diện cho nhân vật chính

"f" đại diễn cho một quái vật

"*" đại diễn cho một vật phẩm

Trang 14

"1", "2", "3", "4" đại diễn cho các cửa chìa khóa, và chúng cần một chìakhóa tương ứng để mở ra.

"t" đại diễn cho một chìa khóa

"s", "d", "w", "x" đại diễn cho các cửa đi qua, và chúng có thể mở hoặcđóng lại

Bản đồ này có kích thước 13x19 và bao gồm các phần bên trong khoảngtrống và các vật thể, hình ảnh một màn chơi của trò chơi

Bản đồ level 2 :

+Đây là một bản đồ cho trò chơi, được biểu diễn bằng các ký tự Mỗi ký

tự tương ứng với một vật thể trên bản đồ:

"#" đại diễn cho tường

" " đại diễn cho một ô trống

"p" đại diễn cho nhân vật chính

"f" đại diễn cho một quái vật

"*" đại diễn cho một vật phẩm

"1", "2", "3", "4" đại diễn cho các cửa chìa khóa, và chúng cần một chìakhóa tương ứng để mở ra

"t" đại diễn cho một chìa khóa

11

Trang 15

"s", "d", "w", "x" đại diễn cho các cửa đi qua, và chúng có thể mở hoặcđóng lại.

Bản đồ này có kích thước 12x31 và bao gồm các phần bên trong khoảngtrống và các vật thể, hình ảnh một màn chơi của trò chơi

- Bản đồ level 3:

+Đây là một bản đồ cho trò chơi, được biểu diễn bằng các ký tự Mỗi ký

tự tương ứng với một vật thể trên bản đồ:

"#" đại diễn cho tường

" " đại diễn cho một ô trống

"p" đại diễn cho nhân vật chính

"f" đại diễn cho một quái vật

"*" đại diễn cho một vật phẩm

"1", "2", "3", "4", "5", "6" đại diễn cho các cửa chìa khóa, và chúng cầnmột chìa khóa tương ứng để mở ra

"t" đại diễn cho một chìa khóa

"s", "d", "w", "x" đại diễn cho các cửa đi qua, và chúng có thể mở hoặcđóng lại

Trang 16

Bản đồ này có kích thước 12x31 và bao gồm các phần bên trong khoảngtrống và các vật thể, hình ảnh một màn chơi của trò chơi.

e.Sprites

- bomb

Sau đây là các hình ảnh theo thứ tự từ trên xuống như hình trên :

13

Trang 19

+ Sau đây là các hình ảnh trong mục illustrations theo thứ tự như hìnhtrên

- Map

Trang 20

+ Sau đây là hình ảnh của các phần tử trong map theo thứ tự như hình trên

Trang 21

- Powerup

Trang 22

Sau đây là các hình ảnh có trong phần powerup theo thứ tự như hình trên:

- Hình ảnh giao diện

19

Trang 23

+ các hình ảnh dưới đây sẽ phù hợp với thứ tự của hình trên :

Trang 27

khai interface EntityController, có một phương thức control để điều khiểnđối tượng Enemy.

public class AIIntelligent implements EntityController<Enemy> {

public static AIIntelligent INSTANCE = new AIIntelligent() ;

protected Random rand = new Random() ;

public class AIIntelligent implements EntityController<Enemy> {

public static AIIntelligent INSTANCE = new AIIntelligent() ;

protected Random rand = new Random() ;

@Override

public void control (Enemy enemy) {

Player player = enemy.getWorld().getPlayer() ;

enemy.setDirection(getDirectionHigh(getDirection(player , enemy))) ; }

public static Direction getDirectionHigh ( int dir) {

List<Point> path = findSortPath(

new EnemyMatrix(enemy) , new Point(player.getTileX() ,

Trang 28

- protected int calculateDirection (Point start , Point end) {

if (end.col < start col ) return ; 0

if (end.col > start.col) return ; 1

if (end.row < start.row) return ; 2

if (end.row > start.row) return ; 3

return - ;

}

- Phương thức calculateDirection tính toán hướng di chuyển dựa trên haiđiểm trên bản đồ Nó so sánh cột của điểm đích và điểm bắt đầu, nếu cộtcủa điểm đích nhỏ hơn cột của điểm bắt đầu thì hướng di chuyển được trả

về là UP (0), ngược lại nếu cột của điểm đích lớn hơn cột của điểm bắtđầu thì hướng di chuyển được trả về là DOWN (1) Tương tự, nếu hàngcủa điểm đích nhỏ hơn hàng của điểm bắt đầu thì hướng di chuyển đượctrả về là LEFT (2), ngược lại nếu hàng của điểm đích lớn hơn hàng củađiểm bắt đầu thì hướng di chuyển được trả về là RIGHT (3)

Cell ( int row , int col , int dist , Cell prev) {

this row = row ;

this col = col ;

this dist = dist ;

25

Trang 29

}

}

// BFS, Time O(n^2), Space O(n^2)

public static List<Point> findSortPath (Matrix matrix , Point start ,

Point end) {

int sx = start row , sy = start col ;

int dx = end.row , dy = end.col ;

if (matrix.isBlocked(sx , sy))

return null;

int m = matrix.getWidth() ;

int n = matrix.getHeight() ;

Cell[][] cells = new Cell[m][n] ;

for int ( i = 0 ; i < m ; i++) {

while ((p = queue.poll()) != null ) {

if (p.row == dx && p col == dy) {

//LinkedList<Cell> path = new LinkedList<>();

List<Point> path = new ArrayList<>() ;

do {

//System.out.println(p.x + " " + p.y);

path.add( new Point(p.row , p col )) ;

} while ((p = p prev ) != null ; )

return path ;

}

}

Trang 30

- Đây là một đoạn mã Java triển khai thuật toán BFS (Breadth-First Search)

để tìm đường đi ngắn nhất giữa hai điểm trên một bản đồ

- Phương thức findSortPath sử dụng ma trận matrix và hai điểm start và end

để tìm đường đi ngắn nhất từ start đến end Thuật toán này sử dụng một mảng 2 chiều của lớp Cell để lưu trữ thông tin về các ô trên bản đồ, và một hàng đợi LinkedList để lưu trữ các ô trong quá trình tìm kiếm

- Đầu tiên, phương thức tạo ra một mảng 2 chiều cells và khởi tạo mỗi ô là một đối tượng Cell với giá trị dist là Integer.MAX_VALUE (vô cùng) và prev là null, trừ các ô bị chặn

- Sau đó, phương thức khởi tạo một hàng đợi và thêm điểm start vào đó vớidist = 0 Trong khi hàng đợi không rỗng, thuật toán lấy phần tử đầu tiên trong hàng đợi và kiểm tra xem có phải là điểm đến hay không Nếu phải, thuật toán đã tìm thấy đường đi và lưu trữ điểm đến vào biến dest

- Nếu không, thuật toán sẽ kiểm tra các ô lân cận và thêm chúng vào hàng đợi nếu chúng có thể di chuyển đến và chưa được duyệt Phương thức visit được sử dụng để kiểm tra ô lân cận và thêm chúng vào hàng đợi

- Nếu dest khác null, phương thức sẽ quay ngược lại từ dest đến start bằng cách truy ngược lại từ prev của mỗi ô và lưu trữ các điểm đã đi qua vào một danh sách List<Point> path, rồi trả về danh sách này

- Phương thức visit kiểm tra ô tại vị trí (x, y) có thể di chuyển đến không và

có phải là ô mới chưa được duyệt hay không Nếu đúng, nó tính toán khoảng cách mới và thêm ô đó vào hàng đợi

3,enemyMatrix

public class EnemyMatrix implements Matrix {

private MovableEntity enemy ;

27

Trang 31

this enemy = enemy ;

}

@Override

public int getWidth () {

return this enemy getWorld().getMapWidth() + 2

}

@Override

public int getHeight () {

return this enemy getWorld().getMapHeight() + 2

}

@Override

public boolean isBlocked ( int , int x y) {

return this enemy blockedBy( this enemy getWorld().getTile(x ,

- Lớp EnemyMatrix có một trường enemy để lưu trữ đối tượng Enemy, và được khởi tạo thông qua constructor của lớp này

- Phương thức getWidth và getHeight đều trả về kích thước của ma trận, bằng cách lấy kích thước của bản đồ trong World và thêm 2 vào mỗi chiều để tạo ra viền xung quanh ma trận

- Phương thức isBlocked kiểm tra xem ô tại vị trí (x,y) có bị chặn bởi đối tượng nào đó hay không Nó sử dụng phương thức blockedBy của đối tượng enemy để kiểm tra xem đối tượng nào đang chặn đường của enemy.Nếu đối tượng tại vị trí (x,y) là đối tượng đang chặn đường của enemy, phương thức trả về true, ngược lại trả về false

4,

public void control (MovableEntity entity) {

if (!entity.isMovable(Direction.UP)

&& !entity.isMovable(Direction.DOWN)

&& !entity.isMovable(Direction.LEFT)

&& !entity.isMovable(Direction.RIGHT)) {

Trang 32

private static Direction randDir () {

int dirCode = rand.nextInt( )4 ;

Nếu đối tượng có thể di chuyển đến ít nhất một hướng, phương thức sẽ sử dụng một vòng lặp while để thử các hướng di chuyển ngẫu nhiên cho đối tượng.Trong vòng lặp while, phương thức gọi phương thức randDir để tạo ra một hướng di chuyển ngẫu nhiên Sau đó, phương thức kiểm tra xem đối tượng có thể di chuyển đến hướng đó bằng cách gọi phương thức isMovable() với hướng

di chuyển đó Nếu đối tượng có thể di chuyển đến hướng đó, phương thức sẽ đặthướng di chuyển của đối tượng thành hướng đó và kết thúc vòng lặp while.Nếu đối tượng không thể di chuyển đến hướng đó, phương thức sẽ tiếp tục lặp lại vòng lặp và thử một hướng di chuyển khác cho đến khi tìm được hướng di chuyển khả dụng

Phương thức randDir sử dụng một đối tượng Random để tạo ra một số ngẫu nhiên trong khoảng từ 0 đến 3, sau đó sử dụng câu lệnh switch-case để trả về một hướng di chuyển tương ứng với số ngẫu nhiên đó Nếu số ngẫu nhiên trả về nằm ngoài khoảng từ 0 đến 3, phương thức sẽ tạo ra một ngoại lệ

29

Ngày đăng: 13/01/2025, 14:09

TÀI LIỆU CÙNG NGƯỜI DÙNG

  • Đang cập nhật ...

TÀI LIỆU LIÊN QUAN