#!/usr/bin/env ruby # -*- coding: utf-8 -*- require 'yaml/store' file = "db/point.yaml" bingoword = %w(もっけ やばち はっこ げっぱ) # 正解キーワード4つ require 'cgi' c = CGI.new(:accept_charset => "UTF-8") # 前回のアクセスで既にcookieが定義されていたら取得 # ブラウザからのcookieは、c.cookies[変数名][0] で受け取る cookie_id=c.cookies["id"][0] # 前回のアクセスで入力された値を取得 form_name=c["playname"] # nameをフォームから取得(もしあれば) form_kwd=c["keyword"] # keywordも取得(もしあれば) if cookie_id == nil # (1)もしcookieからのidがなければ新規生成 # 新規idは、現在時刻を秒(to_i)にした文字列(to_s)と乱数の組み合わせ newid = Time.now.to_i.to_s + "/" + rand(99999).to_s id=newid # 新規idをidとする else # (2)cookieからのidがあればそれをidとする id=cookie_id end # idをすぐcookieで相手ブラウザに送る # 変数の期限を24時間に設定し、expire変数に入れる expire = (Time.now+24*3600).gmtime.strftime("%a, %d %b %Y %H:%M:%S GMT") printf("Content-type: text/html; charset=UTF-8\n") printf("Set-Cookie: id=%s; expires=%s\n\n", id, expire) db = YAML::Store.new(file) db.transaction do info = db["info"] = db.fetch("info", Hash.new) if !info[id] # もしそのユーザ情報が未登録(空)なら info[id] = Hash.new # 新規ハッシュを割り当てる end if form_name > "" # formからの名前設定がもしあれば info[id]["name"] = form_name # それをユーザ情報に記録 info[id]["bingo"] = Hash.new # 正解した単語保存用のハッシュも作成 end point = 0 # 開始直後は0点 if !info[id]["name"] # もしユーザのプレイ名が未設定なら title = "○○ゲームへようこそ!" hello = "ポイントゲームを始めましょう。" guide = "あなたのプレイ名を決めます" input = '' else # プレイ名設定済みならキーワード入力 title = sprintf("%s さんのホーム", info[id]["name"]) guide = "キーワードを入れてください" input = '' # プレイ名設定済みで、さらにキーワードが入力されていたら if form_kwd > "" index = bingoword.index(form_kwd) # 配列から入力単語(form_kwd)を探索 if index # 見付かった! その単語をハッシュのキーとして適当に値(true)を入れておく info[id]["bingo"][bingoword[index]] = true end end point = info[id]["bingo"].length # ハッシュの長さで正解数が分かる hello = sprintf("現在のポイントは %dpt です。", 25*point) bingos = info[id]["bingo"].keys.collect do |x| "「" + x + "」" # collectメソッドで 「 」 で括った単語を集めて end.join(", ") # joinメソッドで ,(カンマ) 区切りでつなげる end printf(<<-EOF,
%s
当てたキーワード(%d/%d): %s
EOF title, hello, point, bingoword.length, bingos, guide, input) end