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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

1138閲覧

Python 21ゲーム プレイヤー対コンピューター 分岐がうまくいかない

mofmofmof

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

1グッド

0クリップ

投稿2019/01/27 22:35

編集2019/01/29 04:55

前提・実現したいこと

21ゲームというものをpythonで実装しようとしてみましたが、実行できません
どうしたらよいかアドバイスお願いします!

ご教授いただければ幸いです。

サイコロで出た目の数で、数字を何個いうのか決めるようにしたいです。
インデントエラーが出てるのですが、どこをどう直したらよいのかわかりません…

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

runfile('C:/Users/Documents/Python Scripts/21_game.py', wdir='C:/Users/Documents/Python Scripts') Traceback (most recent call last): File "C:\Users\Anaconda3\lib\site-packages\IPython\core\interactiveshell.py", line 2961, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-27-8021c557fff1>", line 1, in <module> runfile('C:/Users/Documents/Python Scripts/21_game.py', wdir='C:/Users/Documents/Python Scripts') File "C:\Users\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 668, in runfile execfile(filename, namespace) File "C:\Users\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile exec(compile(f.read(), filename, 'exec'), namespace) File "C:/Users/Documents/Python Scripts/21_game.py", line 50 if 0<i<18: ^ IndentationError: unexpected indent

該当のソースコード

python

1 2# -*- coding: utf-8 -*- 3""" 4Created on Tue Jan 29 09:25:24 2019 5 6""" 7 8 9#21を言ったら負けなゲーム 10OPENING_MESSAGE=""" 11____________________________ 12 13***21ゲーム*** 141~21までの数字を、1~3つ順番に 15交互に言い合って 1621を言った人が負けのゲームだよ! 17コンピューターに勝てるかな?? 18(数字はコンマで区切って入力してね!) 19____________________________ 20""" 21 22def game(): 23 import random 24 print(OPENING_MESSAGE) 25 26 27 while True: 28 kai = input('1~3個の数字を入れてね:').split(',') 29 30 if len(kai)>3: 31 print('3桁以内だよ') 32 else: 33 lst = list(map(int,kai)) 34 35 if len(lst)==1: 36 lst[0]==i 37 38 elif len(lst)==2: 39 if lst[0]+1==lst[1]: 40 lst[1]==i 41 else: 42 print('数字は順番に入力してね') 43 44 elif len(lst)==3: 45 if lst[0]+1==lst[1] and lst[1]+1==lst[2]: 46 lst[2]==i 47 else: 48 print('数字は順番に入力してね') 49 50 if 0<i<18: 51 dice=r.choice(face) 52 r = random 53 face=[1,2,3,4,5,6] 54 55 if dice>4: 56 print(i+1) 57 elif 2<dice<5: 58 print(i+1,i+2) 59 elif dice<3: 60 print(i+1,i+2,i+3) 61 elif i==18: 62 print(19,20) 63 elif i==19: 64 print(20) 65 66 elif i==20: 67 print(21) 68 print('おめでとう!あなたの勝ちだよ') 69 break 70 71 elif i==21: 72 print('残念、あなたの負けだね') 73 break 74 75 return print('ゲーム終了') 76 77def main(): 78 while True: 79 x = input('プレイする?y/n:') 80 81 if x != 'y' and x != 'n': 82 print('yかnを入力してね') 83 84 # 終了処理 85 elif x == 'n': 86 print('おつかれさま~') 87 break 88 89 # 開始処理 90 elif x == 'y': 91 print('始まるよー') 92 93 game() 94 95 96if __name__ == '__main__': 97 main() 98 99 100 101 102

試したこと

同じようなものを作っている人が見つからず、1から作ってみました

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

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

yumetodo👍を押しています

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

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

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

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

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

guest

回答2

0

21ゲームというのが

  • 先攻と後攻の2名で行う
  • プレイヤーは同時に三つまでの数値(連続している必要がある)を言うことができる
  • 21を言わされたプレイヤーが負け

であれば、両者最善手を取った場合に後攻必勝です。
※21 = 4*5 + 1 であるため、(先攻+後攻)の言った数値の数が4になるようにすれば、後攻が絶対20を言うことができる=先攻が21を言わざるを得なくなる

つまりこのゲームで後攻が負けるためには、意図的にこの「4-先攻の言った数値の数」だけ言うという手順を崩す必要があります。
考えられる方法としては、

  • まず先攻の言った数値の数から、「4-数値の数」を算出する(最善手の導出)
  • ランダムな数値を一つ取って、その値と閾値から、最善手を取るかどうかを決める(間違えるかどうかをサイコロを振って決める、というような意味です)

といった手心を加えることになるでしょう。

投稿2019/01/28 02:39

tacsheaven

総合スコア13703

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

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

momon-ga

2019/01/28 08:10 編集

21を言った人が勝ちなので、先手必勝ですね。
tacsheaven

2019/01/28 08:32

いいえ、質問は「4の倍数を言った方が勝つ」だから、21を言った方が負けですよ。 まあ、21を言ったら勝ちにするなら先手必勝は正しいですけど(先手の第1手が「1」)
mofmofmof

2019/01/28 11:25

4の倍数を言っていくと必然的に21も言えるようになるので、21を言ったほうが勝ちという意味で質問しました!わかりづらくてすみません…
momon-ga

2019/01/28 13:53 編集

えっと、倍数じゃなくて等差ね。4の倍数を言っていくと21は相手に言われちゃうので。ソース見ればわかるけど質問だけ見れば回答者さんのように誤解します。
mofmofmof

2019/01/28 15:04

確かにそうですね、失礼しました
guest

0

ベストアンサー

pythonはインデントで構文を表す、オフサイドルールを採用した言語です。論理的にネストの深さの同じ行は、すべてインデントの深さを同じに揃える必要があります。

ちなみにタブ文字でインデントするとタブ1つでスペース8桁として扱われますが、普通はスペースに統一した方が(エディタの設定でタブキーを打つとスペースでインデントされるようにした方が)やりやすいでしょう。一般的にはスペース4つのインデントが使われます。

投稿2019/01/27 22:49

hayataka2049

総合スコア30933

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

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

mofmofmof

2019/01/28 01:02

ありがとうございます、インデントは無事直せました! よろしければ今後もお付き合い願いたいです… よろしくお願いします。
hayataka2049

2019/01/28 02:03

ゲームのルールを知らないのでどこまで付き合えるかわかりませんが、とりあえずエラーが出たのならそれに至るまでに出力されたメッセージはすべて貼ってください。
mofmofmof

2019/01/28 15:22

わかりました!
mofmofmof

2019/01/28 15:36

貼りました、宜しければよろしくお願いします
hayataka2049

2019/01/28 15:42

改めてコードをざっと見ましたが、 if 0 < i <18: 以下のブロックぜんぶおかしいですね。たとえばlen(lst) == 1がTrueになるというのはlst=["hoge"]などであることを表し、この場合1番目以降のインデックスではアクセスできず、IndexError: list index out of rangeになります(lst[0]のみ可)。len(lst) == 2ならlst[0], lst[1]は取れますがlst[2]以降は無理です。 プログラミングには不慣れでしょうか? たぶん、少し基礎からやり直した方が良いでしょう。
mofmofmof

2019/01/29 01:53

たしかに、、、!?そうですよね、見落としていました!!!おかげで解決しそうです。 重ねて質問恐縮なのですが、相手から受けとる数値が連続していないとエラーを返すような措置というのは可能でしょうか?(例:1,2,3=TRUE、1,2,4=FALSE)
hayataka2049

2019/01/29 01:55

分割して整数に直して1つずつずらしながら差を見る。1以外ならだめ。とかですかね。
mofmofmof

2019/01/29 04:56

ありがとうございます!やってみました!!
hayataka2049

2019/01/29 05:57

>IndentationError: unexpected indent そして振り出しに戻る、という感じでしょうか。エラー箇所のif以下が一段深いです。
mofmofmof

2019/01/29 06:27

戻してみたら、NameError: name 'i' is not defined と出てしまうのですが、i の定義の仕方がそもそも違うんですかね?? 長らくお付き合いいただいてすみません、恐縮ですが答えていただけるとありがたいです。
hayataka2049

2019/01/29 06:36

変数iを作っていないので当然そうなるんじゃないですかね。 少し基礎からやり直した方が良いでしょう。(再掲)
mofmofmof

2019/01/29 07:42

すみませんでした。そうします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問