Untitled

mail@pastecode.io avatar
unknown
plain_text
5 months ago
3.1 kB
2
Indexable
 Tôi hiểu rồi. Chúng ta sẽ thêm các hàm checkI và checkO vào class Tetromino để kiểm tra xem hình dạng hiện tại có phải là khối I hoặc O không. Sau đó, chúng ta sẽ sử dụng các hàm này trong phương thức rotate của Game để ngăn việc xoay đối với khối O và xử lý đặc biệt cho khối I. Đây là cách thực hiện:

1. Trong Tetromino.h, thêm các phương thức mới:

```cpp
class Tetromino {
public:
    // ... existing methods ...
    bool isI() const;
    bool isO() const;
private:
    // ... existing members ...
};
```

2. Trong Tetromino.cpp, thêm triển khai cho các phương thức mới:

```cpp
bool Tetromino::isI() const {
    return (a[0].y == a[1].y && a[1].y == a[2].y && a[2].y == a[3].y) ||
           (a[0].x == a[1].x && a[1].x == a[2].x && a[2].x == a[3].x);
}

bool Tetromino::isO() const {
    return (a[0].x == a[1].x && a[0].y == a[2].y && 
            a[1].y == a[3].y && a[2].x == a[3].x);
}
```

3. Trong Game.cpp, sửa đổi phần xử lý xoay trong phương thức update:

```cpp
void Game::update(float deltaTime) {
    // ... existing code ...

    if (rotate) {
        if (!currentTetromino.isO()) {  // Don't rotate if it's an O piece
            if (currentTetromino.isI()) {
                // Special rotation for I piece
                currentTetromino.rotate();
                if (!currentTetromino.checkCollision(field)) {
                    currentTetromino.rotate();
                    currentTetromino.rotate();
                    currentTetromino.rotate();
                }
            } else {
                // Normal rotation for other pieces
                currentTetromino.rotate();
                if (!currentTetromino.checkCollision(field)) {
                    currentTetromino.rotate();
                    currentTetromino.rotate();
                    currentTetromino.rotate();
                }
            }
        }
    }

    // ... rest of the update method ...
}
```

4. Cuối cùng, sửa đổi phương thức rotate trong Tetromino.cpp để xử lý đặc biệt cho khối I:

```cpp
void Tetromino::rotate() {
    if (isI()) {
        // Special rotation for I piece
        Point p = a[1];  // Use the second block as pivot
        for (int i = 0; i < 4; i++) {
            int x = a[i].y - p.y;
            int y = a[i].x - p.x;
            a[i].x = p.x - x;
            a[i].y = p.y + y;
        }
    } else {
        // Normal rotation for other pieces
        Point p = a[1];
        for (int i = 0; i < 4; i++) {
            int x = a[i].y - p.y;
            int y = a[i].x - p.x;
            a[i].x = p.x - x;
            a[i].y = p.y + y;
        }
    }
}
```

Những thay đổi này sẽ ngăn khối O xoay và xử lý đặc biệt cho khối I khi xoay. Khối I sẽ xoay quanh điểm thứ hai của nó thay vì điểm giữa, giúp nó xoay đúng cách trong lưới game.

Với những thay đổi này, việc xoay các khối tetromino sẽ hoạt động chính xác hơn, đặc biệt là đối với các khối I và O.
Leave a Comment