Tải bản đầy đủ (.docx) (21 trang)

bài tập lớn công nghệ java đề tài trò chơi flappy bird

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.63 MB, 21 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢIKHOA CƠNG NGHỆ THƠNG TIN </b>

<b>BÀI TẬP LỚNCơng Nghệ Java</b>

<b>ĐỀ TÀI: TRỊ CHƠI FLAPPY BIRD</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>LỜI NĨI ĐẦU</b>

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úngta 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úngta 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 ln 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!

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>MỤC LỤC</b>

<b>1. Tổng quan về đề tài...4</b>

<b>2. Luật chơi...4</b>

<b>3. Giao diện trò chơi ...5</b>

<b>4. Thiết kế các đối tượng...7</b>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>1. Tổng quan về đề tài</b>

<i><b>Tên trò chơi: Flappy Bird( Chú chim vỗ cánh)</b></i>

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

<i>Phong cách Đồ họa và Âm thanh của Flappy Bird</i>

<b>Đồ họa: Flappy Bird có một phong cách đồ họa đơn giản nhưng đầy sức hút. </b>

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.

<b>Âm thanh: Âm thanh trong Flappy Bird cũng theo phong cách đơn giản và </b>

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ị.

<b>2. Luật chơi</b>

<b>Bay qua các ống: Người chơi điều khiển một con chim (hoặc một loài chim </b>

<b>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 </b>

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.

<b>Đ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 </b>

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.

<b>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</b>

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

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>Kiê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 </b>

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.

<b>3. Giao diện trò chơi</b>

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

<i>Chim (Bird): Một hình chữ nhật màu vàng đại diện cho chim trong trò chơi. </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.

<i>Chướng Ngại Vật (Obstacle): Các ống màu xanh lá cây biểu diễn các chướng </i>

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.

<i>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 </i>

diễn mặt đất mà chim phải tránh va vào.

Và ngồ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

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<small>3.1 Giao diện Menu</small>

<small>Hình 3.2 Giao diện lúc bắt đầu Game</small>

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<small>Hình 3.3 Giao diện lúc kết thúc game</small>

<b>4. Thiết kế các đối tượng</b>

Game được thiết kế theo cấu trúc dưới đây:

7

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

Trong đó:

<i><b>Assets Là thư mục chứa tài nguyên của trị chơi như hình ảnh, âm thanh.</b></i>

<i><b>flappybird: Gói (package) chứa mã nguồn, đối tượng của trò chơi Flappy Bird.</b></i>

<i>BirdObject: Lớp đại diện cho đối tượng chim trong trò chơi. Chứa các phương </i>

thức và thuộc tính để điều khiển hành vi của chim.

<i>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 </i>

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..

<i>ChimneyGroup: Lớp quản lý và vẽ nhóm các ống trong trị chơi Flappy BirdFlappyBird:</i>

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.

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<i> Ground: lớp này đảm nhiệm cho việc vẽ mặt đất cho trị chơi</i>

<i><b>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, </b></i>

danh sách hàng đợi, vv.

<i>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, </i>

ống, mặt đất, vv.

<i>QueueList: Lớp cài đặt một danh sách hàng đợi.</i>

<i><b>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 </b></i>

<i>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.</i>

Menu: Là lớp chứa các phương thức để tạo nên một menu cho game

<i><b>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 </b></i>

của game.

<i>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 </i>

<i>SoundPlayer: Lớp chứa các phương thức để phát các tệp âm thanh.</i>

Dưới đây là sơ đồ lớp để xây dựng Game:

9

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

<small>Hình 4.1 Sơ đồ lớp của game FlappyBird</small>

<i>Trong đó GameThread kế thừa từ lớp có sẵn như Jpanel và interface Runnable là hai </i>

lớp có sẵn trong thư viện javax.swing và java.lang, tương ứng.

<i>GameScreen là lớp đại diện cho màn hình trị chơi, kế thừa từ JFrame và triển khai </i>

giao diện KeyListener có sẵn trong thư viện của Java Swing

<i>Lớp FlappyBird chứa phương thức main và kế thừa từ lớp ảo GameScreen Nó triển </i>

khai các phương thức từ GameScreen như GAME_UPDATE, GAME_PAINT,

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

KEY_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.

<i>BirdObject và Chimney là các lớp kế thừa từ lớp Objects</i>

Các quan hệ cịn lại trong sơ đồ có quan hệ là sử dụng (use):

<i>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à </i>

thêm hiệu ứng cho trò chơi.

<i>BirdObject sử dụng đối tượng trong SoundPlayer để thêm âm thanh cho trò </i>

<i>chimneyGroup sử dụng đối tượng trong QueueList QueueList sử dụng nhiều đối tượng trong ElementObjects sử dụng đối tượng trong lớp GameScreen</i>

<b>5. Mô tả cơng nghệ sử dụng</b>

<i>Ngơn ngữ lập trình: JavaFramework/Thư viện sử dụng:</i>

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

<i><b>Mô tả âm thanh: </b></i>

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

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<i><b>Mơ tả hình ảnh:</b></i>

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.

<b>6. Mơ tả tính logic của trị chơi</b>

<i><b> Mơ tả cách tính điểm:</b></i>

Đầu tiên thiết lập trò chơi ta sẽ co điểm = 0 (point = 0)

<i>Trong class Chimney, một thuộc tính isBehindBird được khai báo và khởi tạo </i>

ban đầu với giá trị false.

<i>Khi giá trị này là false, nghĩa là ống khói đang ở phía trước con chim.</i>

<i>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 </i>

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.

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

<i>Phương thức getBehindBird(): Phương thức này được sử dụng để truy xuất giá </i>

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>Điều kiện playerBird.getPosX() > chimneyGroup.getChimney(i).getPosX() </i>

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>Điều kiện !chimneyGroup.getChimney(i).getBehindBird() đảm bảo rằng ống </i>

khói chưa được đánh dấu là đã vượt qua.

<i>Đ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, </i>

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

<i>Cuối cùng, phương thức setIsBehindBird(true) được gọi để đánh dấu rằng ống </i>

khói đã được vượt qua bởi con chim.

<i><b>Mơ tả khi trò chơi kết thúc (game over) :</b></i>

<i>Điều kiện game over:</i>

13

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

Trong 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

<i>ống (chimney) hoặc va chạm với mặt đất.</i>

Đầu tiên, trong vòng lặp for đầu tiên, mã kiểm tra xem con chim có va chạm

<i>với bất kỳ ống nào trong chimneyGroup hay khơng bằng cách sử dụng phương thức </i>

<i>intersects() của hình chữ nhật đại diện cho con chim và hình chữ nhật đại diện cho </i>

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

<i>cịn sống (setLive(false)) và tiếng chng báo hiệu rơi chơi (fallSound) được phát.</i>

Tiếp theo, mã kiểm tra xem con chim đã chạm mặt đất chưa. Nếu vị trí Y của

<i>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 </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 chng 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.

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

<i><b>Cách xây dựng các đối tượng trong trò chơi:</b></i>

<i> Đầu tiên xây dựng đối tượng Objects:</i>

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.

<i>Phương thức setPos, setPosX, setPosY: Các phương thức này được sử dụng để </i>

đặt vị trí của đối tượng.

<i>Phương thức getPosX, getPosY, getW, getH: Các phương thức này được sử </i>

dụng để trả về các giá trị về vị trí, chiều rộng và chiều cao của đối tượng.

<i>Sau đó xây dựng lớp BirdObject kế thừa từ lớp Objects:</i>

Xây dựng biến và các thuộc tính cho lớp BirdObject

15

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

fallSpeed: 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.

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

17

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

Constructor đượ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.

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

Biến và Thuộc tính:

rect: Đối tượng hình chữ nhật (Rectangle) đại diện cho ống.

isBehindBird: Biến boolean xác định xem ống có nằm sau con chim hay không.Constructor:

Constructor được sử dụng để khởi tạo một đối tượng Chimney với các giá trị ban đầu như vị trí, kích thước và đối tượng hình chữ nhật.

Phương thức update:

Phương thức này được gọi để cập nhật vị trí của ống sau mỗi frame.

Trong phương thức này, vị trí của ống được điều chỉnh bằng cách giảm giá trị x(hồn tồn có thể thay đổi tốc độ di chuyển bằng cách thay đổi giá trị giảm này).

19

</div>

×