# 一个python的2048简单实现

```# -*- 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

```

0人收藏

0

0