Giao diện trò chơi Giao diện của trò chơi Flappy Bird vô cùng đơn giản, chỉ gồm có 3 đối tượng: con chim, mặt đất và các ống khói Chim Bird: Một hình chữ nhật màu vàng đại diện cho chim
Trang 1TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI
KHOA CÔNG NGHỆ THÔNG TIN
BÀI TẬP LỚN Công Nghệ Java
ĐỀ TÀI: TRÒ CHƠI FLAPPY BIRD
Trang 2LỜI NÓI ĐẦU
Trong thời đại hiện đại, Công nghệ Thông tin đã trở thành một phầnkhông thể thiếu của cuộc sống hàng ngày của chúng ta Từ việc sửdụng điện thoại di động cho đến việc lướt web trên máy tính, chúng
ta luôn tiếp xúc và phụ thuộc vào các công nghệ này để giao tiếp,làm việc và giải trí
Các thiết bị công nghệ như điện thoại thông minh, máy tính bảng vàmáy tính cá nhân không chỉ là công cụ hữu ích mà còn trở thành mộtphần của cuộc sống hàng ngày của chúng ta Chúng không chỉ giúpchúng ta kết nối với thế giới xung quanh mà còn mang lại cho chúng
ta những trải nghiệm giải trí đa dạng và thú vị
Trong số các trò chơi điện tử phổ biến, Flappy Bird nổi bật với sự đơngiản và thử thách mà nó mang lại Mặc dù chỉ là một trò chơi đơngiản với cách chơi cơ bản, nhưng Flappy Bird đã gây nghiện chohàng triệu người chơi trên toàn thế giới Sự kết hợp giữa cách chơiđơn giản nhưng thách thức cao đã tạo nên sức hút đặc biệt của tròchơi này, khiến người chơi luôn muốn thử thách bản thân và cố gắngđạt được điểm số cao nhất có thể
Với sự phát triển của công nghệ và ngành công nghiệp game, FlappyBird đã trở thành một biểu tượng của sự đơn giản và sức hút trongthế giới game điện tử, và vẫn được nhớ đến với những kỷ niệm vàtrải nghiệm độc đáo mà nó mang lại
Em xin chân thành cảmơn!
Trang 3MỤC LỤC
1 Tổng quan về đề tài 4
2 Luật chơi 4
3 Giao diện trò chơi 5
4 Thiết kế các đối tượng 7
5 Mô tả công nghệ sử dụng 10
6 Mô tả tính logic của trò chơi 11
7 Tổng kết 19
Tài Liệu Tham Khảo 20
3
Trang 41 Tổng quan về đề tài
Tên trò chơi: Flappy Bird( Chú chim vỗ cánh)
Giới thiệu trò chơi: Với phong cách của game cũ từ thập niên 90, Flappy Bird thu hút người chơi bởi sự kịch tính, hưng phấn khi đạt được điểm số cao Game thủ phải liên tục nhấn vào màn hình điều khiển “chú chim” vượt qua các chướng ngại vật là những ống cống màu xanh Cứ mỗi lần vượt qua một ống cống sẽ được tính 1 điểm Trò chơichỉ kết thúc khi chú chim rơi xuống hoặc va vào ống cống Nghe qua thì tưởng chừng như đơn giản, cách chơi dễ ợt, thế nhưng Flappy Bird khiến người chơi đập phá điện thoại, nổi khùng vì khó chinh phục Tuy nhiên, dù không dễ nhưng càng chơi lại càng cuốn Do đó dù đã được tạo ra từ rất lâu nhưng Flappy Bird luôn là một trong những tựa game cuốn hút
Phong cách Đồ họa và Âm thanh của Flappy Bird
Đồ họa: Flappy Bird có một phong cách đồ họa đơn giản nhưng đầy sức hút
Hình ảnh chủ yếu là một con chim nhỏ màu vàng nhẹ nhàng và các ống cống màu xanh lam Cảm giác tổng thể của trò chơi là rất retro, giống như các trò chơi điện tử cổ điển từ thập kỷ 90 Sự đơn giản của đồ họa không chỉ giúp trò chơi dễ tiếp cận mà còn tạo ra một cái nhìn đặc biệt và dễ nhận diện
Âm thanh: Âm thanh trong Flappy Bird cũng theo phong cách đơn giản và
retro Tiếng chim vỗ cánh và tiếng va chạm khi chim va vào ống cống là những
âm thanh chính trong trò chơi Âm thanh nhạc nền cũng rất đơn giản và lặp lại, giúp tạo ra một bầu không khí kích thích và hấp dẫn cho người chơi Mặc dù không có những hiệu ứng âm thanh phức tạp, nhưng âm thanh trong Flappy Bird vẫn đóng vai trò quan trọng trong việc tạo ra trải nghiệm chơi game đầy thú vị
2 Luật chơi
Bay qua các ống: Người chơi điều khiển một con chim (hoặc một loài chim
khác nhau tùy Bay qua các ống: thuộc vào phiên bản) bằng cách nhấn vào
màn hình, bàn phím, chuột, Mỗi lần nhấn, con chim sẽ nhảy lên một chút Mục tiêu là bay qua các ống mà không chạm vào chúng Càng bay được xa, điểm số càng cao
Điểm số: Mỗi lần bạn bay qua một cặp ống mà không va chạm, bạn sẽ được
một điểm Điểm số của bạn sẽ được hiển thị ở màn hình chính và thường được
sử dụng để so sánh với điểm số của bạn bè hoặc người chơi khác
Kết thúc trò chơi: Nếu con chim của bạn chạm vào các ống hoặc va chạm vào
mặt đất, trò chơi sẽ kết thúc Bạn có thể bắt đầu lại từ đầu chinh phục trò chơi
Trang 5Kiên nhẫn và phản xạ nhanh: Trò chơi yêu cầu người chơi có sự kiên nhẫn
và phản xạ nhanh nhạy để điều khiển con chim qua các ống một cách chính xác
3 Giao diện trò chơi
Giao diện của trò chơi Flappy Bird vô cùng đơn giản, chỉ gồm có 3 đối tượng: con chim, mặt đất và các ống khói
Chim (Bird): Một hình chữ nhật màu vàng đại diện cho chim trong trò chơi
Chiều cao và chiều rộng của chim có thể được điều chỉnh để phù hợp với kích thước mong muốn
Chướng Ngại Vật (Obstacle): Các ống màu xanh lá cây biểu diễn các chướng
ngại vật trong trò chơi Chướng ngại vật này di chuyển từ phải sang trái trên màn hình
Mặt Đất (Ground): Một phần dưới cùng của màn hình được tô màu xám, biểu
diễn mặt đất mà chim phải tránh va vào
Và ngoài ra phía sau còn có background biểu diễn bầu trời, tạo cho người chơi cảm giác thư giãn và giải trí Giao diện của trò chơi Flappy Bird vô cùng đơn giản nhưng vẫn mang lại trải nghiệm thú vị cho người chơi Sự kết hợp giữa các đối tượng như chim, chướng ngại vật và mặt đất cùng với background bầu trời tạo nên một không gian giải trí phù hợp
5
Trang 63.1 Giao diện Menu
Hình 3.2 Giao diện lúc bắt đầu Game
Trang 7Hình 3.3 Giao diện lúc kết thúc game
4 Thiết kế các đối tượng
Game được thiết kế theo cấu trúc dưới đây:
7
Trang 8Trong đó:
Assets Là thư mục chứa tài nguyên của trò chơi như hình ảnh, âm thanh.
flappybird: Gói (package) chứa mã nguồn, đối tượng của trò chơi Flappy Bird.
BirdObject: Lớp đại diện cho đối tượng chim trong trò chơi Chứa các phương
thức và thuộc tính để điều khiển hành vi của chim
Chimney: chịu trách nhiệm cho việc quản lý và điều khiển hành vi của các ống
trong trò chơi Flappy Bird, bao gồm việc cập nhật vị trí của chúng và xác định liệu chúng có ở phía sau chim hay không
ChimneyGroup: Lớp quản lý và vẽ nhóm các ống trong trò chơi Flappy Bird FlappyBird:
Quản lý trạng thái của trò chơi (màn hình bắt đầu, màn hình chơi, màn hình kết thúc)
Xử lý sự kiện nhấn phím và click chuột
Quản lý và vẽ các đối tượng trong trò chơi như chim, ống, đất
Tính điểm và xử lý logic khi chim va chạm với các ống hoặc đất
Vẽ các đối tượng và giao diện người dùng trên màn hình
Trang 9Ground: lớp này đảm nhiệm cho việc vẽ mặt đất cho trò chơi
game_controller: Gói chứa các lớp liên quan đến quản lý trò chơi như luồng trò chơi,
danh sách hàng đợi, vv
GameThread: Lớp thực thi một luồng riêng biệt để cập nhật và vẽ trò chơi Objects: Gói chứa các lớp đại diện cho các đối tượng trong trò chơi như chim,
ống, mặt đất, vv
QueueList: Lớp cài đặt một danh sách hàng đợi.
graphics_manager: Gói chứa các lớp quản lý đồ họa như màn hình trò chơi và hình
ảnh
AFrameOnImage: Lớp chứa các phương thức để vẽ 1 phần của hình ảnh GameScreen: Lớp đại diện cho màn hình trò chơi, là một cửa sổ JFrame.
Menu: Là lớp chứa các phương thức để tạo nên một menu cho game
media_manager: Gói chứa các lớp quản lý phương tiện như phát âm thanh, hiệu ứng
của game
Animation: Lớp chứa các phương thức để tạo và điều khiển các hiệu ứng hoạt
hình
SoundPlayer: Lớp chứa các phương thức để phát các tệp âm thanh.
Dưới đây là sơ đồ lớp để xây dựng Game:
9
Trang 10Hình 4.1 Sơ đồ lớp của game FlappyBird
Trong đó GameThread kế thừa từ lớp có sẵn như Jpanel và interface Runnable là hai
lớp có sẵn trong thư viện javax.swing và java.lang, tương ứng
GameScreen là lớp đại diện cho màn hình trò chơi, kế thừa từ JFrame và triển khai
giao diện KeyListener có sẵn trong thư viện của Java Swing
Lớp FlappyBird chứa phương thức main và kế thừa từ lớp ảo GameScreen Nó triển
khai các phương thức từ GameScreen như GAME_UPDATE, GAME_PAINT,
Trang 11KEY_ACTION, MOUSE_ACTION để quản lý trạng thái trò chơi, xử lý sự kiện, vẽ đối tượng và tính điểm.
BirdObject và Chimney là các lớp kế thừa từ lớp Objects
Các quan hệ còn lại trong sơ đồ có quan hệ là sử dụng (use):
FlappyBird sử dụng đối tượng trong các lớp BirdObject, ChimneyGroup, Animation, AframeOnImage, Ground, Menu để vẽ các đối tượng trong 1 số lớp đó và
thêm hiệu ứng cho trò chơi
BirdObject sử dụng đối tượng trong SoundPlayer để thêm âm thanh cho trò
chơi
chimneyGroup sử dụng đối tượng trong QueueList
QueueList sử dụng nhiều đối tượng trong Element
Objects sử dụng đối tượng trong lớp GameScreen
5 Mô tả công nghệ sử dụng
Ngôn ngữ lập trình: Java
Framework/Thư viện sử dụng:
Java Swing: Được sử dụng để tạo giao diện đồ họa cho ứng dụng
Java AWT: Cũng được sử dụng để hỗ trợ việc tạo giao diện đồ họa và xử lý sự kiện
Java Sound API: Sử dụng để điều khiển và phát lại âm thanh trong trò chơi
Công cụ phát triển IDE sử dụng IntelliJ IDEA
Mô tả âm thanh:
SoundPlayer sử dụng các lớp trong Java Sound API như Clip,
AudioInputStream, và AudioSystem để thực hiện các chức năng liên quan đến phát lại
âm thanh
InputStream là một lớp được sử dụng để đọc dữ liệu byte từ một nguồn nào đó SoundPlayer sử dụng getResourceAsStream() để lấy một InputStream từ tệp âm thanhđược chỉ định trong thư mục tài nguyên của ứng dụng
AudioFormat là một lớp trong Java Sound API được sử dụng để mô tả các thuộc tính của một luồng âm thanh, bao gồm tỷ lệ lấy mẫu, số bit mỗi mẫu, số kênh, SoundPlayer sử dụng AudioFormat để chỉ định các thuộc tính của âm thanh được phátlại
11
Trang 12Mô tả hình ảnh:
Java Swing là một toolkit GUI được cung cấp bởi Java để phát triển các ứng dụng desktop Java Swing được sử dụng để tạo giao diện đồ họa cho các màn hình trò chơi, bao gồm cửa sổ và các thành phần như nút và hình ảnh
Java AWT và Java 2D API: Lớp AFrameOnImage sử dụng các lớp và phương thức của Java AWT và Java 2D API để thực hiện các hoạt động vẽ và xử lý hình ảnh
AffineTransform được sử dụng để thực hiện các biến đổi như xoay hình ảnh.AffineTransformOp được sử dụng để áp dụng các biến đổi được xác định bởi AffineTransform lên hình ảnh
Phương pháp Abstract: Lớp GameScreen chứa các phương thức trừu tượng, bao gồm GAME_UPDATE, GAME_PAINT, KEY_ACTION, và MOUSE_ACTION.Phương thức này được sử dụng để định nghĩa các hành động cụ thể mà mỗi màn hình trò chơi cần thực hiện
JFrame: GameScreen mở rộng từ JFrame, cho phép nó tạo ra một cửa sổ đồ họacho màn hình trò chơi
BufferedImage: Trong các phương thức RegisterImage và getImageWithID, GameScreen sử dụng BufferedImage để quản lý và tải hình ảnh cho trò chơi
6 Mô tả tính logic của trò chơi
Mô tả cách tính điểm:
Đầu tiên thiết lập trò chơi ta sẽ co điểm = 0 (point = 0)
Trong class Chimney, một thuộc tính isBehindBird được khai báo và khởi tạo
ban đầu với giá trị false
Khi giá trị này là false, nghĩa là ống khói đang ở phía trước con chim.
Phương thức setIsBehindBird(boolean b): Phương thức này được sử dụng để thiết lập giá trị của isBehindBird Khi con chim đã vượt qua ống khói, phương thức
này sẽ được gọi và truyền vào giá trị true, đánh dấu rằng ống khói đã ở phía sau con chim
Trang 13Phương thức getBehindBird(): Phương thức này được sử dụng để truy xuất giá
trị của isBehindBird Khi cần kiểm tra xem con chim đã vượt qua ống khói hay chưa, phương thức này sẽ được gọi để lấy giá trị hiện tại của isBehindBird
Trong phương thức GAME_UPDATE, khi màn hình đang ở trạng thái
GAMEPLAY_SCREEN, đoạn mã dưới đây được sử dụng để xác định xem con chim
đã vượt qua một ống khói hay không và tăng điểm số tương ứng:
Vòng lặp này duyệt qua tất cả các ống khói trong chimneyGroup
Điều kiện playerBird.getPosX() > chimneyGroup.getChimney(i).getPosX()
kiểm tra xem con chim đã vượt qua ống khói hay chưa bằng cách so sánh vị trí x của con chim với vị trí x của ống khói
Điều kiện !chimneyGroup.getChimney(i).getBehindBird() đảm bảo rằng ống
khói chưa được đánh dấu là đã vượt qua
Điều kiện i % 2 == 0 chỉ xử lý tính điểm cho mỗi ống khói thứ chẵn (0, 2,
4, ) Điều này có thể là một quy ước trong trò chơi để chỉ xử lý tính điểm khi con chim đi qua các ống khói chẵn
Nếu tất cả các điều kiện đều được thỏa mãn, điểm số được tăng lên bằng cách tăng giá trị của biến point
Âm thanh điểm số được phát bằng cách gọi phương thức play của âm thanh
getPointSound.
Cuối cùng, phương thức setIsBehindBird(true) được gọi để đánh dấu rằng ống
khói đã được vượt qua bởi con chim
Mô tả khi trò chơi kết thúc (game over) :
Điều kiện game over:
13
Trang 14Trong phương thức GAME_UPDATE, có một phần mã được sử dụng để xử lý trạng thái của con chim trong trò chơi Đoạn mã này kiểm tra nếu con chim va chạm với các
ống (chimney) hoặc va chạm với mặt đất.
Đầu tiên, trong vòng lặp for đầu tiên, mã kiểm tra xem con chim có va chạm
với bất kỳ ống nào trong chimneyGroup hay không bằng cách sử dụng phương thức
intersects() của hình chữ nhật đại diện cho con chim và hình chữ nhật đại diện cho
mỗi ống trong nhóm Nếu có va chạm xảy ra, con chim được đặt vào trạng thái không
còn sống (setLive(false)) và tiếng chuông báo hiệu rơi chơi (fallSound) được phát.
Tiếp theo, mã kiểm tra xem con chim đã chạm mặt đất chưa Nếu vị trí Y của
con chim cộng với chiều cao của nó (playerBird.getPosY() + playerBird.getH()) lớn hơn vị trí Y của mặt đất (ground.getYGround()), điều này ngụ ý rằng con chim đã rơi
xuống mặt đất Trong trường hợp này, nếu con chim vẫn còn sống, tiếng chuông báo hiệu rơi được phát và biến CurrentScreen được đặt thành GAMEOVER_SCREEN để chuyển sang màn hình game over
Cuối cùng, nếu con chim không còn sống (tức là đã va chạm với ống hoặc đã rơi xuống mặt đất), tốc độ rơi của nó được đặt thành 10 và vị trí rơi được cập nhật Nếu con chim đã rơi xuống mặt đất, biến CurrentScreen lại được đặt thành
GAMEOVER_SCREEN để kết thúc trò chơi
Trang 15Cách xây dựng các đối tượng trong trò chơi:
Đầu tiên xây dựng đối tượng Objects:
Lớp này có các thuộc tính posX, posY, w, và h để đại diện cho vị trí và kích thước của đối tượng
Constructor có tham số để khởi tạo vị trí và kích thước ban đầu của đối tượng
Phương thức setPos, setPosX, setPosY: Các phương thức này được sử dụng để
đặt vị trí của đối tượng
Phương thức getPosX, getPosY, getW, getH: Các phương thức này được sử
dụng để trả về các giá trị về vị trí, chiều rộng và chiều cao của đối tượng
Sau đó xây dựng lớp BirdObject kế thừa từ lớp Objects:
Xây dựng biến và các thuộc tính cho lớp BirdObject
15
Trang 16fallSpeed: Biến lưu trữ tốc độ rơi của con chim.
isFlying: Biến boolean xác định xem con chim có đang bay hay không
rect: Đối tượng hình chữ nhật (Rectangle) đại diện cho con chim
isLive: Biến boolean xác định xem con chim còn sống hay không
Biến gravity: biến static được thêm vào lớp BirdObject, và nó biểu diễn trọng lực trong trò chơi
flapSound, fallSound, getPointSound: Các đối tượng SoundPlayer để phát âm thanh trong trò chơi
Trang 1717
Trang 18Constructor được sử dụng để khởi tạo một đối tượng BirdObject với các giá trị ban đầu như vị trí, kích thước và các đối tượng âm thanh.
Phương thức setLive và getLive:
setLive: Đặt giá trị cho biến isLive
getLive: Trả về giá trị của biến isLive
Phương thức getRect:
Trả về đối tượng hình chữ nhật đại diện cho con chim
Phương thức setFallSpeed và updateState:
setFallSpeed: Đặt giá trị cho biến fallSpeed
updateState: Cập nhật trạng thái của con chim sau mỗi frame Tốc độ rơi của con chim được cập nhật dựa trên trọng lực (FlappyBird.gravity), và vị trí của con chim được điều chỉnh tương ứng
Phương thức birdFly:
Cập nhật tốc độ rơi của con chim khi người chơi bấm để làm con chim bay lên
và phát âm thanh flapSound