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)
明日もう一度考えてみよう。