18
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ジャルジャルの「国名分けっこ」を実装してみた

Last updated at Posted at 2018-12-05

##はじめに
こんにちは!Life is Tech! Tokai Mentors Advent Calendar 2018の6日目の記事はわだどんが書かせていただきます。

突然ですがみなさん...漫才は好きですか?

諸々の導入はぶっ飛ばしますが、今回の記事でジャルジャルさんを愛してやまない筆者が実装するのは**「国名分けっこ」**です。

「国名分けっこ」とは

「国名分けっこ」を知らない...?

もしかして「分けっこ国名」って言ってました?

※「国名分けっこ」を知らないそこのあなたはこちらのネタ動画を見てからこの記事を読み進めることをオススメします。

ゲーム進行(ざっくり)

  1. 福徳さんが国名を任意の位置までぶった切って言う
  2. 後藤さんが残りの国名を返す

実際はリズムに合わせてのやりとりが面白いんですが今回はその辺は実装しません。制限時間とかつけたらいい感じにできるはずです。知らんけど。

実装する処理の流れ

  1. 国名を途中まで出力
  2. プレイヤーが答えを入力
  3. 正解なら「ええやん!」不正解なら「全然あかんやん!」と出力

実装

国名をランダムに取得する

.py
class CountryModel:
    def __init__(self):
        self.countries = [('アルゼンチン',17),('インドネシア',17),('イタリア',5),('オーストラリア',4),('ニッポン',3),('チュウゴク',3),('ドイツ',2),('モンゴル',2),('エジプト',2),('カナダ',2),('ギリシャ',2),('ブラジル',2),('アメリカ',1),('イギリス',1),('カンコク',1)]

    def get_prob_sum(self):
        prob_sum = 0
        for c in self.countries:
            prob_sum += c[1]
        return prob_sum

    def get_country(self):
        rand = random.randint(0,self.get_prob_sum()-1)
        count = 0
        prob = 0
        while True:
            prob = self.countries[count][1]
            rand -= prob
            if rand<=0:
                break
            count+=1
        return self.countries[count][0]

コンストラクタではself.countries('国名',重み)となるタプルを格納しています。
重みはM-1の時のネタでの出現数を手動で数えました

get_prob_sum()で出現率の合計を算出し、get_country()で重みとかを計算した後に国名を返します。

コードを見てもわかる通りアルゼンチンとインドネシアが圧倒的に出やすいです。

国名をぶった切ったり答えのチェックしたり

.py
class TextModel:
    def chop_text(self,text):
        length = len(text)
        rand = random.randint(1,length-1)
        return text[0:rand]

    def check(self,question,answer,countries):
        answer = question+answer
        for c in countries:
            if c[0] == answer:
                print('ええやん!')
                return

        print('全然あかんやん!')
        return

本当はsplit()とかで任意の位置での切り分けができればよかったんですが、区切り文字が存在しなかったのでムリっぽいですね。

chop_text()はランダムな位置で文字列を2つにぶった切って先頭側の方を返してくれます。

check()はその名の通り答えがあっているかどうかのチェックをしています。

動作

スクリーンショット 2018-12-04 2.49.56.png

ええやん!

ソースコード

ソースコードはこちら

感想

国名の出現数を数えるところが1番きつかったです。

頭おかしなるわこれ!!

18
5
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?