Berikut adalah panduan lengkap untuk membuat game Snake sederhana menggunakan SDL dengan C++:
Persiapan Awal
- Pastikan SDL sudah terinstal di proyek Anda.
- Atur struktur file:
- File proyek utama, misalnya:
snake.cpp
.
- File proyek utama, misalnya:
Kode Lengkap Snake dengan SDL
Kode ini berisi mekanisme permainan seperti kontrol ular, deteksi tabrakan, dan logika pertumbuhan.
#include <SDL2/SDL.h>
#include <iostream>
#include <vector>
// Ukuran window
const int WINDOW_WIDTH = 800;
const int WINDOW_HEIGHT = 600;
const int CELL_SIZE = 20;
// Arah ular
enum Direction { UP, DOWN, LEFT, RIGHT };
struct Segment {
int x, y;
};
class SnakeGame {
private:
SDL_Window* window;
SDL_Renderer* renderer;
bool isRunning;
std::vector<Segment> snake;
Segment food;
Direction dir;
int score;
public:
SnakeGame() : window(nullptr), renderer(nullptr), isRunning(false), dir(RIGHT), score(0) {}
bool init() {
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
std::cerr << "Failed to initialize SDL: " << SDL_GetError() << std::endl;
return false;
}
window = SDL_CreateWindow("Snake Game",
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN);
if (!window) {
std::cerr << "Failed to create window: " << SDL_GetError() << std::endl;
return false;
}
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
if (!renderer) {
std::cerr << "Failed to create renderer: " << SDL_GetError() << std::endl;
return false;
}
// Inisialisasi ular
snake.push_back({WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2});
spawnFood();
isRunning = true;
return true;
}
void spawnFood() {
food.x = (rand() % (WINDOW_WIDTH / CELL_SIZE)) * CELL_SIZE;
food.y = (rand() % (WINDOW_HEIGHT / CELL_SIZE)) * CELL_SIZE;
}
void handleEvents() {
SDL_Event event;
while (SDL_PollEvent(&event)) {
if (event.type == SDL_QUIT) {
isRunning = false;
} else if (event.type == SDL_KEYDOWN) {
switch (event.key.keysym.sym) {
case SDLK_UP:
if (dir != DOWN) dir = UP;
break;
case SDLK_DOWN:
if (dir != UP) dir = DOWN;
break;
case SDLK_LEFT:
if (dir != RIGHT) dir = LEFT;
break;
case SDLK_RIGHT:
if (dir != LEFT) dir = RIGHT;
break;
}
}
}
}
void update() {
// Gerakkan ular
Segment newHead = snake[0];
switch (dir) {
case UP: newHead.y -= CELL_SIZE; break;
case DOWN: newHead.y += CELL_SIZE; break;
case LEFT: newHead.x -= CELL_SIZE; break;
case RIGHT: newHead.x += CELL_SIZE; break;
}
// Cek tabrakan dengan tubuh sendiri
for (const auto& segment : snake) {
if (newHead.x == segment.x && newHead.y == segment.y) {
isRunning = false;
return;
}
}
// Cek tabrakan dengan dinding
if (newHead.x < 0 || newHead.x >= WINDOW_WIDTH || newHead.y < 0 || newHead.y >= WINDOW_HEIGHT) {
isRunning = false;
return;
}
snake.insert(snake.begin(), newHead);
// Cek makan makanan
if (newHead.x == food.x && newHead.y == food.y) {
score++;
spawnFood();
} else {
snake.pop_back(); // Jika tidak makan, hapus ekor
}
}
void render() {
// Bersihkan layar
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); // Hitam
SDL_RenderClear(renderer);
// Gambar ular
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255); // Hijau
for (const auto& segment : snake) {
SDL_Rect rect = { segment.x, segment.y, CELL_SIZE, CELL_SIZE };
SDL_RenderFillRect(renderer, &rect);
}
// Gambar makanan
SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255); // Merah
SDL_Rect foodRect = { food.x, food.y, CELL_SIZE, CELL_SIZE };
SDL_RenderFillRect(renderer, &foodRect);
// Tampilkan di layar
SDL_RenderPresent(renderer);
}
void cleanUp() {
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
}
void run() {
while (isRunning) {
handleEvents();
update();
render();
SDL_Delay(100); // Kecepatan permainan
}
cleanUp();
}
};
int main() {
SnakeGame game;
if (!game.init()) {
return -1;
}
game.run();
return 0;
}
Fitur Utama dalam Kode
- Pergerakan Ular:
- Menggunakan input dari keyboard untuk mengubah arah.
- Pertumbuhan Ular:
- Ular bertambah panjang ketika memakan makanan.
- Deteksi Tabrakan:
- Permainan berakhir jika ular bertabrakan dengan dinding atau tubuh sendiri.
- Makanan Acak:
- Posisi makanan digenerate secara acak di area permainan.
Tingkatkan Game Anda
- Tambahkan Skor di Layar:
- Gunakan SDL_TTF untuk menampilkan skor di layar.
- Efek Suara:
- Gunakan SDL_Mixer untuk menambahkan efek suara ketika ular makan atau game berakhir.
- Level Kesulitan:
- Tingkatkan kecepatan ular berdasarkan skor.