美文网首页
网易C++--书籍练习案例01--字符雨动画--完成!

网易C++--书籍练习案例01--字符雨动画--完成!

作者: heiqimingren | 来源:发表于2020-11-08 18:45 被阅读0次

第一版本

#include<stdio.h>
#include<string.h>
#include<stdlib.h>    //清屏命令在这里。
#include <windows.h> //延时10毫秒-sleep,gotoxy函数
#include <iostream>
#include <conio.h>       //getch()----不用按回车,就可以输入字符。    
#include <graphics.h>      //EasyX库,所使用的!
#include <math.h>         //三角函数
#include <algorithm>      //sort函数排序方法,https://blog.csdn.net/BIGKALA/article/details/81624691,这是方法适用的地址
#include <time.h>


using namespace std;

#define High 800
#define Width 1000        //定义游戏画面尺寸
#define CharSize 25       //定义每个字符显示的大小

int main()
{
    int highNum = High / CharSize;           //高度可以存放的字符数量
    int widthNum = Width / CharSize;         //宽度,可以存放的字符数量

    //charRain存储对应字符矩阵中需要输出字符的ASCII码
    int charRain[High / CharSize][Width / CharSize];     //这里必须这么写。表达式必须含有常量值
    int CNum[Width / CharSize];       //宽度,可以存放的字符数量
    int i, j, x, y;

    srand((unsigned)time(NULL));         //设置随机函数种子

    //======================初始化字符矩阵
    for (i = 0; i < widthNum;i++)      //先进行每一行遍历   
    {
        CNum[i] = (rand() % (highNum * 9 / 10)) + highNum / 10;         //这一列的有效字符个数,也是随机的
        for (j = 0; j < CNum[i];j++)
        {
            charRain[j][i] = (rand() % 26) + 65;      //产生A-z的随机ascii码
        }
    }
    //======================初始化字符矩阵===结束

    //=====接下来,把这个二维矩阵画出来,显示出来========================
    initgraph(Width, High);
    BeginBatchDraw();
    setfont(25, 10, _T("Courier"));  //设置字体
    setcolor(GREEN);                 //设置颜色

    for (i = 0; i < widthNum;i++)          //输出整个字符矩阵
    {
        x = i*CharSize;                   //当前字符的x坐标
        for (j = 0; j < CNum[i];j++)
        {
            y = j*CharSize;                      //当前字符的y坐标
            outtextxy(x, y, charRain[j][i]);     //输出当前字符
        }
    }

    FlushBatchDraw();
    EndBatchDraw();

    //=====接下来,把这个二维矩阵画出来,显示出来========================
    getch();
    closegraph();
    return 0;

}

效果图


image.png

============================================================================

第二版本:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>    //清屏命令在这里。
#include <windows.h> //延时10毫秒-sleep,gotoxy函数
#include <iostream>
#include <conio.h>       //getch()----不用按回车,就可以输入字符。    
#include <graphics.h>      //EasyX库,所使用的!
#include <math.h>         //三角函数
#include <algorithm>      //sort函数排序方法,https://blog.csdn.net/BIGKALA/article/details/81624691,这是方法适用的地址
#include <time.h>


using namespace std;

#define High 800
#define Width 1000        //定义游戏画面尺寸
#define CharSize 25       //定义每个字符显示的大小

int main()
{
    int highNum = High / CharSize;           //高度可以存放的字符数量
    int widthNum = Width / CharSize;         //宽度,可以存放的字符数量

    //charRain存储对应字符矩阵中需要输出字符的ASCII码
    int charRain[High / CharSize][Width / CharSize];     //这里必须这么写。表达式必须含有常量值
    int CNum[Width / CharSize];       //宽度,可以存放的字符数量
    int i, j, x, y;

    srand((unsigned)time(NULL));         //设置随机函数种子

    //======================初始化字符矩阵
    for (i = 0; i < widthNum;i++)      //先进行每一行遍历   
    {
        CNum[i] = (rand() % (highNum * 9 / 10)) + highNum / 10;         //这一列的有效字符个数,也是随机的
        for (j = 0; j < CNum[i];j++)
        {
            charRain[j][i] = (rand() % 26) + 65;      //产生A-z的随机ascii码
        }
    }
    //======================初始化字符矩阵===结束

    //=====接下来,把这个二维矩阵画出来,显示出来========================
    initgraph(Width, High);
    BeginBatchDraw();
    setfont(25, 10, _T("Courier"));  //设置字体
    setcolor(GREEN);                    //设置颜色
    
    //======下面的每一帧让字符向下移动,然后最上面产生新的字符
    while (1)
    {
        
        for (i = 0; i < widthNum;i++)
        {
            if (CNum[i]<highNum-1 )  //当这一列字符没有填满时候
            {
                for (j = CNum[i] - 1; j >= 0;j--)  //每个字符向下移动一格
                {
                    charRain[j + 1][i] = charRain[j][i];      //把上面格子内容,给下面格子
                }
                charRain[0][i] = (rand() % 26) + 65;       //最上一行产生随机的ascii码
                CNum[i] = CNum[i] + 1;              //这一列的有效字符的个数加1
            }
        }


        //======================输出整个字符矩阵
        for (i = 0; i < widthNum; i++)
        {
            x = i*CharSize;                   //当前字符的x坐标
            for (j = 0; j < CNum[i]; j++)
            {
                y = j*CharSize;                      //当前字符的y坐标
                outtextxy(x, y, charRain[j][i]);     //输出当前字符
            }
        }

        FlushBatchDraw();
        Sleep(100);
        clearrectangle(0, 0, Width - 1, High - 1);      //清空画面中的全部矩形区域。
    }
    EndBatchDraw();

    //=====接下来,把这个二维矩阵画出来,显示出来========================
    getch();
    closegraph();
    return 0;

}

=================================================
第三版,最终版本

#include<stdio.h>
#include<string.h>
#include<stdlib.h>    //清屏命令在这里。
#include <windows.h> //延时10毫秒-sleep,gotoxy函数
#include <iostream>
#include <conio.h>       //getch()----不用按回车,就可以输入字符。    
#include <graphics.h>      //EasyX库,所使用的!
#include <math.h>         //三角函数
#include <algorithm>      //sort函数排序方法,https://blog.csdn.net/BIGKALA/article/details/81624691,这是方法适用的地址
#include <time.h>


using namespace std;


#define High 800
#define Width 1000        //定义游戏画面尺寸
#define CharSize 25       //定义每个字符显示的大小

int main()
{
    int highNum = High / CharSize;           //高度可以存放的字符数量
    int widthNum = Width / CharSize;         //宽度,可以存放的字符数量

    //charRain存储对应字符矩阵中需要输出字符的ASCII码
    int charRain[High / CharSize][Width / CharSize];     //这里必须这么写。表达式必须含有常量值
    int CNum[Width / CharSize];       //宽度,可以存放的字符数量
    int ColorG[Width / CharSize];      //每一列字符的颜色

    int i, j, x, y;

    srand((unsigned)time(NULL));         //设置随机函数种子

    //======================初始化字符矩阵
    for (i = 0; i < widthNum;i++)      //先进行每一行遍历   
    {
        CNum[i] = (rand() % (highNum * 9 / 10)) + highNum / 10;         //这一列的有效字符个数,也是随机的
        ColorG[i] = 255;     //新增加的内容,
        for (j = 0; j < CNum[i];j++)
        {
            charRain[j][i] = (rand() % 26) + 65;      //产生A-z的随机ascii码
        }
    }
    //======================初始化字符矩阵===结束

    //=====接下来,把这个二维矩阵画出来,显示出来========================
    initgraph(Width, High);
    BeginBatchDraw();
    setfont(25, 10, _T("Courier"));  //设置字体
    setcolor(GREEN);                    //设置颜色
    
    //======下面的每一帧让字符向下移动,然后最上面产生新的字符
    while (1)
    {
        
        for (i = 0; i < widthNum;i++)
        {
            if (CNum[i]<highNum-1 )  //当这一列字符没有填满时候
            {
                for (j = CNum[i] - 1; j >= 0;j--)  //每个字符向下移动一格
                {
                    charRain[j + 1][i] = charRain[j][i];      //把上面格子内容,给下面格子
                }
                charRain[0][i] = (rand() % 26) + 65;       //最上一行产生随机的ascii码
                CNum[i] = CNum[i] + 1;              //这一列的有效字符的个数加1
            }
            else   //当这一列字符填满之后,
            {
                if (ColorG[i]>40 )
                {
                    ColorG[i] = ColorG[i] - 20;   //让满的这一列逐渐变暗
                }
                else    //变到足够阴暗的时候
                {
                    CNum[i] = (rand() % (highNum / 3)) + highNum / 10;         //这一列字符的个数,随机的
                    ColorG[i] = (rand()%75 )+180;     //新增加的内容,
                    for (j = 0; j < CNum[i]; j++)
                    {
                        charRain[j][i] = (rand() % 26) + 65;      //产生A-z的随机ascii码
                    }
                }

            }
        }


        //======================输出整个字符矩阵
        for (i = 0; i < widthNum; i++)
        {
            x = i*CharSize;                   //当前字符的x坐标
            for (j = 0; j < CNum[i]; j++)
            {
                y = j*CharSize;                      //当前字符的y坐标
                outtextxy(x, y, charRain[j][i]);     //输出当前字符
            }
        }

        FlushBatchDraw();
        Sleep(100);
        clearrectangle(0, 0, Width - 1, High - 1);      //清空画面中的全部矩形区域。
    }
    
    EndBatchDraw();

    //=====接下来,把这个二维矩阵画出来,显示出来========================
    getch();
    closegraph();
    return 0;

}

相关文章

网友评论

      本文标题:网易C++--书籍练习案例01--字符雨动画--完成!

      本文链接:https://www.haomeiwen.com/subject/indavktx.html