# Python 応用問題(ロボット、数字対戦) Homework
###### tags: `Python`
## 1.
あなたは作りかけのゲームプログラムを発見しましたが、キャラクターの動きの制限する方法が未実装でした。
制作中のゲームは、縦方向に H マスと横方向に W マスだけ広がる格子上のマップを用います。
左下のマスが原点であり、その座標を (0, 0) とします。
原点から横方向に x マス、縦方向に y マス進んだ座標を (x, y) と表記します。
現在の開発段階では障害物などはなく、キャラクターの初期座標が必ず (0, 0) です。
この状態から合計で N 回の上下左右への移動操作が行われます。
各移動操作はキャラクターの座標 (x, y) を以下のように変更します。
・上への移動 : キャラクターの座標を (x, y) から (x, y + 1) へ変更する。
・下への移動 : キャラクターの座標を (x, y) から (x, y - 1) へ変更する。
・左への移動 : キャラクターの座標を (x, y) から (x - 1, y) へ変更する。
・右への移動 : キャラクターの座標を (x, y) から (x + 1, y) へ変更する。
開発依頼書には、N 回の操作中にキャラクターが不正な座標にいることがないか判定するプログラムの作成が指示されています。
ここで不正な座標とは、マップ外の座標、すなわち格子上に存在しない座標すべてのことを指します。
例えば、入力例 1 および入力例 2 は以下のように考えることができます。

```
入力例1
縦方向のマス数:3
横方向のマス数:3
移動数:5
U
R
D
R
L
出力1
valid
入力例2
縦方向のマス数:4
横方向のマス数:4
移動数:7
U
U
R
R
R
R
D
出力2
invalid
```

:::success
```python=
# 移動をリストとして受け取り、最後の位置を返す
def move(move_list):
rob_x = 0
rob_y = 0
for order in move_list:
if order == "U":
rob_y += 1
elif order == "R":
rob_x += 1
elif order == "D":
rob_y -= 1
elif order == "L":
rob_x -= 1
return [rob_x, rob_y]
# 中にいるかどうかの確認
def is_inside(rob_x, rob_y, field_x, field_y):
if rob_x < field_x and rob_y < field_y:
re_bool = True
else:
re_bool = False
return re_bool
#----- MAIN -----#
# フィールドの幅と長さ
field_y = int(input("縦方向のマス数:"))
field_x = int(input("横方向のマス数:"))
# 移動量
move_amount = int(input("移動数:"))
# 移動コマンド連続入力
move_list = list()
for i in range(move_amount):
move_list.append(input())
# 移動し、位置を変数に格納
last_list = move(move_list)
rob_x = last_list[0]
rob_y = last_list[1]
# 最終判定
if is_inside(rob_x, rob_y, field_x, field_y):
print("valid")
else:
print("invalid")
```
:::
## 2.
請輸入2個數a跟b,並產生一個a~b亂數不重複的list(包含a跟b)。
並利用這個list來寫一個跟電腦比大小的遊戲,流程如下
1.玩家跟電腦輪流選一個位置
2.比較選出來的數字,數字較大的一方,獲得兩個數相加的分數
3.直到list的值被選完或剩一個
4.判斷誰是贏家
2つの数値aとbをユーザーに入力させ、a~bの整数値で要素が重複しないListを作成する。
前述のListを使用しユーザーとコンピューターが数字比較を行うゲームを作ってください。
1. ユーザーが数字の位置を選びます
2. コンピューターが数字の位置を選びます
3. 双方の数字を比較し、大きかった方が勝利し、両方の数値を加算しポイントとする
4. 1~3を続けて、Listの選ばれていない要素が残り1つ又はなくなるまで続ける
5. ポイントの高い方を勝者とし出力する
ゲーム状況を出力したものが次になります。
```
input a:1
input b:10
* * * * * * * * * *
choose one:0
5 9 * * * * * * * *
player_pick_n: 5
computer_pick_n: 9
The computer wins 14 points.
choose one:9
5 9 * * * * * 4 * 7
player_pick_n: 7
computer_pick_n: 4
The player wins 11 points.
choose one:3
5 9 * 6 2 * * 4 * 7
player_pick_n: 6
computer_pick_n: 2
The player wins 8 points.
choose one:0
Choose again:1
Choose again:2
5 9 10 6 2 * * 4 3 7
player_pick_n: 10
computer_pick_n: 3
The player wins 13 points.
choose one:5
5 9 10 6 2 8 1 4 3 7
player_pick_n: 8
computer_pick_n: 1
The player wins 9 points.
------------------------end------------------------------------
The computer wins 14 points.
The player wins 41 points.
The player wins the game.
```
:::success
```python=
import random
# 数字リストの初期化
def create_rand_list(a: int, b: int) -> list:
re_list = list()
re_list = [i for i in range(a, b + 1)]
random.shuffle(re_list)
return re_list
# 数字の羅列
def show_number(n_list, show_list) -> str:
re_s = ""
s_list = [n_list[i] if show_list[i] else "*" for i in range(len(n_list))]
for s in s_list:
re_s += str(s) + " "
return re_s
# それぞれのスコア
player_score = 0
cpu_score = 0
# それぞれがピックした数字
player_num = 0
cpu_num = 0
# 数字配置リスト
number_list = list()
# 数字公開リスト
# False: 非公開 True: 公開
opened_list = list()
#----- MAIN -----#
# 数字リスト、公開リストの作成
a = int(input("input a:"))
b = int(input("input b:"))
number_list = create_rand_list(a, b)
opened_list = [False for i in range(a, b + 1)]
n_length = b - a + 1
# 数字公開表示
print(show_number(number_list, opened_list))
# 残り枚数が1以下になるまで続ける
while opened_list.count(False) > 1:
print()
# プレイヤーピック、そして公開状態にする
sel_i = int(input("choose one:"))
while opened_list[sel_i] == True:
sel_i = int(input("Choose again:"))
player_num = number_list[sel_i]
opened_list[sel_i] = True
# CPUピック、そして公開状態にする
cpu_i = random.randrange(n_length)
while opened_list[cpu_i] == True:
cpu_i = random.randrange(n_length)
cpu_num = number_list[cpu_i]
opened_list[cpu_i] = True
# 数字公開表示
print(show_number(number_list, opened_list))
# ピック表示
print("player_pick_n: {}".format(player_num))
print("computer_pick_n: {}".format(cpu_num))
# 合計、1セットの勝者決定
total = player_num + cpu_num
if player_num > cpu_num:
print("The player wins {} points.".format(total))
player_score += total
else:
print("The computer wins {} points.".format(total))
cpu_score += total
else:
# 結果発表
print("------------------------end------------------------------------")
print("The computer wins {} points.".format(cpu_score))
print("The player wins {} points.".format(player_score))
print("The {} wins the game."\
.format("player" if player_score > cpu_score else "computer"))
```
:::