$4 ゲームを作ってみる

4-1 簡単なパズル

これまでの技術を使って、簡単なゲームを作ってみましょう。 ゲームの内容は、次のとおりです。

ということで作ってみましょう。

実際のゲーム

と言っても、基本的なプログラムの流れは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>"

Next: 5-1 ファイルからの入力

Previous: 3-3 フォームからのデータ取得 その2

Contents


Foundation of CGI Page

春風はるか haruka@harukaze.net