Side Photo 1
Side Photo 2
Formal Photo Hendry

Hello, I'm Hendry

I'm a

My name is Hendry Anastacia Chandra. I am an undergraduate at Binus University studying Computer Science - Software Engineering. I have a passion in Web Development, Teaching, and UI/UX Design. I am eager to expand my knowledge and contribute my skills in a collaborative environment. Welcome to my Portfolio!


Education

Bachelor of Computer Science - Software Engineering

I am currently studying Computer Science - Software Engineering at Binus University @Bekasi, where I started my journey in 2022 right after high school. Through my studies, I have gained proficiency in core subjects such as Algorithm and Programming, Software Design, Human-Computer Interaction, and others. My academic journey has been enriched by maintaining a strong academic record and excelling in key courses. I have also taken opportunities to participate in competitions, proudly representing my university. To complement my academic learning, I have worked on several projects that showcase my technical and creative abilities. These include a prototype design focused on improving well-being, a UI/UX design for an AI-powered education platform for individuals with disabilities using Figma, and study cases in C and Java programming, among others. Collaborating with peers on these projects strengthened my problem-solving abilities and capacity to deliver impactful, user-centered solutions. Notably, our education platform project was recognized for its innovative use of AI to enhance accessibility. Beyond academics, I continuously work on improving my soft skills, such as leadership, communication, and adaptability. With a passion for Web Development and UI/UX Design, I aspire to create innovative, fresh, and unique software solutions that enhance user experiences and address real-world problems. My goal is to contribute to impactful projects, combining my technical expertise with the skills I’ve honed through education and experience.


Binus University @Bekasi

Expected Graduation: 2026

Highlights:

  • Core Courses: Algorithm & Programming, Software Engineering, Software Design, Data Structures, Machine Learning, Human-Computer Interaction, & Software Security.
  • Projects: WellMind (Prototype design for well-being), Edumate (AI-powered Education Platform for Disabilities), EduBridge (Self Learning & Note Sharing Application/Website), and Study Cases in C and Java
  • Tools & Technologies: HTML, CSS, JavaScript, Figma, C, Pyhton, Java, MySql, and Visual Studio Code
  • Binus Picture

    Skills

    Technical Skills

    HTML Icon HTML
    CSS Icon CSS
    JavaScript Icon JavaScript
    C Icon C
    Python Icon Python
    Java Icon Java
    MySQL Icon MySQL
    Figma Icon Figma





    Soft Skills

    Team Leadership Team Leadership

    Using my leadership skills, I guide and manage my team to achieve our goals .

    Communication Communication

    I deliver my ideas clearly and listen well to others opinions or ideas.

    Public Speaking Public Speaking

    To effectively communicate my ideas or information to an audience clearly and engagingly.

    Problem Solving Problem Solving

    Analyzing and resolving complex challenges efficiently.

    Adaptability Adaptability

    Adjusting to new situations and environments to understand what is the best.

    Attention to detail Attention to detail

    To spot small inconsistencies or errors to ensure precision and quality.

    Cricital Thinking Critical Thinking

    An approach to problem-solving where I think logicaly and analytically.

    Empathy Empathy

    Understanding and share the feelings, needs, and perspectives of others

    Time Management Time Management

    Capability to prioritize tasks, set goals, and use time efficiently






    Languages

    English

    I have been studying English since Grade 1, building fluency over the years. I frequently use English in academic, professional, and social contexts. My Experience includes presenting ideas, collaborating with other English-speakign peers, and writing documents, showcasing my ability to communicate effectively across diverse settings.

    Indonesian

    I was born and raised Indonesia, making me a native speaker. My proficiency allows me to communicate seamlessly. I also enjoy exploring Indonesian culture and media to deepen my understanding of Indonesia.






    Hobbies & Interests

    Designing Websites

    I enjoy creating aesthetically pleasing and functional websites using HTML and CSS, constantly seeking new knowledge to enhance my skills in web development.

    Teaching

    I am passionate about sharing knowledge and mentoring others. I find great joy in helping others understand and apply what I have taught them.

    Puzzles

    I enjoy solving challenging puzzles, such as Rubik's Cube and its many variants, which help enhance my critical thinking and problem-solving skills.

    Trying New Challenges

    I love exploring and conquering new opportunities and challenges, which helps me enhance my adaptability skills and prepares me to effectively navigate future endeavors.





    Experience

    Chairman - KMBD Binus University @Bekasi

    January 2024 - Present

  • Leading and managing the organization for the 35th period, fostering teamwork and collaboration.
  • Setting strategic goals to promote personal development and leadership among members.
  • Organizing events to support the community's growth and engagement.
  • Activist - KMBD Binus University @Bekasi

    January 2023 - December 2023

  • Actively participated in organizational activities to support Buddhist awareness and community events.
  • Assisted in the planning and execution of large-scale events, improving organizational efficiency.
  • Collaborated with fellow members to foster a positive and engaging environment.
  • Freshmen Partner - Binus University

    September 2023 - June 2024

  • Assisted and supervised 11 frehsmen during the transition to university life.
  • Provided logistical support for orientation events and activities.
  • Helped create a supportive environment for freshmen to build connections and confidence.
  • Freshmen Leader - Binus University

    July 2023 - September 2023

  • Guided and mentored 9 frehsmen during the orientation program, fostering a welcoming environment.
  • Collaborated with the organizing team to ensure smooth execution of orientation activities.
  • Provided support to freshmen in adapting to university life and academics.



  • Competitions

    Invofest 2024

    Achieved: First Place 🥇

    Invofest (Informatics Vocational Festival) is an annual event organized by Teknik Informatika Harber, aimed at inspiring and empowering Indonesia's youth to navigate and thrive in the digital era.


    My team and I competed in the UI/UX Design Competition, focusing on the theme: "AI Challenge: Gen Z's Quest for Digital Sustainability". Through innovation and collaboration, we advanced to the finals and proudly secured 1st place, demonstrating our commitment to creating impactful and sustainable digital solutions.

    Invofest Logo

    Proto-A-Thon 2024

    Proto-A-Thon is an international prototype design competition hosted by the Business Information Technology program at Binus @Bekasi. This year’s theme, "Education Technology for Disability," challenged participants to develop innovative solutions for improving educational resources and providing inclusive technology support for students with disabilities.


    My team and I participated with dedication and creativity, successfully ranking 15th out of 50+ teams, showcasing our ability to generate impactful ideas in a highly competitive field.

    Protoathon Logo

    Projects

    WellMind Project

    WellMind

    WellMind is a prototype design focused on improving mental well-being. Developed as part of a Human & Computer Interaction project, WellMind emphasizes accessibility, ease of use, and mental health support tailored to diverse user needs.

    Home Page

    The WellMind homepage offers a clean and intuitive design for users to easily navigate through various features. It provides a snapshot of user progress, inspiring quotes, and a calming aesthetic that sets the tone for a mindful experience.


    • The color purple to evoke the sense of calmness, relaxationn, dan serenity.
    • Simple navigations to all the features we offer.
    • Quick access to mood tracking and statistics.
    • Designed with inclusivity in mind, using high contrast for better visibility
    • Notifications for reminders, updates, or upcoming events.
    • Streak tracking and progress indicators to encourage consistency.
    WellMind Home page

    Chat Page

    WellMind offers a chat page, serving as a dedicated space for users to connect with professionals and peers. Designed to foster a sense of community and provide immediate support, the chat page balances simplicity with functionality for an engaging user experience.


    • Engage in instant messaging with certified counselors, mental health experts, or support groups
    • Ensures end-to-end encryption to protect user privacy and maintain a safe space for open communication.
    • Sends reminders for ongoing conversations or upcoming scheduled chats, ensuring users never miss an important interaction.
    WellMind Chat page

    Check Up Page

    The WellMind Check-Up Page provides users with a structured and personalized way to assess their mental well-being regularly. Through intuitive design and actionable insights, it empowers users to understand and improve their emotional health over time.


    • Easy to use check up page, encouraging users to do it daily.
    • Daily guided assessments to reflect on current emotions and triggers.
    • Integrated mood tracking to identify patterns and trends over time.
    • Reminders to encourage consistent mental health monitoring.
    WellMind Check Up page

    Mood Tracker Page

    The WellMind Mood Tracker is an intuitive and interactive tool that helps users log their emotions daily and visualize their mental health journey over time. By offering a calendar-based interface, it simplifies mood tracking and promotes self-awareness.


    • Interactive calendar that changes color based on the selected mood.
    • Modern and sleek user interface.
    WellMind Mood Tracker page

    Goals Tracker Page

    The WellMind Goals Tracker empowers users to set, monitor, and achieve their personal objectives, fostering a sense of accomplishment and purpose. Designed with simplicity and clarity, the tracker ensures that users stay motivated and organized.


    • Set and categorize goals
    • Track progress visually with milestones and progress bars.
    • Customize goals with deadlines, priority levels, and detailed notes.
    WellMind Goals page

    See WellMind in action! Explore its features and design through the live preview or review the source code.

    Please note that WellMind is a prototype design, developed to showcase its features and conceptual framework.


    EduBridge Project

    EduBridge

    EduBridge is a self-learning and note-sharing platform designed to empower students by providing seamless access to educational resources and collaborative tools. This project focuses on bridging the gap between students and learning materials through a user-friendly interface and innovative features.

    Home Page

    The EduBridge Home Page serves as a centralized hub for users to access various features and explore the platform's offerings. With a clean and intuitive design, it provides quick navigation and highlights essential tools for a seamless user experience.


    • Side navigation bar for easy access to Home, About Us, Courses, Notes, and Contact Us.
    • Dashboard showcasing saved notes, top categories, and popular topics.
    • A curated list of courses, complete with thumbnails and easy navigation to playlists.
    • Theme toggle to switch between dark mode and light mode for user comfort.
    • Search bar for quickly locating specific courses or topics.
    • Blue is used as an accent color to represent education because it embodies qualities that align closely with the purpose of learning
    EduBridge Home page

    Courses Page

    EduBridge's Course Page provides students with a streamlined and intuitive interface to explore the available courses. It offers a comprehensive overview of educational resources, making it easy for students to find and access the content they need.


    • Provides a visual overview of available courses, including titles, instructor details, and thumbnails, giving students a clear snapshot of what to expect.
    • The clean, organized layout ensures a smooth browsing experience, while the modern design keeps users engaged.
    • Compatible with both light and dark modes to enhance visual comfort for students, regardless of their preferences or environment.
    EduBridge Courses page

    Courses Page

    The Playlist Page in EduBridge provides an organized and user-friendly interface for students to access a collection of educational videos within a specific playlist. It focuses on enhancing the learning experience by displaying detailed information and easy navigation through the content.


    • Clean and intuitive layout, ensuring students can easily identify and access specific videos within the playlist.
    • Videos are arranged in a logical sequence, making it easy for students to follow the course step-by-step.
    • Video thumbnails provide a visual snapshot of the content, enabling students to quickly identify topics of interest.
    • A clear navigation structure ensures users can switch between playlists or sections without confusion.
    EduBridge Playlist page

    Watch Video Page

    The Watch Video Page of EduBridge provides students with an immersive and focused video learning experience.


    • Clean and intuitive layout, ensuring students can easily identify and access specific videos within the playlist.
    • Maintains a visually cohesive design, ensuring familiarity and reducing learning curves for new users.
    • Optimized for all devices, allowing students to access playlists on desktops, tablets, or mobile phones without compromising usability.
    EduBridge Watch Video page

    Notes Page

    The Notes Page in EduBridge serves as a collaborative platform where students can share their notes and access notes from their peers. This feature fosters a community-driven learning environment.


    • Upload and share their notes on various topics, allowing others to benefit from their understanding and perspectives.
    • Browse through notes shared by other students, gaining different viewpoints and potentially discovering more efficient ways to approach complex topics.
    • Highlights the most popular and highly rated notes, allowing students to quickly identify and access the best resources contributed by their peers.
    EduBridge Watch Video page

    View/Read Notes Page

    The View Notes Page in EduBridge provides students with a seamless experience to access and utilize shared study materials effectively.


    • Students can easily read through the full content of the shared notes, ensuring they have all the information they need.
    • Each note comes with a description provided by the contributor, offering context, objectives, or additional insights about the material.
    • A convenient download feature allows students to save the notes for offline use, enabling flexible and uninterrupted learning.
    EduBridge Watch Video page

    Explore the EduBridge platform to see how it facilitates collaborative and self-directed learning.


    EduMate Project

    EduMate

    EduMate is a prototype project developed by Team Return 0 — including myself, Miguel, and Hariz. This innovative design was created for participation in Proto-A-Thon and InvoFest, where it earned 1st place, demonstrating its impact and creativity.


    EduMate is a mobile application designed to empower individuals with disabilities by providing tailored tools and resources to enhance their educational experience. Its mission is to bridge the accessibility gap in education, fostering inclusivity and enabling users to achieve their academic goals with ease and independence.

    Starting Page

    The Starting Page welcomes users as they begin their EduMate journey. On this page, users can select their EduMate—a personalized mascot and companion—that will guide and support them throughout their educational experience. This feature adds a fun and interactive element, creating a more engaging and personalized learning environment.


    • Warm and friendly design elements create a positive first impression for users.
    • Provides an engaging experience by allowing users to preview different EduMate mascots before finalizing their choice.
    • The color blue symbolizes the structured and reliable support EduMate offers to its users, particularly in their academic journey.
    • While the color purple reflecting EduMate's commitment to inclusivity and its focus on supporting individuals with disabilities.
    EduMate Starting page

    Home Page

    The Home Page of EduMate serves as a welcoming dashboard, designed to provide users with quick access to the app's key features and information. It sets the stage for an intuitive and engaging learning experience.


    • Prominently shows subject categories (e.g., Mathematics, English) with the number of courses available, enabling quick access to desired learning topics.
    • Displays the user’s name, profile picture, and educational level (e.g., Senior High School), making the experience personalized and welcoming.
    • Highlights ongoing courses with progress bars to track learning completion.
    • Provides easy access to main sections, such as EduPage, Home, and Chats, ensuring seamless navigation within the app.
    EduMate Home page

    Edumate Customization Page

    The Edumate Customization Page allows users to personalize their Edumate to reflect their own preferences and personality. By customizing their Edumate, users can create a more meaningful and engaging connection with their virtual learning companion. This feature fosters a sense of attachment, making the learning experience more enjoyable and personal.


    • Users can modify various aspects of their Edumate, such as outfits, colors, accessories, or expressions, to create a unique look.
    • Personalization fosters emotional attachment, encouraging users to interact with their Edumate more frequently and build a stronger bond over time.
    • A simple and intuitive layout makes the customization process enjoyable and accessible for users of all ages.
    EduMate Customization page

    Course Detail Page

    The Course Detail Page provides users with an overview of the selected course, including its content, structure, and objectives. This page serves as a gateway to begin the learning journey for a specific course, offering essential information to prepare users for what lies ahead.


    • The title of the course (e.g., Intermediate - 1) and the number of lessons it contains are displayed prominently, giving users clarity about their learning goals.
    • A prominent call-to-action button invites users to dive into the course, ensuring smooth navigation to start their learning experience.
    • Visual representation of locked and unlocked lessons encourages users to complete modules sequentially, motivating them to progress through the course.
    EduMate Course Detail page

    Learning Page

    The Learning Page provides users with a focused and interactive learning experience for the selected topic. It offers a comprehensive introduction to the lesson and ensures an engaging and supportive environment through AI assistance.


    • Displays the lesson's title (Basic Vocabulary) and estimated completion time (15.30 minutes), allowing users to manage their learning time effectively.
    • An AI-powered feature to guide users through the lesson. It offers personalized tips, explanations, or support as users engage with the content.
    • A large, engaging header image sets the tone for the lesson, creating a visually appealing and motivating environment for learning.
    EduMate Customization page

    These are just some of the features EduMate has to offer.

    Dive into EduMate to explore a wide range of innovative and user-focused features designed to enhance your educational journey.


    C Projects/Cases

    This section showcases a collection of C programming projects and cases I have worked on and solved. Each project demonstrates problem-solving abilities, logical structuring, and hands-on programming skills in the C language.

    2048 Puzzle Game

    This project is a text-based implementation of the popular 2048 puzzle game, developed in C. The game challenges players to combine tiles with the same value by swiping them in four directions (up, down, left, or right) to achieve the highest score possible.

    • Dynamic Grid Sizes: Users can choose between a 4x4 or 6x6 grid to play the game, providing a customizable challenge.
    • Tile Movement and Merging: Implements smooth movement logic and proper merging of tiles with identical values, adding strategic complexity.
    • Highscore Management: Tracks and displays top 10 scores along with player names and unique IDs.
    • Random Tile Generation: Ensures fair gameplay by introducing random tiles after each move.
    • Game Over Detection: Automatically detects when no moves are possible, signaling the end of the game.
    • Persistent Highscore Storage: Saves and retrieves highscore data from a file, ensuring records persist across sessions.
    
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <conio.h>
    #include <time.h>
    
    void MainMenu()
    {
        printf("2048\n\n\n");
        printf("    1. New Game\n");
        printf("    2. Highscore\n");
        printf("    3. Exit\n");
        printf("    >> ");
    }
    
    struct Player
    {
        char UserID[6];
        char Name[16];
        int score;
    
        struct Player* next;
    };
    
    struct Player* addPlayer(struct Player* head, char UserID[6], char Name[16], int score)
    {
        struct Player* newNode = (struct Player*)malloc(sizeof(struct Player));
    
        strcpy(newNode->UserID, UserID);
        strcpy(newNode->Name, Name);
        newNode->score = score;
    
        newNode->next = head;
    
        head = newNode;
    
        return head;
    }
    
    void swapPlayers(struct Player* a, struct Player* b)
    {
        struct Player temp = *a;
        *a = *b;
        *b = temp;
    }
    
    int partition(struct Player* arr, int low, int high)
    {
        int pivot = arr[high].score;
        int i = (low - 1);
    
        for (int j = low; j <= high - 1; j++)
        {
            if (arr[j].score > pivot)
            {
                i++;
                swapPlayers(&arr[i], &arr[j]);
            }
        }
        swapPlayers(&arr[i + 1], &arr[high]);
        return (i + 1);
    }
    
    void quickSort(struct Player* arr, int low, int high)
    {
        if (low < high)
        {
            int pi = partition(arr, low, high);
            quickSort(arr, low, pi - 1);
            quickSort(arr, pi + 1, high);
        }
    }
    
    void printTop10Scores(struct Player* head)
    {
        if (head == NULL)
        {
            printf("No HighScores\n");
            return;
        }
    
        struct Player* top10 = (struct Player*)malloc(10 * sizeof(struct Player));
        int i;
        for (i = 0; i < 10; i++)
        {
            top10[i].score = -1;
        }
    
        struct Player* current = head;
        while (current != NULL)
        {
            for (i = 0; i < 10; i++)
            {
                if (current->score > top10[i].score)
                {
                    for (int j = 9; j > i; j--)
                    {
                        top10[j] = top10[j - 1];
                    }
                    top10[i] = *current;
                    break;
                }
            }
            current = current->next;
        }
    
        quickSort(top10, 0, 9);
    
        printf("%-3s |%-10s |%-15s |%s\n", "No.", "ID", "Username", "Score");
        for (i = 0; i < 10; i++)
        {
            printf("%-3d |%-10s |%-15s |%d\n", i + 1, top10[i].UserID, top10[i].Name, top10[i].score);
        }
    
        free(top10);
    }
    
    int BOARD_SIZE = 4;
    
    int board[6][6];
    
    void StartingBoard()
    {
        for (int i = 0; i < BOARD_SIZE; i++)
        {
            for (int j = 0; j < BOARD_SIZE; j++)
            {
                board[i][j] = 0;
            }
        }
    }
    
    void randomTiles()
    {
        int emptyTiles[BOARD_SIZE * BOARD_SIZE][2];
        int count = 0;
    
        for (int i = 0; i < BOARD_SIZE; i++)
        {
            for (int j = 0; j < BOARD_SIZE; j++)
            {
                if (board[i][j] == 0)
                {
                    emptyTiles[count][0] = i;
                    emptyTiles[count][1] = j;
                    count++;
                }
            }
        }
    
        if (count > 0)
        {
            int randomIndex = rand() % count;
            int value = (rand() % 2 + 1) * 2;
            int x = emptyTiles[randomIndex][0];
            int y = emptyTiles[randomIndex][1];
            board[x][y] = value;
        }
    }
    
    int score = 0;
    
    void printBoard()
    {
        system("cls");
        printf("2048 Game\n");
    
        for (int i = 0; i < BOARD_SIZE; i++)
        {
            for (int j = 0; j < BOARD_SIZE; j++)
            {
                if (board[i][j] == 0)
                {
                    printf("| %-4s ", "");
                }
                else
                {
                    printf("| %-4d ", board[i][j]);
                }
            }
            printf("|\n");
            if (i < BOARD_SIZE - 1)
            {
                for (int j = 0; j < BOARD_SIZE; j++)
                {
                    printf("+------");
                }
                printf("+\n");
            }
        }
    
        printf("Score: %d\n\n\n[Press Enter To Exit]", score);
    }
    
    void moveUp()
    {
        for (int column = 0; column < BOARD_SIZE; column++)
        {
            for (int row = 1; row < BOARD_SIZE; row++)
            {
                if (board[row][column] != 0)
                {
                    int newRow = row;
    
                    while (newRow > 0 && board[newRow - 1][column] == 0)
                    {
                        board[newRow - 1][column] = board[newRow][column];
                        board[newRow][column] = 0;
                        newRow--;
                    }
    
                    if (newRow > 0 && board[newRow - 1][column] == board[newRow][column])
                    {
                        int merge = board[newRow - 1][column] * 2;
                        board[newRow - 1][column] = merge;
                        board[newRow][column] = 0;
                        score += merge;
                    }
                }
            }
        }
    }
    
    void moveDown()
    {
        for (int column = 0; column < BOARD_SIZE; column++)
        {
            for (int row = BOARD_SIZE - 2; row >= 0; row--)
            {
                if (board[row][column] != 0)
                {
                    int newRow = row;
                    while (newRow < BOARD_SIZE - 1 && board[newRow + 1][column] == 0)
                    {
                        board[newRow + 1][column] = board[newRow][column];
                        board[newRow][column] = 0;
                        newRow++;
                    }
                    if (newRow < BOARD_SIZE - 1 && board[newRow + 1][column] == board[newRow][column])
                    {
                        int merge = board[newRow + 1][column] * 2;
                        board[newRow + 1][column] = merge;
                        board[newRow][column] = 0;
                        score += merge;
                    }
                }
            }
        }
    }
    
    void moveLeft()
    {
        for (int row = 0; row < BOARD_SIZE; row++)
        {
            for (int column = 1; column < BOARD_SIZE; column++)
            {
                if (board[row][column] != 0)
                {
                    int newColumn = column;
                    while (newColumn > 0 && board[row][newColumn - 1] == 0)
                    {
                        board[row][newColumn - 1] = board[row][newColumn];
                        board[row][newColumn] = 0;
                        newColumn--;
                    }
                    if (newColumn > 0 && board[row][newColumn - 1] == board[row][newColumn])
                    {
                        int merge = board[row][newColumn - 1] * 2;
                        board[row][newColumn - 1] = merge;
                        board[row][newColumn] = 0;
                        score += merge;
                    }
                }
            }
        }
    }
    
    void moveRight()
    {
        for (int row = 0; row < BOARD_SIZE; row++)
        {
            for (int column = BOARD_SIZE - 2; column >= 0; column--)
            {
                if (board[row][column] != 0)
                {
                    int newColumn = column;
                    while (newColumn < BOARD_SIZE - 1 && board[row][newColumn + 1] == 0)
                    {
                        board[row][newColumn + 1] = board[row][newColumn];
                        board[row][newColumn] = 0;
                        newColumn++;
                    }
                    if (newColumn < BOARD_SIZE - 1 && board[row][newColumn + 1] == board[row][newColumn])
                    {
                        int merge = board[row][newColumn + 1] * 2;
                        board[row][newColumn + 1] = merge;
                        board[row][newColumn] = 0;
                        score += merge;
                    }
                }
            }
        }
    }
    
    int GameOver()
    {
        for (int i = 0; i < BOARD_SIZE; i++)
        {
            for (int j = 0; j < BOARD_SIZE; j++)
            {
                if (board[i][j] == 0)
                {
                    return 0;
                }
    
                if ((i > 0 && board[i][j] == board[i - 1][j]) ||
                    (i < BOARD_SIZE - 1 && board[i][j] == board[i + 1][j]) ||
                    (j > 0 && board[i][j] == board[i][j - 1]) ||
                    (j < BOARD_SIZE - 1 && board[i][j] == board[i][j + 1]))
                {
                    return 0;
                }
            }
        }
    
        return 1;
    }
    
    struct Player* readPlayersFromFile(const char* filename)
    {
        FILE* fp = fopen("highscore.txt", "r");
        if (fp == NULL)
        {
            return NULL;
        }
    
        struct Player* head = NULL;
        char UserID[6];
        char Name[16];
        int score;
    
        while (fscanf(fp, "%5[^#]#%14[^#]#%d\n", UserID, Name, &score) == 3)
        {
            head = addPlayer(head, UserID, Name, score);
        }
    
        fclose(fp);
        return head;
    }
    
    int main()
    {
        int count = 0;
    
        struct Player* head = readPlayersFromFile("highscore.txt");
    
        int MenuChoice;
    
        do
        {
            MainMenu();
    
            scanf("%d", &MenuChoice);
            getchar();
    
            switch (MenuChoice)
            {
            case 1: // play
            {
                int gameRunning = 1;
    
                do
                {
                    printf("Input Grid Size [4 or 6]: ");
                    scanf("%d", &BOARD_SIZE);
                    getchar();
                } while (BOARD_SIZE != 4 && BOARD_SIZE != 6);
    
                score = 0;
    
                srand(time(NULL));
    
                StartingBoard();
                randomTiles();
                randomTiles();
    
                do
                {
                    printBoard();
    
                    char key = getch();
    
                    switch (key)
                    {
                    case 'w':
                        moveUp();
                        break;
    
                    case 's':
                        moveDown();
                        break;
    
                    case 'a':
                        moveLeft();
                        break;
    
                    case 'd':
                        moveRight();
                        break;
    
                    case '\r':
                        gameRunning = 0;
                        break;
                    }
    
                    int checkGameOver = GameOver();
    
                    if (checkGameOver == 1)
                    {
                        getchar();
    
                        break;
                    }
    
                    randomTiles();
                } while (gameRunning == 1);
    
                system("cls");
    
                char name[16];
    
                do
                {
                    printf("Input Name [name length must be between 3-15]: ");
                    scanf(" %[^\n]", name);
                    getchar();
                } while (strlen(name) < 3 || strlen(name) > 15);
    
                char id[6];
    
                int random[3];
    
                for (int i = 0; i < 3; i++)
                {
                    random[i] = rand() % 10;
                }
    
                sprintf(id, "%c%c%d%d%d", toupper(name[0]), toupper(name[1]), random[0], random[1], random[2]);
    
                head = addPlayer(head, id, name, score);
    
                FILE* ADD = fopen("highscore.txt", "a");
                fprintf(ADD, "%s#%s#%d\n", id, name, score);
                fclose(ADD);
    
                break;
            }
    
            case 2: // show highscore
                system("cls");
    
                printTop10Scores(head);
    
                printf("\n\nPress Enter to Continue...");
    
                getchar();
                break;
    
            case 3: // exit
                system("cls");
    
                printf("Thank you for playing!");
    
                return 0;
                break;
            }
    
            system("cls");
        } while (MenuChoice != 3);
    
        return 0;
    }      
                        

    LabIRinth Explorer

    LabIRinth Explorer is a text-based maze navigation game developed in C. In this game, players must find their way out of a labyrinth by reaching the designated goal (O) while avoiding obstacles and dead ends. The game offers a simple yet challenging experience with dynamic maze layouts and customizable difficulty levels.

    • Custom ASCII Art and Narrative: The game sets the stage with immersive ASCII art and an engaging backstory, drawing players into the challenge of navigating the labyrinth.
    • Three Difficulty Levels: Players can choose from Easy, Medium, and Hard levels, each with unique maze layouts that test their problem-solving skills.
    • Player Movement: Use intuitive keyboard controls (W, A, S, D) to move through the maze. The game ensures valid moves and updates the player’s position dynamically.
    
    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #include <conio.h>
    
    void printLabirinth()
    {
        printf(" _      ____ ____  ____ ____  ____ ____	 ______	__ __		\n");
        printf("| |    /    |    \\|    |    \\|    |    \\|      |  |  |	\n");
        printf("| |   |  o  |  o  )|  ||  D  )|  ||  _  |      |  |  |		\n");
        printf("| |___|	    |     ||  ||    / |  ||  |  |_|  |_|  _  |		\n");
        printf("|     |  _  |  O  ||  ||    \\ |  ||  |  | |  | |  |  |	   	\n");
        printf("|     |  |  |     ||  ||  .  \\|  ||  |  | |  | |  |  | 	\n");
        printf("|_____|__|__|_____|____|__|\\_|____|__|__| |__| |__|__|		\n");
        printf("_--___-^_^-_--__^-_--__^-^--^^^^-^_^-_-^_^-_---__^--__-	  \n\n");
    }
    
    void printIntro()
    {
        printf("Welcome to labIRinth!\n\n");
        printf("One day, you wake up in a cursed labyrinth and want to escape.\n");
        printf("But, you realised that it might not be that easy.\n");
        printf("As you look around, you realize that there are mummies roaming the place.\n");
        printf("Try to get to the exit without getting caught by the mummies.\n");
        printf("Good luck and have fun!\n");
    }
    
    char easy[20][40] = 
    {
        "######################################",
        "#                                    #",
        "#  P        #                        #",
        "#           #                        #",
        "#           #                        #",
        "#           # ######                 #",
        "#                                    #",
        "#                                    #",
        "#      # ######                      #",
        "#      #                             #",
        "#      #                     ###     #",
        "#      #                     ###     #",
        "#                            ###     #",
        "#                                    #",
        "#                ####                #",
        "#                #  #                #",
        "#                ####              O #",
        "#                                    #",
        "######################################",
    };
    
    char medium[20][40] =
    {
        "######################################",
        "#                 O                  #",
        "#                ###       #         #",
        "#                                    #",
        "#                     ####           #",
        "#                                    #",
        "#                #                   #",
        "#    ##             #                #",
        "#       #                            #",
        "#       #         # # #              #",
        "#                                    #",
        "#                #                   #",
        "#                #                   #",
        "#                                    #",
        "#        ##                          #",
        "#            #                    ####",
        "#          #                 #     P #",
        "#                 #          #       #",
        "######################################",
    };
    
    char hard[20][40] =
    {
        "######################################",
        "#                               P    #",
        "#                    #               #",
        "#       #                    ####### #",
        "#                  #                 #",
        "#      # ######              ###     #",
        "#      #                     #       #",
        "#      #           ####              #",
        "#                          ##        #",
        "#               ###                  #",
        "#         ##            #            #",
        "#         ##          # #            #",
        "#               #####                #",
        "#    ###                ############ #",
        "#    ###          ###                #",
        "#    ###              #         #### #",
        "#                     #       #   O  #",
        "#                                    #",
        "######################################",
    };
    
    void printWin()
    {
        printf(" __      __ __	 ___   __ __     __    __  ____  ____       __		\n");
        printf("|  |    |  |  | /   \\ |  |  |   |  |__|  ||    ||    \\     |  | 	\n");
        printf("|  |    |  |  ||     ||  |  |   |  |  |  | |  | |  _  |    |  |		\n");
        printf("|__|    |  ~  ||  O  ||  |  |   |  |  |  | |  | |  |  |    |__|		\n");
        printf(" __     |___, ||     ||  :  |   |  `  '  | |  | |  |  |     __ 		\n");
        printf("|  |    |     ||     ||     |    \\      /  |  | |  |  |    |  |	\n");
        printf("|__|    |____/  \\___/  \\__,_|     \\_/\\_/  |____||__|__|    |__|	\n");
    }
    
    
    void printInformation()
    {
        printf("\nW A S D to move\n\nLegends\n");
        printf("P player\nl mummy\nO escape");
        printf("\n\nPress ENTER to exit");
    }
    
    
    void showMaze(char maze[20][40])
    {
        for(int i=0; i<20; i++)
        {
            for(int j=0; j<40; j++)
            {
                printf("%c", maze[i][j]);
            }
            printf("\n");
        }
    }
    
    int main()
    {
    	printLabirinth();
    	printIntro();
    	
    	printf("\nPress any key to continue...");
    	getch();
    	
    	system("cls");
    
        char moveInput;
        
        int easyY = 2;
        int easyX = 2;
        
        int mediumY = 16;
        int mediumX = 35;
        
        int hardY = 1;
        int hardX = 32;
        
        int difficulty;
        int win = 0;
    
        do
    	{
            printLabirinth();
    
            printf("Difficulty Level\n");
            printf("--------------------\n");
            printf("1. Easy\n2. Medium\n3. Hard\nChoose your difficulty (0 to exit): ");
    
            scanf("%d", &difficulty);
            getchar();
            system("cls");
    
            switch(difficulty)
    		{
                case 1:
                    system("cls");
                    showMaze(easy);
                    printInformation();
    
                    do
    				{
                        moveInput = _getch();
    
                        switch (moveInput)
    					{
                            case 'w':
                                if(easy[easyY - 1][easyX] != '#')
    							{
                                    easy[easyY][easyX] = ' ';
                                    easyY--;
                                    easy[easyY][easyX] = 'P';
    							}
    
                                break;
                            case 'a':
                                if(easy[easyY][easyX - 1] != '#')
    							{
                                    easy[easyY][easyX] = ' ';
                                    easyX--;
                                    easy[easyY][easyX] = 'P';
    							}
    
                                break;
                            case 's':
                                if(easy[easyY + 1][easyX] != '#')
    							{
                                    easy[easyY][easyX] = ' ';
                                    easyY++;
                                    easy[easyY][easyX] = 'P';
    							}
    
                                break;
                            case 'd':
                                if(easy[easyY][easyX + 1] != '#')
    							{
                                    easy[easyY][easyX] = ' ';
                                    easyX++;
                                    easy[easyY][easyX] = 'P';
    							}
    
                                break;
                            default:
                                break;
                        }
    
                        system("cls");
                        showMaze(easy);
                        printInformation();
                        
                    }while(easyY != 16 || easyX != 35);
                    
                    system("cls");
                    
                    printWin();
                    
                    return 0;
    
                    break;
                    
                case 2:
                    system("cls");
                    showMaze(medium);
                    printInformation();
                    
                    do
    				{
                        moveInput = _getch();
    
                        switch (moveInput)
    					{
                            case 'w':
                                if(medium[mediumY - 1][mediumX] != '#')
    							{
                                    medium[mediumY][mediumX] = ' ';
                                    mediumY--;
                                    medium[mediumY][mediumX] = 'P';
    							}
    
                                break;
                            case 'a':
                                if(medium[mediumY][mediumX - 1] != '#')
    							{
                                    medium[mediumY][mediumX] = ' ';
                                    mediumX--;
                                    medium[mediumY][mediumX] = 'P';
    							}
    
                                break;
                            case 's':
                                if(medium[mediumY + 1][mediumX] != '#')
    							{
                                    medium[mediumY][mediumX] = ' ';
                                    mediumY++;
                                    medium[mediumY][mediumX] = 'P';
    							}
    
                                break;
                            case 'd':
                                if(medium[mediumY][mediumX + 1] != '#')
    							{
                                    medium[mediumY][mediumX] = ' ';
                                    mediumX++;
                                    medium[mediumY][mediumX] = 'P';
    							}
    
                                break;
                            default:
                                break;
                        }
    
                        system("cls");
                        showMaze(medium);
                        printInformation();
                        
                    }while(mediumY != 1 || mediumX != 18);
                    
                    system("cls");
                    
                    printWin();
                    
                    return 0;
    
                    break;
                    
                case 3:
                    system("cls");
                    showMaze(hard);
                    printInformation();
                    
                    do
    				{
                        moveInput = _getch();
    
                        switch (moveInput)
    					{
                            case 'w':
                                if(hard[hardY - 1][hardX] != '#')
    							{
                                    hard[hardY][hardX] = ' ';
                                    hardY--;
                                    hard[hardY][hardX] = 'P';
    							}
    
                                break;
                            case 'a':
                                if(hard[hardY][hardX - 1] != '#')
    							{
                                    hard[hardY][hardX] = ' ';
                                    hardX--;
                                    hard[hardY][hardX] = 'P';
    							}
    
                                break;
                            case 's':
                                if(hard[hardY + 1][hardX] != '#')
    							{
                                    hard[hardY][hardX] = ' ';
                                    hardY++;
                                    hard[hardY][hardX] = 'P';
    							}
    
                                break;
                            case 'd':
                                if(hard[hardY][hardX + 1] != '#')
    							{
                                    hard[hardY][hardX] = ' ';
                                    hardX++;
                                    hard[hardY][hardX] = 'P';
    							}
    
                                break;
                            default:
                                break;
                        }
    
                        system("cls");
                        showMaze(hard);
                        printInformation();
                        
                    }while(hardY != 16 || hardX != 34);
                    
                    system("cls");
                    
                    printWin();
                    
                    return 0;
    
                    break;
                    
                default:
                    break;
            }
    
        } while (difficulty != 0);
    
        return 0;
    }
                        

    Golden Tickets

    Golden Tickets is one of the C programs I designed to solve a competition problem. The goal of the program is to determine which teams are eligible for "Golden Tickets" to participate in The ICPC Asia Jakarta 2023, adhering to specific institutional and ranking criteria.


    The program processes data about N teams, their ranks, and their respective institutions. It first identifies the top M teams eligible by default. Then, it strategically selects up to K additional teams from institutions not represented in the top M, ensuring that only one team per institution receives a Golden Ticket. These selected teams are then sorted by their ranking and displayed.

    
    #include <stdio.h>
    #include <string.h>
    
    int main() {
        int N, M, K;
        scanf("%d %d %d", &N, &M, &K);
    
        char team_names[N][101];
        char institutions[N][101];
    
        for(int i=0; i<N; i++)
        {
            scanf(" %s %s", team_names[i], institutions[i]);
        }
        
        char uneligible_institutions[M][101];
        int uneligible_count;
        
        for(int i=0; i<M; i++)
        {
            strcpy(uneligible_institutions[i], institutions[i]);
            uneligible_count++;
        }
        
        int golden_tickets_count = 0;
        char golden_tickets_teams[N][101];
        int institution_won[N];
    
        for(int i=0; i<N; i++)
        {
            institution_won[i] = 0;
        }
        
        for(int i=0; i<N; i++)
        {
            if(golden_tickets_count < K)
            {
                int is_unelegible = 0;
                
                for(int j=0; j<uneligible_count; j++)
                {
                    if(strcmp(institutions[i], uneligible_institutions[j]) == 0)
                    {
                        is_unelegible = 1;
                        break;
                    }
                }
                            
                if(!is_unelegible && !institution_won[i])
                {
                    strcpy(golden_tickets_teams[golden_tickets_count], team_names[i]);
                    golden_tickets_count++;
                    
                    strcpy(uneligible_institutions[uneligible_count], institutions[i]);
                    uneligible_count++;
                }
            }
        }
        
        printf("%d\n", golden_tickets_count);
        
        for(int i=0; i<golden_tickets_count; i++)
        {
            printf("%s\n", golden_tickets_teams[i]);
        }
        
    
        return 0;
    }
                            
                        

    Diet Plan

    Diet Plan is one of the C programs developed to solve a competition problem. The program calculates the maximum number of days a person can adhere to a specific diet plan while managing limited resources: milk and biscuits.


    The problem involves a sequence of daily milk requirements, where the program strategically allocates milk and substitutes biscuits to maximize the number of consecutive days the diet plan is followed. If the resources are exhausted, the program outputs the total number of successfully completed days.

    
    #include <stdio.h>
    
    int main()
    {
        int N = 0, M = 0, K = 0;
        scanf("%d %d %d", &N, &M, &K);
        
        int P[N+1] = {0};
        
        for (int i = 0; i < N; i++)
        {
            scanf("%d", &P[i]);
        }
    
        int i = 0;
        
        for(i=0; i<N; i++)
        {
            int max = 0;
            int index = 0;
            M -= P[i];
            
            if(M >= 0)
            {
                continue;
            }
            else if(K > 0)
            {
                K--;
                for(int j=0; j<=i; j++)
                {
                    if(max < P[j])
                    {
                        max = P[j];
                        index = j;
                    }
                }
                
                M += max;
                P[index] = 0;
            }
            else
            {
                printf("%d\n", i);
                break;
            }
        }
        
        if(i == N)
        {
            printf("%d\n", N);
        }
    
        return 0;
    }
                            
                        

    Horse Carts

    Horse Carts is one of the C programs I designed to solve a competition problem. The program calculates the maximum total value of treasures that can be transported using a limited number of horse carts, each with specific weight limits.


    The problem involves matching treasures with carts based on their weights and values, optimizing for the highest value while adhering to the weight constraints of each cart. The program uses sorting and greedy selection strategies to achieve an efficient solution.

    
    #include <stdio.h>
    #include <stdlib.h>
    
    struct Treasure
    {
        int weight;
        int value;
        int index;
        int taken;
    };
    
    int compare(const void *a, const void *b)
    {
        return ((struct Treasure *)b)->value - ((struct Treasure *)a)->value;
    }
    
    int compareWeight(const void *a, const void *b)
    {
        return ((struct Treasure *)a)->weight - ((struct Treasure *)b)->weight;
    }
    
    void swap(struct Treasure *a, struct Treasure *b)
    {
        struct Treasure temp = *a;
        *a = *b;
        *b = temp;
    }
    
    int main()
    {
        int N, M;
    
        scanf("%d %d", &N, &M);
    
        struct Treasure treasures[N];
        for (int i=0; i<N; i++)
        {
            scanf("%d %d", &treasures[i].weight, &treasures[i].value);
            treasures[i].index = i + 1;
            treasures[i].taken = 0;
        }
    
        qsort(treasures, N, sizeof(struct Treasure), compare);
    
        int S[M];
        for (int j = 0; j < M; j++)
        {
            scanf("%d", &S[j]);
        }
    
        qsort(S, M, sizeof(int), compareWeight);
    
        int total_treasure = 0;
        
        for (int j=0; j<M; j++)
        {
            for (int i=0; i<N; i++)
            {
                if (S[j] >= treasures[i].weight && treasures[i].taken == 0)
                {
                    total_treasure += treasures[i].value;
                    treasures[i].taken = 1;
                    
                    break;
                }
            }
        }
    
        printf("%d\n", total_treasure);
    
        return 0;
    }
                            
                        

    Services

    These are the professional skills and expertise I offer to assist individuals, teams, and businesses. These services have been honed through the development of both my soft and hard skills, gained through continuous learning and experience.

    Coding Instructor/Teacher


    I am prepared to offer personalized education and mentorship tailored to individual learning styles and goals. My expertise spans key areas including Algorithms & Programming, UI/UX Design, and Software Development.


    Why choose me?

  • Expertise and Customization: Leveraging my technical knowledge gained from university studies and hands-on experiences, I am equipped to create customized learning plans for each student. Whether you're beginning your journey in tech or seeking to advance in specific areas, I adapt teaching strategies to meet your unique needs.
  • Engaging and Supportive Environment: I am committed to fostering a supportive and interactive learning environment. My aim is to make learning both effective and enjoyable, ensuring that students not only acquire essential knowledge but also feel encouraged and motivated throughout their journey.
  • Bilingual Education: Fluent in both English and Indonesian, I can conduct lessons in either language, accommodating a diverse student base and enriching the learning experience.
  • Open-Minded and Adaptive: I embrace new methods and ideas in education, using traditional and modern teaching techniques to align with the evolving educational landscape. My approach is flexible, making it suitable for learners of all ages—from young students to adult learners. This adaptability ensures that I can effectively communicate complex concepts to any generation, fostering an inclusive learning environment that respects and addresses diverse educational needs.
  • Soft Skills Integration: Alongside technical expertise, I emphasize the development of soft skills such as critical thinking, problem-solving, public speaking and effective communication, which are crucial for succeeding in this field.
  • Coding Instructor

    Web Developer


    I offer tailored web development services that cater to the specific needs of clients. My expertise encompasses front-end and back-end development, ensuring a comprehensive approach to building websites that are not only visually appealing but also functionally robust.


    Why choose me?

  • Technical Proficiency and Innovation: With a solid foundation in computer science and specialized skills in HTML, CSS, JavaScript, and various backend technologies, I create cutting-edge websites that meet modern standards.
  • User-Centric Design: My UI/UX design experience enables me to craft intuitive and engaging interfaces that enhance user satisfaction and drive interaction. I focus on creating seamless user experiences with a keen eye for design aesthetics and usability.
  • Responsive and Adaptive: I develop websites that are responsive and accessible across all devices and platforms. This flexibility ensures a uniform experience for all users, adapting to different screen sizes and orientations without compromising functionality.
  • Collaborative Development Process: I believe in working closely with clients to ensure that their visions are transformed into reality. My development process is transparent and involves regular updates and feedback cycles, ensuring alignment with client expectations at every stage.
  • Web Development

    UI/UX Designer


    I specialize in creating user-centered design solutions that enhance user experience and engagement. My approach involves understanding user needs and business goals to deliver intuitive and aesthetically pleasing interfaces.


    Why choose me?

  • knowledgable in User Experience Design: Leveraging my educational background and practical experience, I craft interfaces that are not only visually appealing but also user-friendly. I focus on the usability aspects of design, ensuring that users can navigate and interact with products seamlessly.
  • Customization and Creativity: I pride myself on creating customized solutions that reflect the client’s brand and meet specific user needs. My creative process involves brainstorming, ideation, and iterative design, allowing for flexibility and innovation in every project.
  • Responsive and Interactive Designs: I design with responsiveness in mind, ensuring that all interfaces perform well on various devices and platforms.
  • Cross-Disciplinary Collaboration: My ability to work cross-functionally with developers, marketers, and product managers ensures that the design aligns with all aspects of product development.
  • Skill Development and Knowledge Sharing: Committed to staying at the forefront of design trends and technologies, I continuously update my skills and knowledge.
  • UI/UX Design

    Ways to Connect with Me

    Feel free to reach out through any of the platforms below. I’d love to hear from you!

    Or connect with me on social media:

    Download My CV

    Looking to learn more about my experience and skills? You can preview or download my latest CV below:

    Thank You for Visiting!

    Feel free to connect with me, and I look forward to collaborating with you!

    Thank You