python3版 2048小游戏

刚自学完Python3基础,做个小练习 😃

"""
    2048小游戏
"""
import copy
import random

view = [[0] * 4 for i in range(4)]


def form_view(r: str):
    if r == 'w':
        return [[view[x][i] for x in range(len(view[i]))] for i in range(len(view))]
    if r == 'a':
        return copy.deepcopy(view)
    if r == 's':
        return [[view[x][i] for x in range(len(view[i]) - 1, -1, -1)] for i in range(len(view))]
    return [item[::-1] for item in view]


def to_view(r: str, v):
    if r == 'w':
        return [[v[x][i] for x in range(len(v[i]))] for i in range(len(v))]
    if r == 'a':
        return copy.deepcopy(v)
    if r == 's':
        return [[v[x][i] for x in range(len(v[i]))] for i in range(len(v) - 1, -1, -1)]
    return [item[::-1] for item in v]


def zero_to_end(item):
    return [x for x in item if x] + [0] * item.count(0)


def can_merge(v):
    for x in v:
        item = zero_to_end(x)
        if x != item:
            return True
        for i in range(len(item) - 1):
            if item[i] and item[i] == item[i + 1]:
                return True
    return False


def show_view():
    print('-' * 29)
    for v in view:
        print('|', end='')
        for x in v:
            if x:
                print(' %4d |' % x, end='')
            else:
                print(' ' * 6 + '|', end='')
        print()
        print('-' * 29)


def add_new_item():
    can_add_row = [i for i in view if 0 in i]
    target_row = can_add_row[random.randint(0, len(can_add_row) - 1)]
    can_add_index = [i for i in range(len(target_row)) if not target_row[i]]
    target_index = can_add_index[random.randint(0, len(can_add_index) - 1)]
    target_row[target_index] = random.randint(1, 2) * 2


def merge(v, r: str):
    for x in v:
        x[:] = zero_to_end(x)
        for i in range(len(x) - 1):
            if x[i] and x[i] == x[i + 1]:
                x[i] = x[i] * 2
                x[i + 1] = 0
        x[:] = zero_to_end(x)
    global view
    view = to_view(r, v)
    add_new_item()
    if not game_over():
        play()


def game_over():
    if can_merge(form_view('w')) or can_merge(form_view('a')) or can_merge(form_view('s')) or can_merge(form_view('d')):
        return False
    show_view()
    print('游戏结束')
    return True


def play():
    show_view()
    ipt = input('''
        w
    a       d ?
        s
    ''')
    if ipt not in ('w', 'a', 's', 'd'):
        print('输入有误')
        play()
    else:
        v = form_view(ipt)
        if can_merge(v):
            return merge(v, ipt)
        print('操作失败')
        play()


add_new_item()
play()

11111111
wsad控制上下左右

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值