第07話:賢くない二人がハイアンドローゲーム
おかしい。
こういうネタが好きな人が「なろう」には30名はいるはず。
しかし、まだブックマーク数が7人だと!?
残りの23人は何をしているんだ!?
と考えている今日このごろです。
さて、これまで帽子を追いかけることにがんばってきましたが、さすがに限界が見えてきました。
あまり気負うと詰まってしまってなにもできませんが、しかしあまりに進歩がないのもつまりません。
ここでちょっと趣向を変えたいと思います。
(帽子追いかけるお題でネタ出してくれた方、すいません。いつか活用したいと思います)
今の状態ですと、少年がひたすら一人で動き回るだけで、こう、なんというか、可能性が広がりません。
少年だけでなく、他のキャラクターにも動いてもらいたいところです。
ということで、いろいろ考えた所、「エージェントAI」の考え方がいいのではないかと思いました。
今の作り方では少年だけが走っているなら問題ありませんが、もっと複雑なことをさせようとすると、プログラムの組み合わせが増えて爆発してしまいます。
エージェントベースにすることで、「少年のプログラム」「少女のプログラム」「老人のプログラム」というように個別に作れるようになります。
難しいことを言うと、エージェントは
◯環境の認識(敵がいる!)
◯意思決定(戦うか逃げるか。ナイフを使うか、銃を使うか)
◯行動(銃で攻撃)
みたいな仕組みなっています。
とはいえ、いきなり難しいことは出来ないので、今回は少女と少年で0~9の札でハイアンドローでゲームをします。
まずは、環境認識も意思決定もなくなく、ただ札を引くだけのプロトタイプを作ってみます。
ここからだんだんと賢くしていきたいと思います。
これがきっと、いつか素晴らしい小説生成に結びつくと信じて……(ほんと?)
もはや、文章生成システムではなく、簡単なゲームAIを作っているような形に……
さて、出力結果です!
**********************************************
少年と少女は退屈していた。
少女「退屈だわ。カードで遊びましょう。先手と後手がカードを一枚ずつ取るのよ。そして、先手が数字を見せたら、後手は自分が選んだ数字が大きいか小さいか当てるのよ」
少年「うん、いいよ」
少女「私が勝ったら30ギル、あなたが勝ったら20ギルね」
少年「え、お金かけるの!? しかも、なんか不公平……」
少女「うるさいわね。まずは私が選ぶわ」
少年の所持金:100
少女の所持金:100
***【先手】少女 【後手】少年***
[先手]少女がカード[5]を選んだ
少女「さぁ、選びなさい」
[後手]少年がカードを選んだ
少女「さぁ、ハイ or ロー?」
少年「ハイ!」
少年がカードを裏返すと、[0]だった!
少年「う……ハズレ」
少女「ふふふ」
少年の所持金:70
少女の所持金:130
***【先手】少年 【後手】少女***
[先手]少年がカード[9]を選んだ
少年「さぁ、選んで」
[後手]少女がカードを選んだ
少年「さぁ、ハイ or ロー?」
少女「ロー!」
少女がカードを裏返すと、[0]だった!
少女「やったわ!」
少年「う……」
少年の所持金:40
少女の所持金:160
***【先手】少女 【後手】少年***
[先手]少女がカード[7]を選んだ
少女「さぁ、選びなさい」
[後手]少年がカードを選んだ
少女「さぁ、ハイ or ロー?」
少年「ロー!」
少年がカードを裏返すと、[6]だった!
少年「やった!」
少女「むぐぐ……」
少年の所持金:60
少女の所持金:140
***【先手】少年 【後手】少女***
[先手]少年がカード[6]を選んだ
少年「さぁ、選んで」
[後手]少女がカードを選んだ
少年「さぁ、ハイ or ロー?」
少女「ハイ!」
少女がカードを裏返すと、[1]だった!
少女「ハ、ハズレ?そんな……」
少年「よかった……」
少年の所持金:80
少女の所持金:120
***【先手】少女 【後手】少年***
[先手]少女がカード[1]を選んだ
少女「さぁ、選びなさい」
[後手]少年がカードを選んだ
少女「さぁ、ハイ or ロー?」
少年「ハイ!」
少年がカードを裏返すと、[6]だった!
少年「やった!」
少女「むぐぐ……」
少年の所持金:100
少女の所持金:100
***【先手】少年 【後手】少女***
[先手]少年がカード[8]を選んだ
少年「さぁ、選んで」
[後手]少女がカードを選んだ
少年「さぁ、ハイ or ロー?」
少女「ロー!」
少女がカードを裏返すと、[7]だった!
少女「やったわ!」
少年「う……」
少年の所持金:70
少女の所持金:130
***【先手】少女 【後手】少年***
[先手]少女がカード[3]を選んだ
少女「さぁ、選びなさい」
[後手]少年がカードを選んだ
少女「さぁ、ハイ or ロー?」
少年「ロー!」
少年がカードを裏返すと、[1]だった!
少年「やった!」
少女「むぐぐ……」
少年の所持金:90
少女の所持金:110
***【先手】少年 【後手】少女***
[先手]少年がカード[4]を選んだ
少年「さぁ、選んで」
[後手]少女がカードを選んだ
少年「さぁ、ハイ or ロー?」
少女「ロー!」
少女がカードを裏返すと、[9]だった!
少女「ハ、ハズレ?そんな……」
少年「よかった……」
少年の所持金:110
少女の所持金:90
***【先手】少女 【後手】少年***
[先手]少女がカード[3]を選んだ
少女「さぁ、選びなさい」
[後手]少年がカードを選んだ
少女「さぁ、ハイ or ロー?」
少年「ロー!」
少年がカードを裏返すと、[4]だった!
少年「う……ハズレ」
少女「ふふふ」
少年の所持金:80
少女の所持金:120
***【先手】少年 【後手】少女***
[先手]少年がカード[4]を選んだ
少年「さぁ、選んで」
[後手]少女がカードを選んだ
少年「さぁ、ハイ or ロー?」
少女「ハイ!」
少女がカードを裏返すと、[9]だった!
少女「やったわ!」
少年「う……」
少年の所持金:50
少女の所持金:150
***【先手】少女 【後手】少年***
[先手]少女がカード[3]を選んだ
少女「さぁ、選びなさい」
[後手]少年がカードを選んだ
少女「さぁ、ハイ or ロー?」
少年「ロー!」
少年がカードを裏返すと、[2]だった!
少年「やった!」
少女「むぐぐ……」
少年の所持金:70
少女の所持金:130
***【先手】少年 【後手】少女***
[先手]少年がカード[5]を選んだ
少年「さぁ、選んで」
[後手]少女がカードを選んだ
少年「さぁ、ハイ or ロー?」
少女「ロー!」
少女がカードを裏返すと、[3]だった!
少女「やったわ!」
少年「う……」
少年の所持金:40
少女の所持金:160
***【先手】少女 【後手】少年***
[先手]少女がカード[5]を選んだ
少女「さぁ、選びなさい」
[後手]少年がカードを選んだ
少女「さぁ、ハイ or ロー?」
少年「ロー!」
少年がカードを裏返すと、[9]だった!
少年「う……ハズレ」
少女「ふふふ」
少年の所持金:10
少女の所持金:190
***【先手】少年 【後手】少女***
[先手]少年がカード[3]を選んだ
少年「さぁ、選んで」
[後手]少女がカードを選んだ
少年「さぁ、ハイ or ロー?」
少女「ハイ!」
少女がカードを裏返すと、[1]だった!
少女「ハ、ハズレ?そんな……」
少年「よかった……」
少年の所持金:30
少女の所持金:170
***【先手】少女 【後手】少年***
[先手]少女がカード[0]を選んだ
少女「さぁ、選びなさい」
[後手]少年がカードを選んだ
少女「さぁ、ハイ or ロー?」
少年「ハイ!」
少年がカードを裏返すと、[4]だった!
少年「やった!」
少女「むぐぐ……」
少年の所持金:50
少女の所持金:150
***【先手】少年 【後手】少女***
[先手]少年がカード[5]を選んだ
少年「さぁ、選んで」
[後手]少女がカードを選んだ
少年「さぁ、ハイ or ロー?」
少女「ロー!」
少女がカードを裏返すと、[2]だった!
少女「やったわ!」
少年「う……」
少年の所持金:20
少女の所持金:180
***【先手】少女 【後手】少年***
[先手]少女がカード[2]を選んだ
少女「さぁ、選びなさい」
[後手]少年がカードを選んだ
少女「さぁ、ハイ or ロー?」
少年「ロー!」
少年がカードを裏返すと、[4]だった!
少年「う……ハズレ」
少女「ふふふ」
少年「もうお金がないよ……」
少女「ふふふ、また挑戦しなさい」
少年「絶対に嫌だよ……」
**********************************************
なんとなくゲームが成立しているように見えますが、実は二人共「ハイ」と「ロー」をランダムに言っています。
相手が出した数字が5以上ならハイと言って、それ以下ならローというのがいい戦略なのですが、そういうことを全然していません。
そのため、勝ったときの報酬が大きい少女のほうが勝っています。
P.S.
あれ、小説ってなんだっけ……?
まぁ、いいか。
ソースコードは以下のとおりです。
#! ruby -E Windows-31J:utf-8
# coding: utf-8
#第07話:賢くない二人がハイアンドローゲーム
def init
$girl = GirlAgent::new
$boy = BoyAgent::new
end
def mainstory
puts "**********************************************"
puts
puts "少年と少女は退屈していた。"
puts
puts "少女「退屈だわ。カードで遊びましょう。先手と後手がカードを一枚ずつ取るのよ。そして、先手が数字を見せたら、後手は自分が選んだ数字が大きいか小さいか当てるのよ」"
puts
puts "少年「うん、いいよ」"
puts
puts "少女「私が勝ったら30ギル、あなたが勝ったら20ギルね」"
puts
puts "少年「え、お金かけるの!? しかも、なんか不公平……」"
puts
puts "少女「うるさいわね。まずは私が選ぶわ」"
puts
loop do
print_money
#少女先手、少年後手
puts "***【先手】少女 【後手】少年***"
card1 = (rand()*10).to_i
puts "[先手]少女がカード["+card1.to_s+"]を選んだ"
puts
puts "少女「さぁ、選びなさい」"
puts
card2 = pick_card(card1)
puts "[後手]少年がカードを選んだ"
puts
puts "少女「さぁ、ハイ or ロー?」"
puts
j = $boy.judge(card1)
puts "少年「"+j+"!」"
puts
puts "少年がカードを裏返すと、["+card2.to_s+"]だった!"
puts
if gote_win?(card1,card2,j) == true
$boy.money += 20
$girl.money -= 20
puts "少年「やった!」"
puts
puts "少女「むぐぐ……」"
puts
else
$boy.money -= 30
$girl.money += 30
puts "少年「う……ハズレ」"
puts
puts "少女「ふふふ」"
puts
end
if $boy.money <= 0
puts "少年「もうお金がないよ……」"
puts
puts "少女「ふふふ、また挑戦しなさい」"
puts
puts "少年「絶対に嫌だよ……」"
break
elsif $girl.money <= 0
puts "少女「ま、まさか私が負けるなんて。もうお金が……」"
puts
puts "少年「ご、ごめん……」"
puts
puts "少女「ゆ、許さないわっ」"
break
end
print_money
#少年先手、少女後手
puts "***【先手】少年 【後手】少女***"
card1 = (rand()*10).to_i
puts "[先手]少年がカード["+card1.to_s+"]を選んだ"
puts
puts "少年「さぁ、選んで」"
puts
card2 = pick_card(card1)
puts "[後手]少女がカードを選んだ"
puts
puts "少年「さぁ、ハイ or ロー?」"
puts
j = $girl.judge(card1)
puts "少女「"+j+"!」"
puts
puts "少女がカードを裏返すと、["+card2.to_s+"]だった!"
puts
if gote_win?(card1,card2,j) == true
$boy.money -= 30
$girl.money += 30
puts "少女「やったわ!」"
puts
puts "少年「う……」"
puts
else
$boy.money += 20
$girl.money -= 20
puts "少女「ハ、ハズレ?そんな……」"
puts
puts "少年「よかった……」"
puts
end
if $boy.money <= 0
puts "少年「もうお金がないよ……」"
puts
puts "少女「ふふふ、また挑戦しなさい」"
puts
puts "少年「絶対に嫌だよ……」"
break
elsif $girl.money <= 0
puts "少女「ま、まさか私が負けるなんて。もうお金が……」"
puts
puts "少年「ご、ごめん……」"
puts
puts "少女「ゆ、許さないわっ」"
break
end
end
puts "**********************************************"
end
def pick_card(exclusion)
loop do
a = (rand()*10).to_i
if a != exclusion
return a
end
end
end
def gote_win?(card1,card2,judge)
if (card1 < card2) && (judge == "ハイ")
return true
elsif (card1 > card2) && (judge == "ロー")
return true
else
return false
end
end
def print_money
puts "少年の所持金:"+$boy.money.to_s
puts "少女の所持金:"+$girl.money.to_s
puts
end
#少女エージェント
class GirlAgent
attr_accessor :money
def initialize
@money = 100
end
def judge(a)
if rand() < 0.5
return "ハイ"
else
return "ロー"
end
end
end
#少年エージェント
class BoyAgent
attr_accessor :money
def initialize
@money=100
end
def judge(a)
if rand() < 0.5
return "ハイ"
else
return "ロー"
end
end
end
#メイン処理
init
mainstory