Python实战——2048

介绍

本项目是通过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

你可能感兴趣的:(python,python,开发语言,后端)