栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python实战——2048

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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_2048

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/649553.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号