view minato2014/bacup/Bingo1.rb @ 1735:93632e78829c

audio Êѹ¹11
author OOTANI Hiroyuki <c115036@g.koeki-u.ac.jp>
date Fri, 28 Jul 2017 21:10:57 +0900
parents 345b851fea56
children
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.cookies["id"][0].to_i
magic = c.cookies["magic"][0].to_i
err = 0                         # ä¸æ­£ãªå‹•ãã§ã‚ã‚Œã°è² ã®å€¤ã«ãªã‚‹
sidesize = 3
message = "ã¯ã‚Šãã£ã¦è¡Œãã¾ã—ょã†!<br>"                    # ビンゴ用テキスト

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

### DROP TABLE ###

getcom = ARGV[0].to_s
drop = 'DROP TABLE main ;'
if getcom == 'ududlrllba'
  db.execute(drop)
end

######

### DELETE TABLE ###

del = 'DELETE FROM main WHERE id=?'
if getcom == 'ududlrlrba'
  db.execute(del, id)
end

######

##### CHECKING UID #####

sql = "SELECT stamp_status, stamp_img, name, job, sex, exp FROM main WHERE id=? AND magic=?"
begin
  user_data = db.execute(sql, id, magic)
rescue
  user_data = []
end

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="2.5;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(256788901)
  stamp = Hash.new("n")
  stamp_name = ["kamo", "kite", "mame", "mo2usa", "inuwasi", "hanabu", "be", "UMIMARU", "pero"]
  (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            # ビンゴã®æ•°
last_bingo = bingo

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
  
    ### ビンゴã—ãŸãƒ©ã‚¤ãƒ³ã‚’判定(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            # ビンゴã®æ•°
  
  # 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] += 1# ビンゴã«ãªã‚‹æ•°å­—を代入
      stamp_img[reach] = rightAC
      message = "æ–°ã—ã„スタンプをGETã—ã¾ã—ãŸ!" # Top message
    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 

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

bc = bingo.to_i - last_bingo.to_i

if bc > 0
  message += '<br>ãŠã‚ã§ã¨ã†!' + bc.to_s
  message += 'ビンゴæƒã„ã¾ã—ãŸ!!<br>'
end

if rank > 0
  printf("<p style=\"background:red; color:white;\">%sãŠã‚ã§ã¨ã†ã”ã–ã„ã¾ã™!☆ %dç­‰ ☆ãŒå½“é¸ã—ã¾ã—ãŸ!!</p>", message, rank)
else
  printf("<p style=\"background:#136cf9;\">%s</p>", message)
end

##

######

### 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=170 height=170><img src=\"png/%s.png\" alt=\"stamped\" width=\"160\" height=\"160\"><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=170 height=170></td>\n" 
    end
  end
  print'<tr>'
end
# End of center 
print'
</table>
</div>
'
######

### BOTTOM ###
print'
<div class="bottom">
'
# - RPGã®è¡¨ç¤º - #

name = user_data[0][2]
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  WHERE rank=0;'
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)

####

## GETTING EXP SUM ##

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

####

stamp = stamp_st.inject(:+)                 # é…列内ã®å€¤ã‚’å…¨ã¦è¶³ã™

charST = rpg(job, sex, stamp, bingo, sumexp)      # ユーザーã®ã‚­ãƒ£ãƒ©ã‚¯ã‚¿ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹

printf("
<!-- キャラクターイメージã®è¨­å®š -->
<div class=\"charIMG\">
<img src=\"png/%s.png\">
</div>
<div class=\"charSTATUS\">
ID:%04d<br>
NAME:%s<br>
ã‚ãªãŸã®Lv: %d / 全員ã®Lv: %d<br>
当é¸ç¢ºçŽ‡: %3.3f \%
<div>
", charST[0], id-1,  name, charST[2],sumexp , charST[1])

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

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

yatex.org