Menyambung tulisan sebelumnya (Angka 0-9 Mantul Naik-Turun) yang membahas tentang program animasi angka 0-9 yang bergerak memantul-mantul secara bersamaan, maka kali ini kita akan membahas secara singkat tentang program animasi abjad A-Z yang ramai-ramai bergerak secara acak dalam 4 arah gerakan.

Program masih saya buat menggunakan Pelles C, yakni IDE dan kompiler C yang gratis bahkan untuk keperluan komersial.

Baca: Belajar Pemrograman Bahasa C di Windows? Pakai Pelles C Saja!

Teknik program animasi pada tulisan ini sama seperti sebelumnya, hanya saja pada contoh program ini objeknya lebih banyak yakni 26 objek dan masing-masing objek memiliki arah gerak yang terdiri dari: UPLEFT, UPRIGHT, DNRIGHT, dan DNLEFT.

Struktur Data

Untuk menyimpan data objek, program menggunakan tipe data struktur dengan 5 buah variabel yang menjadi properti objek yakni posisi kolom, posisi baris, arah gerak, karakter objek, dan warna objek. Berikut adalah kode program deklarasi tipe datanya.

typedef struct
{
  unsigned int x;
  unsigned int y;
  unsigned int arah;
  char abjad[1];
  unsigned int warna;
} STRUCT_ALPHABET;

STRUCT_ALPHABET ALPHA[26];

Variabel ALPHA adalah variabel array yang menyimpan data 26 objek animasi dengan properti seperti struktur data di atas.

Skenario Program

Nah, agar memiliki gambaran tentang bagaimana nantinya program bekerja, maka berikut ini adalah skenario singkat program animasi 26 abjad (A-Z).

  1. Inisialisasi data.
  2. Tampilkan masing-masing objek (abjad) pada posisinya dengan atributnya masing-masing.
  3. Cek apakah posisi objek telah sampai pada tepi layar  console, jika IYA maka ubah arah gerakannya.
  4. Sleep(100) – tunda proses selama 100ms.
  5. Hapus objek di layar.
  6. Update posisi kolom dan posisi baris terbaru.
  7. Ulangi langkah ke-2 hingga tombol keyboard ditekan.

Kode Program

/*
  AlphabetMantul
  Abjad A-Z bergerak secara acak di layar dalam 4 arah
  Chandra MDE - telinks.wordpress.com
*/

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>

//Arah gerakan abjad
#define UPLEFT 1
#define UPRIGHT 2
#define DNRIGHT 3
#define DNLEFT 4

typedef struct
{
  unsigned int x;
  unsigned int y;
  unsigned int arah;
  char abjad;
  unsigned int warna;
} STRUCT_ALPHABET;

int i;
STRUCT_ALPHABET ALPHA[26];

void InitData(void)
{
  srand(GetTickCount()/1000.0);
  for (i=0; i<=25; i++)
  {
    ALPHA[i].x = (rand() % 70) + 5;
    ALPHA[i].y = (rand() % 20) + 3;
    ALPHA[i].arah = (rand() % 4) + 1;
    ALPHA[i].abjad = 65 + i;
    ALPHA[i].warna = (rand() % 15) + 1;
  }
}

void CetakAlphabets(void)
{
  for(i=0; i<=25; i++)
  {
    _gotoxy(ALPHA[i].x, ALPHA[i].y);
    _textcolor(ALPHA[i].warna);
    printf("%c", ALPHA[i].abjad);
  }
}

void HapusAlphabets(void)
{
  for(i=0; i<=25; i++)
  {
    _gotoxy(ALPHA[i].x, ALPHA[i].y);
    printf(" ");
  }
}

//PROGRAM UTAMA
int main(void)
{
  SetConsoleTitleA("Animasi Multi-Objek 26 Huruf Mantul Acak - Chandra MDE, telinks.wordpress.com");
  ShowCursor(FALSE);
  _textcolor(10);
  printf("26 Alphabet Mantul - Press any key to exit…");

  InitData();
  while(!_kbhit())
  {
    CetakAlphabets();

    //Update arah gerakan masing2 karakter jika telah mencapai tepi layar
    for(i=0; i<=25; i++)
    { 
      if (ALPHA[i].x==1)
      {
         if (ALPHA[i].arah==UPLEFT)
             ALPHA[i].arah = UPRIGHT;
         else if (ALPHA[i].arah==DNLEFT)
             ALPHA[i].arah = DNRIGHT;
      } 
      else if (ALPHA[i].x==79)
      {
         if (ALPHA[i].arah==UPRIGHT)
             ALPHA[i].arah = UPLEFT;
         if (ALPHA[i].arah==DNRIGHT)
             ALPHA[i].arah = DNLEFT;
      }
      if (ALPHA[i].y==2)
      {
         if (ALPHA[i].arah==UPRIGHT)
             ALPHA[i].arah = DNRIGHT;
         if (ALPHA[i].arah==UPLEFT)
             ALPHA[i].arah = DNLEFT;
      }
      else if (ALPHA[i].y==24)
      {
         if (ALPHA[i].arah==DNRIGHT)
             ALPHA[i].arah = UPRIGHT;
         if (ALPHA[i].arah==DNLEFT)
             ALPHA[i].arah = UPLEFT;
      }
      Sleep(0);
   }
   Sleep(100);
   HapusAlphabets();   //hapus tampilan karakter
 
  //Update karakter di posisi baru
  for (i=0; i<=25; i++)
  {
     switch (ALPHA[i].arah)
     {
         case UPLEFT:
             ALPHA[i].x = ALPHA[i].x - 1;
             ALPHA[i].y = ALPHA[i].y - 1;
             break;
         case UPRIGHT:
             ALPHA[i].x = ALPHA[i].x + 1;
             ALPHA[i].y = ALPHA[i].y - 1;
             break;
         case DNLEFT:
             ALPHA[i].x = ALPHA[i].x - 1;
             ALPHA[i].y = ALPHA[i].y + 1;
             break;
         case DNRIGHT:
             ALPHA[i].x = ALPHA[i].x + 1;
             ALPHA[i].y = ALPHA[i].y + 1;
             break;
      }
      Sleep(0);
    }   
  }
  return 0;
}

Fungsi InitData() memberikan nilai-nilai awal pada variabel-variabel objek yang sebagian besar adalah sebuah nilai integer yang dibangkitkan secara acak menggunakan fungsi pembangkit bilangan acak rand(). Untuk memastikan variasi keacakan nilai hasil fungsi generator bilangan acak rand(), maka digunakan fungsi srand() dengan bibit bilangan acak menggunakan fungsi GetTickCount() yang dibagi dengan bilangan 1000.0.

Fungsi CetakAlphabets() bertugas menampilkan abjad-abjad pada posisinya masing-masing dan dengan warna yang sesuai dengan properti warnanya masing-masing. Sedangkan fungsi HapusAlphabets() bertugas menghapus tampilan abjad-abjad sebelum proses update tampilan selanjutnya.

Fungsi WinAPI SetConsoleTitleA() digunakan untuk mengeset judul dari windows console, biar sedikit keren.

Dan berikut adalah screenshot lain ketika program sedang running.

Selama program berjalan, maka akan tampak 26 abjad dari A-Z yang bergerak secara acak dan akan memantul (berubah arah) jika telah sampai pada tepi layar.

Program sederhana ini cukup lumayan untuk materi pembelajaran bagi Pemula. Program melibatkan struct, array of struct, perulangan, if-else, switch-case, membangkitkan bilangan acak (random), Sleep() dan sedikit WinAPI.

Btw, Sleep(0) dalam perulangan digunakan untuk mengalihkan kontrol program kepada Windows agar Windows dapat memproses MESSAGE yang muncul. Ini berguna agar bilamana program kita macet, maka Windows tidak ikutan macet. Praktek ini tetap saya gunakan meskipun mungkin Windows sekarang sudah lebih tahan macet.

Semoga bermanfaat.

Pelatihan Privat Online Pemrograman dan Pembuatan Program C

Kami melayani Pelatihan Privat Pemrograman Bahasa C Tingkat Dasar dan juga melayani pembuatan program C untuk beberapa platform antara lain:

  • Windows, menggunakan Pelles C
  • Linux, menggunakan GCC
  • Mikrokontroler, menggunakan Arduino IDE dan AVR-GCC

Materi dapat diminta sesuai kebutuhan.

Info lebih lanjut mengenai Pelatihan Privat Pemrograman dan Pembuatan Program, silakan menghubungi nomor WhatsApp 0882-3560-7047.