取direction上offset一行/列的所有方块 。例如,当需要将第2行左移时,用
get_line(1, LEFT)获得这一行 。
'''
global BOARD
if direction == LEFT:
return BOARD[offset]
elif direction == RIGHT:
return list(reversed(BOARD[offset]))
elif direction == UP:
return [BOARD[y][offset] for y in range(4)]
elif direction == DOWN:
return [BOARD[y][offset] for y in range(3, -1, -1)]
def put_line(line: list, offset: int, direction: int):
'''
将一条方块按照direction所指的方向放进游戏板中 。
'''
global BOARD
if direction == LEFT:
BOARD[offset] = line
elif direction == RIGHT:
BOARD[offset] = list(reversed(line))
elif direction == UP:
for y in range(4):
BOARD[y][offset] = line[y]
elif direction == DOWN:
for y in range(4):
BOARD[y][offset] = line[3 - y]
def move(line: list):
'''
移动一条方块 。
'''
new_line = []
gained_score = 0
i = 0
while i < 4:
if line[i] == 0:
i += 1
else:
old_tile = line[i]
i += 1
while i < 4 and line[i] == 0:
i += 1
if i >= 4 or line[i] != old_tile:
new_line.append(old_tile)
else:
gained_score += line[i] + old_tile
new_line.append(line[i] + old_tile)
i += 1
while len(new_line) < 4:
new_line.append(0)
# 这里有三种情况:
# 1. 移动不了 。
# 2. 移动了,但是没有得分 。
# 3. 移动了,也得分了 。
# 在这里,出现第一种情况时返回None,第二/三种情况返回移动好的方块和
# 本次移动获得的分 。
if new_line == line:
return None
else:
return new_line, gained_score
board_moved = False
for offset in range(4):
line = get_line(offset, direction)
moved_line = move(line)
if moved_line is not None:
board_moved = True
line, gained_score = moved_line
put_line(line, offset, direction)
SCORE += gained_score
put_line(line, offset, direction)
# 在这里,对于整个游戏板,有两种情况:
# 1. 有至少一行/一列移动了 。
# 2. 没有 。全部都没有移动 。
# 在第二种下是不应该生成新的方块的 。在这里返回游戏板有没有移动:
return board_moved
def get_neighbour(x, y, width, height):
global VECTOR
result = []
for vec in VECTOR:
new_x = x + vec[0]
new_y = y + vec[1]
if 0 <= new_x < width and 0 <= new_y < height:
result.append((new_x, new_y))
return result
def check_board():
global BOARD, HAS_2048, IS_STUCK
for y, row in enumerate(BOARD):
for x, num in enumerate(row):
# 如果有2048,那么就记住有2048 。
if num == 2048:
HAS_2048 = True
return
# 如果有空位,那么就可以继续移动 。
elif num == 0:
IS_STUCK = False
return
else:
for new_x, new_y in get_neighbour(x, y, 4, 4):
if BOARD[new_y][new_x] == num:
IS_STUCK = False
return
IS_STUCK = True
return
def main(stdscr):
global SCREEN
SCREEN = stdscr
while True:
SCREEN.clear()
new_game()
user_choice = get_user_input(
'是否开始下一盘?(输入Y开始下一盘,输入Q退出)[Y/Q]', ['Y', 'Q', 'y', 'q'])
if user_choice in 'qQ':
print_prompt('正在退出……')
break
elif user_choice in 'yY':
print_prompt('开始下一盘……')
continue
# don't start the thing when loading in interactive mode.
if __name__ == '__main__':
curses.wrapper(main)
推荐阅读
- python实现多进程通信实例分析
- 32个常用 Python 实现
- 8 个 Python 实用脚本,收藏备用
- 足球|科乐美终于承认:为尽快发售《eFootball 2022》没专注游戏质量
- 手机游戏|可能是史上最高清的“传奇”:传奇IP续作《传奇天下》将由虚幻4打造
- 一文搞懂Python字符编码问题,值得收藏
- 柚子教大家如何用python做精美的照片墙!五分钟学会get新技能
- 优化Python代码的4种方法
- 如何通过“import”语句确定在Python中导入了哪个文件?详解
- 手机游戏|本科毕业起薪8000,为何学IT就业容易又收入高?有孩子读高中速看