😆
Rubyの世界へようこそ ~ウエストランドの漫才を作ってみよう~
Rubyの世界へようこそ ~ウエストランドの漫才を作ってみよう~
ウエストランドとは
井口浩之さん(ボケ)と河本太さん(ツッコミ)からなる日本のお笑いコンビです。
2020年12月20日、M-1グランプリ決勝に初めて進出しました。登場順は10番目で、結果は9位でした。
2022年12月18日、M-1グランプリ決勝へ2年ぶりに進出し、ファーストステージでは2年前と同じく最後の10番目に登場して659点を獲得し、ファーストステージを3位で通過しました。
ファイナルステージでは3組中1番手で登場し、さや香、ロングコートダディを抑えて全7票のうち6票を獲得して優勝し、18代目チャンピオンとなりました!
ウエストランドの決勝ネタを追体験しよう!
井口さんサイド(井:)の一人として参加し、相方の河本さん(河:)が出題する「あるなしクイズ」に答えていくことができます!
遊び方
- ウエストランドの決勝ネタ漫才を聞くことができます。
- さらに、河本さんが出題する「あるなしクイズ」に参加することができます。
- 河本さんが、「Aにはあるけど、Bにはない」と出題するタイミングがあります。
- 河本さんが「正解は何だと思いますか?(Y / N)」と聞いてきます。(Y = Yes / N = Noの意)
- 答えが分かったら、その都度挙手して(Y)、答えを入力することができます。
- 挙手しない(N)、または、クイズに不正解だった場合、井口さんが続けて解答して、漫才を続けてくれます。
「あるなし」クイズを楽しみながら、ウエストランドさんの漫才の世界観にも浸ってください!
作成したコード
もっと整理した書き方がある場合は、ぜひご教授ください!
コードの詳細
# ウエストランドの漫才を開始する役割のクラスです
class WestlandComedy
def self.play
comedy_quiz = ComedyQuiz.new
comedy_quiz.play
end
end
class ComedyQuiz
# playメソッドで、各メソッドを実行しています
def play
introduce
idol_dialogue
countryside_dialogue
sing_dialogue
m1_dialogue
osaka_dialogue
conclusion
end
# 「あるなし」クイズに関するメソッドです
def play_quiz
puts "挙手して答えますか?(Y / N)"
# YかNの入力値を受け取ります。小文字で入力された場合も、大文字として受け取るようにしています。
player_choice = gets.chomp.upcase
if player_choice == "Y"
puts "河:正解は、何だと思いますか?"
player_answer = gets.chomp
correct_answers = ["あいうえお", "あ、い、う、え、お", "あ・い・う・え・お", "あ い う え お"]
# 後述
if correct_answers.any? { |condition| player_answer.gsub(/[、・\s]/, '') =~ /\A#{condition}\z/ }
puts "河:すごい!その通り!"
conclusion
exit
else
puts "河:あー残念。違います"
sleep 1
end
elsif player_choice == "N"
puts "河:正解を言うまで、何回も挑戦できるんでね。分かったらどんどん答えちゃってください"
sleep 1
else
puts "河:ごめんなさい。上手く聞き取れなかったです。ちゃんと半角で言いましたか?"
sleep 1
end
end
def introduce
puts "井:どうもー、ウエストランドですー"
sleep 1
puts "井:ありがとうございますーがんばっていきましょうー"
sleep 1
puts "河:オリジナルのね、あるなしクイズ考えたんですよ"
sleep 1
puts "河:やります?"
sleep 1
puts "井:あー、たまたま大好きなんで"
sleep 1
puts "井:ちょっとじゃあ出してもらっていいですか"
end
def idol_dialogue
sleep 1
puts "河:まずね、【アイドル】にはあるけど、【役者】にはない。"
puts ""
puts "ある なし"
puts "--------------------"
puts "アイドル 役者"
puts ""
sleep 1
play_quiz
sleep 1
puts "井:アイドルにはあるけど、役者にはない。はい、わかりました。(挙手)"
sleep 1
puts "河:まだ、まだ1個目だから。"
sleep 1
puts "井:1個目でもわかるから!"
puts "河:じゃあどうぞ"
sleep 2
puts "井:正解は、向上心!"
sleep 1
puts "河:なんでですか?"
sleep 1
puts "井:アイドルはなんとしても売れてやるという向上心がすごいから。"
sleep 1
puts "井:他人を蹴落としてでも自分だけは売れてやるんだという飽くなき向上心のカタマリだから。急に心霊が見えるようになったと言い出してみたり。急に部屋が汚いと言い出してみたり。"
sleep 1
puts "井:ネクストブレイクくらいの芸人に近づいてお笑いわかってますヅラしてみたり、なんかこう、なんとしても自分だけは売れるという向上心がすごいから、正解は向上心だろ!"
sleep 2
puts "河:ちがいます"
sleep 0.5
puts "井:いいや!向上心!"
sleep 0.5
puts "河:いいやってことはない"
sleep 0.5
puts "井:いいや!向上心だろ!"
sleep 0.5
puts "河:ちがいます"
sleep 1
puts "井:だってそうだろう、ナシのほうの役者なんて、そこらへんの舞台役者なんてお互いの芝居見に行くだけでなんの向上心ないんだから。ひとつも成長しねえじゃねえかあいつら!"
sleep 0.5
puts "井:うーん演出が悪いなとか脚本が悪いなとかなんにも成長しないんだから。前売り5,500円。たけーよ!毎回毎回「知らないやつが載ってる裏表紙」いらないんだよあれ!"
sleep 0.5
puts "井:だから正解は向上心だろ!"
sleep 1
puts "河:ちがうって。"
sleep 0.5
puts "井:向上心!"
sleep 0.5
puts "河:違います。"
sleep 0.5
puts "井:向上心!"
sleep 0.5
puts "河:違いますよ。"
sleep 0.5
puts "井:違うの?"
sleep 0.5
puts "河:違います"
sleep 1
puts "井:じゃあもう次いってくれ次。"
end
def countryside_dialogue
sleep 1
puts "河:えー、【田舎】にはあるけど【都会】にはない。"
sleep 1
puts ""
puts "ある なし"
puts "--------------------"
puts "アイドル 役者"
puts "田舎 都会"
puts ""
sleep 1
play_quiz
sleep 1
puts "井:田舎にはあるけど都会にはない?はい。わかりました(挙手)"
sleep 1
puts "河:はいどうぞ"
sleep 1
puts "井:引け目。"
sleep 1
puts "井:いくら田舎で成功してもどうせ都会では通用しないよなの引け目を常に感じてるから、正解は引け目!"
sleep 1
puts "河:違いますしそんなことはないです"
sleep 1
puts "井:いや、引け目だろ。"
sleep 1
puts "河:違います"
sleep 1
puts "河:じゃあアイドルにも引け目あるの?"
sleep 1
puts "井:アイドルは引け目感じてるに決まってるだろ、だって嘘ついて売れようとしてんだもん!」"
sleep 0.5
puts "井:引け目のかたまりだろ。年齢から何から嘘ついてるんだから。引け目だろ?引け目!"
sleep 1
puts "河:違うって。"
sleep 1
puts "井:虚無感!"
sleep 1
puts "河:虚無感?"
sleep 1
puts "井:「田舎だもんなー」の虚無感。「ここで活躍しても田舎だもんなー」の虚無感!"
sleep 1
puts "河:そんなことない"
sleep 1
puts "井:違うの?"
sleep 1
puts "河:違います"
sleep 1
puts "井:じゃあもう次いってくれ次"
end
def sing_dialogue
sleep 1
puts "河:えー、【歌】にはあるけど【コント】にはない"
puts ""
puts "ある なし"
puts "--------------------"
puts "アイドル 役者"
puts "田舎 都会"
puts "歌 コント"
puts ""
sleep 1
play_quiz
sleep 1
puts "井:はい。これわかりました(挙手)"
sleep 1
puts "河:はいどうぞ"
sleep 1
puts "井:正解は、メッセージ性。なぜなら歌にはメッセージ性が必要だけど、お笑いにはメッセージ性とか必要ないから、正解はメッセージ性。"
sleep 1
puts "河:あー残念違います"
sleep 1
puts "井:そうかー、ネタにメッセージ性つめてくるうざいコント師とかいるかー」"
sleep 1
puts "井:やめてくれー。単独ライブの最後20分を長尺コントやめてくれー"
sleep 1
puts "井:いらねー、ほっこり終わりやめてくれー見てらんないから。なんか文章のタイトルやめてくれー単独ライブのタイトル。不条理な文章にするの。「晴天なのに傘」やめてくれー!"
sleep 1
puts "井:やめてくれお笑いライブで。なんかフライヤー。ポスターのことをチラシのことをフライヤーと呼びなんかそれも不条理なやつ、“瓦礫の前でパジャマ”。やめてくれー!"
sleep 1
puts "井:フライヤー!"
sleep 1
puts "河:答えが?"
sleep 1
puts "井:フライヤー!"
sleep 0.5
puts "井:不条理なフライヤー!"
sleep 1
puts "河:答え?"
sleep 1
puts "井:不条理なフライヤー!"
sleep 1
puts "河:違う、そんなわけないでしょ"
sleep 1
puts "井:違うの?"
sleep 1
puts "河:違うよ"
sleep 1
puts "井:じゃあ次いってくれ次"
end
def m1_dialogue
sleep 1
puts "河:【M-1】にはあるけど【R-1】にはない。"
puts ""
puts "ある なし"
puts "--------------------"
puts "アイドル 役者"
puts "田舎 都会"
puts "歌 コント"
puts "M-1 R-1"
puts ""
sleep 1
play_quiz
sleep 1
puts "井:はい!夢!"
sleep 1
puts "河:そんなことはない。"
sleep 1
puts "井:希望? 希望!"
sleep 1
puts "井:大会の価値。大会の規模"
sleep 1
puts "井:そりゃそうだよ。M-1決勝行くだけで人生変わるけどR-1は何も変わらないから、夢!"
sleep 1
puts "河;そんなことない "
sleep 1
puts "河:当てる気ないでしょ?"
sleep 1
puts "井:当てる気あるよそんなの"
sleep 1
puts "河:自分の気持ち言ってません?"
sleep 1
puts "井:自分の気持ちじゃない、クイズに正解したいだけだから。次いってくれ次!"
end
def osaka_dialogue
sleep 1
puts "河:【大阪】にあるけど【東京】にはない"
puts ""
puts "ある なし"
puts "--------------------"
puts "アイドル 役者"
puts "田舎 都会"
puts "歌 コント"
puts "M-1 R-1"
puts "大阪 東京"
puts ""
sleep 1
play_quiz
sleep 1
puts "井:はい!自分たちのお笑いが正義だという凝り固まった考え"
sleep 1
puts "河:(首をふる)"
sleep 1
puts "井:それを押しつけてくるあの感じ!"
sleep 1
puts "河:(首をふる)"
sleep 1
puts "井:自虐ネタばっかり言うくせにこっちがいじったらブチ切れてくるあの感じ"
sleep 1
puts "井:ずっと「え、エスカレーターそっち並びまんのん?」ってずっというあの感じ!それだろうが!"
sleep 1
puts "河:結局どれなの?"
sleep 1
puts "井:「うざい」!"
puts "井:ある方は全部「うざい」!!"
sleep 1
puts "河:M-1も?"
sleep 1
puts "井:M-1もうざい!"
sleep 1
puts "井:アナザーストーリーがうざい!!いらないんだよ、泣きながらお母さんに電話するなー!「優勝したよお」じゃないんだよどうでもいいよ!見てらんないから。うざいうざいうざい!あるほうもないほうも両方うざい!"
sleep 1
puts "河:あるなしクイズにならないじゃないすか"
sleep 1
puts "井:正解はなんなんだよ"
end
def conclusion
sleep 1
puts "河:正解は頭文字ぜんぶ集めると【あいうえお】になっている、っていうね"
sleep 1
puts "井:クソつまんねえじゃねえかよ、どうも、ありがとうございました"
end
end
WestlandComedy.play
工夫したところ
- sleepを用いることで、会話のテンポ感が出るようにしました。
- 入力された答え(player_answer)が正解と判定されるための条件を、以下のようにしました。
if correct_answers.any? { |condition| player_answer.gsub(/[、・\s]/, '') =~ /\A#{condition}\z/ }
-
correct_answers.any?: correct_answers
- 配列の要素のいずれかが条件を満たすかどうかを確認します。
- .any? メソッドは、ブロック内の条件が少なくとも一度でも真であれば true を返します。
-
{ |condition| player_answer.gsub(/[、・\s]/, ' ') =~ /\A#{condition}\z/ }
-
ブロック内の処理は、correct_answers 配列の各要素に対して行われます。
-
player_answer.gsub(/[、・\s]/, ''): player_answer
- 文字列から、全角スペース(\s)や読点、中黒などを取り除きます(' ')。
- これによって、ユーザーが入力した回答から余分な文字を削除します。
-
=~ /\A#{condition}\z/
- 正規表現の =~ 演算子を使用して、ユーザーの解答が condition と一致するかどうかを判定します。
- \A は文字列の先頭、\z は文字列の末尾を表します。※\はバックスラッシュを表しています
-
最後に
プログラミングもお笑いも好きなので、その両方を兼ねることができて大満足です。
漫才はテレビや劇場で観るのが1番ですが、文面だけでも面白いのは、ウエストランドの凄さです!
Discussion