前几天是白色情人节,临时脑抽写了个表白神器 高端大气上档次,就是不知道该送给谁,经过两天的反射弧思考决定还是写给博客娘吧。- -~

这个程序就是打开后,在Dos窗口内模拟写出几行字母。其实主要就是模拟一下帧刷新。像游戏引擎那样每一帧都打印一个满屏,那么所有的动画也就出来了。想在里边写个小游戏也未尝不可。

但是理想丰满现实骨感,Dos窗口不断帧刷新效果很一般,是不是会出现跳动的情况,很蛋疼。

win7 dos窗口的默认宽度是80个字符,高度是25个字符。经过简单的处理,通过调用Sleep函数来控制间隔时间来无限打印80x25的字符串集合,就能模拟帧刷新了,非常的简单。

c/c++版本代码

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <vector>

using namespace std;

//全局变量 标记是否处于update状态
bool update_flag = false;
//全局数组,每一帧打印的所有字符
];
//全局变量,打印刷新计数器
;

//结构体 代表80x25中的一个点
struct _pos
{
    int _x;
    int _y;

    _pos(int x, int y) : _x(x), _y(y){}

};
//刷新函数的函数指针
typedef void(*_update)(vector<_pos>&);

_pos makepos(int x, int y)
{
    _pos ret(x, y);
    return ret;
}

//初始化要打印的点阵 虽然屏幕是80个字符的宽度,但是字符要多一个,原因是\0的字符串结尾标识符占一个//最后一行做特殊处理 没有\n换行符,以免每一帧的时候窗口被向下延伸一行
void init_screen()
{
    ; i < ; i++)
    {
        screen[i] = ();
        memset(screen[i], );
        //if (i == 0) screen[i][0] = 'x';
        screen[i][] = '\n';
        screen[i][] = '\0';
        )
        {
            screen[i][] = '\0';
            screen[i][] = '\0';
        }
    }
}
//打印一帧的屏幕 上边缺失的换行符在这里补充
void display_screen()
{
    printf("\n");

    ; i < ; i++)
    {
        printf(screen[i]);
    }
}
//更改某一点的显示字符
void set_char(int x, int y, char target)
{
     && x <  && y >=  && y < )
    {
        char* index = (screen[x] + y);
        *index = target;
    }
}
//开始update函数
void start_update(_update update_function,  int daley, vector<_pos>& _vec)
{
    update_flag = true;
    while (update_flag)
    {
        Sleep(daley);
        update_function(_vec);
    }
}
//停止update
void stop_update()
{
    update_flag = false;
}
//每一帧执行的函数
void processing(vector<_pos>& _vec)
{
    if (pro_count < _vec.size())
        set_char(_vec[pro_count]._x, _vec[pro_count]._y, 'o');

    display_screen();
    pro_count++;
}
//制作一个序列,这个序列用来保存需要 更改的点
void init_vec(vector<_pos>& vec)
{
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));

    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));

    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));

    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));

    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
    vec.push_back(makepos(, ));
}

int main(int argc, char* argv[])
{
    vector<_pos> poses;
    init_vec(poses);

    init_screen();
    _update _s_fun = processing;
    start_update(_s_fun, , poses);

    system("pause");
}

下面是C#版本 C#版本追加了颜色变化效果,更浪♂van

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace confession
{
    class Program
    {
        static void Main(string[] args)
        {

            InitScreen();
            DisplayScreen();

            List<Pos> poses = new List<Pos>();
            InitPoses(poses);
            Update(, poses);
            Console.ReadKey();
        }

        static void InitPoses(List<Pos> poses)
        {
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));

            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));

            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));

            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));

            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
            poses.Add(Pos.MakePos(, ));
        }

        static private string[] screen;
        static private bool update_flag;
        static private int pro_count;

        static void InitScreen()
        {
            screen = ];
            update_flag = true;
            pro_count = ;

            ; i < ; i++)
            {
                screen[i] = );
                ) screen[i] += "\n";
                else screen[i] += "";
            }
        }

        static void SetChar(int x, int y, char target)
        {
             && x <  && y >=  && y < )
            {
                char[] line = screen[x].ToCharArray();
                line[y] = target;
                string newLine = new string(line);
                screen[x] = newLine;
            }
        }

        static void Update(int delay, List<Pos> poses)
        {
            while (update_flag)
            {
                Thread.Sleep(delay);
                Processing(poses);
            }
        }

        static void Processing(List<Pos> poses)
        {
            if (pro_count < poses.Count)
            {
                SetChar(poses[pro_count].X, poses[pro_count].Y, 'o');
            }
            else
            {
                DisplayColor();
            }

            DisplayScreen();
            ;
            pro_count++;
        }

        static void StartUpdate()
        {
            update_flag = true;
        }

        static void StopUpdate()
        {
            update_flag = false;
        }

        static void DisplayScreen()
        {
            Console.WriteLine();
            ; i < ; i++)
            {
                Console.Write(screen[i]);
            }
        }

        static void DisplayColor()
        {
            ;
            ;
            switch (_type)
            {
                :
                    Console.ForegroundColor = ConsoleColor.Cyan;
                    break;
                :
                    Console.ForegroundColor = ConsoleColor.DarkGray;
                    break;
                :
                    Console.ForegroundColor = ConsoleColor.Red;
                    break;
                :
                    Console.ForegroundColor = ConsoleColor.White;
                    break;
                :
                    Console.ForegroundColor = ConsoleColor.Yellow;
                    break;
                :
                    Console.ForegroundColor = ConsoleColor.Green;
                    break;
                :
                    Console.ForegroundColor = ConsoleColor.Magenta;
                    break;
                :
                    Console.ForegroundColor = ConsoleColor.Blue;
                    break;
            }
        }
    }

    class Pos
    {
        private int x;
        private int y;

        public int X
        {
            get { return x; }
            set { x = value; }
        }

        public int Y
        {
            get { return y; }
            set { y = value; }
        }

        Pos(int _x, int _y)
        {
            x = _x;
            y = _y;
        }

        public static Pos MakePos(int _x, int _y)
        {
            Pos ret = new Pos(_x, _y);

            return ret;
        }
    }
}

编译后有惊喜 噗噗噗

win7 dos窗口模拟帧刷新的更多相关文章

  1. 学习java之电脑的常用快捷键和DOS窗口下的常用命令

    学习java之电脑的常用快捷键和DOS窗口下的常用命令 电脑一些常用的快捷键 win快捷键: 单独按Windows:显示或隐藏 "开始"功能表 Windows+BREAK:显示&q ...

  2. Windows环境变量设置无效解决办法——DOS窗口设置环境变量

    公司配置的电脑是Win7,使用的账户并不是管理员账户,我在计算机->属性中设置环境变量无效. 后来在DOS窗口中设置环境变量成功. 1. set [环境变量名称]=[所有环境变量值]:set P ...

  3. 系统右键菜单添加剪贴板清空项(隐藏DOS窗口)

    @color 0A @title 系统右键菜单添加剪贴板清空项(隐藏DOS窗口) by wjshan0808 @echo off echo 请输入右键菜单名称 set /p name= ::创建本机A ...

  4. 打包bat等文件成exe,双击运行不显示dos窗口,exe不报毒

    准备材料如下bat和vbs直接新建文本,然后改后缀就可以建出来了(后面发现exe运行vbs来启动bat不报毒)下面内容就是要把这些文件打包成exe,双击exe后打开图片test.jpg,不显示dos窗 ...

  5. visual studio 2005 编fortran程序,运行后dos窗口显示问题

    比如程序: program main implicit none write(*,*) "AAAAAAAAAAAAAAAAAAAAAAAA" stop end 虽然可以看见DOS窗 ...

  6. HTML的窗口分帧

    下面通过一个后台管理的部分设计来说明窗口分帧 frameset.html代码 <!-- <frameset>标签(常用来做后台管理界面) 属性:rows(行).cols(列).可以使 ...

  7. window.open窗口关闭后刷新父窗口代码

    window.open窗口关闭后刷新父窗口代码 window.opener.location.href=window.opener.location.href;window.close();

  8. VS2012 编写C++程序的时候DOS窗口一闪而过解决办法。

    在我每次通过VS2012 运行C++程序的时候,DOS窗口在显示结果的时候都是一闪而过.这样让人没法观察输出的结果.经试验找到了一较好的解决办法: 首先包含头文件"stdlib.h" ...

  9. 让windows系统的DOS窗口也可以显示utf8字符集

    C:\Users\Administrator>chcp活动代码页: 936 windows cmd命令显示UTF8设置 在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CM ...

随机推荐

  1. Docker入门(四):服务(Services)

    这个<Docker入门系列>文档,是根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家指 ...

  2. python3-----反射实例

    #/usr/bin/env python # -*- coding:utf-8 -*- import sys,os class WebServer(object): def __init__(self ...

  3. ubuntu下caffe配置

    http://blog.csdn.net/yhaolpz/article/details/71375762

  4. string实现

    #include<iostream> using namespace std;   class String{     friend ostream& operator<&l ...

  5. E20190419-hm

    diagram n. 图表; 示意图; 图解; [数] 线图; contingency n. 意外事故,偶发事件; 可能性,偶然性; [审计] 意外开支; crash v. 碰撞; 使发出巨响; 暴跌 ...

  6. HyperLedger Fabric 多机部署(一)

    本文参考:http://www.lijiaocn.com/%E9%A1%B9%E7%9B%AE/2018/04/26/hyperledger-fabric-deploy.html  学习. 1.准备工 ...

  7. Acwing 98-分形之城

    98. 分形之城   城市的规划在城市建设中是个大问题. 不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现. 而这座名为 Fractal 的城市设想了这样 ...

  8. Nacos深入浅出(八)

    Nacos-spring-context.java 感觉这个后台要比之前的Nacos复杂多了,涉及到很多基础的概念,慢慢看,这个后面慢慢更新解析过程 看到他的目录结构一个是基于注解,一个是XML的解析 ...

  9. github版本库使用详细教程(命令行及图形界面版)

    Git是一个分布式的版本控制系统,作为开源代码库以及版本控制系统,Github目前拥有140多万开发者用户.随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选 ...

  10. CountDownLatch MyUncaughtExceptionHandler

    package com.yd.wmsc.util; import java.text.SimpleDateFormat; import java.util.Date; import java.util ...