view minato2014/Bingo.rb @ 2286:bc56fa218f57

Apdated.
author MURAKAMI Masaki <c112124@h.koeki-u.ac.jp>
date Tue, 22 Jul 2014 20:53:34 +0900
parents d0116df87007
children 7d88e0656c18
line wrap: on
line source

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'sqlite3'
require 'cgi'
require 'date'
require './sub.rb'
require 'net/http'

c = CGI.new(:tag_maker => "html5", :accept_charest => "UTF-8")
db = SQLite3::Database.new("sql/stamp.sq3")

#id = c[id]                      # uidの取得
id = c.cookies["id"][0].to_i
#id = 1                          # test
err = 0                         # 不正な動きであれば負の値になる
sidesize = 3
message = "はりきって行きましょう!"                    # ビンゴ用テキスト

print("Content-type: text/html; charset=UTF-8 \n\n")

#p id
##### CHECKING UID #####

sql = "SELECT stamp_status, stamp_img, name, job, sex, exp FROM main WHERE id=?"
user_data = db.execute(sql, id)
if user_data == []              # ログインエラー(-1)
  err -= 1
end

### LOGIN ERROR HTML ###

if err == -1
  print'
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="refresh" content="3;http://skip.koeki-prj.org/minato2014/account.html">
</head>
<title>たいとる</title>
<body>
'
print'
<p> ログインに失敗しました。 </p>
<p>
アカウント登録ページへ接続中…<br>
* 3秒経っても移動しない場合は<a href="account.html">こちら</a>から移動して下さい。
</p>
</body>
</html>
'
  exit
end

######

##########

##### RE-ARRAYING STAMP_STATUS AND STAMP_IMG #####

# stamp status
stamp_st = user_data[0][0]
stamp_st = stamp_st.split(//)   # 一文字ずつ分けて配列にする
stamp_st = stamp_st.map {|s| s.to_i} # 配列内の文字列を数列になおす

# stamp img
stamp_img = user_data[0][1]     
stamp_img = stamp_img.split(",") # 文字列を","で区切って配列にする

##########

##### STAMPPING #####

### Making randam number ###

def taiou(sidesize)
  srand(123456789)
  stamp = Hash.new("n")
  stamp_name = ["kamo", "kite", "mame", "mo2usa", "inuwasi", "hanabu", "be", "UMIMARU", "murakamibot"]
  (sidesize**2).times do |n|
    stamp[rand(10000000)] = stamp_name[n]
  end
  stamp
end

######

##### Checking bingo method #####

def bingocheck(start, sidesize, stepon, stamp, decision, bingo)
  nbox = []
  setbox = Hash.new
  if sidesize == stepon
    x = sidesize
  else
    x = 1
  end
  x.times do |m|
    start.step(sidesize*sidesize - 1, stepon) do |n|
      nbox << n + m
      if nbox.length == sidesize
        dbox = Array.new(0)     # next bingo or reach numbers(bingoed -> nothing)
        for i in nbox
          if stamp[i] == 0
            dbox << i
          end
        end
        # sidesizeにdecisionの値を加えることで、ビンゴ、次ビンゴ、リーチをそれぞれdecisionに0,1,2を加えることで表現。
        if dbox.length == decision 
          setbox[dbox] = nbox
          bingo << setbox
          setbox = Hash.new
          nbox = []
        else
          nbox = []
        end
      end
    end
  end
end 
# bingo[{[ビンゴまたはリーチに必要な番号] => [ビンゴまたはリーチのラインを形成する番号]}]
##########

bingo =          # 現在のビンゴ数

### Checking Access Cord(AC) ###

getAC = ARGV[0].to_i            # URL?以降の引数を取得
rightAC = taiou(sidesize)       # taiouで生成したACのハッシュ
#p rightAC
rightAC = rightAC[getAC]        # ACが正しければスタンプ名が入り、異なる場合はn

##### ACCESS LOG #####
t = Time.now
time = (t.hour * 3600) + (t.min * 60) + t.sec

## Checking sql_master table. If sqlite_master don't have tablename, it create.

sql_master = "SELECT name FROM sqlite_master WHERE name='logs';"
check_master = db.execute(sql_master)
sql_logs = 'CREATE TABLE logs(
id INTEGER PRIMARY KEY AUTOINCREMENT,
uid INTEGER,
ac TEXT,
time INTEGER);
'
if check_master == []
  db.execute(sql_logs)
end

##########

begin
  get_log = 'SELECT ac, time FROM logs WHERE uid=(SELECT MAX(id) FROM logs WHERE uid=?);' # ユーザーの最新のログ情報を取得
  log_check = db.execute(get_log, id)
rescue
  print'GETTING LOG ERROR!'
end
begin
  log = 'INSERT INTO logs(uid, ac, time) VALUES(?, ?, ?)'
  db.execute(log, id, rightAC, time)
rescue
  print'INSERT LOG ERROR!'
end
# /* memo: 再度同じようなシステムを作る際はスタンプ用のテーブルがほしい。 */ #

##########

### ビンゴしたラインを判定(decision = 0) ###
bingo = []
# 横
bingocheck(0, sidesize, 1, stamp_st, 0, bingo)
# 縦
bingocheck(0, sidesize, sidesize, stamp_st, 0, bingo)
# 左斜め
bingocheck(0, sidesize, sidesize+1, stamp_st, 0, bingo)
# 右斜め
bingocheck(sidesize-1, sidesize, sidesize-1, stamp_st, 0, bingo)
#######

bingo = bingo.length            # ビンゴの数


if rightAC != "n"               # rightACが正しければ
  
  ### Update Stamp_status And Stamp_img ###
  
  # Replacing Image #
  
  index_st = []
  stamp_st.length.times { |c|
    if stamp_st[c] == 0
      index_st << c
    end
  }
  
  ### リーチ(decision = 1)# [{[ビンゴの番号] => [リーチを構成する数]}]
  reach = []
  # 横 
  bingocheck(0, sidesize, 1, stamp_st, 1, reach)
  # 縦
  bingocheck(0, sidesize, sidesize, stamp_st, 1, reach)
  # 左斜め
  bingocheck(0, sidesize, sidesize+1, stamp_st, 1, reach)
  # 右斜め
  bingocheck(sidesize-1, sidesize, sidesize-1, stamp_st, 1, reach)
  #######
  
  begin
    reach = reach[0].flatten(2)[0] # ビンゴの番号のみ抽出
  rescue
    reach = []
  end
  
  # Updating stamp_st #  
  if stamp_img.include?(rightAC) == true          # 既に同名のスタンプが入っていたら
    if stamp_st[stamp_img.index(rightAC)] < 9
      stamp_st[stamp_img.index(rightAC)] += 1       # 対応するスタンプの位置に1足す
      message = "スタンプカウントが「1」増えました!(スタンプカウントは「9」が上限です)"
    else
      message="スタンプカウントMAX!!(※これ以上このスタンプのカウントは増えません)"
    end
  else
    if reach != [] && bingo == 0       # はじめのビンゴは必ず3回で完成
      stamp_st[reach] # ビンゴになる数字を代入
      stamp_img[reach] = rightAC
    else
      randam_number = index_st[rand(index_st.length)] # スタンプの入っていない個所のなかからランダムにひとつ選ぶ
      stamp_st[randam_number] += 1                  # 選ばれた個所に1足す
      stamp_img[randam_number] = rightAC # stamp_stと同じ個所にstamp_imgにスタンプの名前を代入
      message = "新しいスタンプをGETしました!" # Top message
    end
  end
  ##
  
  ##

  ### ビンゴしたラインを判定(decision = 0) ###
  bingo = []
  # 横
  bingocheck(0, sidesize, 1, stamp_st, 0, bingo)
  # 縦
  bingocheck(0, sidesize, sidesize, stamp_st, 0, bingo)
  # 左斜め
  bingocheck(0, sidesize, sidesize+1, stamp_st, 0, bingo)
  # 右斜め
  bingocheck(sidesize-1, sidesize, sidesize-1, stamp_st, 0, bingo)
  #######
  
  bingo = bingo.length            # ビンゴの数
  
  # Convert to string # 
  
  stamp_st_string = stamp_st.join
  stamp_img_string = stamp_img.join(",")
  
  ##

  sql_update = "UPDATE main SET stamp_status=?, stamp_img=? WHERE id=?;"
  db.execute(sql_update, stamp_st_string, stamp_img_string, id)
end

######

##########

##### HTML #####
print'
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>たいとる</title>
<link rel="stylesheet" type="text/css" href="Bingo.css">
</head>
<body>
'
### TOP ###

sql_rank = 'select rank from main where id=?;'
rank = db.execute(sql_rank, id).flatten(2)[0].to_i

print'
<div class="outflam">
'
if rank > 0
  print'<div class="top" style="background: red;">'
else
  print'<div class="top">'
end
# - ビンゴステータス処理 - #

if rank > 0
  printf("<h1>おめでとうございます!!<br>☆ %d等 ☆が当選しました!!</h1>", rank)
  # print'<p>抽選は終了しましたが、引続きゆる☆スタをお楽しみ下さい!!</p>'
end 
printf("<p>%s</p>",message)

# End of top 
print'
</div>
'
######



### CENTER ###
print'
<div class="center">
<table border=1>
'
for i in 0..2
  print'<tr>'
  3.times do |n|
    if stamp_st[3*i+n].to_i > 0
      printf("<td width=160 height=160><img src=\"png/%s.png\" alt=\"stamped\" width=\"150\" height=\"150\"><span style=\"color: green; font-weight: 900;\">%d</span></td>\n", stamp_img[3*i+n], stamp_st[3*i+n])
    else
      print"<td width=150 height=150></td>\n" 
    end
  end
  print'<tr>'
end
# End of center 
print'
</table>
</div>
'
######

### BOTTOM ###
print'
<div class="bottom">
'
# - RPGの表示 - #

job = user_data[0][3]
sex = user_data[0][4]
exp = user_data[0][5]

## GETTING EXP SUM ##

sum_sql = 'SELECT SUM(exp) FROM main ;'
sumexp = db.execute(sum_sql).flatten(2)[0]

####

stamp = stamp_st.inject(:+)                 # 配列内の値を全て足す

charST = rpg(job, sex, stamp, bingo, sumexp)      # ユーザーのキャラクタステータス

## GETTING EXP SUM ##

sum_sql = 'SELECT SUM(exp) FROM main ;'
sumexp = db.execute(sum_sql).flatten(2)[0]


####

stamp = stamp_st.inject(:+)                 # 配列内の値を全て足す

charST = rpg(job, sex, stamp, bingo, sumexp)      # ユーザーのキャラクタステータス

## UPDATE EXP ##

update_exp = 'UPDATE main SET exp=? WHERE id=?;'
db.execute(update_exp, charST[2], id)

####
#p charST[2]
#p sumexp

printf("
<!-- キャラクターイメージの設定 -->
<div class=\"charIMG\">
<img src=\"png/%s.png\">
</div>
<div class=\"charSTATUS\">
ID:%04d<br>
Lv: %d / 全Lv: %d<br>
当選確率: %3.3f \%
<div>
", charST[0], id,charST[2],sumexp , charST[1])

# End of bottom
print'</div>'

# End of outflam
print'</div>'
######

print'
</body>
</html>
'
##########

yatex.org