一个python的2048简单实现,python2048,# -*- coding


# -*- coding: utf8 -*-import randomdata = [[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_Yclass GameOverException(Exception):    passdef zero_list(size):    return [0] * sizedef 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 Falsedef to_xy(no):    return no % _MAX_Y, no // _MAX_Xdef 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 GameOverExceptiondef 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 sourcedef new_pos():    x, y = get_random_pos()    data[y][x] = 2def 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 changeddef 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 changeddef 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

评论关闭