- # -*- coding: utf8 -*-
- import random
- data = [[0, 0, 0, 0],
- [0, 0, 0, 0],
- [0, 0, 0, 0],
- [0, 0, 0, 0]]
- _MAX_X = 4
- _MAX_Y = 4
- _RECT_SIZE = _MAX_X * _MAX_Y
- class GameOverException(Exception):
- pass
- def zero_list(size):
- return [0] * size
- def initialize():
- for index in range(_MAX_Y):
- data[index] = zero_list(_MAX_X)
- new_pos()
- def is_empty(x, y):
- try:
- return data[y][x] == 0
- except IndexError as e:
- return False
- def to_xy(no):
- return no % _MAX_Y, no // _MAX_X
- def get_random_pos():
- no = random.randint(0, _RECT_SIZE - 1)
- for index in range(no, _RECT_SIZE):
- x, y = to_xy(index)
- if is_empty(x, y):
- return x, y
- raise GameOverException
- def print_map():
- for row in data:
- print(row)
- def get_by_xy(x, y):
- return data[y][x]
- def get_row(index):
- return data[index]
- def get_col(index):
- return [row[index] for row in data]
- def replace_col(index, col):
- assert type(col) == list
- assert len(col) == _MAX_Y
- for y in range(_MAX_Y):
- data[y][index] = col[y]
- def replace_row(index, row):
- assert type(row) == list
- assert len(row) == _MAX_X
- for x in range(_MAX_X):
- data[index][x] = row[x]
- def merge_data(src, *, reverse=False):
- pre_len = len(src)
- source = [item for item in src if item != 0]
- if reverse:
- source.reverse()
- for start in range(1, len(source) // 2 + 1):
- for index in range(start, len(source) - start + 1):
- moon = source[index - 1]
- star = source[index]
- if moon == star:
- moon += star
- star = 0
- elif moon == 0:
- moon = star
- star = 0
- source[index - 1] = moon
- source[index] = star
- source.extend(zero_list(pre_len - len(source)))
- if reverse:
- source.reverse()
- return source
- def new_pos():
- x, y = get_random_pos()
- data[y][x] = 2
- def show():
- print_map()
- def vertical(*, reverse=False):
- changed = False
- for index in range(_MAX_X):
- source = get_col(index)
- summary = merge_data(source, reverse=reverse)
- changed |= (summary != source)
- replace_col(index, summary)
- return changed
- def horizontal(*, reverse=False):
- changed = False
- for index in range(_MAX_Y):
- source = get_row(index)
- summary = merge_data(source, reverse=reverse)
- changed |= (summary != source)
- replace_row(index, summary)
- return changed
- def up():
- if vertical():
- new_pos()
- def down():
- if vertical(reverse=True):
- new_pos()
- def left():
- if horizontal():
- new_pos()
- def right():
- if horizontal(reverse=True):
- new_pos()
- if __name__ == '__main__':
- pass
- #该片段来自于http://www.codesnippet.cn/detail/1206201512859.html
来源: http://www.codesnippet.cn/detail/1206201512859.html