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

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

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

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

Q&A

解決済

3回答

984閲覧

コード長すぎてミスが隠れちゃった、、いっせーので(指スマ)作ったとき

Konya

総合スコア10

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python

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

0グッド

0クリップ

投稿2022/09/09 03:45

編集2022/09/10 03:54

前提

google colaboratoryにて指スマ(いっせーので)ちゃんと書いてるはずなのに答えが違う理由がわからないので教えてください。
前の質問でglobalというのを知って使っているのですがもしかしたらそれのせいなのかもしれません。
初心者で簡単なコードで作ってます。(コードが長くおそらく短くする方法などがあるだろうけどとりあえずそこには触れないでください。)

実現したいこと

・1本と入力したらちゃんとCPUのところに足されるようにする。
・いっせーので(指スマ)として成り立たせる。

起こっていること

なぜかinputで入力して足すようにしてるのに足されない。(ゲームが成り立ってない)

次はCPUの番だよ。 何本出すか入力してね。 ゆびすま・・・(あげる本数)2 CPUは 0 本あげたよ。 CPUは 0 本といったよ。 当たったので1本のけるよ。

該当のソースコード

#randomのインポート import random #初めの指の本数の関数定義 n = 2 nm = 2 #指スマ関数の定義(自分の番)2-2,1-2 def yubisuma1(): global n print("最初に何本出すか入力してね。") people = int(input("ゆびすま・・・(あげる本数)")) print(" ") print("合計全員で何本あげるか予想してね。") human = int(input("ゆびすま・・・(みんなとの合計)")) bot = random.randint(0,2) if people + bot == human: print("CPUは", bot , "本あげたよ。") print("あたり。一本のけてね。") n -= 1 if people + bot != human: print("CPUは", bot , "本あげたよ。") print("残念。") #指スマ関数の定義(自分の番)2-1,1-1 def yubisuma2(): global n print("最初に何本出すか入力してね。") people = int(input("ゆびすま・・・(あげる本数)")) print(" ") print("合計全員で何本あげるか予想してね。") human = int(input("ゆびすま・・・(みんなとの合計)")) bot = random.randint(0,1) if people + bot == human: print("CPUは", bot , "本あげたよ。") print("あたり。一本のけてね。") n -= 1 if people + bot != human: print("CPUは", bot , "本あげたよ。") print("残念。") #指スマ関数の定義(CPUの番)2-2 def yubisuma5(): global nm print("次はCPUの番だよ。") print("") print("何本出すか入力してね。") people = int(input("ゆびすま・・・(あげる本数)")) print(" ") cpu = random.randint(0,4) bot = random.randint(0,2) if people + bot == cpu: print("CPUは", bot , "本あげたよ。") print("CPUは", bot , "本といったよ。") print("当たったので1本のけるよ。") nm -= 1 if people + bot != cpu: print("CPUは", bot , "本あげたよ。") print("CPUは", cpu , "本といったよ。") print("残念。") #指スマ関数の定義(CPUの番)2-1 def yubisum6(): global nm print("次はCPUの番だよ。") print("") print("何本出すか入力してね。") people = int(input("ゆびすま・・・(あげる本数)")) print(" ") cpu = random.randint(0,3) bot = random.randint(0,1) if people + bot == cpu: print("CPUは", bot , "本あげたよ。") print("CPUは", bot , "本といったよ。") print("当たったので1本のけるよ。") nm -= 1 if people + bot != cpu: print("CPUは", bot , "本あげたよ。") print("CPUは", cpu , "本といったよ。") print("残念。") #指スマ関数の定義(CPUの番)1-2 def yubisuma7(): global nm print("次はCPUの番だよ。") print("") print("何本出すか入力してね。") people = int(input("ゆびすま・・・(あげる本数)")) print(" ") cpu = random.randint(0,3) bot = random.randint(0,2) if people + bot == cpu: print("CPUは", bot , "本あげたよ。") print("CPUは", bot , "本といったよ。") print("当たったので1本のけるよ。") nm -= 1 if people + bot != cpu: print("CPUは", bot , "本あげたよ。") print("CPUは", cpu , "本といったよ。") print("残念。") #指スマ関数の定義(CPUの番)1-1 def yubisuma8(): global nm print("次はCPUの番だよ。") print("") print("何本出すか入力してね。") people = int(input("ゆびすま・・・(あげる本数)")) print(" ") cpu = random.randint(0,2) bot = random.randint(0,1) if people + bot == cpu: print("CPUは", bot , "本あげたよ。") print("CPUは", bot , "本といったよ。") print("当たったので1本のけるよ。") nm -= 1 if people + bot != cpu: print("CPUは", bot , "本あげたよ。") print("CPUは", cpu , "本といったよ。") print("残念。") #関数を動かす。 yubisuma1() while True: if n == 1 and nm == 2: print(" ") print(" ") yubisuma7() if n == 1 and nm == 2: print(" ") print(" ") yubisuma1() if n == 2 and nm == 2: print(" ") print(" ") yubisuma1() if n == 2 and nm == 1: print(" ") print(" ") yubisuma2() if n == 1 and nm == 1: print(" ") print(" ") yubisuma2() if n == 0: print(" ") print(" ") print("あなたの勝ち!") break if nm == 0: print(" ") print(" ") print("CPUの勝ち!") break if n == 2 and nm == 2: print(" ") print(" ") yubisuma5() if n == 1 and nm == 2: print(" ") print(" ") yubisuma1() if n == 2 and nm == 2: print(" ") print(" ") yubisuma1() if n == 2 and nm == 1: print(" ") print(" ") yubisuma2() if n == 1 and nm == 1: print(" ") print(" ") yubisuma2() if n == 0: print(" ") print(" ") print("あなたの勝ち!") break if nm == 0: print(" ") print(" ") print("CPUの勝ち!") break if n == 2 and nm == 1: print(" ") yubisuma6() if n == 1 and nm == 2: print(" ") print(" ") yubisuma1() if n == 2 and nm == 2: print(" ") print(" ") yubisuma1() if n == 2 and nm == 1: print(" ") print(" ") yubisuma2() if n == 1 and nm == 1: print(" ") print(" ") yubisuma2() if n == 0: print(" ") print(" ") print("あなたの勝ち!") break if nm == 0: print(" ") print(" ") print("CPUの勝ち!") break if n == 1 and nm == 1: print("") print(" ") yubisuma8() if n == 1 and nm == 2: print(" ") print(" ") yubisuma1() if n == 2 and nm == 2: print(" ") print(" ") yubisuma1() if n == 2 and nm == 1: print(" ") print(" ") yubisuma2() if n == 1 and nm == 1: print(" ") print(" ") yubisuma2() if n == 0: print(" ") print(" ") print("あなたの勝ち!") break if nm == 0: print(" ") print(" ") print("CPUの勝ち!") break if n == 0: print("") print("") print("あなたの勝ち!") break if nm == 0: print("") print("") print("CPUの勝ち!") break

不思議な点

・人間の番のほうはちゃんと足されてるのにCPUのほうがたされてない点
・エラーなどは出ず実行はできる点。

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

・google colaboratoryを使用してます
・最近global関数知って使ってます。
・結構時間かけて作ってるので是非教えてください;;

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

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

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

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

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

can110

2022/09/09 05:45

n, nm, human, bot, peopleなどの変数名が何を表しているかが分からないので 分かりやすい名前に変更して各変数の意味(説明)をコメントで追加したソースを提示ください。
Konya

2022/09/09 06:46

もう解決したのでありがとうございました! 僕的には分かりやすく使ってたんですけど周りから見たらそうなんですねw 
guest

回答3

0

直接質問に結びつく回答ではありませんが…
プログラミングでは未来の自分は他人という言葉がよく知られています。
将来、なにかのきっかけ(自分の書いたコードのデバッグで地獄を見るとか)に実感するかもしれません。
参考:プログラムは、人なり

投稿2022/09/09 07:19

編集2022/09/09 07:50
can110

総合スコア38262

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

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

Konya

2022/09/09 07:31

そうなれるようにがんばります!ありがとうございます!
TakaiY

2022/09/09 12:12

これ、僕もよくあります。「だれだ、こんな書き方したのは」と思って履歴を見ると、自分とか。 ようするに、わかりやすいコードを書きましょうということですが、たとえば、このポイントで指摘するとしたら、 ・ 役割の異なる関数の名前がいずれもyubisumaになっている。 たとえば、player_turn, cpu_turn など役割を示す名前にする ・変数名も、 n, nm では見ても何もわからない。 player_finger, cpu_finger とか。 ・適切なコメントを書く(うーん、これは具体的に書くのはむずかしい) あたりが実現できていると、よりよいのではないかな。
Konya

2022/09/10 03:52

了解です!イチからまた作ってみます! 今度は短くするように意識します!
guest

0

ベストアンサー

足されていないわけではなく、以下のところで違うものを表示しているからそう見えているだけでしょう。

python

1d if people + bot == cpu: 2 3 print("CPUは", bot , "本あげたよ。") 4 print("CPUは", bot , "本といったよ。")

ここでは、「print("CPUは", cpu , "本といったよ。")」とすべきですね。

ところで、nはnm はグローバル関数ではなくてグローバル変数ですよ。


おまけ
ところで、同じような処理をしている関数がたくさんできてしまっていますね。 今回のように関数を修正する場合に、あちこち修正しなければならなくて大変です。
また、呼ぶ関数がことなるせいで、下の方の分岐処理が長大になっています。

沢山ある関数は、2つにまとめられます。
1つは、ユーザの番の関数 yubisuma_pとしましょう。

python

1def yubisuma_p(): 2 global n 3 4 print("最初に何本出すか入力してね。") 5 people = int(input("ゆびすま・・・(あげる本数)")) 6 7 print(" ") 8 9 print("合計全員で何本あげるか予想してね。") 10 human = int(input("ゆびすま・・・(みんなとの合計)")) 11 12 bot = random.randint(0, f_count) 13 14 if people + bot == human: 15 16 print("CPUは", bot , "本あげたよ。") 17 print("あたり。一本のけてね。") 18 19 n -= 1 20 if people + bot != human: 21 22 print("CPUは", bot , "本あげたよ。") 23 print("残念。")

ここで、f_count とした値が違いです。 この値は残っている腕(n)の本数によって変るのですから、関数の始めの方でnの値がいくつなのかによって設定すればいいでしょう。
どうように、CPU側の関数も1つにまとめることができます。
yubisuma_c()とでもしましょう。

このようにしておけば、最後のところの分岐も不要になり、
yubisuma_p() -> 勝敗判定 -> yubisuma_c() -> 勝敗判定 -> 戻る
というような単純なループにすることができるでしょう。


さらに、先の関数は、合計は当たりかはずれのいずれかなので、if-elseにしたほうがすっきりします。

python

1def yubisuma_p(): 2 global n 3 4 print("最初に何本出すか入力してね。") 5 people = int(input("ゆびすま・・・(あげる本数)")) 6 print(" ") 7 8 print("合計全員で何本あげるか予想してね。") 9 human = int(input("ゆびすま・・・(みんなとの合計)")) 10 11 bot = random.randint(0, f_count) 12 13 if people + bot == human: 14 print("CPUは", bot , "本あげたよ。") 15 print("あたり。一本のけてね。") 16 n -= 1 17 else: 18 print("CPUは", bot , "本あげたよ。") 19 print("残念。")

投稿2022/09/09 06:29

TakaiY

総合スコア12747

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

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

Konya

2022/09/09 06:57

なるほどです!変なミスしててこうなったのは置いといてw わざわざ短くする方法まで書いてくださりありがとうございます!random.randentは数字しか無理だと思っていたけどf_countなどの変数として入れることもできるんですね!もう一回それを使って入れてみようと思います!感謝です! global変数は最近知ってまじでよくわかってなくて絶賛勉強中でミスしてしまってすみません;; まあ、何がともあれ初心者にもやさしく答えてくださってありがとうございます!まだまだ、1か月しか触れてなくておもしろいなーで終わってる状態なのでどんどん極めていきます!回答ありがとうございました!
TakaiY

2022/09/09 07:24

数値を直接書けるところは、基本的にどこでも、その値を保持した変数にできるし、変数で使うことが多いところを文字列などのリテラルで置き換えることもできます。
Konya

2022/09/09 07:30

了解です!これから新しいものをどんどんしていくときに必ず試してみようと思います!ありがとうございます!
guest

0

他にもありそうですが

python

1#指スマ関数の定義(CPUの番)2-1 2def yubisum6(): 3 global nm 4 5 print("次はCPUの番だよ。") 6 print("") 7 print("何本出すか入力してね。") 8 people = int(input("ゆびすま・・・(あげる本数)")) 9 print(" ") 10 11 cpu = random.randint(0,3) 12 bot = random.randint(0,1) 13 14 if people + bot == cpu: 15 16 print("CPUは", bot , "本あげたよ。") 17 #print("CPUは", bot , "本といったよ。") # 誤 18 print("CPUは", cpu , "本といったよ。") # 正 19 print("当たったので1本のけるよ。") 20 21 nm -= 1

投稿2022/09/09 05:47

k5kkkkk

総合スコア102

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

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

k5kkkkk

2022/09/09 05:51

コードが冗長なことは自覚されているようですが、その影響でちょっとしたミスが埋もれてしまっています。 少なくとも、指の数に依らずにplayerのターンとCPUのターンは1つづつとした方がよいのでは?
Konya

2022/09/09 06:44

ちゃんとしたゲームとして成り立たせたいので1つづつにはしたくないので変えないとは思いますが、確かに変なミスしてて笑いましたw 短くするのは今後の課題だとしてちゃんと似たようなコードの場合は複製するなどの工夫して作ってるので今回のコードに問題がないと思い込んでましたねw 短くできるように努力します! 最後にこたえてくださりありがとうございました!まだ、初めて1か月(時間にしたら5日)くらいしかできていなく、とても助かりました!ありがとうございます!
k5kkkkk

2022/09/09 07:23 編集

1つづつというのは、TakaiY さんの 回答のおまけと同じ意味です。 cpuが挙げる指の数は、0からCPUの残りの指の数のどれか cpuのコールする指の数は、0から"CPUの残りの指の数+playerの残りの指の数"のどれかですね。 ```python cpu = random.randint(0,3) bot = random.randint(0,1) ``` のように、あらかじめ数字を入れるのではなく、 ```python cpu = random.randint(0,cpu_max+plyaer_max) bot = random.randint(0,cpu_max) ``` のように変数を入れると共通化できますね。 (上記の私が付けた)変数名は適当なので、分かりやすくてカッコいいものを考えてみるといいでしょう
Konya

2022/09/09 07:00

なるほどです!それ試そうと思ってます!変数入れれることを今知ったのでぜひぜひすぐ試そうと思います。 ちょっと笑ったのは、修正依頼で分かりやすい変数にしろって怒られたけど適当にかっこいいものって言ってくれてま反対で笑っちゃいましたw ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問