Hướng Dẫn Làm Game Tetris Bằng Java

  -  

Tetris là game huyền thoại mà các thế hệ 8x, 9x đều biết được chơi. Từ những năm 2000, Những máy chơi game đen trắng bùng nổ, xuất hiện khắp mọi nơi, hầu như trẻ em thời điểm đấy ai cũng master thể loại Game này.

Bạn đang xem: Hướng dẫn làm game tetris bằng java

Sau đây, mình sẽ hướng dẫn các bạn làm game Tetris bằng ngôn ngữ Java.

Chuẩn bị

Tiến hành

Mình sẽ tạo 2 folder gổm src (chứa source code) và textures (chứa ảnh)

Tạo một file ảnh gồm 7 khối màu

*

File ảnh kích thước là 210x30 nghĩa là ảnh gồm 7 khối, mỗi khối kích thước 30x30. Mình phóng to hình cho các bạn dễ quan sát. Bạn có thể tải từ source code của mình file ảnh trên hoặc tự tạo cho mình một khối ảnh 7 màu như sau:

Sử dụng thư viện pillow của Python vẽ các khối hình vuông cạnh nhau rồi lưu vào folder textures

from PIL import Image, ImageDrawim = Image.new("RGB", (210, 30), (0, 0, 0))draw = ImageDraw.Draw(im)draw.rectangle((0, 0, 30, 30), fill=(246, 0, 0))draw.rectangle((30, 0, 60, 30), fill=(255, 140, 0))draw.rectangle((60, 0, 90, 30), fill=(255, 238, 0))draw.rectangle((90, 0, 120, 30), fill=(77, 233, 76))draw.rectangle((120, 0, 150, 30), fill=(55, 131, 255))draw.rectangle((150, 0, 180, 30), fill=(72, 21, 170))draw.rectangle((180, 0, 210, 30), fill=(255, 26, 206))im.save("textures/tiles.png", quality=100)

Chia lớp

Mình chia đơn giản thành 3 phần:

Lớp Window: Tạo cửa số chính, các thanh ngang trên, kích thước cửa số. Chạy cửa số chính, load Board game.Lớp Board: Chia các block ảnh màu, lưu thành 7 shape như trong game Tetris, random shape, vẽ các đường bảng, …Lớp Shape: Tập hợp các thuộc tính của Shape, render Shape, cập nhập Shape sau mỗi lần xuống, biến đối Shape, thao tác phím với Shape, …

Mình sẽ đi từng bước thực hiện game Tetris như sau:

Thiết lập Window Game

*

Window có kích thước 306x629. Window có kích thước này là vì phải trừ đi vài pixcel 2 bên lề trái phải và trên dưới để ta được bên trong kích thước Board game sẽ là 300x600. Nút Close được thêm vào, không thêm nút Resize.

Bây giờ tạo thêm class Board rồi thêm Board vào trong Window để load game.

import javax.swing.JFrame;/** * Window */public class Window { public static final int WIDTH = 306, HEIGHT = 629; private JFrame window; private Board board; public Window(){ window = new JFrame("Tetris Game"); window.setSize(WIDTH, HEIGHT); window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); window.setResizable(false); window.setLocationRelativeTo(null); board = new Board(); window. add(board); window.addKeyListener(board); window.setVisible(true); } public static void main(String<> args) { new Window(); }}

Vẽ Board game

*

Với kích thước Board game là 300x600, ta chia bề rộng thành 10 phần, bề ngang thành 20 phần. Kẻ các đường màu đen phân chia tạo thành Board.

Xem thêm: Ký Sinh Trùng Cảnh Bị Cắt - Loạt Cảnh Bị Cắt Khỏi Phim 'Ký Sinh Trùng'

private final int blockSize = 30; private final int boardWidth = 10, boardHeight = 20; public void paintComponent(Graphics g) { super.paintComponent(g); for (int i = 0; i

Load ảnh, chia Block và tạo hình các Shape

*

Sau khi có Board game, ta sẽ load bức ảnh tiles.png chứa các Block 7 màu như trên. Tiến hành chia bức ảnh thành 7 block với 7 màu kích thước 30x30.

try { blocks = ImageIO.read(Board.class.getResource("tiles.png")); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }Tiếp theo, ta tạo Shape lưu một số thông tin hiện tại như khối màu, vị trí. Sau đó tạo hàm render để vẽ các khối Block cùng màu lên Board game để tạo thành hình các Shape.

private BufferedImage block; private int<><> coords; private Board board; public void render(Graphics g){ for (int row = 0; row Các Shape gồm 7 tạo hình gồm hình chữ O, I, S, Z, L, J, T. Các chia là chúng ta sử dụng một ma trận kích thước nhỏ, đánh dấu các ô số 1 nghĩa là chứa block, số 0 là không chứa block. Các ô số 1 xếp thành hình các Shape rồi ta render cho Shape là được.

Xem thêm: Kim Khắc Mệnh Gì Và Khắc Mệnh Nào, Mệnh Kim Hợp Mệnh Gì Và Khắc Mệnh Nào

shapes<0> = new Shape(blocks.getSubimage(0, 0, blockSize, blockSize), new int<><> { { 1, 1, 1, 1 } // I shape }, this, 1); shapes<1> = new Shape(blocks.getSubimage(blockSize, 0, blockSize, blockSize), new int<><> { { 1, 1, 0 }, { 0, 1, 1 } // Z shape }, this, 2); shapes<2> = new Shape(blocks.getSubimage(blockSize * 2, 0, blockSize, blockSize), new int<><> { { 0, 1, 1 }, { 1, 1, 0 } // S shape }, this, 3); shapes<3> = new Shape(blocks.getSubimage(blockSize * 3, 0, blockSize, blockSize), new int<><> { { 1, 1, 1 }, { 0, 0, 1 } // J shape }, this, 4); shapes<4> = new Shape(blocks.getSubimage(blockSize * 4, 0, blockSize, blockSize), new int<><> { { 1, 1, 1 }, { 1, 0, 0 } // L shape }, this, 5); shapes<5> = new Shape(blocks.getSubimage(blockSize * 5, 0, blockSize, blockSize), new int<><> { { 1, 1, 1 }, { 0, 1, 0 } // T shape }, this, 6); shapes<6> = new Shape(blocks.getSubimage(blockSize * 6, 0, blockSize, blockSize), new int<><> { { 1, 1 }, { 1, 1 } // O shape }, this, 7);

Tạo chức năng cho Shape

Sau khi có các Shape việc tiếp theo cần làm là tạo các Event Key tạo tác các Shape. Xử lý va chạm với border của Board.

*

Bình thường, Shape sẽ tự động di chuyển từ trên xuống dưới. Key thao tác gồm phím trái, phải để di chuyển Shape sang trái hay phải. Phím xuống dưới dùng để tăng tốc độ cho Shape. Bình thường thì deltaX = 0 còn deltaX = -1 hoặc 1 sẽ di chuyển shape sang trái hoặc phải. Ở board.java: