2004-04-01
          [開発ログ]リーグ生成
リーグ生成処理が一部しっくりこない。
#-----------------------------------------------------------------------------
#    大会ステータス
#    新規は手動で作成。このレコードの存在=大会の存在である。
#-----------------------------------------------------------------------------
CREATE TABLE compe_state (
  ID             INT  primary key auto_increment,
  stageCounter   INT  not null default 1,
  dayMax         INT,                 # 経過日数がこの値に達すると大会が終了し、新しいリーグが組まれる
                                      # 試合数ではなく休日を含めたあくまで日数
  dayCounter     INT,                 # 経過日数
                                      # NULLだとリーグ新規作成
  gameMax        INT  not null,       # 奇数:1リーグの試合数。ここから1リーグの参加人数(gameMax+1)が決まる
  turn           INT  not null,       # 同じ相手と戦う回数。ステージの試合数は(gameMax*turn)
  gameCounter    INT  not null,       # すでに終了した試合数
  schedule       CHAR(255) not null,  # 1,1,1,1,1,0,0,1,1,1,1,0 スケジュールリスト
  gradeMax       INT  not null,
  leagueNums     CHAR(255) not null,  # 1,3,9,0…  グレード別のリーグ数。必ず最後が0
  downNums       CHAR(255) not null,  # 3,3,3,3,…  グレード別の降格人数
                                      # 最後(最高ランク)の数字は基本的に0。1以上ならその人数が抜ける→NPCで補充
  updatedTime    TIMESTAMP,           # 更新日時
  creationTime   TIMESTAMP,           # 作成日時
);
#-----------------------------------------------------------------------------
#    リーグデータ
#-----------------------------------------------------------------------------
CREATE TABLE league_data (
  ID             INT primary key auto_increment,
  CompeID        INT not null,         # 大会ID
  StageID        INT not null,         # ステージ
  Grade          INT not null,         # グレード
  GroupID        INT not null,         # グループ
  WinAward       INT not null,         # 勝利時の賞金
  DrawAward      INT not null,         # 引き分け時の賞金
  state          ENUM("Playing","After") not null default "Playing",
  UserList       CHAR(255) not null,   # teamid1,teamid2,teamid3,… エントリー順
                                       # デバッグ用。正式にはleague_data_usersで管理される
  updatedTime    TIMESTAMP,            # 更新日時
  creationTime   TIMESTAMP,            # 作成日時
  UNIQUE (CompeID,StageID,GroupID,Grade)
);
#-----------------------------------------------------------------------------
#    リーグデータユーザーズ
#    そのリーグにエントリしているユーザーのリスト
#-----------------------------------------------------------------------------
CREATE TABLE league_data_user (
  UserID         INT not null,
  LeagueID       INT not null,
  EntryIdx       INT not null,
  UNIQUE (userID,LeagueID),
  UNIQUE (LeagueID,EntryIdx),
);
#-----------------------------------------------------------------------------
#    順位テーブル
#    順位とリーグ中の成績を記録。試合終了時に更新。
#    インサートはリーグ更新時だけなので、過去の大会の順位ログが残っていく。
#    
#    リーグ作成時にこのリストも作成される。
#-----------------------------------------------------------------------------
CREATE TABLE compe_ranking (
  userID          INT not null,
  CompeID         INT not null,           # LeagueIDからも引けるが持っておく
  StageID         INT not null,           # LeagueIDからも引けるが持っておく
  LeagueID        INT,
  Grade           INT,
  ranking         INT,                    # リーグ内順位
  gRanking        INT,                    # ランク内順位
  cRanking        INT,                    # 大会総合順位
  win             INT not null default 0,
  draw            INT not null default 0,
  lose            INT not null default 0,
  score           INT not null default 0,
  UNIQUE (userID,LeagueID)
);
#-----------------------------------------------------------------------------
#    対戦データ
#    試合の対戦記録。リーグ更新時にまとめて作成される。
#    試合が行われたときに更新される。
#    スケジュールの役割も果たす。
#
#    容量計算
#      4*4+3+80+80=179+index ≒ 200
#      5000(games) × 200(Byte) × 1000(days) = 1,000,000,000 = 1G
#    よって 1万人1000日稼動でHDD消費1ギガ
#-----------------------------------------------------------------------------
CREATE TABLE vs_data (
  ID              INT primary key auto_increment,
  LeagueID        INT not null,
  DayCount        INT not null,       # 何日目に行われる何試か
  GameCount       INT not null,       # 何試合目か
  homeID          TINYINT not null,   # 試合会場のID
  homeUserID      INT not null,
  awayUserID      INT not null,
  homeScore       TINYINT,            # NULLなら試合が行われていないとみなす
  awayScore       TINYINT,            # NULLなら試合が行われていないとみなす
  UNIQUE (LeagueID,GameCount,homeUserID)
);
            leaguefactory.rb
#============================================================================= # リーグ工場 # # 新規にリーグを作成 # vs_data(対戦スケジュール)もここで作成 # 既存のリーグに途中参加のユーザを追加 # #============================================================================= class LeagueFactory #--------------------------------------------------------------------------- # ひとつのリーグを新規作成 # vs_data(対戦スケジュール)もここで作成 #--------------------------------------------------------------------------- def LeagueFactory.make(sql,compeID,stageID,member,grade) end #--------------------------------------------------------------------------- # 大会参加者全員分のリーグを作成 # # 順位順にソートし、上から順にグループに振り分ける # リーグのエントリに不足があればNPCを作成してエントリさせる #--------------------------------------------------------------------------- def LeagueFactory.make_all(sql,compeID,stageID) end end
ranking.rb
#============================================================================= # compe_rankingテーブルに対する操作を行う # # #============================================================================= class Ranking #--------------------------------------------------------------------------- # compe_ranking作成 #--------------------------------------------------------------------------- def Ranking.make_new(sql,compeID,stageID) end #--------------------------------------------------------------------------- # compe_ranking.cRankingを成績にソートした順位で更新する #--------------------------------------------------------------------------- def Ranking.update_cranking(sql,compeID,stageID) end #--------------------------------------------------------------------------- # leagueIDを設定 #--------------------------------------------------------------------------- def Ranking.update_leagueID(sql,compeID,stageID) end end
_test_all.rb
init_test(sql) CardDealer::deal_to_all(sql) stageID = -1 compeID = make_compe_state(sql) Ranking::make_new(sql,compeID,stageID) Ranking::update_cranking(sql,compeID,stageID) LeagueFactory::make_all(sql,compeID,stageID) Ranking::make_new(sql,compeID,stageID) Ranking::update_cranking(sql,compeID,stageID) Ranking::update_leagueID(sql,compeID,stageID)
明日もう一度考えてみよう。