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

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

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

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

Q&A

解決済

3回答

6954閲覧

じゃんけん あいこ時の繰り返し

sjg

総合スコア1

Python

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

0グッド

0クリップ

投稿2022/02/15 06:46

超初心者です。現在、じゃんけんゲームを作成しています。
プレイヤーの手は0~2の入力によって決定し、CPUの手はランダムで出るようにしています。
あいこの時は勝敗が決するまで繰り返す、ということをしたいのですが、その際にプレイヤーの手がずっと同じになってしまいます。
下のコードの2行目~のinput,intの位置や使い方に問題があるのはわかるのですが(実際、これをループの中に入れることも検討しました)、どうもうまくいきません。何か良い方法があればご教授願いたいです。

import random a=input() your_hand_num=int(a) while True: CPU_hand_num=random.randrange(3) hands=['グー','チョキ','パー'] your_hand=hands[your_hand_num] CPU_hand=hands[CPU_hand_num] print("あなたは"+your_hand+"を出しました") print("コンピュータは"+CPU_hand+"を出しました") if your_hand==CPU_hand: print("あいこです")

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

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

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

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

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

takasima20

2022/02/15 07:06

うまくいかないコードを質問に追加しましょう。
guest

回答3

0

import random a=int(input()) while True: CPU_hand_num=random.randrange(3) hands=['グー','チョキ','パー'] your_hand=hands[a] CPU_hand=hands[CPU_hand_num] print("コンピュータは"+CPU_hand+"を出しました") if your_hand=='{出した手}' and CPU_hand=='{出した手}':  print("あなたは"+your_hand+"を出しました") break elif your_hand=='{出した手}' and CPU_hand=='{出した手}': print("あなたは"+your_hand+"を出しました")  break

ifで勝つ場合のパターンをまず書き出す。
その終わりにbreak

elifで負けのパターンを書く。
その終わりにbreak

ですかね。
あいこの場合を書く時もelifの下に同じように書いて、continue(コンテニュー)ってかいたらうまくいくと思います

投稿2022/02/15 07:22

aoiriyu0406

総合スコア54

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

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

sjg

2022/02/15 08:14

解決しました!ありがとうございました!
guest

0

ベストアンサー

その際にプレイヤーの手がずっと同じになってしまいます。

当たり前では?
むしろ質問にあるコードで質問者さんの意図通りに動いたらホラーですよ?

まず、プログラミングってのは、「こう書けばいい」と言うものではありません
ロジック(論理)を書いて論理的に命令する事です。

たとえば、創作料理のレシピを考案してプロに作ってもらうとします。
「カレーを作れ」とかみたいな文章で書きますか? それとも「ガーッとやって、ゾーッとなって…」みたいな適当な文章で書きますか? 違いますよね?

私なら、

1. 好みの量のニンジンを1.5cm角に切る 2. フライパンに油を1cm分、中火で10秒温める 3. (1)で切ったニンジンにパン粉をまぶし… ...

のようにそのままやればうまくいくような書き方をするはずです。(私は料理できない方なのであくまでイメージですが。)

で、上記のレシピに論理違反があれば変なものが出来るはずです。意図していないものが。
論理的に正しくなるように修正したりもします。それがプログラミングだとデバッグです。

ということで、コードを読みましょう
コードを読むコツは「一行レベルで、その行が何をしているかを考えながら読む」です。

Python

1import random 2 3# ユーザ入力を受け付け、変数 aにセット 4a=input() 5# aの値を整数として変換し、変数 your_hand_num にセット 6your_hand_num=int(a) 7# 無限ループ 8while True: 9 # 0~2の乱数を生成し、変数 CPU_hand_numにセット 10 CPU_hand_num=random.randrange(3) 11 # 配列 hands を { グー, チョキ, パー } とする 12 hands=['グー','チョキ','パー'] 13 # ユーザの整数データを{ グー, チョキ, パー }のいずれかに変換し、変数 your_hand にセット 14 your_hand=hands[your_hand_num] 15 # CPU_handも同様に 16 CPU_hand=hands[CPU_hand_num] 17 # それぞれの手を文字列で表示 18 print("あなたは"+your_hand+"を出しました") 19 # 同じく 20 print("コンピュータは"+CPU_hand+"を出しました") 21 # CPUとユーザの手が同じなら 22 if your_hand==CPU_hand: 23 # 「あいこです」と表示 24 print("あいこです")

これを疑似コードとして切り出す。

1. ユーザ入力を受け付け、変数 aにセット 2. aの値を整数として変換し、変数 your_hand_num にセット 3. 無限ループ 3.1. 0~2の乱数を生成し、変数 CPU_hand_numにセット 3.2. 配列 hands を { グー, チョキ, パー } とする 3.3. ユーザの整数データを{ グー, チョキ, パー }のいずれかに変換し、変数 your_hand にセット 3.4. CPU_handも同様に 3.5. それぞれの手を文字列で表示 3.6. CPUとユーザの手が同じなら 3.6.1.「あいこです」と表示

これを現実世界でシミュレーションしてみてください。算数の問題を解く手順とか料理のレシピとかととらえて。
実際に値を入れて考えてみるとか。

まず、(1)で 「0」が入力されたとする。すると、a = "0" となる。
(2)で整数に変換。(3)で無限ループ。(3.1)で乱数が「1」だとする。すると、

a = "0" your_hand_num = 0 CPU_hand_num = 1

となる。

(3.2)で {グー,チョキ,パー} という選択肢を与える。(3.3)でyour_hand = "グー"となる。
(3.4)で CPU_hand = "チョキ"となる。

ここまでの変数内のデータを整理すると、

a = "0" your_hand_num = 0 CPU_hand_num = 1 hand = { グー, チョキ, パー } のいずれか ( as 選択肢 ) your_hand = "グー" CPU_hand = "チョキ"

(3.5)では単に表示しているだけなのでスルー。(3.6)で your_hand == CPU_hand となるかチェックしているが、your_hand = "グー", CPU_hand = "チョキ"なので、if "グー" == "チョキ": という事になり、偽になりますね。

よって(3.6.1)は処理せずに(3)に戻る。(無限ループなので)

(3.1)で CPU_hand_numが再発行される。仮に「0」とする。
(3.2)で選択肢 { グー, チョキ, パー } が再発行される。

つまり、現時点では、

a = "0" your_hand_num = 0 CPU_hand_num = 0 hand = { グー, チョキ, パー } のいずれか ( as 選択肢 )

となる。

your_handやらなんやらを決めると、

a = "0" your_hand_num = 0 CPU_hand_num = 0 hand = { グー, チョキ, パー } のいずれか ( as 選択肢 ) your_hand = "グー" CPU_hand = "グー"

で、(3.6)では if "グー" == "グー":なので 真に。つまり(3.6.1)が処理される。
そんでもって、(3)に戻る。...

と考えてみると、「いつyour_hand_numが書き換えられる」のでしょうか?
書き換えられているのはせいぜい、(2)だけです。それは(3)の無限ループの対象ではないので一回限りの処理になり、再発行されません。上書きもされません。
そりゃ書き換わるわけないでしょ。って話です。

プログラムは書いた通りにしか動きません。なのでコードを読むなり、デバッグをするなりしてロジックを修正するのです。

投稿2022/02/15 07:13

編集2022/02/15 07:34
BeatStar

総合スコア4958

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

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

sjg

2022/02/15 08:13

ご丁寧にありがとうございます。仰る通りですね。自分のプログラミングへの認識の甘さを痛感させられました。 上に説明いただいた内容で、今自分が何が分かっていなかったのかが整理でき、無事解決することが出来ました。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2022/02/15 08:32

無事解決することが出来た? じゃあ高評価しろよ。
guest

0

python

1while True: 2 自分の手を決める 3 相手の手を決める 4 if 勝敗がついた : 5 whileから抜ける

投稿2022/02/15 07:04

ozwk

総合スコア13521

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

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

sjg

2022/02/15 08:13

解決しました!ありがとうございました!
退会済みユーザー

退会済みユーザー

2022/02/15 08:32

解決した? じゃあ高評価しろよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問