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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

782閲覧

Python初心者です。関数を使ったしりとりゲームを作っているのですが、上手くいかない部分があり教えてほしいです

ponta1

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2022/09/01 13:06

前提

Python初心者なのですが、今、関数を使ったしりとりゲームを作っています。
以下に記載のコードで実現されるようなしりとりゲームです。
しかし、以下のコードには問題があります。
それは、グローバル変数を使ってしまっている点です。
グローバル変数を使わないと、リストと変数を保持できないからです。

実現したいこと

グローバル変数を使わないで、同じようなしりとりゲームを実現したいです。

発生している問題・エラーメッセージ

-

該当のソースコード

Python

1l = [] 2turn=0 3 4def shiritori_judge(words_a,words_b): 5 global l 6 global turn 7 turn+=1 8 print(f'A君:{words_a}') 9 print(f'B君:{words_b}') 10 if turn == 1: 11 if words_b[-1] == 'ん' or words_a[-1] != words_b[0]: 12 ans = False 13 return ans 14 else: 15 l = words_b 16 17 if turn > 1: 18 if l[-1] != words_a[0]: 19 ans = True 20 return ans 21 elif words_b[-1] == 'ん' or words_a[-1] != words_b[0]: 22 ans = False 23 return ans 24 else: 25 l = words_b 26 27 28print('しりとりチェック') 29while True: 30 words_1,words_2 = [i for i in input('2つの単語を入力してください:').split()] 31 if words_1[-1] == 'ん': 32 print(f'A君:{words_1}') 33 print('A君の負け') 34 break 35 ans = shiritori_judge(words_1,words_2) 36 if ans == False: 37 print('B君の負け') 38 break 39 elif ans == True: 40 print('A君の負け') 41 break 42 43

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

退会済みユーザー👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

次の方針で解決するんじゃないかと思いました。

  • 直前の単語は、関数呼び出し側で記憶する。
  • 一番最初の『直前の単語』を工夫し、ターンによる分岐を排除する。

例えば、こんなふうに。元のコードの形はある程度保つように改造してみました。

Python

1def shiritori_judge(pre_word, words_a, words_b): 2 print(f'A君:{words_a}') 3 print(f'B君:{words_b}') 4 5 if pre_word[-1] != words_a[0]: 6 ans = True 7 return ans 8 elif words_b[-1] == 'ん' or words_a[-1] != words_b[0]: 9 ans = False 10 return ans 11 12 13print('しりとりチェック') 14pre_word = None 15while True: 16 words_1,words_2 = [i for i in input('2つの単語を入力してください:').split()] 17 if pre_word is None: 18 pre_word = words_1[0] 19 20 if words_1[-1] == 'ん': 21 print(f'A君:{words_1}') 22 print('A君の負け') 23 break 24 ans = shiritori_judge(pre_word, words_1,words_2) 25 pre_word = words_2 26 27 if ans == False: 28 print('B君の負け') 29 break 30 elif ans == True: 31 print('A君の負け') 32 break

追記:もうちょっと改造するなら

Python

1def is_faul(pre, word): 2 if pre[-1] != word[0]: # 前の単語と繋がらなかったら負け 3 return True 4 if word[-1] == 'ん': # 最後の文字が『ん』だったら負け 5 return True 6 7 return False 8 9 10def play_shiritori(): 11 print('しりとりチェック') 12 pre_word = None 13 14 while True: 15 word_a, word_b = input('2つの単語を入力してください:').split() 16 print(f'A君:{word_a}') 17 print(f'B君:{word_b}') 18 19 if pre_word is None: 20 pre_word = word_a[0] 21 22 if is_faul(pre_word, word_a): 23 print('A君の負け') 24 return 25 26 if is_faul(word_a, word_b): 27 print('B君の負け') 28 return 29 30 pre_word = word_b 31 32 33play_shiritori()

例えば三人対戦に拡張したら、元とどちらが追従しやすいか考えてみると良いでしょう。
対戦人数を実行時に指定できても楽しいかもしれませんね。

投稿2022/09/01 13:24

編集2022/09/01 13:34
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ponta1

2022/09/01 13:32

回答ありがとうございます! そしてとても参考になりました!
guest

0

回答ありがとうございます!
そしてとても参考になりました!

投稿2022/09/01 13:31

ponta1

総合スコア5

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問