介绍
本项目是通过python语言实现的2048游戏。
2048是一款特别好玩的游戏,操作十分简单。
下面分享一下我的思路。
核心功能
- 棋盘重置
- 棋盘输出
- 移动判断
- 移动实现
- 键盘监听
- 结束判断
功能实现与解析
棋盘重置
棋盘的重置核心就是将所有格子的数字全部变成0,也就是生成一个4*4的全部为0的二维数组
qipan = [[0 for j in range(4)] for i in range(4)]
采用双层列表解析的方式生成二维数组.
棋盘输出
棋盘的输出就是将二位数组输出,但难点就是输出不影响棋盘的美观,而且数值为0时输出为空
for i in range(4):
print("+------" * 4 + "+")
line = "|{0:^6}|{1:^6}|{2:^6}|{3:^6}|"
print(line.format(qipan[i][0] if qipan[i][0] != 0 else "",
qipan[i][1] if qipan[i][1] != 0 else "",
qipan[i][2] if qipan[i][2] != 0 else "",
qipan[i][3] if qipan[i][3] != 0 else "", ))
print("+------" * 4 + "+")
通过format方法保证棋盘不会因为数值长短导致棋盘变形.
通过二元表达式来实现数值0输出为空.
移动判断
对于移动的判断只需要找到当前方向上是否存在相同的数字相邻,同时对于空格存在时可以视作一定可以移动,后续需要判断有效移动与无效移动。无效移动就是移动前后没有发生任何变化的移动
def is_move_left():
for i in range(4):
for j in range(4):
if qipan[i][j] == 0:
return True
if j != 4 - 1:
if qipan[i][j] == qipan[i][j + 1]:
return True
return False
移动实现
移动主要分两步,首先是填补空位,以左移为例,就是将所有格子的值往左移动,填上所有空格。其次是合并,将相邻的相同数值的格子进行合并
def move_left():
# 移动(填补空位)
for i in range(4):
location = 0
for j in range(4):
if qipan[i][j] != 0:
qipan[i][location] = qipan[i][j]
if location != j:
qipan[i][j] = 0
location += 1
# 合并
for i in range(4):
for j in range(4 - 1):
if qipan[i][j] == qipan[i][j + 1] and qipan[i][j] != 0:
qipan[i][j] = qipan[i][j] * 2
for t in range(j + 1, 4 - 1):
qipan[i][t] = qipan[i][t + 1]
qipan[i][4 - 1] = 0
键盘监听
使用第三方库pynput实现
with keyboard.Listener(on_press=on_press) as listener:
listener.join()
def on_press(key):
try:
if key.char == 'w':
#上移
elif key.char == 's':
#下移
elif key.char == 'a':
#左移
elif key.char == 'd':
#右移
elif key.char == 'r':
#重置
elif key.char == 'q':
#退出
except AttributeError:
pass
结束判断
结束的判断无非就是游戏胜利或游戏失败,因此只需要通过两个函数is_win和is_gameover判断即可
def is_win():
return max(chain(*qipan)) >= 2048
def is_gameover():
if is_move_up() or is_move_down() or is_move_left() or is_move_right():
return False
else:
return True
游戏胜利:只需要存在某个格子的数值大于等于2048即可判断.
游戏失败:当出现四个方向都无法移动且游戏没有胜利,便可判断游戏失败.
完整项目
git:https://gitee.com/zjl0409/python/tree/master/python_2048