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

 #include <windows.h>
#include <mmsystem.h>
#include <stdio.h> #pragma comment(lib, "winmm.lib") #define DATAFILE "BADAPPLE.txt" #define FRAME_WIDTH 80
#define FRAME_HEIGHT 32 #define DATA_TOKEN_SIZE ( 5 + 1 ) // $0000\n
#define DATA_PITCH_SIZE ( FRAME_WIDTH + 1 ) // ###...\n
#define DATA_FRAME_SIZE ( DATA_TOKEN_SIZE + ( DATA_PITCH_SIZE * FRAME_HEIGHT ) ) #define FRAME_COUNT 3271 #define VIDEO_TIME 218000.0f // 3:38 (218000ms) void main(void)
{
HANDLE hOutput; hOutput = GetStdHandle( STD_OUTPUT_HANDLE ); CONSOLE_CURSOR_INFO coc = { , FALSE };
COORD co = { FRAME_WIDTH, FRAME_HEIGHT };
SMALL_RECT rc = { , , FRAME_WIDTH - , FRAME_HEIGHT - }; SetConsoleCursorInfo( hOutput, &coc );
SetConsoleScreenBufferSize( hOutput, co );
SetConsoleWindowInfo( hOutput, TRUE, &rc ); SetConsoleTitle( "Bad Apple By Crsky @2016" ); FILE *fp;
int size;
char *buf;
char *cur;
int start; buf = NULL; fp = fopen( DATAFILE, "rb" ); if ( !fp )
{
printf( "%s not found.\n", DATAFILE );
goto err;
} size = DATA_FRAME_SIZE * FRAME_COUNT; buf = new char[ size ]; if ( fread( buf, size - , , fp ) != )
{
printf( "Failed to read in data file.\n" );
goto err;
} buf[ size - ] = '\0'; fclose( fp ); mciSendString( "open BADAPPLE.wma alias BGM", NULL, , NULL );
mciSendString( "play BGM", NULL, , NULL ); start = GetTickCount(); while ( )
{
int time;
float percen;
int frame;
COORD xy = { , };
DWORD written; if ( GetKeyState( VK_SPACE ) )
{
printf( "Stop play.\n" );
break;
} time = GetTickCount();
percen = ( time - start ) / VIDEO_TIME; if ( percen > )
{
printf( "End of play.\n" );
break;
} frame = percen * FRAME_COUNT;
cur = &buf[ ( DATA_FRAME_SIZE * frame ) + DATA_TOKEN_SIZE ]; for ( ; xy.Y < FRAME_HEIGHT; xy.Y++, cur += DATA_PITCH_SIZE )
WriteConsoleOutputCharacter( hOutput, cur, DATA_PITCH_SIZE - , xy, &written ); Sleep( );
} mciSendString( "stop", NULL, , NULL );
mciSendString( "close", NULL, , NULL ); err:
if ( buf )
delete[] buf; Sleep( );
}

效果图:

完整程序下载:百度网盘

BAD APPLE C++控制台程序的更多相关文章

  1. Mac OS X上用CoreCLR运行一个真正的.NET控制台程序

    这个真正的控制台程序来自corefxlab,名叫CoreClrHelloWorld,是一个跨平台的.NET控制台演示程序,可以显示微软.Linux.苹果的logo. CoreClrHelloWorld ...

  2. MAC COCOA call command 调用终端控制台程序

    MAC COCOA call command 调用终端控制台程序 STEP 1 先写一个C++ DOS程序 STEP2 使用NSTask来运行,然后用NSPipe和 NSData来接受运行的结果字符串 ...

  3. 在.NET Core控制台程序中使用依赖注入

    之前都是在ASP.NET Core中使用依赖注入(Dependency Injection),昨天遇到一个场景需要在.NET Core控制台程序中使用依赖注入,由于对.NET Core中的依赖注入机制 ...

  4. 使用 CommandLineApplication 类创建专业的控制台程序

    闲话 在很久很久以前,电脑是命令行/终端/控制台的天下,那屏幕上的光标在行云流水般的键盘敲击下欢快地飞跃着,那一行行的字符输出唰唰唰地滚动着--直到 Windows 95 的出现(那时候我还不知道苹果 ...

  5. C#基础-关于用json给控制台程序传值的坑

    上周遇到了一个非常诡异的坑,首先写了两个程序,第一个程序输出成dll,第二个程序是控制台程序. 在第一个程序里,我使用了process去启动第二个程序,同时传入了一个Json作为参数,即: Proce ...

  6. 你们信不信一句Console.WriteLine就能让你的控制台程序失去响应

    好久没更新博客了,今天是扒衣见君节,难得闲下来就来说说一个最近有趣的发现吧. 首先废话不多说,直接上代码吧 class Program { static void Main(string[] args ...

  7. 【转】WIN32 控制台程序

    http://blog.csdn.net/houmin0036/article/details/7702236 win32控制台项目指在32位Windows命令提示符(即所谓的dos)环境下运行的应用 ...

  8. Async Console Programs 异步控制台程序

    如果你正在写一个控制台程序,你可能最终想要一个异步的main方法,像这样: class Program { static async void Main(string[] args) { ... } ...

  9. C#控制台程序的参数解析类库 CommandLine简单使用说明

    前言 C#开发的控制台程序,默认接收string[] args参数.如果有多个参数需要输入时,可以按照顺序依次输入:但如果有些参数不是必选的,或者有些参数中间需要有空格比如时间“2016-05-18 ...

随机推荐

  1. 《C#微信开发系列(4)-接收 / 返回文本消息》

    4.0接收 / 返回文本消息 ①接收/返回文本消息原理说明 当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,着手开发之前先行阅读微信公众平台接收普通消息 ...

  2. 【requireJS路径加载】与程序员小卡的交流

    这两天正好看到了程序员小卡同学的一篇博客,里面对requireJS路径的解析做了一些说明,里面有点问题待解决,我这里正好知道一点,所以整理成文,不知对小卡同学是否有帮助. http://www.cnb ...

  3. redhat6.4安装MySQL-server-5.5.28-1.linux2.6.x86_64.rpm

    首先下载下面三个文件: MySQL-server-5.5.28-1.linux2.6.x86_64.rpm MySQL-client-5.5.28-1.linux2.6.x86_64.rpm MySQ ...

  4. js 假值

    function demo(a){ if(a){ console.log(111); }else{ console.log(222); } } demo(0) html_dom.html:27 222 ...

  5. Google C++单元测试框架GoogleTest---GTest的Sample1和编写单元测试的步骤

    如果你还没有搭建gtest框架,可以参考我之前的博客:http://www.cnblogs.com/jycboy/p/6001153.html.. 1.The first sample: sample ...

  6. mysql远程登录

    mysql -h  -P -u -p-h:需要登录的mysql服务器的ip-P(大写):mysql开放的端口,如果是3306端口可省略此选项-u:数据库用户名-p:数据库密码

  7. Spring实现AOP的4种方式

    了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个“时机”,这些“ ...

  8. ICompare接口、Sort()方法

    1.接口中的方法并不实现具体功能,继承于该接口的类必须实现具体功能. 核心思想:对修改封闭,对扩展开放. 2.Sort()方法: 默认:Sort(内容) 英文:按照首字母顺序排序,首字母相同则看第二个 ...

  9. SortedMap基本特性

    特性: 继承与Map. 提供对key(自然排序顺序或者SortedMap创建时提供的Comparator)的全排序. key必须实现Comparable接口,以便于进行相互比较. 应用于对map的遍历 ...

  10. XmlSerializer的使用

    关键词: XmlSerializer StreamWriter T instance 保存xml文件 代码: public static void SaveXML<T>(string xm ...