python实现一个简单的2048游戏详解编程语言

[Python]代码    

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

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/8125.html

(0)
上一篇 2021年7月18日
下一篇 2021年7月18日

相关推荐

发表回复

登录后才能评论