當(dāng)前位置:首頁 > 公眾號精選 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]本項目是在Linux下實現(xiàn)的,實現(xiàn)效果就是在Linux終端上顯示一個方塊,方塊的大小由編寫者自行決定。


微信公眾號:嵌入式開發(fā)圈
關(guān)注可了解更多的教程。問題或建議,請公眾號留言;
如果你覺得本文對你有幫助,歡迎贊賞,點廣告就可以了噢!^^

▲長按圖片保存可分享至朋友圈


        

    彈彈方塊項目實現(xiàn)需求

    本項目是在Linux下實現(xiàn)的,實現(xiàn)效果就是在Linux終端上顯示一個方塊,方塊的大小由編寫者自行決定。然后畫一個方框,小方塊會在這個方框的范圍中來回彈,如圖3-7-12所示。

  

我們用上一篇文章的VT100控制碼來實現(xiàn)這個需求。

VT100控制碼表

項目實現(xiàn)步驟規(guī)劃

一、畫一個方框,從終端的哪一個位置(行,列)坐標(biāo)開始畫起,顏色又是什么?

二、畫一個方塊,方塊的起始位置,方塊的大小,方塊移動的方向,方塊的顏色是什么?

三、移動的時候,為了不要方塊留下移動的痕跡,那么需要清除方塊的痕跡,如何實現(xiàn)?

具體實現(xiàn)

一、方塊結(jié)構(gòu)體

 1struct block 
2{
3    int W ;   //方塊的寬度
4    int H ;   //方塊的高度
5    int row ; //方塊的起始坐標(biāo)row和col
6    int col ; 
7    int drow ; //方塊的移動方向drow和dcol
8    int dcol ; 
9    void (*show)(struct block block) ;  //方塊顯示
10    void (*clear)(struct block block); //方塊清除
11    void (*move)(struct block *block) ;  //方塊移動
12};

    該結(jié)構(gòu)體描述方塊的一切信息,包括顯示的位置、方塊的大小、移動的方向以及方塊的顏色。   

二、操作方塊的API函數(shù)

 1//顯示邊框的函數(shù)
2void show_map(void);
3//顯示方塊
4void show_block(struct block_t *array , int size);
5//清除方塊
6void clear_block(struct block_t *array , int size);
7//移動方塊
8void move_block(struct block_t *array , int size);
9//檢測方塊是否在邊框內(nèi)
10int  check_block(struct block_t *array , int size);

三、源代碼實現(xiàn) block.c

 1#include 
2#include 
3//窗體的大小
4#define     ROW    20
5#define     COL    60
6//定義延遲函數(shù)
7#define  msleep(x)    usleep(x*1000)
8
9
10//方塊操作結(jié)構(gòu)體
11struct block 
12{

13    int W ;   //方塊的寬度
14    int H ;   //方塊的高度
15    int row ; //方塊的起始坐標(biāo)row和col
16    int col ; 
17    int drow ; //方塊的移動方向drow和dcol
18    int dcol ; 
19    void (*show)(struct block block) ;  //方塊顯示
20    void (*clear)(struct block block); //方塊清除
21    void (*move)(struct block *block) ;  //方塊移動
22};
23
24void show_background(void);
25void show_block(struct block block);
26void clear_block(struct block block);
27void move_block(struct block *block);
28int main(void)
29
{
30    struct block b1 = {4,2,5,5,1,1,show_block , clear_block , move_block};
31    system(“clear”);
32    show_background();
33    printf("\033[?25l");
34    while(1)
35    {   
36        b1.show(b1);
37        msleep(100);    
38        b1.clear(b1);   
39        b1.move(&b1);
40    }
41    return 0 ; 
42}
43//顯示方塊
44void show_block(struct block block)
45
{
46    int i ,j ; 
47    for(i = 0 ; i < block.H ; i++)
48    {
49        for(j = 0 ; j < block.W ; j++)
50        {
51            printf("\033[%d;%dH\033[43m \033[0m" ,block.row+i, block.col+j);
52        }
53    }
54    fflush(stdout);
55}
56//清除方塊
57void clear_block(struct block block)
58
{
59    int i ,j ; 
60    for(i = 0 ; i < block.H ; i++)
61    {
62        for(j = 0 ; j < block.W ; j++)
63        {
64            printf("\033[%d;%dH \033[0m" ,block.row+i, block.col+j);
65        }
66    }
67    fflush(stdout);
68}
69//移動方塊
70void move_block(struct block *block)
71
{
72    if(block->row < 3 || block->row > ROW-block->H-1)
73        block->drow = -block->drow ; 
74    if(block->col < 3 || block->col > COL-block->W-1)
75        block->dcol = -block->dcol ; 
76
77    block->row += block->drow ; 
78    block->col += block->dcol ; 
79}
80//顯示背景
81void show_background(void)
82
{
83    int i ,j ; 
84    //畫出上下和左右邊框
85    for(i = 1 ; i <= ROW ; i++)
86    {
87        printf("\033[%d;1H\033[43m \033[0m" , i);
88        printf("\033[%d;%dH\033[43m \033[0m" , i , COL);
89    }
90
91    for(i = 1 ; i <= COL ; i++)
92    {
93        printf("\033[1;%dH\033[43m \033[0m" , i);
94        printf("\033[%d;%dH\033[43m \033[0m" ,ROW, i);
95    }
96}

    在Linux下,使用gcc命令編譯程序生成可執(zhí)行文件,然后運行。顯示效果如圖3-7-13所示:

    那么,如果我想一次性顯示多個同時移動的方塊呢?如何是兩個,該如何編寫程序呢?其實很簡單,多定義一個方塊結(jié)構(gòu)體。然后在循環(huán)中,調(diào)用對應(yīng)的顯示方塊,清除方塊,移動方塊的函數(shù)即可。再看看效果,如圖3-7-14所示。

1struct block b2 = {4,2,7,8,1,3,show_block , clear_block , move_block};

    程序還有許多的優(yōu)化方法,讀者可以自行發(fā)揮,修改以上源代碼。下面給讀者一個思考的空間,我們已經(jīng)學(xué)習(xí)過VT控制碼了,你能否改變方塊的顏色呢?還有,如果每次都像現(xiàn)在的一樣多定義一個結(jié)構(gòu)體,然后在主循環(huán)中調(diào)用,程序?qū)絹碓接纺[,能否設(shè)計新的程序架構(gòu)解決這個問題呢?

       本程序還有一個Window版本,讀者可以自行掃碼獲取。



免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉