Skip to content

Commit

Permalink
Fix & Add comments
Browse files Browse the repository at this point in the history
  • Loading branch information
ikhsan3adi committed Dec 10, 2024
1 parent acb567e commit 2519aef
Show file tree
Hide file tree
Showing 13 changed files with 96 additions and 57 deletions.
20 changes: 10 additions & 10 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
CC = gcc
CC = gcc -g -Wall
CFLAGS_WINDOWS = -Iinclude
CFLAGS_LINUX_MAC =
LDFLAGS_WINDOWS = -Llib -lpdcurses # Gunakan pdcurses di Windows
LDFLAGS_LINUX_MAC = -lncurses # Gunakan ncurses di Linux/MacOS
LDFLAGS_WINDOWS = -Llib -lpdcurses # pdcurses di Windows
LDFLAGS_LINUX_MAC = -lncurses # ncurses di Linux/MacOS

# Deteksi platform (Linux/MacOS/Windows)
UNAME_S := $(shell uname -s) # Hanya bekerja untuk Linux/MacOS
# Deteksi os (Linux/MacOS/Windows)
UNAME_S := $(shell uname -s)

# Tentukan CFLAGS dan LDFLAGS sesuai dengan platform
# CFLAGS dan LDFLAGS sesuai dengan os
# Windows (default)
CFLAGS = $(CFLAGS_WINDOWS)
LDFLAGS = $(LDFLAGS_WINDOWS)

ifeq ($(UNAME_S), Linux) # Linux
CFLAGS = $(CFLAGS_LINUX_MAC)
LDFLAGS = $(LDFLAGS_LINUX_MAC)
CFLAGS = $(CFLAGS_LINUX_MAC)
LDFLAGS = $(LDFLAGS_LINUX_MAC)
endif
ifeq ($(UNAME_S), Darwin) # macOS
CFLAGS = $(CFLAGS_LINUX_MAC)
LDFLAGS = $(LDFLAGS_LINUX_MAC)
CFLAGS = $(CFLAGS_LINUX_MAC)
LDFLAGS = $(LDFLAGS_LINUX_MAC)
endif

SRC = $(wildcard *.c)
Expand Down
3 changes: 2 additions & 1 deletion food.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ Food create_food(int screen_width, int screen_height, Snake *snake)
// Mengembalikan posisi makanan yang valid bertipe Vector2
Vector2 food_generate_position(int screen_width, int screen_height, Snake *snake)
{
// Deklarasi variabel untuk menyimpan posisi makanan
Vector2 new_position;
bool valid_position;
bool valid_position; // variabel untuk menyimpan status validitas posisi

do
{
Expand Down
10 changes: 5 additions & 5 deletions game.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ Game game_create(int screen_width, int screen_height, GameData *game_data)

// Atur status awal
new_game.current_score.score = 0;
new_game.hi_score = game_data->hi_score;
new_game.settings = game_data->settings;
new_game.hi_score = game_data->hi_score; // ambil dari game data
new_game.settings = game_data->settings; // ambil dari game data
new_game.is_running = true;
new_game.is_pause = false;

Expand Down Expand Up @@ -65,7 +65,7 @@ void game_update(Game *game)
// Cek tabrakan dengan makanan
if (vector2_equals(game->game_food.position, game->game_snake.head))
{
// Tumbuhkan ular
// Tambah skor dan panjang ular
if (snake_grow(&game->game_snake))
{
add_score(&game->current_score);
Expand All @@ -79,7 +79,7 @@ void game_update(Game *game)
}
}

// Fungsi untuk memeriksa apakah permainan telah berakhir
// Fungsi untuk memeriksa apakah permainan telah berakhir (ular menabrak tembok atau ular itu sendiri)
// game: parameter input passing by reference, tipe Game*, menunjuk ke objek permainan yang akan diperiksa
// Mengembalikan true jika permainan berakhir, false jika tidak
bool is_game_over(Game *game)
Expand Down Expand Up @@ -107,7 +107,7 @@ void game_restart(Game *game, GameData *game_data)
*game = game_create(game->screen_width, game->screen_height, game_data);
}

// Prosedur untuk menangani input dari pengguna
// Prosedur untuk menangani input dari pengguna untuk mengubah arah pergerakan ular
// game: parameter input/output passing by reference, tipe Game*, menunjuk ke objek permainan yang akan diperbarui berdasarkan input
// new_dir: parameter input passing by value, tipe Vector2, arah baru untuk ular
void game_handle_input(Game *game, Vector2 new_dir)
Expand Down
4 changes: 2 additions & 2 deletions game.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ void set_game_hi_score(Game *game, GameData *game_data, Score current_score);
// game: parameter input/output passing by reference, tipe Game*, menunjuk ke objek permainan yang akan diperbarui
void game_update(Game *game);

// Fungsi untuk memeriksa apakah permainan telah berakhir
// Fungsi untuk memeriksa apakah permainan telah berakhir (ular menabrak tembok atau ular itu sendiri)
// game: parameter input passing by reference, tipe Game*, menunjuk ke objek permainan yang akan diperiksa
// Mengembalikan true jika permainan berakhir, false jika tidak
bool is_game_over(Game *game);
Expand All @@ -54,7 +54,7 @@ bool is_game_over(Game *game);
// game_data: parameter output passing by reference, tipe GameData*, menunjuk ke objek data permainan
void game_restart(Game *game, GameData *game_data);

// Prosedur untuk menangani input dari pengguna
// Prosedur untuk menangani input dari pengguna untuk mengubah arah pergerakan ular
// game: parameter input/output passing by reference, tipe Game*, menunjuk ke objek permainan yang akan diperbarui berdasarkan input
// new_dir: parameter input passing by value, tipe Vector2, arah baru untuk ular
void game_handle_input(Game *game, Vector2 new_dir);
Expand Down
6 changes: 6 additions & 0 deletions gamedata.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// Nama Program : gamedata.c
// Deskripsi : Implementasi logika penyimpanan dan pemuatan data permainan,
// bertujuan untuk menyimpan dan memuat data permainan ke dan dari file biner.
// Pembuat : Ikhsan Satriadi / 241511080
// Rizky Satria Gunawan / 241511089

#include <stdio.h>
#include <string.h>
#include "gamedata.h"
Expand Down
7 changes: 7 additions & 0 deletions gamedata.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
// Nama Program : gamedata.h
// Deskripsi : Header file untuk pengelolaan data permainan,
// mendefinisikan struktur GameData dan fungsi-fungsi untuk menyimpan,
// memuat, dan menghapus data permainan.
// Pembuat : Ikhsan Satriadi / 241511080
// Rizky Satria Gunawan / 241511089

#ifndef GAMEDATA_H
#define GAMEDATA_H

Expand Down
10 changes: 8 additions & 2 deletions score.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// Nama Program : score.c
// Deskripsi : Implementasi logika pengelolaan skor dalam permainan,
// bertujuan untuk membuat, menambah, dan menyimpan skor pemain.
// Pembuat : Ikhsan Satriadi / 241511080
// Rizky Satria Gunawan / 241511089

#include <stdio.h>
#include <string.h>
#include "score.h"
Expand All @@ -9,7 +15,7 @@
Score create_score(int score, char *player_name)
{
Score new_score;
strcpy(new_score.player_name, player_name);
strcpy(new_score.player_name, player_name); // salin player_name ke new_score.player_name
new_score.score = score;

return new_score;
Expand All @@ -19,5 +25,5 @@ Score create_score(int score, char *player_name)
// score: parameter output passing by reference, tipe Score*, pointer ke objek Score yang akan ditambah
void add_score(Score *score)
{
score->score++;
score->score++; // increment skor
}
7 changes: 7 additions & 0 deletions score.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
// Nama Program : score.h
// Deskripsi : Header file untuk pengelolaan skor dalam permainan,
// mendefinisikan struktur Score dan fungsi-fungsi terkait untuk
// membuat dan mengelola skor pemain.
// Pembuat : Ikhsan Satriadi / 241511080
// Rizky Satria Gunawan / 241511089

#ifndef SCORE_H
#define SCORE_H

Expand Down
7 changes: 7 additions & 0 deletions settings.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
// Nama Program : settings.c
// Deskripsi : Implementasi pengaturan permainan,
// bertujuan untuk memperbarui dan mengelola pengaturan permainan seperti level dan kecepatan.
// Pembuat : Ikhsan Satriadi / 241511080
// Rizky Satria Gunawan / 241511089

#include <stdio.h>
#include "settings.h"

Expand All @@ -7,6 +13,7 @@
// new_speed: parameter input passing by value, tipe integer, kecepatan permainan baru
void update_settings(Settings *settings, int level, int new_speed)
{
// update level dan speed
settings->level = level;
settings->speed = new_speed;
}
7 changes: 7 additions & 0 deletions settings.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
// Nama Program : settings.h
// Deskripsi : Header file untuk pengaturan permainan,
// mendefinisikan struktur Settings dan fungsi-fungsi terkait untuk
// memperbarui dan mengelola pengaturan permainan seperti level dan kecepatan.
// Pembuat : Ikhsan Satriadi / 241511080
// Rizky Satria Gunawan / 241511089

#ifndef SETTINGS_H
#define SETTINGS_H

Expand Down
19 changes: 9 additions & 10 deletions snake.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@
// Mengembalikan objek ular baru bertipe Snake
Snake create_snake(int start_x, int start_y)
{
Snake new_snake = {0};
new_snake.head = vector2_create(start_x, start_y);
new_snake.direction = vector2_create(1, 0);
new_snake.length = 1;
Snake new_snake = {0}; // buat objek ular
new_snake.head = vector2_create(start_x, start_y); // buat posisi kepala ular
new_snake.direction = vector2_create(1, 0); // arah ular
new_snake.length = 1; // panjang awal

new_snake.segments[0] = new_snake.head;
new_snake.segments[0] = new_snake.head; // simpan posisi kepala ke dalam array segment

return new_snake;
}
Expand All @@ -27,7 +27,7 @@ Snake create_snake(int start_x, int start_y)
// snake: parameter input/output passing by reference, menunjuk ke objek ular yang akan diperbarui
void snake_move(Snake *snake)
{
// Geser segmen
// Geser segmen dan update segmen berdasarkan panjang ular
for (int i = snake->length; i > 0; i--)
{
snake->segments[i] = snake->segments[i - 1];
Expand All @@ -45,10 +45,8 @@ bool snake_collides_with_self(Snake *snake)
{
for (int i = 1; i < snake->length; i++)
{
if (vector2_equals(snake->head, snake->segments[i]))
{
if (vector2_equals(snake->head, snake->segments[i])) // Jika ada posisi segmen yang sama dengan kepala
return true;
}
}
return false;
}
Expand All @@ -60,7 +58,7 @@ bool snake_grow(Snake *snake)
{
if (snake->length < MAX_SNAKE_LENGTH)
{
snake->length = snake->length + 1;
snake->length = snake->length + 1; // Tambahkan satu segmen baru
return true;
}
return false;
Expand Down Expand Up @@ -97,5 +95,6 @@ void snake_change_direction(Snake *snake, Vector2 new_direction)
return;
}

// Ubah arah gerakan ular
snake->direction = new_direction;
}
49 changes: 24 additions & 25 deletions ui.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,19 @@ void initialize_ui()
srand(time(NULL));

// Inisialisasi curses
initscr();
cbreak();
noecho();
keypad(stdscr, TRUE);
curs_set(0);
nodelay(stdscr, TRUE);
initscr(); // Inisialisasi & mengaktifkan tampilan curses
cbreak(); // Mengaktifkan mode cbreak, yang memungkinkan input karakter tanpa menunggu enter
noecho(); // Menonaktifkan echo input, sehingga karakter yang dimasukkan tidak ditampilkan
keypad(stdscr, TRUE); // Mengaktifkan pengenalan tombol khusus (cth. arrow key)
curs_set(0); // Menyembunyikan kursor
nodelay(stdscr, TRUE); // Mengatur input non-blocking, sehingga getch() tidak menunggu input

// Inisialisasi warna
if (has_colors() == FALSE)
{
endwin();
fprintf(stderr, "Terminal tidak mendukung warna\n");
exit(1);
endwin(); // Mengakhiri mode curses jika terminal tidak mendukung warna
fprintf(stderr, "Terminal tidak mendukung warna\n"); // Menampilkan pesan kesalahan
exit(1); // Keluar dari program dengan status kesalahan
}
// Inisialisasi warna
start_color();
Expand All @@ -57,7 +57,7 @@ void show_title()
// game_data: parameter input/output passing by reference, menunjuk ke objek GameData yang menyimpan data permainan
void show_menu(GameData *game_data)
{
int choice;
int choice; // Variabel untuk menyimpan pilihan pengguna
do
{
erase(); // Bersihkan layar
Expand All @@ -71,11 +71,10 @@ void show_menu(GameData *game_data)
attron(COLOR_PAIR(3)); // beri warna kuning
mvprintw(9, 10, "=== Menu ===");
mvprintw(11, 10, "1. Main");
sprintf(buffer, "2. Atur Level (Level: %d)", game_data->settings.level);
sprintf(buffer, "2. Atur Level (Level: %d)", game_data->settings.level); // menampilkan level saat ini
mvprintw(12, 10, buffer);
mvprintw(13, 10, "3. Keluar");
mvprintw(15, 10, "Pilih opsi (1-3): ");
refresh();

choice = getch(); // Ambil input dari pengguna

Expand All @@ -99,7 +98,7 @@ void show_menu(GameData *game_data)
// game_data: parameter input/output passing by reference, menunjuk ke objek GameData yang menyimpan data permainan
void set_game_level(GameData *game_data)
{
int level_choice;
int level_choice; // Variabel untuk menyimpan pilihan pengguna
do
{
erase(); // Bersihkan layar
Expand Down Expand Up @@ -187,15 +186,15 @@ void render_ui(Game *game)

// Tampilkan skor
sprintf(buffer, " Score: %d ", game->current_score.score);
mvaddstr(0, game->screen_width - (strlen(buffer) / 2), buffer);
mvaddstr(0, game->screen_width - (strlen(buffer) / 2), buffer); // tampilkan skor di tengah atas

// Tampilkan hi-score
sprintf(buffer, " Hi-Score: %d | %s ", game->hi_score.score, game->hi_score.player_name);
mvaddstr(game->screen_height + 1, 2, buffer);
mvaddstr(game->screen_height + 1, 2, buffer); // tampilkan hi-score di kiri bawah

// Tampilkan level saat ini
sprintf(buffer, " Level: %d ", game->settings.level);
mvaddstr(game->screen_height + 1, game->screen_width * 2 - 10, buffer);
mvaddstr(game->screen_height + 1, game->screen_width * 2 - 10, buffer); // tampilkan level di kanan bawah
}

// Prosedur untuk menggambar batas layar
Expand Down Expand Up @@ -238,7 +237,7 @@ void draw_border(int y, int x, int width, int height)
}
}

// Prosedur untuk menampilkan tampilan game over
// Prosedur untuk menampilkan tampilan game over atau paused
// game: parameter input, menunjuk ke objek Game yang akan ditampilkan
// Menampilkan pesan game over atau kemenangan, serta instruksi untuk memulai ulang permainan.
void show_game_over_ui(Game *game)
Expand All @@ -248,7 +247,7 @@ void show_game_over_ui(Game *game)

if (game->game_snake.length >= MAX_SNAKE_LENGTH)
{
// Pesan kemenangan
// Pesan kemenangan di tengah layar
mvaddstr(game->screen_height / 2,
game->screen_width - 10,
" Selamat! Anda Menang! ");
Expand All @@ -264,7 +263,6 @@ void show_game_over_ui(Game *game)
}
else
{
// Pesan game over
if (game->is_pause) // tampilkan pesan berbeda jika pause
{
mvaddstr(game->screen_height / 2,
Expand All @@ -274,7 +272,7 @@ void show_game_over_ui(Game *game)
game->screen_width - 16,
"Tekan SPACE untuk melanjutkan (resume)");
}
else
else // Pesan game over
{
mvaddstr(game->screen_height / 2,
game->screen_width - 10,
Expand All @@ -284,6 +282,7 @@ void show_game_over_ui(Game *game)
"Tekan SPACE untuk restart");
}

// tampilkan instruksi untuk pergi ke menu atau keluar
mvaddstr(game->screen_height / 2 + 2,
game->screen_width - 14,
"Tekan ENTER untuk kembali ke menu");
Expand Down Expand Up @@ -319,7 +318,7 @@ void get_player_name(Game *game)
erase(); // bersihkan layar
}

// Prosedur untuk menangani input dari pengguna
// Prosedur untuk menangani input dari pengguna selama dalam permainan
// game: parameter input/output passing by reference, menunjuk ke objek Game yang akan diperbarui berdasarkan input
// game_data: parameter input/output passing by reference, menunjuk ke objek GameData yang menyimpan data permainan
void ui_handle_input(Game *game, GameData *game_data)
Expand Down Expand Up @@ -365,10 +364,10 @@ void ui_handle_input(Game *game, GameData *game_data)
// Menghentikan antarmuka pengguna dan membersihkan layar sebelum keluar dari program.
void quit_game()
{
endwin();
endwin(); // Mengakhiri mode curses, mengembalikan terminal ke mode normal

printf("\e[1;1H\e[2J");
printf("\e[?25h");
printf("\e[1;1H\e[2J"); // Mengatur kursor ke posisi (1,1) dan membersihkan layar terminal
printf("\e[?25h"); // Menampilkan kursor kembali setelah keluar dari mode curses

exit(0);
exit(0); // Keluar dari program dengan status sukses
}
Loading

0 comments on commit 2519aef

Please sign in to comment.