This repository was archived by the owner on May 30, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathminoMover.py
117 lines (108 loc) · 5.1 KB
/
minoMover.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
from lib import *
import decisionMaker
import boardWatcher
# directedMinoをboard上でmoveに従って動かす処理を行い,その動いた先のdirectedMinoを返す
# 注意;ここで与えられるmoveは正当であることがなんらかの方法で確認されているものとする。valid checkは行わない
def MoveOneStep (move:MoveInt, directedMino:DirectedMino, board:Board) -> DirectedMino:
if move is MOVE.LEFT:
return DirectedMino(
directedMino.mino,
directedMino.direction,
(directedMino.pos[0] - 1, directedMino.pos[1])
)
elif move is MOVE.RIGHT:
return DirectedMino(
directedMino.mino,
directedMino.direction,
(directedMino.pos[0] + 1, directedMino.pos[1])
)
elif move is MOVE.DOWN:
return DirectedMino(
directedMino.mino,
directedMino.direction,
(directedMino.pos[0], directedMino.pos[1] + 1)
)
elif move is MOVE.DROP:
dropCount = decisionMaker.Drop(board.mainBoard, directedMino)
return DirectedMino(
directedMino.mino,
directedMino.direction,
(directedMino.pos[0], directedMino.pos[1] + dropCount)
)
elif move is MOVE.R_ROT or move is MOVE.L_ROT:
return decisionMaker.Rotate(directedMino, move, board.mainBoard)
else:
Error("Invalid kind of moves.")
# directedMinoがmoveをしたときに、directedMinoがどこに移動するかを返す
def GetMovedDirectedMino (move:MoveInt, directedMino:DirectedMino, mainBoard:List[int]) -> DirectedMino:
pos = directedMino.pos
if move is MOVE.LEFT:
return DirectedMino(directedMino.mino, directedMino.direction, (pos[0]-1, pos[1]))
elif move is MOVE.RIGHT:
return DirectedMino(directedMino.mino, directedMino.direction, (pos[0]+1, pos[1]))
elif move is MOVE.DOWN:
return DirectedMino(directedMino.mino, directedMino.direction, (pos[0], pos[1]+1))
elif move is MOVE.DROP:
return DirectedMino(directedMino.mino, directedMino.direction, (pos[0], pos[1]+Drop(mainBoard, directedMino)))
elif move is MOVE.L_ROT or move is MOVE.R_ROT:
return Rotate(directedMino, move, mainBoard)
else:
Error("Invalid move from GetMovedDirectedMinoPos")
# moveListとdirectedMinoを受け取って、その通りに入力を行う
# moveList = [downが入っていないfirstHalfMove] + [downの連続列] + [secondHalfMove(downが入るうるが、長押しはしない)]の形のみに対応している
# directedMinoをmoveListに従って動かした結果の移動先のdirectedMinoを返す
# 置きミスしたときは、Noneを返す
# todo: より一般的なmoveListに対しても動くようにする
def InputMove (moveList:List[MoveInt], directedMino:DirectedMino, mainBoard:List[int]) -> Union[DirectedMino, None]:
nextDirectedMino = directedMino
# moveList = [firstHalfMove] + [downの連続列] + [secondHalfMove]に分割する
if MOVE.DOWN in moveList:
downStartIdx = 0
while True:
if moveList[downStartIdx] is MOVE.DOWN:
break
else:
downStartIdx += 1
downEndIdx = downStartIdx
while True:
if moveList[downEndIdx] is not MOVE.DOWN:
break
else:
downEndIdx += 1
firstHalfMove = moveList[:downStartIdx]
downCount = len(moveList[downStartIdx:downEndIdx])
secondHalfMove = moveList[downEndIdx:]
else:
firstHalfMove = moveList
downCount = 0
secondHalfMove = []
# firstHalfMoveを入力
for move in firstHalfMove:
Move(move)
nextDirectedMino = GetMovedDirectedMino(move, nextDirectedMino, mainBoard)
# downを入力
if downCount > 0:
HoldDown() # 目的の場所にたどり着くまで下を押し続ける
nextDirectedMino = DirectedMino(nextDirectedMino.mino, nextDirectedMino.direction, (nextDirectedMino.pos[0], nextDirectedMino.pos[1] + downCount))
count = 0
posNotChangeCount = 0
previousPosYOfCurrentMino = boardWatcher.GetPosOfCurrentMino()[1]
while True:
# 下ボタンを押してるにもかかわらず位置が変わっていない場合
if previousPosYOfCurrentMino == boardWatcher.GetPosOfCurrentMino()[1]:
posNotChangeCount += 1
if posNotChangeCount > 20: # 0.20秒程度押し続けても変わらない場合到達していると考えられる
ReleaseDown()
break
previousPosYOfCurrentMino = boardWatcher.GetPosOfCurrentMino()[1]
count += 1
# 回転入れがある程度の時間成功しない時は失敗とみなす todo: もっといい方法はないか
if count > 200:
ReleaseDown()
return None
time.sleep(0.01)
# secondHalfMoveを入力
for move in secondHalfMove:
Move(move)
nextDirectedMino = GetMovedDirectedMino(move, nextDirectedMino, mainBoard)
return nextDirectedMino