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

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

ただいまの
回答率

88.62%

リストを途中から処理する方法について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 186

HaTea

score 16

前提・実現したいこと

野球ゲームのプログラムを書いているのですが、
作った打順をリストに格納してヒットかアウト判定する関数に入れた所
1回の処理を終えてしまうと1番打者に戻ってしまいます。
打順なので処理を終えた所からリストを読み込める様にしたい。

該当のソースコード

# bは塁打。ホームランも4塁打として扱えば良い。
def hit(base_state, b):
    # どの塁までランナーが到達したか。3塁のあとは4塁,5塁と突き進む。
    ret = []
    point = 0
    if b == 0:
        for e in base_state:
            ret.append(e)
        return ret, point
    else:
        new_state = [b]
        for e in base_state:
            new_state.append(e+b)
    # 4塁を超えたランナーをホームインさせる。
        for e in new_state:
            if e < 4:
                ret.append(e)
            else:
                point += 1

    # ベース上の状況と、今の打席の点数を返す。
        return ret, point
#選手毎のデータ読み込み
base_defn = 3
def pro_name(pros):
    state = []
    total_point=[]
    out = 0
    point = 0
    while True:
        for pro in pros:
            one_date = df3.loc[[pro],['安打','二塁打','三塁打','本塁打','打率(割合)']]
            for index, row in one_date.iterrows():
                #選手名
                name = index
                #安打数
                a_bat = row[0] + row[1] + row[2] + row[3]
                #安打数からの単打の割合
                a_hit = row[0] / a_bat
                #安打数からの二塁打の割合
                two = row[1] / a_bat + a_hit
                #安打数からの三塁打の割合
                thr = row[2] / a_bat + two
                #打率
                atta = row[4]
                coin1 = random.random()
                coin2 = random.random()
                #3の数字は後に相手投手の防御率が入る。
                print('-'*16)
                if coin1 < (atta + 3 - base_defn):
                    if coin2 < a_hit:
                        print(name+'ヒット')
                        h = 1
                    elif coin2 < two:
                        print(name+'ツーベースヒット')
                        h = 2
                    elif coin2 < thr:
                        print(name+'スリーベースヒット')
                        h = 3
                    else:
                        print(name+'ホームラン!!!!!!!!!!!!!!!')
                        h = 4
                else:
                    print(name+'アウト!')
                    out += 1
                    h = 0
                print('-'*16)
                state, point = hit(state, h)    # 塁上の状況の更新。
                print(f'只今{out}アウト')
                if not state:
                    print('ランナーなし')
                else:
                    print(f'ただいまランナー{state}塁')
                print(f'{point}点入りました')
                total_point.append(point)
                print(f'只今{sum(total_point)}点')
                if out == 3:
                    return print('チェンジ!!')
                    sys.exit()
player=['荻野 貴司','角中 勝也','清田 育宏','井上 晴哉','加藤 翔平','藤岡 裕大','藤原 恭大','細谷 圭','三木 亮']
member = [player[i%9] for i in range(0,100)]
for i in range(9):
    pro_name(member)

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

python3.7

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

以下でいかがでしょうか?

import itertools
player = [
    '荻野 貴司', '角中 勝也', '清田 育宏', '井上 晴哉',
    '加藤 翔平', '藤岡 裕大', '藤原 恭大', '細谷 圭',
    '三木  亮',
]
gen = itertools.cycle(player)

# 27アウトになるまで(延長を考慮しなければ)、gen.__next__()を呼び出せば、
# バッターが生成されます。
gen.__next__()   # 荻野 貴司
gen.__next__()   # 角中 勝也

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/06/22 19:28

    import itertools
    player=['荻野 貴司','角中 勝也','清田 育宏','井上 晴哉','加藤 翔平','藤岡 裕大','藤原 恭大','細谷 圭','三木 亮']
    member = [player[i%9] for i in range(0,100)]
    gen = itertools.cycle(member)
    for i in range(9):
    pro_name(gen)
    で9回まで打順通り回すことが出来ました!ありがとうございました!!

    キャンセル

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

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

関連した質問

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