使用C++语言编写,如果想改成C语言,手动以GetProcAddress的方式来调用相关函数即可。

  1 #include <windows.h>
  2 #include <mmsystem.h>
  3 #include <stdio.h>
  4
  5 #pragma comment(lib, "winmm.lib")
  6
  7
  8 #define DATAFILE "BADAPPLE.txt"
  9
 10 #define FRAME_WIDTH        80
 11 #define FRAME_HEIGHT    32
 12
 13 #define DATA_TOKEN_SIZE    ( 5 + 1 )    //    $0000\n
 14 #define DATA_PITCH_SIZE    ( FRAME_WIDTH + 1 )        // ###...\n
 15 #define DATA_FRAME_SIZE    ( DATA_TOKEN_SIZE + ( DATA_PITCH_SIZE * FRAME_HEIGHT ) )
 16
 17 #define FRAME_COUNT    3271
 18
 19 #define VIDEO_TIME    218000.0f    // 3:38 (218000ms)
 20
 21
 22 void main(void)
 23 {
 24     HANDLE hOutput;
 25
 26     hOutput = GetStdHandle( STD_OUTPUT_HANDLE );
 27
 28     CONSOLE_CURSOR_INFO coc = { 1, FALSE };
 29     COORD co = { FRAME_WIDTH, FRAME_HEIGHT };
 30     SMALL_RECT rc = { 0, 0, FRAME_WIDTH - 1, FRAME_HEIGHT - 1 };
 31
 32     SetConsoleCursorInfo( hOutput, &coc );
 33     SetConsoleScreenBufferSize( hOutput, co );
 34     SetConsoleWindowInfo( hOutput, TRUE, &rc );
 35
 36     SetConsoleTitle( "Bad Apple By Crsky @2016" );
 37
 38     FILE    *fp;
 39     int        size;
 40     char    *buf;
 41     char    *cur;
 42     int        start;
 43
 44     buf = NULL;
 45
 46     fp = fopen( DATAFILE, "rb" );
 47
 48     if ( !fp )
 49     {
 50         printf( "%s not found.\n", DATAFILE );
 51         goto err;
 52     }
 53
 54     size = DATA_FRAME_SIZE * FRAME_COUNT;
 55
 56     buf = new char[ size ];
 57
 58     if ( fread( buf, size - 1, 1, fp ) != 1 )
 59     {
 60         printf( "Failed to read in data file.\n" );
 61         goto err;
 62     }
 63
 64     buf[ size - 1 ] = '\0';
 65
 66     fclose( fp );
 67
 68     mciSendString( "open BADAPPLE.wma alias BGM", NULL, 0, NULL );
 69     mciSendString( "play BGM", NULL, 0, NULL );
 70
 71     start = GetTickCount();
 72
 73     while ( 1 )
 74     {
 75         int        time;
 76         float    percen;
 77         int        frame;
 78         COORD    xy = { 0, 0 };
 79         DWORD    written;
 80
 81         if ( GetKeyState( VK_SPACE ) )
 82         {
 83             printf( "Stop play.\n" );
 84             break;
 85         }
 86
 87         time = GetTickCount();
 88         percen = ( time - start ) / VIDEO_TIME;
 89
 90         if ( percen > 1 )
 91         {
 92             printf( "End of play.\n" );
 93             break;
 94         }
 95
 96         frame = percen * FRAME_COUNT;
 97         cur = &buf[ ( DATA_FRAME_SIZE * frame ) + DATA_TOKEN_SIZE ];
 98
 99         for ( ; xy.Y < FRAME_HEIGHT; xy.Y++, cur += DATA_PITCH_SIZE )
100             WriteConsoleOutputCharacter( hOutput, cur, DATA_PITCH_SIZE - 1, xy, &written );
101
102         Sleep( 60 );
103     }
104
105     mciSendString( "stop", NULL, 0, NULL );
106     mciSendString( "close", NULL, 0, NULL );
107
108 err:
109     if ( buf )
110         delete[] buf;
111
112     Sleep( 500 );
113 }

效果图:

完整程序下载:百度网盘

转载于:https://www.cnblogs.com/crsky/p/5984260.html

BAD APPLE C++控制台程序相关推荐

  1. VC++ 隐藏控制台程序窗口

    转自:http://hi.baidu.com/sicceer/blog/item/d9c35a810d15c4c8bc3e1ec8.html 设置 #pragma comment( linker, & ...

  2. 在vc6控制台程序中如何调用运行ImageMagick命令行工具

    在http://www.imagemagick.org/script/index.php网站下载相应的执行文件,这里以下载ImageMagick-6.6.5-10-Q16-windows-static ...

  3. Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法

    Ubuntu下QT控制台程序无法运行的解决方案以及XTerm的配置方法 最近由于老师要求要在Ubuntu下QT上进程多线程服务器的开发,虽然只是单纯的调用qt的network模块,但是为了避免麻烦,我 ...

  4. 使用VSCode调试C#控制台程序

    转载自: http://www.cnblogs.com/lxhbky/p/6673230.html http://www.cnblogs.com/lxhbky/p/6692065.html 一.环境安 ...

  5. VS C/C++控制台程序添加内存泄漏自动检测功能

    基于MFC框架的应用程序由模板生成时,已经自动添加了内存泄漏自动检测功能,当你的程序有内存泄漏,在Debug调式模式下运行就会在vc的输出窗口里显示出来,容易发现并及时解决.但是我们在写一些测试程序时 ...

  6. Mysql:mysql 控制台程序的提示符 prompt 字符串设置

    The prompt command reconfigures the default mysql> prompt. The string for defining the prompt can ...

  7. 把控制台程序嵌入到 WinForm 中执行

    我们经常有一些用控制台实现的简单应用,这种应用一般都是一步一步"向导"式执行,在每一步上收集用户的输入,最后得到程序执行的结果.但有些用户可能不喜欢用键盘操作的命令行界面,还是愿意 ...

  8. 【错误记录】Windows 控制台程序编译报错 ( WINDOWS.H already included. MFC apps must not #include <Windows.h> )

    文章目录 一.报错信息 二.解决方案 一.报错信息 Windows 控制台程序编译报错 : 已启动生成- 1>------ 已启动生成: 项目: hacktool, 配置: Debug Win3 ...

  9. 【Visual Studio】Visual Studio 2019 创建 Windows 控制台程序 ( 安装 ‘使用 C++ 的桌面开发‘ 组件 | 创建并运行 Windows 控制台程序 )

    文章目录 一.安装 C++ 桌面开发组件 二.创建并运行 Windows 控制台程序 一.安装 C++ 桌面开发组件 打开 Visual Studio Installer , 点击 " 修改 ...

最新文章

  1. 提高汽车系统的安全性
  2. 世界上最好的光刻机为什么来自荷兰?【物联网智商精选】
  3. Robotium调用getActivity()导致程序挂起的方法
  4. Java虚拟机是什么
  5. App如何适配Jelly Bean 和 Nexus 7
  6. easypoi导出word表格_拒绝加班,批量将word文档中的信息高效率提取出来存储到Excel中...
  7. 运用xlib进行事件响应(X11 API)的小例子
  8. lstm数学推导_如何在训练LSTM的同时训练词向量?
  9. Hibernate中hql的基本查询、条件查询、排序插叙、分页查询、投影查询
  10. 关于xendesktop外部SQL数据库连接设置的问题
  11. BoxBlur(方框模糊)
  12. ubuntu开机启动+图标配置
  13. chinapub读书会第10期:机器学习与人工智能 6月25日相约阿里云+优客工场
  14. A3C的算法原理和算法流程
  15. 分数阶麻雀搜索算法-附代码
  16. css 关于元素选中时会显示蓝色背景
  17. 无线串口服务器规模,无线串口服务器讲述.doc
  18. 华硕AC68U路由器APP远程控制设置方法
  19. 计算机应用基础试题操作题,计算机应用基础期末考试操作题.doc
  20. qlib的工作流管理:mlflow机器学习生命周期管理平台

热门文章

  1. Java编程入门100例之二十二(字符串查找)
  2. SDN自定义网络讲解(内部学习专用)
  3. 常见Java面试题之如何实现对象克隆
  4. Invalid VCS root mapping
  5. nginx 安装、操作命令、基本配置与参数说明
  6. redis入门demo
  7. BZOJ4818 [SDOI2017] 序列计数 【矩阵快速幂】
  8. 3Sum探讨(Java)
  9. JavaScript | 数据属性与访问器属性
  10. 服务器性能瓶颈分析方法