C言語で作った数当てゲームを Node.js で再実装してみた

phi phi on C, Node.js

駄文です.

ハードディスク整理してたら学生時代の懐かしいデータが色々出てきたので C言語に没頭していた時の思い出に耽ながら Node.js で replace 実装してみました.

C言語で数当てゲームを実装

/*
 * 数当てゲーム
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {  
  srand((unsigned)time(NULL));

  int answer = rand()%100+1;
  int n = 0;
  int turn = 0;

  printf("★ 数当てゲーム ★\n");
  while (true) {
    printf("1~100 の間の数字を入力してください: ");
    scanf("%d", &n);

    ++turn;

    if (n < answer) {
      printf("もっと大きい!\n");
    }
    else if (n > answer) {
      printf("もっと小さい!\n");
    }
    else {
      printf("正解!!\n");
      break;
    }
  }

  printf("答えは %d, 正解までに %d ターンかかりました.\n", answer, turn);

  return 0;
}


/*
# result

★ 数当てゲーム ★
1~100 の間の数字を入力してください: 50  
もっと小さい!
1~100 の間の数字を入力してください: 25  
もっと大きい!
1~100 の間の数字を入力してください: 33  
もっと小さい!
1~100 の間の数字を入力してください: 32  
もっと小さい!
1~100 の間の数字を入力してください: 30  
もっと大きい!
1~100 の間の数字を入力してください: 31  
正解!!
答えは 31, 正解までに 6 ターンかかりました.
*/

ファイルをダウンロードしたら

$g++ -o numbershit numbershit.cpp && ./numbershit

とかで実行できると思います.

Node.js で数当てゲームを実装

/*
 * 数当てゲーム
 */

var util = require('util');  
var readline = require('readline');  
var rl = readline.createInterface({  
    input: process.stdin,
    output: process.stdout,
    // terminal: false
});

var print = function(s) {  
  process.stdout.write(util.format.apply(this, arguments));
};

var answer = Math.floor( Math.random()*100 ) + 1;  
var turn = 0;

print('★ 数当てゲーム ★\n');  
print('1~100 の間の数字を入力してください: ');  
rl.on('line', function (line) {  
  ++turn;

  var n = +line;

  if (global.isNaN(n)) {
    print('不正な値です\n');
  }
  else if (n < answer) {
    print('もっと大きい!\n');
  }
  else if (n > answer) {
    print('もっと小さい!\n');
  }
  else {
    print('正解!!\n');
    rl.close();

    return ;
  }
  print('1~100 の間の数字を入力してください: ');
});
rl.on('close', function () {  
  print('答えは %d, 正解までに %d ターンかかりました.\n', answer, turn);
});


/* 
# result

★ 数当てゲーム ★
1~100 の間の数字を入力してください: 50  
もっと小さい!
1~100 の間の数字を入力してください: 25  
もっと小さい!
1~100 の間の数字を入力してください: 10  
もっと大きい!
1~100 の間の数字を入力してください: 15  
正解!!
答えは 15, 正解までに 4 ターンかかりました.
*/

こちらもファイルをダウンロードして

$node numbershit.js

で実行できます.

差分メモ

あまり入力が必要なプログラムを Node.js で書く機会がなかったので 色々発見がありました.

標準入力

C言語は scanf でやりますが,

scanf("%d", &n);  

Node.js では readline というモジュールを使って
らしい書き方ができるようになっています.

var readline = require('readline');  
var rl = readline.createInterface({  
    input: process.stdin,
    output: process.stdout,
    // terminal: false
});

rl.on('line', function (line) {  
  // ...
});
rl.on('close', function () {  
  // ...
});

乱数

C言語では rand を使います.
乱数の seed が固定なので srand に time を設定するのを忘れないように.(懐かしいw)

srand((unsigned)time(NULL));

int answer = rand()%100+1;  

Node.js では, Math.random() ですね.
浮動小数点数型 が返ってくるので Math.floor するのを忘れないようにしましょう.

var answer = Math.floor( Math.random()*100 ) + 1;  


あの頃は毎日, こういったミニゲームを作っては友人にプレイしてもらいフィードバックをもらうという日々を送っていました. 周りに同じ目標を持つ学生がいる中で切磋琢磨し合える環境が一番成長できますね.

今は, サービスについて考えたりフレームワークを選定したりとプログラミング自体に本気で 没頭する機会が少なくなってきてるなぁとしみじみ...

久々に競技プログラミングでも覗いてみようと思います.

以上, 駄文でした.