这是一个很简陋的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 =