Python新手实现2048小游戏


Posted in Python onMarch 31, 2015

接触 Python 不久,看到很多人写2048,自己也捣鼓了一个,主要是熟悉Python语法。

程序使用Python3 写的,代码150行左右,基于控制台,方向键使用输入字符模拟。

演示图片

Python新手实现2048小游戏

2048.py

# -*- coding:UTF-8 -*-
#! /usr/bin/python3
 
import random
 
v = [[0, 0, 0, 0],
   [0, 0, 0, 0],
   [0, 0, 0, 0],
   [0, 0, 0, 0]]
 
def display(v, score):
    '''显示界面
 
    '''
    print('{0:4} {1:4} {2:4} {3:4}'.format(v[0][0], v[0][1], v[0][2], v[0][3]))
    print('{0:4} {1:4} {2:4} {3:4}'.format(v[1][0], v[1][1], v[1][2], v[1][3]))
    print('{0:4} {1:4} {2:4} {3:4}'.format(v[2][0], v[2][1], v[2][2], v[2][3]))
    print('{0:4} {1:4} {2:4} {3:4}'.format(v[3][0], v[3][1], v[3][2], v[3][3]), '  Total score: ', score)
 
def init(v):
    '''随机分布网格值
     
    '''
    for i in range(4):
        v[i] = [random.choice([0, 0, 0, 2, 2, 4]) for x in range(4)]
 
def align(vList, direction):
    '''对齐非零的数字
 
    direction == 'left':向左对齐,例如[8,0,0,2]左对齐后[8,2,0,0]
    direction == 'right':向右对齐,例如[8,0,0,2]右对齐后[0,0,8,2]
    '''
 
    # 移除列表中的0
    for i in range(vList.count(0)):
        vList.remove(0)
    # 被移除的0
    zeros = [0 for x in range(4 - len(vList))]
    # 在非0数字的一侧补充0
    if direction == 'left':
        vList.extend(zeros)
    else:
        vList[:0] = zeros
     
def addSame(vList, direction):
    '''在列表查找相同且相邻的数字相加, 找到符合条件的返回True,否则返回False,同时还返回增加的分数
     
    direction == 'left':从右向左查找,找到相同且相邻的两个数字,左侧数字翻倍,右侧数字置0
    direction == 'right':从左向右查找,找到相同且相邻的两个数字,右侧数字翻倍,左侧数字置0
    '''
    score = 0
    if direction == 'left':
        for i in [0, 1, 2]:
            if vList[i] == vList[i+1] != 0: 
                vList[i] *= 2
                vList[i+1] = 0
                score += vList[i]
                return {'bool':True, 'score':score}
    else:
        for i in [3, 2, 1]:
            if vList[i] == vList[i-1] != 0:
                vList[i-1] *= 2
                vList[i] = 0
                score += vList[i-1]
                return {'bool':True, 'score':score}
    return {'bool':False, 'score':score}
 
def handle(vList, direction):
    '''处理一行(列)中的数据,得到最终的该行(列)的数字状态值, 返回得分
 
    vList: 列表结构,存储了一行(列)中的数据
    direction: 移动方向,向上和向左都使用方向'left',向右和向下都使用'right'
    '''
    totalScore = 0
    align(vList, direction)
    result = addSame(vList, direction)
    while result['bool'] == True:
        totalScore += result['score']
        align(vList, direction)
        result = addSame(vList, direction)
    return totalScore
     
 
def operation(v):
    '''根据移动方向重新计算矩阵状态值,并记录得分
    '''
    totalScore = 0
    gameOver = False
    direction = 'left'
    op = input('operator:')
    if op in ['a', 'A']:  # 向左移动
        direction = 'left'
        for row in range(4):
            totalScore += handle(v[row], direction)
    elif op in ['d', 'D']: # 向右移动
        direction = 'right'
        for row in range(4):
            totalScore += handle(v[row], direction)
    elif op in ['w', 'W']: # 向上移动
        direction = 'left'
        for col in range(4):
            # 将矩阵中一列复制到一个列表中然后处理
            vList = [v[row][col] for row in range(4)]
            totalScore += handle(vList, direction)
            # 从处理后的列表中的数字覆盖原来矩阵中的值
            for row in range(4):
                v[row][col] = vList[row]
    elif op in ['s', 'S']: # 向下移动
        direction = 'right'
        for col in range(4):
            # 同上
            vList = [v[row][col] for row in range(4)]
            totalScore += handle(vList, direction)
            for row in range(4):
                v[row][col] = vList[row]
    else:
        print('Invalid input, please enter a charactor in [W, S, A, D] or the lower')
        return {'gameOver':gameOver, 'score':totalScore}
 
    # 统计空白区域数目 N
    N = 0
    for q in v:
      N += q.count(0)
    # 不存在剩余的空白区域时,游戏结束
    if N == 0:
        gameOver = True
        return {'gameOver':gameOver, 'score':totalScore}
 
    # 按2和4出现的几率为3/1来产生随机数2和4
    num = random.choice([2, 2, 2, 4]) 
    # 产生随机数k,上一步产生的2或4将被填到第k个空白区域
    k = random.randrange(1, N+1)
    n = 0
    for i in range(4):
        for j in range(4):
            if v[i][j] == 0:
                n += 1
                if n == k:
                    v[i][j] = num
                    break
 
    return {'gameOver':gameOver, 'score':totalScore}
 
init(v)
score = 0
print('Input:W(Up) S(Down) A(Left) D(Right), press <CR>.')
while True:
    display(v, score)
    result = operation(v)
    if result['gameOver'] == True:
        print('Game Over, You failed!')
        print('Your total score:', score)
    else:
        score += result['score']
        if score >= 2048:
            print('Game Over, You Win!!!')
            print('Your total score:', score)

以上所述就是本文给大家分享的全部代码了,希望能够对大家学习Python有所帮助。

Python 相关文章推荐
Python中__name__的使用实例
Apr 14 Python
python 与GO中操作slice,list的方式实例代码
Mar 20 Python
Python自动化运维_文件内容差异对比分析
Dec 13 Python
使用 Python 实现微信公众号粉丝迁移流程
Jan 03 Python
python实现多线程行情抓取工具的方法
Feb 28 Python
Django实现支付宝付款和微信支付的示例代码
Jul 25 Python
Python 占位符的使用方法详解
Jul 10 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
python创建n行m列数组示例
Dec 02 Python
kafka监控获取指定topic的消息总量示例
Dec 23 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
Feb 10 Python
Python requests设置代理的方法步骤
Feb 23 Python
举例介绍Python中的25个隐藏特性
Mar 30 #Python
在Python的循环体中使用else语句的方法
Mar 30 #Python
python实现2048小游戏
Mar 30 #Python
利用一个简单的例子窥探CPython内核的运行机制
Mar 30 #Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
Mar 30 #Python
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
Mar 30 #Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 #Python
You might like
PHP_Flame(Version:Progress)的原代码
2006/10/09 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
PHP限制HTML内容中图片必须是本站的方法
2015/06/16 PHP
PHP Web木马扫描器代码分享
2015/09/06 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
2019/04/23 PHP
仿校内登陆框,精美,给那些很厉害但是没有设计天才的程序员
2008/11/24 Javascript
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
js DOM的学习笔记
2011/12/22 Javascript
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
深入理解JavaScript系列(4) 立即调用的函数表达式
2012/01/15 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
php跨域调用json的例子
2013/11/13 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
Javascript基础教程之for循环
2015/01/18 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
JS如何判断是否为ie浏览器的方法(包括IE10、IE11在内)
2015/12/13 Javascript
全面解析DOM操作和jQuery实现选项移动操作代码分享
2016/06/07 Javascript
浅析如何利用JavaScript进行语音识别
2016/10/27 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
详解本地Node.js服务器作为api服务器的解决办法
2017/02/28 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
基于PHP pthreads实现多线程代码实例
2020/06/24 Javascript
分析Python中设计模式之Decorator装饰器模式的要点
2016/03/02 Python
python 计算文件的md5值实例
2017/01/13 Python
深入理解Python3中的http.client模块
2017/03/29 Python
Python计时相关操作详解【time,datetime】
2017/05/26 Python
python实现windows下文件备份脚本
2018/05/27 Python
解决django同步数据库的时候app models表没有成功创建的问题
2019/08/09 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
css3的transform中scale缩放详解
2014/12/08 HTML / CSS
超市收银员岗位职责
2015/04/07 职场文书
学校远程教育工作总结
2015/08/11 职场文书
判断Python中的Nonetype类型
2021/05/25 Python
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
nginx 添加http_stub_status_module模块
2022/05/25 Servers