node.js使用readline按行读取文件内容到Array中

本文介绍了如何利用Node.js的readline模块,将文件内容逐行读取并存储到Array中,通过示例代码展示了具体的实现过程及执行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

具体代码实现如下:

var fs = require("fs");
var readLine = require("readline");

/**
 * 按行读取文件内容
 *
 * @param fReadName 文件名路径
 * @param cb 回调函数
 *
 * @return 字符串数组
 */
function readFileToArr(fReadName, cb) {

    var arr = [];
    var readObj = readLine.createInterface({
        input: fs.createReadStream(fReadName)
    });

    readObj.on('line', function (line) {
        arr.push(line);
    });
    readObj.on('close', function () {
        console.log('readLine close....');
        cb(arr);
    });
}

readFileToArr('ObserverMode.js', function (arr) {
    console.log(arr);
});

使用到的实例代码如下:

//ObserverMode.js

const queuedObservers = new Set();

const observe = fn => queuedObservers.add(fn);
const observable = obj => new Proxy(obj, {set});

function set(target, key, value, receiver) {
    const result = Reflect.set(target, key, value, receiver);
    queuedObservers.forEach(observer => observer());
    return result;
}

const person = observable({
    name: '张三',
    age: 20
});

function print() {
    console.log(`${person.name}, ${person.age}`)
}

observe(print);
person.name = '李四';

示例执行结果如下:

"D:\software\WebStorm 2017.2.4\bin\runnerw.exe" "D:\Program Files\nodejs\node.exe" D:\Workspaces\Webstorm\web\javascript\ES6\src\readFileToArr.js
readLine close....
[ '',
  'const queuedObservers = new Set();',
  '',
  'const observe = fn => queuedObservers.add(fn);',
  'const observable = obj => new Proxy(obj, {set});',
  '',
  'function set(target, key, value, receiver) {',
  '    const result = Reflect.set(target, key, value, receiver);',
  '    queuedObservers.forEach(observer => observer());',
  '    return result;',
  '}',
  '',
  'const person = observable({',
  '    name: \'张三\',',
  '    age: 20',
  '});',
  '',
  'function print() {',
  '    console.log(`${person.name}, ${person.age}`)',
  '}',
  '',
  'observe(print);',
  'person.name = \'李四\';',
  '' ]

Process finished with exit code 0
好的,实现扫雷游戏需要先了解一下游戏规则和基本原理。 游戏规则: 扫雷游戏是一种单人益智游戏。游戏区域被分为许多单元格,有些单元格下面有地雷。游戏的目标是揭示出所有没有地雷的单元格,同时不揭开任何地雷。当揭开一个地雷时游戏就结束了。如果成功地揭示出所有没有地雷的单元格,游戏就胜利了。 基本原理: 游戏区域被分为许多单元格,每个单元格有三种状态:覆盖状态、揭示状态和标记状态。覆盖状态表示该单元格还没有被揭示,揭示状态表示该单元格已经被揭示,标记状态表示该单元格被标记为地雷。在游戏开始时,随机生成若干个地雷,将它们分布在游戏区域中。当玩家点击一个单元格时,如果该单元格下面有地雷,游戏失败,否则将该单元格变为揭示状态,如果该单元格周围没有地雷,就会自动揭示周围的单元格,直到揭示到有地雷的单元格或者揭示到边缘为止。玩家可以用鼠标右键将一个单元格标记为地雷,标记状态的单元格不会被揭示。 以下是一个简单的实现扫雷游戏的示例代码,使用Node.js和控制台输出实现: ```javascript const readline = require('readline'); // 游戏参数,可以根据需要进修改 const ROWS = 10; // 数 const COLS = 10; // 列数 const MINES = 10; // 地雷数 // 游戏状态 const STATE_COVERED = 0; // 覆盖状态 const STATE_MARKED = 1; // 标记状态 const STATE_REVEALED = 2; // 揭示状态 // 单元格对象 class Cell { constructor() { this.mine = false; // 是否为地雷 this.state = STATE_COVERED; // 单元格状态 this.adjacentMines = 0; // 周围地雷数 } } // 游戏对象 class Minesweeper { constructor() { this.board = []; // 游戏区域 this.gameOver = false; // 游戏是否结束 this.uncoveredCount = 0; // 已经揭示的单元格数量 this.initBoard(); // 初始化游戏区域 } // 初始化游戏区域 initBoard() { // 生成空白的游戏区域 for (let i = 0; i < ROWS; i++) { this.board.push([]); for (let j = 0; j < COLS; j++) { this.board[i].push(new Cell()); } } // 随机生成地雷 let count = 0; while (count < MINES) { let row = Math.floor(Math.random() * ROWS); let col = Math.floor(Math.random() * COLS); if (!this.board[row][col].mine) { this.board[row][col].mine = true; count++; } } // 计算每个单元格周围的地雷数 for (let i = 0; i < ROWS; i++) { for (let j = 0; j < COLS; j++) { if (!this.board[i][j].mine) { let count = 0; for (let r = i - 1; r <= i + 1; r++) { for (let c = j - 1; c <= j + 1; c++) { if (r >= 0 && r < ROWS && c >= 0 && c < COLS && this.board[r][c].mine) { count++; } } } this.board[i][j].adjacentMines = count; } } } } // 揭示单元格 reveal(row, col) { let cell = this.board[row][col]; if (cell.state !== STATE_COVERED || this.gameOver) { return; } cell.state = STATE_REVEALED; this.uncoveredCount++; // 如果揭示到了地雷,游戏结束 if (cell.mine) { this.gameOver = true; this.showBoard(); console.log('Game over!'); return; } // 如果所有没有地雷的单元格都被揭示了,游戏胜利 if (this.uncoveredCount === ROWS * COLS - MINES) { this.gameOver = true; this.showBoard(); console.log('Congratulations, you win!'); return; } // 如果揭示到的单元格周围没有地雷,继续揭示周围的单元格 if (cell.adjacentMines === 0) { this.revealNeighbors(row, col); } this.showBoard(); } // 揭示周围的单元格 revealNeighbors(row, col) { for (let r = row - 1; r <= row + 1; r++) { for (let c = col - 1; c <= col + 1; c++) { if (r >= 0 && r < ROWS && c >= 0 && c < COLS && !(r === row && c === col)) { this.reveal(r, c); } } } } // 标记单元格 mark(row, col) { let cell = this.board[row][col]; if (cell.state === STATE_COVERED) { cell.state = STATE_MARKED; } else if (cell.state === STATE_MARKED) { cell.state = STATE_COVERED; } this.showBoard(); } // 显示游戏区域 showBoard() { console.clear(); console.log(' ' + Array.from({ length: COLS }, (_, i) => i + 1).join(' ')); for (let i = 0; i < ROWS; i++) { let row = []; for (let j = 0; j < COLS; j++) { let cell = this.board[i][j]; if (cell.state === STATE_COVERED) { row.push('.'); } else if (cell.state === STATE_MARKED) { row.push('F'); } else { row.push(cell.mine ? '*' : cell.adjacentMines === 0 ? ' ' : cell.adjacentMines); } } console.log((i + 1) + ' ' + row.join(' ')); } console.log(); } } // 读取用户输入 const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); // 创建游戏对象 const game = new Minesweeper(); // 开始游戏 console.log('Welcome to Minesweeper!'); game.showBoard(); rl.on('line', (input) => { let parts = input.split(' '); if (parts.length !== 3 || !/^[rm]$/i.test(parts[0]) || isNaN(parts[1]) || isNaN(parts[2])) { console.log('Invalid input, please try again.'); return; } let row = parseInt(parts[1]) - 1; let col = parseInt(parts[2]) - 1; if (row < 0 || row >= ROWS || col < 0 || col >= COLS) { console.log('Invalid row or column, please try again.'); return; } if (parts[0].toLowerCase() === 'r') { game.reveal(row, col); } else { game.mark(row, col); } }); ``` 运以上代码,可以在控制台上玩扫雷游戏。例如,输入 `r 1 1` 可以揭示第一第一列的单元格,输入 `m 2 3` 可以将第二第三列的单元格标记为地雷。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值