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中自定义函数的教程
Apr 27 Python
Python实现的HTTP并发测试完整示例
Apr 23 Python
详解python并发获取snmp信息及性能测试
Mar 27 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
Jan 11 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
Jun 13 Python
Pandas之Dropna滤除缺失数据的实现方法
Jun 25 Python
django之静态文件 django 2.0 在网页中显示图片的例子
Jul 28 Python
python psutil模块使用方法解析
Aug 01 Python
TensorFlow实现checkpoint文件转换为pb文件
Feb 10 Python
Python实现异步IO的示例
Nov 05 Python
在PyCharm中安装PaddlePaddle的方法
Feb 05 Python
Python 快速验证代理IP是否有效的方法实现
Jul 15 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的header和asp中的redirect比较
2006/10/09 PHP
PHP中用正则表达式清除字符串的空白
2011/01/17 PHP
php开发过程中关于继承的使用方法分享
2011/06/17 PHP
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
ThinkPHP CURD方法之limit方法详解
2014/06/18 PHP
两个php日期控制类实例
2014/12/09 PHP
通过JAVAScript实现页面自适应
2007/01/19 Javascript
js null undefined 空区别说明
2010/06/13 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
jquery对元素拖动排序示例
2014/01/16 Javascript
jquery form 加载数据示例
2014/04/21 Javascript
JavaScript入门基础
2015/08/12 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
JS查找字符串中出现最多的字符及个数统计
2017/02/04 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
json的结构与遍历方法实例分析
2017/04/25 Javascript
Vuex的初探与实战小结
2018/11/26 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
vue vant中picker组件的使用
2020/11/03 Javascript
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
2018/09/25 Python
解决Python下json.loads()中文字符出错的问题
2018/12/19 Python
python3.6实现学生信息管理系统
2019/02/21 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
python numpy矩阵信息说明,shape,size,dtype
2020/05/22 Python
python自动生成sql语句的脚本
2021/02/24 Python
CSS3+DIV实现漂亮的动画彩色标签
2016/06/16 HTML / CSS
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
LINUX下线程,GDI类的解释
2016/12/14 面试题
国家助学贷款承诺书
2015/04/30 职场文书
优秀乡村医生事迹材料(2016精选版)
2016/02/29 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
根德5570型九灯四波段立体声收音机是电子管收音机的楷模 ? 再论5570
2022/04/05 无线电