Python 编写简易2048游戏

这是一个很简陋的2048游戏设计,先看下在 PyCharm 控制台输出的效果先:

请输入2048游戏界面的大小:3
[0, 0, 0]
[0, 0, 0]
[0, 2, 0]
(w/W)上,(s/S)下,(a/A)左,(d/D)右,(r/R)重置游戏大小,(q/Q)退出:a
[0, 0, 0]
[0, 0, 0]
[2, 0, 4]
(w/W)上,(s/S)下,(a/A)左,(d/D)右,(r/R)重置游戏大小,(q/Q)退出:d
[2, 0, 0]
[0, 0, 0]
[0, 2, 4]
(w/W)上,(s/S)下,(a/A)左,(d/D)右,(r/R)重置游戏大小,(q/Q)退出:s
[2, 0, 0]
[0, 0, 0]
[2, 2, 4]
(w/W)上,(s/S)下,(a/A)左,(d/D)右,(r/R)重置游戏大小,(q/Q)退出:d
[0, 0, 2]
[0, 0, 0]
[2, 0, 8]
(w/W)上,(s/S)下,(a/A)左,(d/D)右,(r/R)重置游戏大小,(q/Q)退出:q

Process finished with exit code 0

其中类似 [0, 2, 2, 2] 这样的数组,“向右滑动”后为 [0, 0, 4, 2],而不是 [0, 0, 2, 4],没去查究竟哪种才是真正的结果,不过这两种的实现效果,代码思想都是一样,就这样吧

设计思路

2048 游戏界面可由一个二维数组来表示。当左右滑动的动作作用在整个二维数组上,可以采用化整为零的思想,把一个二维数组按情况分解为一列列的一维数组或者一行行的一维数组,进而遍历这些一维数组,实现一维数组上的左右滑动,从而实现二维数组的左右滑动操作。

代码实现解析

首先定义一个初始数组,表示游戏界面的范围大小

  • [[0 for i in range(size)] for j in range(size)]表示行列数都为 size ,值都为 0 的二维数组
def area_array():
    '''
    生成 2048 游戏界面,界面的长宽为输入值的大小
    :return: 全部值为0 的二维数组
    '''
    while True:
        size = input('请输入2048游戏界面的大小:')
        if re.match('^[2-9][0-9]*$|^[1-9][0-9]+$', size):
            size = int(size)
            area = [[0 for i in range(size)] for j in range(size)]
            break
        else:
            print('输入有误!输入需满足大于等于2的数字\n')
    return area

然后,通过随机给一个值为 0 的数组元素赋值 2 或 4,来模拟在界面上空白处随机生成一个数

  • random.choice([2, 4]) 返回参数列表中随机的一个元素

  • [(j, i) for i in range(len(n[0])) for j in range(len(n)) if n[j][i] == 0]表示

    数组 n 中值为零的元素的位置元组所组成的列表

def next_station(n):
    '''
    随机选择在值为零的数组位置上,随机赋值 2 或 4
    :param n: “滑动”操作后的界面二维数组
    :return:  随机赋值后的二维数组
    '''
    values = random.choice([2, 4])      
    temp = [(j, i) for i in range(len(n[0])) for j in range(len(n)) if n[j][i] == 0]
    temp_index = random.choice(temp)
    n[temp_index[0]][temp_index[1]] = values

    return n

这里先搞定 “滑动” 一维数组是怎样实现的,比如, [2, 0, 2, 8] 向左 “滑动” 后变为 [4, 8, 0, 0] 。之后把二维数组按照上下左右滑动的不同情况来对应分解成几个一维数组,遍历它们即可完成整个二维数组的 “滑动”


先编写子函数来判断任意一个一维数组是否还可以“滑动”

  • for i in range(len([])):print('Ok') 这句语句不会输出内容,即不会进入该循环中
def is_next_equals(n):
    '''
    判断一维数组是否还可以“滑动”
    :param n: 一维数组
    :return: bool
    '''
    length = len(n)
    n = 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值