成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在 Linux 上用 ASCII 藝術(shù)打印萬(wàn)圣節(jié)問候語(yǔ)

系統(tǒng) Linux 后端
利用擴(kuò)展 ASCII 字符集和它的繪畫元素集合的全彩 ASCII 藝術(shù)在 DOS 上曾經(jīng)相當(dāng)流行。你可以在你的下一個(gè) FreeDOS 程序中加入 ASCII 藝術(shù),作為一個(gè)很酷的“歡迎”屏幕,或者作為一個(gè)提供了更多程序信息的彩色“退出”屏幕,來(lái)增加一點(diǎn)視覺上的樂趣。

[[432540]]

使用 Linux 或 FreeDOS 從一個(gè) C 程序中生成彩色的 ASCII 藝術(shù)。

利用擴(kuò)展 ASCII 字符集和它的繪畫元素集合的全彩 ASCII 藝術(shù)在 DOS 上曾經(jīng)相當(dāng)流行。你可以在你的下一個(gè) FreeDOS 程序中加入 ASCII 藝術(shù),作為一個(gè)很酷的“歡迎”屏幕,或者作為一個(gè)提供了更多程序信息的彩色“退出”屏幕,來(lái)增加一點(diǎn)視覺上的樂趣。

但是,這種 ASCII 藝術(shù)的風(fēng)格并不僅僅局限于 FreeDOS 程序。你可以在 Linux 終端模式的程序中使用同樣的方法。雖然 Linux 使用 ncurses 來(lái)控制屏幕,而不是 DOS 的 conio,但相關(guān)的概念也適用于 Linux 程序。本文探討了如何從 C 語(yǔ)言程序中生成彩色 ASCII 藝術(shù)。

ASCII 藝術(shù)文件

你可以使用各種工具來(lái)繪制你的 ASCII 藝術(shù)。在這個(gè)例子中,我使用了一個(gè)叫做 TheDraw 的老式 DOS 應(yīng)用程序,但是你可以在 Linux 上找到現(xiàn)代的開源 ASCII 藝術(shù)程序,比如 Moebius(Apache 許可證)或者 PabloDraw(MIT 許可證)。只要你知道保存的數(shù)據(jù)是什么樣子的,你使用什么工具并不重要。

下面是一個(gè) ASCII 藝術(shù)文件樣本的一部分,以 C 源代碼保存。請(qǐng)注意,這個(gè)代碼片段定義了幾個(gè)值。IMAGEDATA_WIDTH 和 IMAGEDATA_DEPTH 定義了屏幕上的列數(shù)和行數(shù)。在這里,它是一個(gè) 80x25 的 ASCII 藝術(shù)“圖像”。IMAGEDATA_LENGTH 定義了 IMAGEDATA 數(shù)組中的條目數(shù)量。ASCII 藝術(shù)畫面中的每個(gè)字符可以用兩個(gè)字節(jié)的數(shù)據(jù)表示。要顯示的字符和包含該字符的前景和背景顏色的顏色屬性。對(duì)于一個(gè) 80x25 的屏幕,每個(gè)字符都與一個(gè)屬性配對(duì),該數(shù)組包含 4000 個(gè)條目(即 80*25*2=4000)。

  1. #define IMAGEDATA_WIDTH 80
  2. #define IMAGEDATA_DEPTH 25
  3. #define IMAGEDATA_LENGTH 4000
  4. unsigned char IMAGEDATA [] = {
  5.     '.', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,
  6.     ' ', 0x08,  ' ', 0x08,  '.', 0x0F,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,
  7.     ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  '.', 0x0F,
  8.     ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,
  9.     ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,  ' ', 0x08,

數(shù)組的其它部分依此類推。

為了在屏幕上顯示這種 ASCII 藝術(shù),你需要寫一個(gè)小小的程序來(lái)讀取數(shù)組并以正確的顏色打印每個(gè)字符。

設(shè)置一個(gè)顏色屬性

這個(gè) ASCII 藝術(shù)文件中的顏色屬性在一個(gè)字節(jié)中定義了背景和前景的顏色,用十六進(jìn)制的值表示,如 0x08 或 0x6E。十六進(jìn)制是適合表達(dá)這樣的顏色“對(duì)”的緊湊方式。

像 Linux 上的 ncurses 或 DOS 上的 conio 這樣的字符模式系統(tǒng) 只能顯示 16 種顏色。這就是十六種可能的文本顏色和八種背景顏色。用二進(jìn)制計(jì)算十六個(gè)值(從 0 到 15)只需要四個(gè)二進(jìn)制位。

1111 是二進(jìn)制的 15

而且方便的是,十六進(jìn)制可以用一個(gè)字符表示 0 到 15:0123456789ABCDE 和 F。所以十六進(jìn)制的值 F 是數(shù)字 15,或二進(jìn)制的 1111

通過(guò)顏色對(duì),你可以用一個(gè)八位的字節(jié)來(lái)編碼背景和前景的顏色。這就是文本顏色的四個(gè)二進(jìn)制位(十六進(jìn)制中的 0 到 15 或 0 到 F)和背景顏色的三個(gè)二進(jìn)制位(十六進(jìn)制中的 0 到 7 或 0 到 E)。字節(jié)中剩余的二進(jìn)制位在這里沒有使用,所以我們可以忽略它。

為了將顏色對(duì)或?qū)傩赞D(zhuǎn)換成你的程序可以使用的顏色值,你需要 使用位掩碼,只指定用于文字顏色或背景顏色的位。使用 FreeDOS 上的 OpenWatcom C 編譯器,你可以編寫這個(gè)函數(shù),從顏色屬性中適當(dāng)?shù)卦O(shè)置顏色。

  1. void
  2. textattr(int newattr)
  3. {
  4. _settextcolor(newattr & 15); /* 0000xxxx */
  5. _setbkcolor((newattr >> 4) & 7); /* 0xxx0000 */
  6. }

_settextcolor 函數(shù)只設(shè)置文本顏色,_setbkcolor 函數(shù)設(shè)置背景顏色。兩者都定義在 graph.h 中。注意,由于顏色屬性在一個(gè)字節(jié)值中包括了背景色和前景色,textattr 函數(shù)使用 &(二進(jìn)制的“與”運(yùn)算)來(lái)設(shè)置一個(gè)位掩碼,只隔離了屬性中的最后四個(gè)位。這就是顏色對(duì)存儲(chǔ)前景顏色的值 0 到 15 的地方。

為了得到背景色,該函數(shù)首先執(zhí)行了一個(gè)位移,將位“推”到右邊。這就把“上”位放到了“下”位范圍,所以任何像 0xxx0000 這樣的位都變成了 00000xxx。我們可以用另一個(gè)的位掩碼 7(二進(jìn)制 0111)來(lái)挑選出背景顏色值。

顯示 ASCII 藝術(shù)

IMAGEDATA 數(shù)組包含整個(gè) ASCII 藝術(shù)屏幕和每個(gè)字符的顏色值。為了在屏幕上顯示 ASCII 藝術(shù),你的程序需要掃描該數(shù)組,設(shè)置顏色屬性,然后一次在屏幕上顯示一個(gè)字符。

讓我們?cè)谄聊坏牡撞苛舫隹臻g,以便向用戶提供單獨(dú)的信息或提示。也就是說(shuō),我不想顯示一個(gè) 80 列 ASCII 屏幕的所有 25 行,而只想顯示前 24 行。

  1. /* print one line less than the 80x25 that's in there:
  2. 80 x 24 x 2 = 3840 */
  3.  
  4. for (pos = 0; pos < 3840; pos += 2) {
  5. ...
  6. }

在 for 循環(huán)里面,我們需要設(shè)置顏色,然后打印字符。OpenWatcom C 編譯器提供了一個(gè)函數(shù) _outtext 來(lái)顯示帶有當(dāng)前顏色值的文本。然而,這需要傳遞一個(gè)字符串,如果我們需要一個(gè)一個(gè)地處理每個(gè)字符,在一行中的每個(gè)字符需要不同顏色的情況下,效率就會(huì)很低。

相反,OpenWatcom 有一個(gè)類似的函數(shù),叫做 _outmem,允許你指示要顯示多少個(gè)字符。對(duì)于一次一個(gè)字符,我們可以在 IMAGEDATA 數(shù)組中提供一個(gè)字符值的指針,并告訴 _outtext 只顯示一個(gè)字符。這將使用當(dāng)前的顏色屬性顯示該字符,這就是我們需要的。

  1. for (pos = 0; pos < 3840; pos += 2) {
  2. ch = &IMAGEDATA[pos]; /* pointer assignment */
  3. attr = IMAGEDATA[pos + 1];
  4. textattr(attr);
  5. _outmem(ch, 1);
  6. }

這個(gè)更新的 for 循環(huán)通過(guò)向 IMAGEDATA 數(shù)組分配一個(gè)指針來(lái)設(shè)置字符 ch。接下來(lái), 循環(huán)設(shè)置文本屬性, 然后用 _outmem 顯示字符.

整合起來(lái)

有了 textattr 函數(shù)和處理數(shù)組的 for 循環(huán), 我們可以編寫一個(gè)完整的程序來(lái)顯示 ASCII 藝術(shù)文件的內(nèi)容。對(duì)于這個(gè)例子,將 ASCII 藝術(shù)文件保存為 imgdata.inc,并用 #include 語(yǔ)句將其包含在源文件中。

  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <graph.h>
  4.  
  5. #include "imgdata.inc"
  6.  
  7. void
  8. textattr(int newattr)
  9. {
  10. _settextcolor(newattr & 15); /* 0000xxxx */
  11. _setbkcolor((newattr >> 4) & 7); /* 0xxx0000 */
  12. }
  13.  
  14. int
  15. main()
  16. {
  17. char *ch;
  18. int attr;
  19. int pos;
  20.  
  21. if (_setvideomode(_TEXTC80) == 0) {
  22. fputs("Error setting video mode", stderr);
  23. return 1;
  24. }
  25.  
  26. /* draw the array */
  27.  
  28. _settextposition(1, 1); /* top left */
  29.  
  30. /* print one line less than the 80x25 that's in there:
  31. 80 x 24 x 2 = 3840 */
  32.  
  33. for (pos = 0; pos < 3840; pos += 2) {
  34. ch = &IMAGEDATA[pos]; /* pointer assignment */
  35. attr = IMAGEDATA[pos + 1];
  36.  
  37. textattr(attr);
  38. _outmem(ch, 1);
  39. }
  40.  
  41. /* done */
  42.  
  43. _settextposition(25, 1); /* bottom left */
  44.  
  45. textattr(0x0f);
  46. _outtext("Press any key to quit");
  47.  
  48. getch();
  49.  
  50. textattr(0x00);
  51. return 0;
  52. }

在 FreeDOS 上使用 OpenWatcom C 編譯器編譯該程序,你會(huì)得到一個(gè)顯示這個(gè)節(jié)日信息的新程序。 

萬(wàn)圣節(jié)快樂(Jim Hall, CC-BY-SA 4.0)

萬(wàn)圣節(jié)快樂,各位!

 

 

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2022-10-30 12:57:31

UbuntuLinux

2018-04-17 09:20:35

Linux命令crypt

2015-10-29 11:43:40

易到

2015-11-04 15:10:25

Fedora 23FedoraLinux

2019-10-31 08:59:23

Python工具萬(wàn)圣節(jié)

2013-10-31 13:30:36

設(shè)計(jì)專題

2018-11-01 15:40:13

災(zāi)備

2012-10-31 13:52:50

筆記本

2011-11-01 09:35:48

2012-11-01 17:00:16

2016-10-31 17:57:32

萬(wàn)圣節(jié)三星

2013-11-15 13:13:30

微軟反Linux戰(zhàn)略

2012-10-29 14:37:25

華為

2021-11-01 07:33:02

Windows 10操作系統(tǒng)壁紙

2021-10-31 08:25:06

網(wǎng)絡(luò)釣魚木馬網(wǎng)絡(luò)攻擊

2013-10-31 13:03:58

釣魚網(wǎng)站趨勢(shì)科技

2023-01-10 08:30:05

2014-10-30 09:38:37

程序員萬(wàn)圣節(jié)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲综合在线播放 | 999国产精品视频 | 亚洲欧美日韩网站 | 91在线免费视频 | 99福利在线观看 | 红桃视频一区二区三区免费 | av天天看| 毛片大全 | 国产一区中文 | 在线久草 | 亚洲国产aⅴ精品一区二区 免费观看av | 欧美成人a | 日韩一级免费电影 | 国产精品免费大片 | 羞羞视频免费在线 | 成人18亚洲xxoo | 97伊人| 亚洲高清在线视频 | 久久99精品久久久久久国产越南 | 国产精品区二区三区日本 | 中文字幕视频一区 | 瑟瑟激情 | 欧美成人精品激情在线观看 | 亚洲一区不卡在线 | 激情小说综合网 | 亚洲欧美一区二区三区在线 | 四虎影院一区二区 | 午夜精品一区 | 国产精品色 | 欧美精品一区三区 | 久久五月婷 | 在线三级电影 | 亚洲国产成人精品女人久久久 | 365夜爽爽欧美性午夜免费视频 | 9999久久| 国产欧美日韩综合精品一区二区 | 国产精品美女久久久久 | 欧美又大粗又爽又黄大片视频 | 国内精品伊人久久久久网站 | 国产精品激情在线 | 日韩免费视频一区二区 |