第03話:構想編 イベントシステムを構築しよう
帽子を追いかけるみたいに一直線の物語では面白くありません。
かといって、エージェントモデルはプログラムの手間がひどくて駄目でした。
そこで、イベント方式で作っていきます。
というか、作りました。
別に今日いきなり作れたわけでなく、前から少しずつ仕込んでいました。
今回の物語を作るに当たっては、こういう事が必要です。
結構面倒です。
1,イベントを沢山つくる
・働くイベント
・賭け事イベント
・先輩と交渉イベント
・アイテム取得イベント?
2,一日ごとに「章」という形にする
・区切りを入れることで見やすくする
・一日の終りに借金計算
3,「一日」という概念を実現するために「時間」の概念を入れる
・うわ、面倒
4,学生ということを考慮して、平日と土日でルーチンを変える
・うわ、面倒 その2
・平日に「学校登校イベント」を実行することで実現
◇イベント実行の構造
・現在のパラメータ(持ち金や時間など)で実行可能なイベントを列挙する
・実行可能なイベントをランダムで実行する
・パラメータを更新する
これを実現するために、isEnableというメソッドを作り、それからすでに実行したイベントを記録するためにWorldクラスに配列を用意して……
いや、もういいですね。
プログラム講座じゃないんだから、あんまり細かく書いても読みたくないですよね。
とりあえず、がんばった結果、こんなんが出せるようになりました。
まだ内容がないですが、とりあえず一日が流れているのがわかると思います。
一週間分を貼り付けます。
******************************************************
月曜日 AM:7時【家】
葵は学校に向かって走った!なんとか、間に合った!
月曜日 AM:8時【学校】
葵はなんとなく授業をやり過ごした!
月曜日 AM:9時【学校】
葵はなんとなく授業をやり過ごした!
月曜日 AM:10時【学校】
葵はなんとなく授業をやり過ごした!
月曜日 AM:11時【学校】
葵はなんとなく授業をやり過ごした!
月曜日 PM:0時【学校】
葵はなんとなく授業をやり過ごした!
月曜日 PM:1時【学校】
葵はなんとなく授業をやり過ごした!
月曜日 PM:2時【学校】
葵はなんとなく授業をやり過ごした!
月曜日 PM:3時【学校】
葵はなんとなく授業をやり過ごした!
月曜日 PM:4時【学校】
葵はなんとなく授業をやり過ごした!
月曜日 PM:5時【学校】
葵は家に帰った!
月曜日 PM:6時【家】
暇つぶしをして1時間過ぎた!
月曜日 PM:7時【家】
暇つぶしをして1時間過ぎた!
月曜日 PM:8時【家】
暇つぶしをして1時間過ぎた!
月曜日 PM:9時【家】
布団に入った!
一日が終わった!
借金が4370円増えた!
借金総額:\441370
所持金:\100
◇
火曜日 AM:7時【家】
葵は学校に向かって走った!なんとか、間に合った!
火曜日 AM:8時【学校】
葵はなんとなく授業をやり過ごした!
火曜日 AM:9時【学校】
葵はなんとなく授業をやり過ごした!
火曜日 AM:10時【学校】
葵はなんとなく授業をやり過ごした!
火曜日 AM:11時【学校】
葵はなんとなく授業をやり過ごした!
火曜日 PM:0時【学校】
葵はなんとなく授業をやり過ごした!
火曜日 PM:1時【学校】
葵はなんとなく授業をやり過ごした!
火曜日 PM:2時【学校】
葵はなんとなく授業をやり過ごした!
火曜日 PM:3時【学校】
葵はなんとなく授業をやり過ごした!
火曜日 PM:4時【学校】
葵はなんとなく授業をやり過ごした!
火曜日 PM:5時【学校】
葵は2時間部活動をした!
火曜日 PM:7時【学校】
葵は家に帰った!
火曜日 PM:8時【家】
暇つぶしをして1時間過ぎた!
火曜日 PM:9時【家】
布団に入った!
一日が終わった!
借金が4413円増えた!
借金総額:\445783
所持金:\100
◇
水曜日 AM:7時【家】
暇つぶしをして1時間過ぎた!
水曜日 AM:8時【家】
葵は学校に行くのを忘れていた。慌てて出かけたが遅刻した……
水曜日 AM:9時【学校】
葵はなんとなく授業をやり過ごした!
水曜日 AM:10時【学校】
葵はなんとなく授業をやり過ごした!
水曜日 AM:11時【学校】
葵はなんとなく授業をやり過ごした!
水曜日 PM:0時【学校】
葵はなんとなく授業をやり過ごした!
水曜日 PM:1時【学校】
葵はなんとなく授業をやり過ごした!
水曜日 PM:2時【学校】
葵はなんとなく授業をやり過ごした!
水曜日 PM:3時【学校】
葵はなんとなく授業をやり過ごした!
水曜日 PM:4時【学校】
葵はなんとなく授業をやり過ごした!
水曜日 PM:5時【学校】
葵は2時間部活動をした!
水曜日 PM:7時【学校】
葵は家に帰った!
水曜日 PM:8時【家】
暇つぶしをして1時間過ぎた!
水曜日 PM:9時【家】
暇つぶしをして1時間過ぎた!
水曜日 PM:10時【家】
暇つぶしをして1時間過ぎた!
水曜日 PM:11時【家】
布団に入った!
一日が終わった!
借金が4457円増えた!
借金総額:\450240
所持金:\100
◇
木曜日 AM:7時【家】
葵は学校に向かって走った!なんとか、間に合った!
木曜日 AM:8時【学校】
葵はなんとなく授業をやり過ごした!
木曜日 AM:9時【学校】
葵はなんとなく授業をやり過ごした!
木曜日 AM:10時【学校】
葵はなんとなく授業をやり過ごした!
木曜日 AM:11時【学校】
葵はなんとなく授業をやり過ごした!
木曜日 PM:0時【学校】
葵はなんとなく授業をやり過ごした!
木曜日 PM:1時【学校】
葵はなんとなく授業をやり過ごした!
木曜日 PM:2時【学校】
葵はなんとなく授業をやり過ごした!
木曜日 PM:3時【学校】
葵はなんとなく授業をやり過ごした!
木曜日 PM:4時【学校】
葵はなんとなく授業をやり過ごした!
木曜日 PM:5時【学校】
葵は家に帰った!
木曜日 PM:6時【家】
暇つぶしをして1時間過ぎた!
木曜日 PM:7時【家】
暇つぶしをして1時間過ぎた!
木曜日 PM:8時【家】
暇つぶしをして1時間過ぎた!
木曜日 PM:9時【家】
布団に入った!
一日が終わった!
借金が4502円増えた!
借金総額:\454742
所持金:\100
◇
金曜日 AM:7時【家】
暇つぶしをして1時間過ぎた!
金曜日 AM:8時【家】
葵は学校に行くのを忘れていた。慌てて出かけたが遅刻した……
金曜日 AM:9時【学校】
葵はなんとなく授業をやり過ごした!
金曜日 AM:10時【学校】
葵はなんとなく授業をやり過ごした!
金曜日 AM:11時【学校】
葵はなんとなく授業をやり過ごした!
金曜日 PM:0時【学校】
葵はなんとなく授業をやり過ごした!
金曜日 PM:1時【学校】
葵はなんとなく授業をやり過ごした!
金曜日 PM:2時【学校】
葵はなんとなく授業をやり過ごした!
金曜日 PM:3時【学校】
葵はなんとなく授業をやり過ごした!
金曜日 PM:4時【学校】
葵はなんとなく授業をやり過ごした!
金曜日 PM:5時【学校】
葵は家に帰った!
金曜日 PM:6時【家】
暇つぶしをして1時間過ぎた!
金曜日 PM:7時【家】
暇つぶしをして1時間過ぎた!
金曜日 PM:8時【家】
暇つぶしをして1時間過ぎた!
金曜日 PM:9時【家】
暇つぶしをして1時間過ぎた!
金曜日 PM:10時【家】
暇つぶしをして1時間過ぎた!
金曜日 PM:11時【家】
布団に入った!
一日が終わった!
借金が4547円増えた!
借金総額:\459289
所持金:\100
◇
土曜日 AM:7時【家】
暇つぶしをして1時間過ぎた!
土曜日 AM:8時【家】
1時間働いて300円稼いだ!(0回目)
土曜日 AM:9時【家】
暇つぶしをして1時間過ぎた!
土曜日 AM:10時【家】
1時間働いて300円稼いだ!(1回目)
土曜日 AM:11時【家】
1時間働いて300円稼いだ!(2回目)
土曜日 PM:0時【家】
1時間働いて300円稼いだ!(3回目)
土曜日 PM:1時【家】
1時間働いて300円稼いだ!(4回目)
土曜日 PM:2時【家】
暇つぶしをして1時間過ぎた!
土曜日 PM:3時【家】
暇つぶしをして1時間過ぎた!
土曜日 PM:4時【家】
1時間働いて300円稼いだ!(5回目)
土曜日 PM:5時【家】
1時間働いて300円稼いだ!(6回目)
土曜日 PM:6時【家】
1時間働いて300円稼いだ!(7回目)
土曜日 PM:7時【家】
1時間働いて300円稼いだ!(8回目)
土曜日 PM:8時【家】
暇つぶしをして1時間過ぎた!
土曜日 PM:9時【家】
暇つぶしをして1時間過ぎた!
土曜日 PM:10時【家】
暇つぶしをして1時間過ぎた!
土曜日 PM:11時【家】
布団に入った!
一日が終わった!
借金が4592円増えた!
借金総額:\463881
所持金:\2800
◇
日曜日 AM:7時【家】
1時間働いて300円稼いだ!(9回目)
日曜日 AM:8時【家】
1時間働いて300円稼いだ!(10回目)
日曜日 AM:9時【家】
暇つぶしをして1時間過ぎた!
日曜日 AM:10時【家】
1時間働いて300円稼いだ!(11回目)
日曜日 AM:11時【家】
暇つぶしをして1時間過ぎた!
日曜日 PM:0時【家】
1時間働いて300円稼いだ!(12回目)
日曜日 PM:1時【家】
1時間働いて300円稼いだ!(13回目)
日曜日 PM:2時【家】
暇つぶしをして1時間過ぎた!
日曜日 PM:3時【家】
1時間働いて300円稼いだ!(14回目)
日曜日 PM:4時【家】
1時間働いて300円稼いだ!(15回目)
日曜日 PM:5時【家】
1時間働いて300円稼いだ!(16回目)
日曜日 PM:6時【家】
1時間働いて300円稼いだ!(17回目)
日曜日 PM:7時【家】
暇つぶしをして1時間過ぎた!
日曜日 PM:8時【家】
1時間働いて300円稼いだ!(18回目)
日曜日 PM:9時【家】
布団に入った!
一日が終わった!
借金が4638円増えた!
借金総額:\468519
所持金:\5800
******************************************************
これ、なんだろう。
とりあえず意図通りに動いてはいるけど、もうこれ小説じゃないね。
学園生活シミュレーションゲーム(製作中)?
暇つぶしややりすごしてばかりしていますが、とりあえず進行はまともにうごいています。
ランダムでイベントを選んでいるので、暇つぶしして通学が遅れたり、部活をしたりしなかったり、寝る時間が前後したりしています。
よし!
それにしても、つくづくこれは小説じゃない気が……
ま、まぁ、いいか……
とりあえずここまで動いたので、ここにイベントをぶちこんでいけばそれっぽくなると思います。
さて、どうなるでしょうか……
ちなみに、プログラムはこんな感じになっています~
↓
######################################################
#! ruby -E Windows-31J:utf-8
# coding: utf-8
#イベントモデルの実験
def init
$aoi = AoiAgent::new
$world = World::new
$world.aoi = $aoi
$event = []
$event.push HappyED::new
$event.push BadED::new
$event.push MoveEvent1::new
$event.push MoveEvent2::new
$event.push SchoolEvent1::new
$event.push ClubEvent1::new
$event.push Event3::new
$event.push Event4::new
$event.push Event5::new
end
#家→学校に移動
class MoveEvent1
def getEventName
return "平日の通学"
end
def isEnable(world,chara)
if !world.isHoliday && (world.time < 12) && (world.place == "家")
return true
else
return false
end
end
def run(world,chara)
if world.time == 7
puts "葵は学校に向かって走った!なんとか、間に合った!"
else
puts "葵は学校に行くのを忘れていた。慌てて出かけたが遅刻した……"
end
world.place = "学校"
world.time += 1
end
end
#学校→家に移動
class MoveEvent2
def getEventName
return "平日の通学(帰り)"
end
def isEnable(world,chara)
if !world.isHoliday && (world.time >= 17) && (world.place == "学校")
return true
else
return false
end
end
def run(world,chara)
puts "葵は家に帰った!"
world.place = "家"
world.time += 1
end
end
#平日の学校
class SchoolEvent1
def getEventName
return "平日の学校"
end
def isEnable(world,chara)
if !world.isHoliday && (world.time < 17) && (world.place == "学校")
return true
else
return false
end
end
def run(world,chara)
puts "葵はなんとなく授業をやり過ごした!"
world.time += 1
end
end
#平日の部活動
class ClubEvent1
def getEventName
return "平日の部活動"
end
def isEnable(world,chara)
if !world.isHoliday && (world.time == 17) && (world.place == "学校")
return true
else
return false
end
end
def run(world,chara)
puts "葵は2時間部活動をした!"
world.time = 19
end
end
#暇つぶし
class Event3
def getEventName
return "家で暇つぶし"
end
def isEnable(world,chara)
if world.time <= 23 && world.place == "家"
return true
else
return false
end
end
def run(world,chara)
puts "暇つぶしをして1時間過ぎた!"
world.time += 1
end
end
#暇つぶし
class Event4
def getEventName
return "睡眠"
end
def isEnable(world,chara)
if (world.time >= 21) && (world.place == "家")
return true
else
return false
end
end
def run(world,chara)
puts "布団に入った!"
puts "一日が終わった!"
puts
world.time = 7
world.nextDay
end
end
#働く
class Event5
def getEventName
return "働く"
end
def isEnable(world,chara)
if world.isHoliday
return true
end
end
def run(world,chara)
puts "1時間働いて300円稼いだ!("+world.countOfExperiencedEvent(self).to_s+"回目)"
chara.money += 300
world.time +=1
end
end
#Happy ED
class HappyED
def getEventName
return "Happy ED"
end
def isEnable(world,chara)
if chara.money >= world.debt
return true
else
return false
end
end
def run(world,chara)
puts "おめでとう! 借金完済!"
return 1
end
end
#BADED
class BadED
def getEventName
return "BAD ED"
end
def isEnable(world,chara)
if world.debt >= 1000000
return true
else
return false
end
end
def run(world,chara)
puts "借金100万円! バッドED!"
return 1
end
end
#環境クラス
class World
#イベント
attr_accessor :last_event
#時間
attr_accessor :time,:day
#借金
attr_accessor :debt, :debt_rate
#エージェント
attr_accessor :aoi
#場所
attr_accessor :place
def initialize
@last_event = ""
@time = 7
@day = 1 #月~金 1-5 土日 6,7
@experienced_events = {}
@debt = 437000
@debt_rate = 1
@place = "家"
end
#時間関係
def isHoliday
if @day == 6 || @day == 7
return true
else
return false
end
end
def nextDay
@day += 1
if @day == 8
@day = 1
end
a = (@debt*@debt_rate*0.01).to_i
puts "借金が"+a.to_s+"円増えた!"
@debt += a
puts "借金総額:\\"+@debt.to_s
puts "所持金:\\"+@aoi.money.to_s
puts
puts "◇"
end
def getDayTime
d = ""
case @day
when 1 then d = "月"
when 2 then d = "火"
when 3 then d = "水"
when 4 then d = "木"
when 5 then d = "金"
when 6 then d = "土"
when 7 then d = "日"
end
t = ""
if @time < 12
t = "AM:"+@time.to_s+"時"
else
t = "PM:"+(@time-12).to_s+"時"
end
return ""+d+"曜日 "+t
end
def addExperiencedEvent(e)
if @experienced_events[e.getEventName] == nil
@experienced_events[e.getEventName] = 1
else
@experienced_events[e.getEventName] += 1
end
end
def countOfExperiencedEvent(e)
if @experienced_events[e.getEventName] == nil
return 0
else
return @experienced_events[e.getEventName]
end
end
end
def mainstory
loop do
puts $world.getDayTime+"【"+$world.place+"】"
ev = []
for e in $event
if e.isEnable($world,$aoi)
ev.push e
end
end
n = rand() * ev.length
if ev[n].run($world,$aoi) == 1
break
end
#前回のイベントを記録
$world.last_event = ev[n].getEventName
#実行したイベントを記録
$world.addExperiencedEvent(ev[n])
puts
end
end
#葵エージェント
class AoiAgent
attr_accessor :money
def initialize
@money=100
end
end
#メイン処理
init
mainstory