GNU/Linux >> Belajar Linux >  >> Linux

Cetak salam Halloween dengan seni ASCII di Linux

Seni ASCII penuh warna dulu cukup populer di DOS, yang dapat memanfaatkan rangkaian karakter ASCII yang diperluas dan koleksi elemen gambarnya. Anda dapat menambahkan sedikit ketertarikan visual ke program FreeDOS berikutnya dengan menambahkan seni ASCII sebagai layar "selamat datang" yang keren atau sebagai layar "keluar" yang berwarna-warni dengan informasi lebih lanjut tentang program tersebut.

Tetapi gaya seni ASCII ini tidak terbatas hanya pada aplikasi FreeDOS. Anda dapat menggunakan metode yang sama dalam program mode terminal Linux. Sementara Linux menggunakan ncurses untuk mengontrol layar alih-alih conio DOS, konsep terkait berlaku baik untuk program Linux. Artikel ini membahas cara menghasilkan seni ASCII berwarna-warni dari program C.

Lebih banyak sumber daya Linux

  • Lembar contekan perintah Linux
  • Lembar contekan perintah Linux tingkat lanjut
  • Kursus online gratis:Ikhtisar Teknis RHEL
  • Lembar contekan jaringan Linux
  • Lembar contekan SELinux
  • Lembar contekan perintah umum Linux
  • Apa itu container Linux?
  • Artikel Linux terbaru kami

File seni ASCII

Anda dapat menggunakan berbagai alat untuk menggambar seni ASCII Anda. Untuk contoh ini, saya menggunakan aplikasi DOS lama bernama TheDraw, tetapi Anda dapat menemukan program seni ASCII open source modern di Linux, seperti Moebius (lisensi Apache) atau PabloDraw (lisensi MIT). Tidak masalah alat apa yang Anda gunakan selama Anda tahu seperti apa tampilan data yang disimpan.

Berikut adalah bagian dari contoh file seni ASCII, disimpan sebagai kode sumber C. Perhatikan bahwa cuplikan kode menentukan beberapa nilai:IMAGEDATA_WIDTH dan IMAGEDATA_DEPTH menentukan jumlah kolom dan baris di layar. Dalam hal ini, ini adalah "gambar" seni ASCII 80x25. IMAGEDATA_LENGTH mendefinisikan jumlah entri dalam IMAGEDATA Himpunan. Setiap karakter dalam layar seni ASCII dapat diwakili oleh dua byte data:Karakter yang akan ditampilkan dan atribut warna yang berisi warna latar depan dan latar belakang untuk karakter tersebut. Untuk layar 80x25, di mana setiap karakter dipasangkan dengan atribut, lariknya berisi 4000 entri (yaitu 80 * 25 * 2 =4000).

#define IMAGEDATA_WIDTH 80
#define IMAGEDATA_DEPTH 25
#define IMAGEDATA_LENGTH 4000
unsigned char IMAGEDATA [] ={
    '.', 0x08,  ' ', 0x08 ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,
    ' ', 0x08,  ' ', 0x08,  '.', 0x0F,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,
    ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  '.', 0x0F,
    ' ', 0x08,  ' ' , 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,
    ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ' 0x08,  ' ', 0x08,

dan seterusnya untuk sisa array.

Untuk menampilkan seni ASCII ini ke layar, Anda perlu menulis program kecil untuk membaca array dan mencetak setiap karakter dengan warna yang tepat.

Menyetel atribut warna

Atribut warna dalam file seni ASCII ini mendefinisikan warna latar belakang dan latar depan dalam satu byte, yang diwakili oleh nilai heksadesimal seperti 0x08 atau 0x6E . Heksadesimal ternyata menjadi cara ringkas untuk mengekspresikan "pasangan" warna seperti ini.

Sistem mode karakter seperti ncurses di Linux atau conio di DOS hanya dapat menampilkan enam belas warna. Itu enam belas kemungkinan warna teks dan delapan warna latar belakang. Menghitung enam belas nilai (dari 0 hingga 15) dalam biner hanya membutuhkan empat bit:

  • 1111 adalah 16 dalam biner

Dan mudahnya, heksadesimal dapat mewakili 0 hingga 15 dengan satu karakter:0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, dan F. Jadi nilainya F dalam heksadesimal adalah angka 15, atau 1111 dalam biner.

Dengan pasangan warna, Anda dapat mengkodekan warna latar belakang dan latar depan dalam satu byte delapan bit. Itu empat bit untuk warna teks (0 hingga 15 atau 0 hingga F dalam heksadesimal) dan tiga bit untuk warna latar belakang (0 hingga 7 atau 0 hingga E dalam heksadesimal). Bit sisa dalam byte tidak digunakan di sini, jadi kita bisa mengabaikannya.

Untuk mengonversi pasangan warna atau atribut menjadi nilai warna yang dapat digunakan program Anda, Anda harus menggunakan bit mask untuk menentukan hanya bit yang digunakan untuk warna teks atau warna latar belakang. Menggunakan OpenWatcom C Compiler di FreeDOS, Anda dapat menulis fungsi ini untuk mengatur warna dengan tepat dari atribut warna:

void
textattr(int newattr)
{
  _settextcolor(newattr &15); /* 0000xxxx */
  _setbkcolor((newattr>> 4) &7); /* 0xxx0000 */
}

_settextcolor fungsi hanya mengatur warna teks, dan _setbkcolor fungsi mengatur warna latar belakang. Keduanya didefinisikan dalam graph.h . Perhatikan bahwa karena atribut warna menyertakan warna latar belakang dan warna latar depan dalam satu nilai byte, textattr fungsi menggunakan & (biner DAN) untuk menyetel topeng bit yang mengisolasi hanya empat bit terakhir dalam atribut. Di situlah pasangan warna menyimpan nilai 0 hingga 15 untuk warna latar depan.

Untuk mendapatkan warna latar belakang, fungsi tersebut terlebih dahulu melakukan sedikit shift untuk “mendorong” bit ke kanan. Ini menempatkan bit "atas" ke dalam kisaran bit "bawah", jadi bit apa pun seperti 0xxx0000 menjadi 00000xxx sebagai gantinya. Kita dapat menggunakan topeng bit lain dengan 7 (biner 0111 ) untuk memilih nilai warna latar belakang.

Menampilkan seni ASCII

IMAGEDATA array berisi seluruh layar seni ASCII dan nilai warna untuk setiap karakter. Untuk menampilkan seni ASCII ke layar, program Anda perlu memindai larik, menyetel atribut warna, lalu menampilkan layar satu karakter dalam satu waktu.

Mari tinggalkan ruang di bagian bawah layar untuk pesan atau permintaan terpisah kepada pengguna. Artinya, daripada menampilkan 25 baris dari layar ASCII 80 kolom, saya hanya ingin menampilkan 24 baris pertama.

  /* mencetak satu baris kurang dari 80x25 yang ada di sana:
     80 x 24 x 2 =3840 */

  for (pos =0; pos <3840; pos +=2) {
...
  }

Di dalam for loop, kita perlu mengatur warna, lalu mencetak karakter. OpenWatcom C Compiler menyediakan fungsi _outtext untuk menampilkan teks dengan nilai warna saat ini. Namun, ini membutuhkan melewatkan string dan akan menjadi tidak efisien jika kita perlu memproses setiap karakter satu per satu, jika setiap karakter pada baris membutuhkan warna yang berbeda.

Sebaliknya, OpenWatcom memiliki fungsi serupa yang disebut _outmem yang memungkinkan Anda untuk menunjukkan berapa banyak karakter yang akan ditampilkan. Untuk satu karakter pada satu waktu, kami dapat memberikan pointer ke nilai karakter di IMAGEDATA array dan beri tahu _outtext untuk menunjukkan hanya satu karakter. Itu akan menampilkan karakter menggunakan atribut warna saat ini, yang kita butuhkan.

  for (pos =0; pos <3840; pos +=2) {
    ch =&IMAGEDATA[pos]; /* penunjukan penunjuk */
    attr =IMAGEDATA[pos + 1];
 
    textattr(attr);
    _outmem(ch, 1);
  }

for . yang diperbarui ini loop menyetel karakter ch dengan menetapkan pointer ke IMAGEDATA Himpunan. Selanjutnya, loop menyetel atribut teks, dan kemudian menampilkan karakter dengan _outmem .

Menggabungkan semuanya

Dengan textattr fungsi dan for loop untuk memproses array, kita dapat menulis program lengkap untuk menampilkan konten file seni ASCII. Untuk contoh ini, simpan seni ASCII sebagai imgdata.inc dan sertakan dalam file sumber dengan #include pernyataan.

#include 
#include
#include

#include "imgdata.inc"

void
textattr(int newattr)
{
  _settextcolor(newattr &15); /* 0000xxxx */
  _setbkcolor((newattr>> 4) &7); /* 0xxx0000 */
}

int
main()
{
  char *ch;
  int attr;
int pos;

  if (_setvideomode(_TEXTC80) ==0) {
    fputs("Error setting video mode", stderr);
    return 1;
  }

  /* menggambar array */

  _settextposition(1, 1); /* kiri atas */

  /* mencetak satu baris kurang dari 80x25 yang ada di sana:
     80 x 24 x 2 =3840 */

  for ( pos =0; pos <3840; pos +=2) {
    ch =&IMAGEDATA[pos]; /* penunjukan penunjuk */
    attr =IMAGEDATA[pos + 1];

    textattr(attr);
    _outmem(ch, 1);
  }

  /* selesai */

  _settextposition(25, 1); /* kiri bawah */

  textattr(0x0f);
  _outtext("Tekan sembarang tombol untuk keluar");

  getch();

  textattr(0x00);
  return 0;
}

Kompilasi program menggunakan OpenWatcom C Compiler di FreeDOS, dan Anda akan mendapatkan program baru yang menampilkan pesan liburan ini:

Selamat Halloween, semuanya!

Unduh file kode INC di sini.

Unduh file kode C di sini.

imgdata.inc_.txt hallown.c.txt
Linux
  1. Cara Mengurai Dan Mencetak JSON Dengan Alat Baris Perintah Linux

  2. Perintah JQ di Linux dengan Contoh

  3. Linux – Bagaimana Menggabungkan Pohon Dengan Ukuran Direktori?

  1. Manajemen paket Linux dengan apt

  2. Cetak hanya kata-kata dengan Huruf Kapital (Linux)

  3. Cara mencetak range alamat IP dengan perintah seq Linux

  1. Buat musik di Linux dengan Ardor

  2. Edit audio di Linux dengan Audacity

  3. Instal aplikasi di Linux dengan Flatpak