質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.38%

ポケモンしりとりのコードを作りました。もっと綺麗にならないでしょうか…?

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,054

score 20

前回の質問(https://teratail.com/questions/205731) からポケモンのデータをリストに整理し、以下のプログラムを製作してみました。

from pokemon_name import  num_set
import random
import re

print("ポケモンのしりとりだよ!")
print("ーには、その1つ前のカタカナから始めてね!")
print("ーが最後に付くポケモンは、母音で代替してね!")


list_nihon = ['ア', 'イ', 'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', 'シ', 'ス',
 'セ', 'ソ', 'タ', 'チ', 'ツ', 'テ', 'ト', 'ナ', 'ニ',
 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ', 'ヘ', 'ホ', 'マ', 'ミ', 'ム', 'メ', 'モ',
 'ラ', 'リ', 'ル', 'レ', 'ロ', 'ヤ', 'ユ', 'ヨ', 'ワ']

fin = 0

f = random.choice(list_nihon)
print(str(f) + "からはじめてね")

def poke_s():
    global fin
    global d
    num_set.remove(pokemon)#入力したポケモンをリストから消す
    dine = 0#入力にあったポケモンを探す
    draw = 0
    while dine <= 0:
        dime = random.choice(num_set)
        B = list(dime)
        if(dime.startswith(POKEMON[-1]) == True and B[-1] !="ン"):#存在するとき
            print(dime)
            d =B[-1]
            dine += 1
        elif draw ==950:#存在しない (限りなく存在しない)とき
            print("負けました")
            dine += 1# 探索の終了
            fin += 1#ゲームの終了
        else:#未だ探索中のとき
            dine += 0
            draw += 1#もう一度繰り返す

    print("次は"+ str(d) + "だよ")
    num_set.remove(dime)#パソコンが出力したポケモンをリストから消す

def fin_game():
    global fin
    print("そのポケモンいないか、もう使ったよ")
    fin += 1#ゲームの終了





while fin <= 0:  
    pokemon =input("カタカナで入力してね")
    POKEMON = list(pokemon)
    D = POKEMON[0]
    N = POKEMON[-1]
    if N =="ァ":#小文字から大文字への変換①
        POKEMON[-1] = "ア"
        if pokemon not in num_set:
            fin_game()
        else:
            poke_s()

    elif N =="ィ":#小文字から大文字への変換②
        POKEMON[-1] ="イ"
        if pokemon not in num_set:
            fin_game()
        else:
            poke_s()



    elif N =="ゥ":#小文字から大文字への変換③
        POKEMON[len(POKEMON)-1] = "ウ"
        if pokemon not in num_set:
            fin_game()
        else:
            poke_s()

    elif N == "ェ":#小文字から大文字への変換④
        POKEMON[len(POKEMON)-1] = "エ"

        if pokemon not in num_set:
            fin_game()
        else:
            poke_s()

    elif N == "ォ":#小文字から大文字への変換⑤

        POKEMON[len(POKEMON)-1] = "オ"

        if pokemon not in num_set:
            fin_game()
        else:
            poke_s()

    elif N =="ン":#最後がンの場合の対応
        print("ダメです")
        fin += 1#ゲームの終了

    else:
        if pokemon not in num_set:
            fin_game()    
        else:
            poke_s()

print("また遊ぼうね!")

quit()#ゲームの終了

いくつかのご指摘から、コードを単純化することに成功しました!
ありがとうございました!

暇なときにでも遊んでいただけたらうれしいです。

補足情報(FW/ツールのバージョンなど)

製作したパソコンの状況:
windows7

なお、pokemon_name.py は
プログラム上部にあるnum_set とは、ポケモンの名前のリストです。情報はwikipediaから引用しました。ありがとうございます~!
https://docs.google.com/document/d/1R6kg2uf2Qw6s__rhvjJ7arWnGI9OoL_uWUjoMX4ikrA/edit?usp=sharing
こちらでpokemon_name.pyは配布しています!

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2019/08/16 01:17

    同じ処理は共通化しよう

    キャンセル

  • gentaro

    2019/08/16 01:18

    > そのため大変恐縮なのですが、皆さんに是非このゲームを遊んで頂き、ゲームへの不満やコードの無駄だと思われる部分を書き込んでいただきたいのです。

    いやそういうサイトじゃねーから。前も指摘したけどガイドライン読もう。
    https://teratail.com/help/avoid-asking

    「低評価」とする際の理由に「広告と受け取られるような投稿」ってのもある。

    キャンセル

  • 0910pass.py

    2019/08/16 02:12

    asahina1979さん<
    共通化…ですか。
    そういったこともpythonはできるんですね。面白いなぁ…
    コメントありがとうございます!

    キャンセル

  • 0910pass.py

    2019/08/16 02:18

    gentaroさん<
    お叱りの言葉ありがとうございます。
    たしかにこれは広告と受け止められる質問ですね…。
    気づきませんでした。申し訳ない。
    これからは質問の内容に応じてサイトを使い分けるようにします。失礼しました。

    キャンセル

回答 1

checkベストアンサー

+2

よくできていると思います。
ただ teratail は具体的な問題を質問して回答を貰う QA サイトという性質上、作ったコードを遊んでもらう目的で投稿するなら、Qiita か GitHub のほうが向いていると思います。


コードの無駄だと思われる部分を書き込んでいただきたいのです。

  1. カタカナの大文字、小文字は区別しないようにしているのだと思いますが、ァの場合、ィの場合、... と文字ごとに同じ処理が条件分岐で書かれているのが気になります。

  2. 文字列の最後の文字の取得は s[len(s) - 1] ではなく、s[-1] でよいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/16 02:10

    コメントありがとうございます!
    Qiita,GitHubというサイトがあるのですね…。知りませんでした。
    今度使ってみます。

    1,2のご指摘ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る