python实现2048小游戏


Posted in Python onMarch 30, 2015

2048的python实现。修改自某网友的代码,解决了原网友版本的两个小bug:

1. 原版游戏每次只消除一次,而不是递归消除。如 [2 ,2 ,2 ,2] 左移动的话应该是 [4, 4, 0, 0] , 而不是[8 , 0 , 0 ,0]
2. 对游戏结束的侦测有bug,已经改正。

2048game.py

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 1 14:15:39 2014
 
@author: kelvin
"""
 
import random
 
class game2048:
 totalScore = 0
 v = [[2, 8, 8, 2],
   [4, 2, 4, 8],
   [2, 4, 2, 0],
   [4, 2, 4, 0]]
 '''
 v = [[0, 0, 0, 0],
   [0, 0, 0, 0],
   [0, 0, 0, 0],
   [0, 0, 0, 0]]
 '''
 def __init__(self):
  for i in range(4):
   self.v[i] = [random.choice([0,0,0,2,2,4]) for x in range(4)]
 
 
 def display(self):
  print('{0:4} {1:4} {2:4} {3:4}'.format(self.v[0][0], self.v[0][1], self.v[0][2], self.v[0][3]))
  print('{0:4} {1:4} {2:4} {3:4}'.format(self.v[1][0], self.v[1][1], self.v[1][2], self.v[1][3]))
  print('{0:4} {1:4} {2:4} {3:4}'.format(self.v[2][0], self.v[2][1], self.v[2][2], self.v[2][3]))
  print('{0:4} {1:4} {2:4} {3:4}'.format(self.v[3][0], self.v[3][1], self.v[3][2], self.v[3][3]))
  print('得分为:{0:4}'.format(self.totalScore))
  print('游戏是否结束:{0:4}'.format(self.isOver()))
 #重新排列
 def align(self,vList, direction):
  for i in range(vList.count(0)):
   vList.remove(0)
  zeros = [0 for x in range(4-len(vList))]
  if direction == 'left':
   vList.extend(zeros)
  else:
   vList[:0] = zeros
 #将相同的元素相加,返回新增积分
 def addSame(self,vList, direction):
  increment=0
  if direction == 'left':
   for i in [0,1,2]:
    if vList[i]==vList[i+1] and vList[i+1]!=0:
     vList[i] *= 2
     vList[i+1] = 0
     increment += vList[i]
  else:
   for i in [3,2,1]:
    if vList[i]==vList[i-1] and vList[i-1]!=0:
     vList[i] *= 2
     vList[i-1] = 0
     increment += vList[i]
  return increment
 #处理行和方向,返回新增积分
 def handle(self, vList, direction):
  self.align(vList, direction)
  increment = self.addSame(vList, direction)
  self.align(vList, direction)
  self.totalScore += increment #直接加到总值
  return increment
 #判断游戏是否结束
 def judge(self):
   
  if self.isOver():
   print('你输了,游戏结束!')
   return False
  else:
   if self.totalScore >= 2048:
    print('你赢了,游戏结束!但是你还可以继续玩。')
   return True
 #判断游戏是否真正结束
 def isOver(self):
  N = self.calcCharNumber(0)
  if N!=0:
   return False
  else:
   for row in range(4):
    flag = self.isListOver(self.v[row])
    if flag==False:
     return False 
   for col in range(4):
    # 将矩阵中一列复制到一个列表中然后处理
    vList = [self.v[row][col] for row in range(4)]
    flag = self.isListOver(vList)
    if flag==False:
     return False
  return True
  
 #判断一个列表是否还可以合并
 def isListOver(self, vList):
  for i in [0,1,2]:
   if vList[i]==vList[i+1] and vList[i+1]!=0:
    return False
  return True
 def calcCharNumber(self, char):
  n = 0
  for q in self.v:
   n += q.count(char)
  return n
 def addElement(self):
  # 统计空白区域数目 N
  N = self.calcCharNumber(0)
  if N!=0:
   # 按2和4出现的几率为3/1来产生随机数2和4
   num = random.choice([2, 2, 2, 4]) 
   # 产生随机数k,上一步产生的2或4将被填到第k个空白区域
   k = random.randrange(1, N+1) #k的范围为[1,N]
   n = 0
   for i in range(4):
    for j in range(4):
     if self.v[i][j] == 0:
      n += 1
      if n == k:
       self.v[i][j] = num
       return
 
     
 def moveLeft(self):
  self.moveHorizontal('left')
 def moveRight(self):
  self.moveHorizontal('right')
 def moveHorizontal(self, direction):
  for row in range(4):
   self.handle(self.v[row], direction)
 
 def moveUp(self):
  self.moveVertical('left')
 def moveDown(self):
  self.moveVertical('right')
 def moveVertical(self, direction):
  for col in range(4):
   # 将矩阵中一列复制到一个列表中然后处理
   vList = [self.v[row][col] for row in range(4)]
   self.handle(vList, direction)
   # 从处理后的列表中的数字覆盖原来矩阵中的值
   for row in range(4):
    self.v[row][col] = vList[row]
     
 #主要的处理函数
 def operation(self):
  op = input('operator:')
  if op in ['a', 'A']: # 向左移动
   self.moveLeft()
   self.addElement()
  elif op in ['d', 'D']: # 向右移动
   self.moveRight()
   self.addElement()
  elif op in ['w', 'W']: # 向上移动
   self.moveUp()
   self.addElement()
  elif op in ['s', 'S']: # 向下移动
   self.moveDown()
   self.addElement()
  else:
   print('错误的输入。请输入 [W, S, A, D] 或者是其小写') 
 
#开始
print('输入:W(上移) S(下移) A(左移) D(右移), press <CR>.')
g =game2048()
flag = True
while True:
 g.display()
 flag = g.judge()
 g.operation()
 flag = g.judge()

演示图

python实现2048小游戏

以上所述就是本文的全部内容了,希望大家能够喜欢。

Python 相关文章推荐
python网络编程之TCP通信实例和socketserver框架使用例子
Apr 25 Python
利用Django模版生成树状结构实例代码
May 19 Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
Jun 17 Python
python在OpenCV里实现投影变换效果
Aug 30 Python
Python数据可视化:顶级绘图库plotly详解
Dec 07 Python
使用python的pyplot绘制函数实例
Feb 13 Python
python 爬虫 实现增量去重和定时爬取实例
Feb 28 Python
Python devel安装失败问题解决方案
Jun 09 Python
Python Scrapy多页数据爬取实现过程解析
Jun 12 Python
详解Django中views数据查询使用locals()函数进行优化
Aug 24 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
Python从MySQL数据库中面抽取试题,生成试卷
Jan 14 Python
利用一个简单的例子窥探CPython内核的运行机制
Mar 30 #Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
Mar 30 #Python
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
Mar 30 #Python
以Python的Pyspider为例剖析搜索引擎的网络爬虫实现方法
Mar 30 #Python
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 #Python
Python中利用函数装饰器实现备忘功能
Mar 30 #Python
利用Python绘制MySQL数据图实现数据可视化
Mar 30 #Python
You might like
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
php usort 使用用户自定义的比较函数对二维数组中的值进行排序
2017/05/02 PHP
自动生成文章摘要的代码[JavaScript 版本]
2007/03/20 Javascript
JavaScript 学习笔记一些小技巧
2010/03/28 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
前台js对象在后台转化java对象的问题探讨
2013/12/20 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
2017/06/30 Javascript
js+html5实现半透明遮罩层弹框效果
2020/08/24 Javascript
详解puppeteer使用代理
2018/12/27 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
如何实现vue的tree组件
2020/12/03 Vue.js
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
python黑魔法之编码转换
2016/01/25 Python
如何使用VSCode愉快的写Python于调试配置步骤
2018/04/06 Python
Python实现全排列的打印
2018/08/18 Python
通过 Python 和 OpenCV 实现目标数量监控
2020/01/05 Python
基于Python的OCR实现示例
2020/04/03 Python
Jupyter notebook如何实现指定浏览器打开
2020/05/13 Python
Python面向对象实现方法总结
2020/08/12 Python
Django windows使用Apache实现部署流程解析
2020/10/12 Python
CSS3 渐变(Gradients)之CSS3 线性渐变
2016/07/08 HTML / CSS
Kate Spade澳大利亚官方网站:美国设计师手袋品牌
2019/09/10 全球购物
网络工程专业毕业生推荐信
2013/10/28 职场文书
水务局局长岗位职责
2013/11/28 职场文书
大学生军训感想
2014/02/16 职场文书
个人函授自我鉴定
2014/03/25 职场文书
党员学习中共十八大报告思想汇报
2014/09/15 职场文书
试用期转正员工自我评价
2014/09/18 职场文书
大学生团员个人总结
2015/02/14 职场文书
毕业论文致谢范文
2015/05/14 职场文书
详解Java实现数据结构之并查集
2021/06/23 Java/Android
mysql优化之query_cache_limit参数说明
2021/07/01 MySQL