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使用any判断一个对象是否为空的方法
Nov 19 Python
python结合shell查询google关键词排名的实现代码
Feb 27 Python
教大家玩转Python字符串处理的七种技巧
Mar 31 Python
使用python实现ANN
Dec 20 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
python读取图片并修改格式与大小的方法
Jul 24 Python
Python代码实现http/https代理服务器的脚本
Aug 12 Python
Django如何使用第三方服务发送电子邮件
Aug 14 Python
浅谈django 模型类使用save()方法的好处与注意事项
Mar 28 Python
序列化Python对象的方法
Aug 01 Python
Flask中sqlalchemy模块的实例用法
Aug 02 Python
Python如何发送与接收大型数组
Aug 07 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的preg_match匹配字符串长度问题解决方法
2014/05/03 PHP
PHP输出一个等腰三角形的方法
2015/05/12 PHP
PHP的PDO大对象(LOBs)
2019/01/27 PHP
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
js简单实现删除记录时的提示效果
2013/12/05 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
jQuery定义插件的方法
2015/12/18 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
jQuery中使用animate自定义动画的方法
2016/05/29 Javascript
JavaScript函数中关于valueOf和toString的理解
2016/06/14 Javascript
微信小程序 HTTPS报错整理常见问题及解决方案
2016/12/14 Javascript
一个例子轻松学会Vue.js
2017/01/02 Javascript
微信小程序 网络请求(post请求,get请求)
2017/01/17 Javascript
关于前后端json数据的发送与接收详解
2017/07/30 Javascript
ionic grid(栅格)九宫格制作详解
2018/06/30 Javascript
使用JavaScript保存文本文件到本地的两种方法
2019/01/22 Javascript
Angular8 Http拦截器简单使用教程
2019/08/20 Javascript
详解Angular cli配置过程记录
2019/11/07 Javascript
vue2路由基本用法实例分析
2020/03/06 Javascript
在项目vue中使用echarts的操作步骤
2020/09/07 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
[53:52]OG vs EG 2018国际邀请赛淘汰赛BO3 第二场 8.23
2018/08/24 DOTA
win10环境下python3.5安装步骤图文教程
2017/02/03 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
中国领先的专业演出票务网:永乐票务
2016/08/29 全球购物
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
JAVA和C++区别都有哪些
2015/03/30 面试题
高一政治教学反思
2014/01/28 职场文书
学习自我鉴定
2014/02/01 职场文书
未受刑事制裁公证证明
2014/09/20 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
2016年教师党员创先争优承诺书
2016/03/24 职场文书
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js
使用logback实现按自己的需求打印日志到自定义的文件里
2021/08/30 Java/Android