これまでの技術を使って、簡単なゲームを作ってみましょう。 ゲームの内容は、次のとおりです。
ということで作ってみましょう。
と言っても、基本的なプログラムの流れはPythonと同じなので、
データ形式、プログラム設計などはそちらを見て下さい。
あとは、プログラム言語固有の表現、関数、メソッド、構文ブロックなどを置き換えれば上手くいきます。
ま、実際のそうなのですが、まだ慣れてないので、はまってしまったところがありました。
特に「文字列型と数値型の変換」です。
重要なところだけ解説します。
1: data = ENV['QUERY_STRING']
2:
3: if data !~ /^[012]{6}[0-5]$/
4: data = "0200020"
5: end
6:
7: Push = data[-1] - 48
8:
9: for i in [0,1,2,3,4,5]
10: if (Push - i).abs == 1 or (Push - i).abs == 5
11: col[i] = (data[i] - 47) % 3
12: else
13: col[i] = data[i] - 48
14: end
15: newdata = newdata + String(col[i])
16: end
ブラウザからのデータ「data」を受け取り、7行目で、最後の文字を変数「Push」に入れます。
しかし、- 48とは何なのでしょうか?
実は、data[-1]とは、最後の文字ではなく、最後の文字の「値」になるのです。
例えば、最後の文字が「0」の場合は、data[-1]は数値の「48」になります。
そこで、本当は「文字としての数字から、その数字が表す数値に変換する」という関数(メソッド)が欲しかったのですが、
探しきれませんでした
(逆に、数値から数字に変換する関数はありました。それが15行目の String です)。
それでいろいろ考えて「とりあえずこの場合は 48引けばいい」ということで出来ました。
(あとで探したら、オブジェクトを整数に変換する「Integer」という関数がありました)
他は、基本的な表現の部分の問題だけで、Python から Ruby への翻訳ができました。
全体のプログラムは、以下のとおりです。
1: #! /usr/local/bin/ruby
2:
3: ballpict = ['../siromaru.gif', '../akamaru.gif', '../aomaru.gif']
4:
5: TR = "</TD></TR>\n<TR><TD>"
6: TD = "</TD><TD>"
7:
8: ball = [0,0,0,0,0,0]
9: col = [0,0,0,0,0,0]
10: newdata = ''
11:
12: data = ENV['QUERY_STRING']
13:
14: if data !~ /^[012]{6}[0-5]$/
15: data = "0200020"
16: end
17:
18: Push = data[-1] - 48
19:
20: for i in [0,1,2,3,4,5]
21: if (Push - i).abs == 1 or (Push - i).abs == 5
22: col[i] = (data[i] - 47) % 3
23: else
24: col[i] = data[i] - 48
25: end
26: newdata = newdata + String(col[i])
27: end
28:
29: for i in [0,1,2,3,4,5]
30: ball[i] = '<A HREF="hexru.cgi?' + newdata + String(i) + '"><IMG SRC="' + ballpict[col[i]] + '" BORDER=0></A>'
31: end
32:
33: print "Content-type: text/html\n\n"
34:
35: print "<HTML><TABLE><TR><TD>", \
36: TD, ball[0], TD, TR, \
37: ball[5], TD, TD, ball[1], TR, \
38: ball[4], TD, TD, ball[2], TR, \
39: TD, ball[3], TD, \
40: "</TD></TR></TABLE><H2><A HREF=\"hexru.cgi\">Restart</A></H2></HTML>"