Ruby's Louvre

每天学习一点点算法

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

控制台下的字符图像界面

// 输出流
var stream = process.stdout;
  
// 输出
var write = function (str) {
  stream.write(str);
};
  
// 生成ANSI escape sequences代码:http://en.wikipedia.org/wiki/ANSI_escape_code
var CSI = exports.CSI = function (str, c) {
  return '\x1b[' + str + c;
};
  
// 生成带颜色的文本
var color = exports.color = function (text, c, bgc) {
  if (isNaN(bgc)) bgc = 0;
  c = Number(c) + 30;
  bgc = Number(bgc) + 40;
  var ret = CSI(c + ';' + bgc, 'm') + text + CSI('37;40', 'm');
  return ret;
};
  
// 设置光标位置,位置从1开始
var setCursor = exports.setCursor = function (row, column) {
  write(CSI(row + ';' + column, 'H'));
};
  
// 清屏
var clear = function (bgcolor) {
  setCursor(1, 1);
  for (var i = 0; i < stream.rows; i++) {
    var line = '';
    for (var j = 0; j < stream.columns; j++) {
      line += ' ';
    }
    write(color(line, 0, 6));
  }
};
  
// 画矩形
var DOUBLE_LINE = '══════════════════════════════════════════════════════════' +
                  '══════════════════════════════════════════';
var SPACE_LINE = '                                                           ' +
                 '                                         ';
var drawRect = function (top, left, width, height, bgcolor) {
  setCursor(top, left);
  var w = width / 2 - 2;
  var c = function (str) {
    return color(str, 0, 7);
  };
  write(c('╔') + c(DOUBLE_LINE.substr(0, w)) + c('╗'));
  for (var i = 1; i < height - 1; i++) {
    setCursor(top + i, left)
    write(c('‖') + color(SPACE_LINE.substr(0, w), 0, bgcolor) +
          color(SPACE_LINE.substr(0, w), 0, bgcolor) + c('‖'));
  }
  setCursor(top + height - 1, left);
  write(c('╚') + c(DOUBLE_LINE.substr(0, w)) + c('╝'));
  setCursor(top + 1, left + 2);
};
  
  
// -----------------------------------------------------------------------------
// --------------- 开始 --------------------------------------------------------
  
// 开始
clear();
// 要绘制的窗口宽度和高度
var w = 68;
var h = 5;
var t = (stream.rows - h) / 2;
var l = (stream.columns - w) / 2;
drawRect(t, l, w, h, 7);
var randomColor = function () {
  var r = Math.round(Math.random() * 5);
  return r + 1;
};
var updateTime = function () {
  setCursor(t + 2, (stream.columns - 48) / 2);
  write(color(new Date().toLocaleString() + '   ', randomColor(), 7));
};
updateTime();
setInterval(updateTime, 1000);

如果您觉得此文有帮助,可以打赏点钱给我支付宝1669866773@qq.com ,或扫描二维码

posted on   司徒正美  阅读(1930)  评论(0编辑  收藏  举报

编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
历史上的今天:
2012-01-31 mass Framework support模块 v2
点击右上角即可分享
微信分享提示