その際にプレイヤーの手がずっと同じになってしまいます。
当たり前では?
むしろ質問にあるコードで質問者さんの意図通りに動いたらホラーですよ?
まず、プログラミングってのは、「こう書けばいい」と言うものではありません。
ロジック(論理)を書いて論理的に命令する事です。
たとえば、創作料理のレシピを考案してプロに作ってもらうとします。
「カレーを作れ」とかみたいな文章で書きますか? それとも「ガーッとやって、ゾーッとなって…」みたいな適当な文章で書きますか? 違いますよね?
私なら、
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)の無限ループの対象ではないので一回限りの処理になり、再発行されません。上書きもされません。
そりゃ書き換わるわけないでしょ。って話です。
プログラムは書いた通りにしか動きません。なのでコードを読むなり、デバッグをするなりしてロジックを修正するのです。