C语言写一个环形广告跑马灯或改为表白系统

目录

EGE图形库

简介

下载地址

特别说明

环形广告跑马灯

演示视频:

EGE图形库简介

EGE的全称是Easy Graphics Engine,即简单图形引擎。其设计目标是为Windows平台下的C语言学习者提供一个类似于早期DOS(Disk Operating System,磁盘操作系统,微软公司在Windows之前的一个命令行字符界面的操作系统)环境下类似TC(Turbo C,DOS环境下一个好用简单易学的C语言学习开发环境,现在很少用)中的BGI(Borland公司的图形法接口)。

下载地址

(官网) ege20.08_all(推荐, 支持vs2010-vs2019以及devcpp,codeblocks等)

(百度网盘)https://pan.baidu.com/s/1qWxAgeK

其他下载 内置EGE最新版本DEV-C++ https://royqh.net/devcpp/download/

特别说明

代码主要源于《C语言从入门到实践》,其中作业一小部分的修改。

环形广告跑马灯

源代码:

#include <graphics.h>
#include <math.h>
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
#define DELAYTIME 50 //广告移动延时
​
#pragma  GCC diagnostic ignored  "-Wunused"
#pragma  GCC diagnostic ignored  "-Wunused-parameter"//禁用未适用的参数警告
//输出要显示的广告信息到msg数组中
void getinput(unsigned char msg[])
{
    char str[100];
    int isinputok=0;//是否输入全是汉字字符(英文字符必须为全角方式输入)
    
    /*利用EGE库提供的输入框输入待显示的汉字或全角英文字符
    进行输入容错处理,输入的字符串如果不满足条件,
    则继续输入,直到输入正确为止*/
    while(!isinputok){
        inputbox_getline("跑马灯广告发布系统","请输入待发布的广告信息\n必须全为汉字或全角英文字,输入完成请回车!",str,sizeof(str)/sizeof(*str));
        
        /*一个汉字占2个字节,每个字节的最高二进制位都是1
        看成无符号正数,都大于等于0x80*/
        isinputok=1;
        for(int i=0;i<(int)strlen(str);i++)
        {
            if((unsigned char)str[i]<0x80)
            {
                //检测输入串是否全为汉字或全角英文字符
                //若有一个不是,则输入失败
                isinputok=0;
                break;
            }
        }
    }
    strcpy((char*)msg,str);//将输入成功的待显示字符串复制到数组msg中
}
​
//读取广告msg字符串中所有字符点阵信息到mat数组中
void getmat(unsigned char mat[],unsigned char msg[])
{
    FILE *HZK;
    int i,j,k;
    unsigned char *p=mat;
    
    if((HZK=fopen("hzk16.txt","rb"))==NULL)
    {
        outtextxy(10,10,"汉字库文件读取失败!");
        exit(0);
    }
    
    for(k=0;k<(int)strlen((char*)msg)/2;k++)
    {
        i=msg[k*2]-0xa0;
        j=msg[k*2+1]-0xa0;//获得区码与位码
        fseek(HZK,(94*(i-1)+(j-1))*32,SEEK_SET);
        fread(p+k*32,32,1,HZK);
    }
    fclose(HZK);
}
​
//显示广告信息msg,其字符点阵在数组在mat中
void showonechar(int x,int y,int gap,unsigned char mat[],unsigned char msg[],color_t color)
{
    int i,j,k,t;
    for(i=0;i<16;i++)//控制输出16行
    {
        t=x;
        for(j=0;j<2;j++)//输出一个字符的2个字节
        {
            for(k=0;k<8;k++)//输出一个字节的8个像素点
            {
                if(mat[i*2+j]&(0x80>>k))
                {
                    putpixel(x,y,color);//输出黄色的像素点
                }
                else{
                    putpixel(x,y,RGB(0,0,0));//输出背景黑色的像素点
                }
                x=x+gap;//相邻两个像素点之间的距离
            }
        }
        x=t;
        y=y+gap;//像素行间距
    }
}
​
//显示广告信息
void showad(unsigned char mat[],unsigned char msg[])
{
    int x,y;
    
    int len=strlen((char *)msg)/2;
    randomize();//初始化随机种子
    color_t bkcolor=RGB(0,0,0);//背景黑色
    int gap=5;//像素建间距
    int r=300;//初始圆的半径
    int dir=1;//半径放大方向,1减小,-1放大
    int size;//一个汉字显示时占的像素宽或高
    
    while(1){
        for(int i=0;i<len;i++)
        {
        //(x,y)为一个汉字显示的像素矩形块的中心点的坐标
            x=(int)(640+r*sin(2*M_PI/len*i));
            y=(int)(400-r*cos(2*M_PI/len*i));
            
            //一个汉字显示的像素块的大小
            //一个汉字16*16点阵,加上像素点的间距
            //16个点有15个间距,间距大小为gap
            size=15*gap+16;
            
            //随机生成一个和背景颜色不同的颜色
            color_t color=RGB(random(255),random(255),random(255));
            while(color==bkcolor){
                color=RGB(random(255),random(255),random(255));
            }
            //显示一个字符
            showonechar(x-size/2,y-size/2,gap,&mat[i*32],&msg[i*2],color);
        }
        delay(100);
        
        r=r-20*dir;//更改半径大小
        
        if(r<=30)//达到最小,开始更改为增大的方向
        {
            r=r+20*dir;//恢复上次的r,保证r不小于30
            dir=-1;
            delay(100);//最小时多延迟1秒清屏
            cleardevice();
            
        }
        if(r>=230){//半径大于等于230时更改方向
        //  r=r-20*dir;
            dir=1;
            delay(100);
            cleardevice();
        }
    
        gap=r/70+1;//适当更改点阵中像素的间距
    }
}
​
int main(void)
{
    unsigned char mat[672];//最多20个汉字,每个汉字32字节,多一个32作为余量
    unsigned char msg[41];//最多20个汉字,如有英文字符,则用全角方式输入
    
    initgraph(1280,800);
    
    cleardevice();
    setcaption("跑马灯广告发布系统");
    
    getinput(msg);//获取待显示的字符串
    
    getmat(mat,msg);//获取字符串中所有字符的点阵信息保存到mat中
    
    showad(mat,msg);//显示环形广告
    
    closegraph();
    
    return 0;
}

点阵文件:HZK16.txt,有需求可以私聊我下载。

演示视频:

制作中......

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bjfu_yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值