[ruby]rubyの勉強がてらoxゲーム作ったら思ったより悲惨な出来だった



後輩が先日rubyでoxゲームを作っていたので、僕もちょっと作ってみました。







作ったもの



Rubyで簡易oxゲーム — Gist
https://gist.github.com/3028448


コマンドラインとかターミナルで動くやつです。
以下メモとか感想とか。





感想


こりゃひでえ。

ぐぐる時間混みで2時間くらいで作ったんですが、作るの遅いしソース汚いし。
35~45行目の3つ並んでいるか判定する部分とかベタ打ちで妥協しました。

(最初は再帰処理書いてたんですが、行数がベタ打ちとあんまり変わらなかった。)

初めてrubyでプログラム書いてみましたが、やっぱり簡単にかけるっぽいですね。
ループの種類の多さとか、要所要所で使いやすそうな感じ。

(1…5).to_a

とか個人的に感動したんだけど、調べてみたら.to_aメソッド廃止になるっぽい。まじか。



※2012/07/02追記
今1.9.3使ってるんですけど、普通に動くんですよね。
でも下のページでは1.9系では廃止になるって書いてある。
どっちなんでしょーか…。
to_a (Object) - Rubyリファレンス
http://ref.xaio.jp/ruby/classes/object/to_a







気になったところ


最近はもっぱらmacでコーディングしてるんですが、作ったソースをThinkpadさんに移してみたら若干動作が違ったのでメモ。





1、sytem("cls")が使えない

windowsのコマンドプロンプトで実行すると、画面をクリアしてくれる便利な命令。
c言語でいうclrscr(); (だっけ?)

macでも普通に動作するかなーと思ったら、ターミナル画面はクリアされませんでした。
何故。



※2012/07/02追記
教えてもらいました。
どうやらエスケープシーケンス使うとできるらしい。
C言語-エスケープシーケンス
http://www.mm2d.net/c/c-06.shtml

CUI上で動くプログラムには適用できるっぽい。
環境依存らしいのでマシンやOSのバージョンによってはできないかもしれないですね。
(僕のMac OS X 10.7.4のターミナル上では動作しました。)

画面のクリアは以下の1行を挿入すればOKです。

print "¥x1b[2J"

正確に言うと画面のクリアっていうか、ターミナルの高さ分スクロールしてるのかな。
ちなみにこのままだとカーソル位置が直前の出力の時のままなので、カーソル位置を左上に指定しましょう。

print "¥x1b[2J¥x1b[0;0H"

ちなみに、.rbのソースに以下の一行を突っ込んでも動きました。何故。

printf("¥x1b[2J¥x1b[0;0H");


と、思ったらrubyにもprintf()あるんですね。納得。





2、getsで取得する値が違う

今回、途中終了用に”q”キーを割り当てたのですが、macだと

while (s = gets) != "q"

で反応しませんでした。
中身を見ていると、どうやら”¥n”まで取得しているらしい。

ってことで

while (s = gets) != "q¥n"

に書き換え。mac上ではうまく動きました。

と思ったら今度はwindowsでは反応しない。
なんでかなーと思って中身見てみたら、”¥r¥n”でした。Oh…

エスケープシーケンスを除いた文字部分だけ取るってやり方はきっとあるんだろうけど、今回は放置。

調べたら追記します。



※2012/07/02追記
文字列にはどうやらchomp()メソッドというものがあるらしく、引数で指定した改行文字列を取り除いてくれるみたいです。

引数は"¥n"、"¥r"、あと""の組み合わせ。
"¥n¥r"とかいう謎の並び順になっていなければ、引数なしで呼び出すことで改行文字列をきれいさっぱり取り除いてくれます。

今回のソースで言えば、

while (s = gets.chomp) != "q"

こういう風に変更すれば、windowsでもmacでも使えるようになりますね。





モードライン


今回ググった総時間で言えばこいつが一番長かったような。

最近は軽くコーディングするときはvimさんにお世話になっているんですが、なんとvimにはファイルごとにインデント幅・タブ幅を設定できるものがあるらしいのです!
それがモードライン

こんな便利な方法知らなかったなんて、vimを使いこなす日はまだまだ遠そうです。



使い方は簡単で、ファイルの先頭or最後尾に設定を書くだけ。
普段はタブ・インデント幅は4に指定しているのですが、rubyは2が主流らしいので、以下の1行をファイルの先頭に追加してました。

# vim:set ts=2 sw=2:

もっと詳しく知りたい方はこちらからどうぞ。

モードラインを使って、ファイルごとにvimエディタのオプションを指定する。 — 名無しのvim使い
http://nanasi.jp/articles/howto/file/modeline.html


地味にはまったのが、#とvimの間にスペースを入れなきゃいけない点。
最初気づかなくてちょっと唸ってました。

当たり前ですが、コメントアウトしないとソースと勘違いされちゃうので、言語に応じて適切なコメントアウトの中にモードラインを書きましょう。






それでもモードラインが使えないあなたへ


.vimrcでモードラインを使う設定がONになっていないかもしれません。

以下の2行を追加すればOKです。

set modeline
set modelines=n

それぞれ

「モードラインを有効にする」
「ファイルの上下端からn行分、モードラインの処理を探索する」

という設定です。
今回は1行済むので、最低
set modelines=1
を指定すれば大丈夫です。







まとめ


rubyおもしろい!けど全然書慣れてない感。
もしこの記事見て「こんな書き方あるよ!」って教えてくださる優しい方がいましたらよろしくお願いしますm(_ _)m

ちなみにgithubにソースあげたの今回が初めてだったり。






・参考

モードラインを使って、ファイルごとにvimエディタのオプションを指定する。 — 名無しのvim使い

In by toku_toku3, 2012年7月1日日曜日


Leave a Reply