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编写一个简单的FUSE文件系统的教程
Apr 02 Python
分享几道你可能遇到的python面试题
Jul 24 Python
python 定义n个变量方法 (变量声明自动化)
Nov 10 Python
简单了解python 生成器 列表推导式 生成器表达式
Aug 22 Python
基于python3监控服务器状态进行邮件报警
Oct 19 Python
pytorch 实现cross entropy损失函数计算方式
Jan 02 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
Apr 01 Python
pyCharm 设置调试输出窗口中文显示方式(字符码转换)
Jun 09 Python
用pandas划分数据集实现训练集和测试集
Jul 20 Python
Python数据可视化常用4大绘图库原理详解
Oct 23 Python
Python实现王者荣耀自动刷金币的完整步骤
Jan 22 Python
opencv实现图像几何变换
Mar 24 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 mysql 判断update之后是否更新了的方法
2012/01/10 PHP
php正则表达式学习笔记
2015/11/13 PHP
PHP使用mkdir创建多级目录的方法
2015/12/22 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
双击滚屏-常用推荐
2006/11/29 Javascript
iphone safari不支持position fixed的解决方法
2012/05/04 Javascript
js setTimeout()函数介绍及应用以倒计时为例
2013/12/12 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
JQuery中Ajax()的data参数类型实例分析
2015/12/15 Javascript
JavaScript阻止回车提交表单的方法
2015/12/30 Javascript
JavaScript隐式类型转换
2016/03/15 Javascript
老生常谈javascript变量的命名规范和注释
2016/09/29 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
javascript读取文本节点方法小结
2016/12/15 Javascript
JS正则匹配URL网址的方法(可匹配www,http开头的一切网址)
2017/01/06 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
JS触摸与手势事件详解
2017/05/09 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
python 实现堆排序算法代码
2012/06/05 Python
Python Django使用forms来实现评论功能
2016/08/17 Python
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
Python中extend和append的区别讲解
2019/01/24 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
Python 最强编辑器详细使用指南(PyCharm )
2019/09/16 Python
淘宝秒杀python脚本 扫码登录版
2019/09/19 Python
Python第三方包PrettyTable安装及用法解析
2020/07/08 Python
html5与css3小应用
2013/04/03 HTML / CSS
写一个在SQL Server创建表的SQL语句
2012/03/10 面试题
叙述DBMS对数据控制功能有哪些
2016/06/12 面试题
毕业生的自我鉴定
2013/10/29 职场文书
学生自我鉴定模板
2013/12/30 职场文书
生日宴会答谢词
2014/01/09 职场文书
大学生志愿者感言
2014/01/15 职场文书
租房协议书怎么写
2014/04/10 职场文书
专科应届毕业生求职信
2014/06/04 职场文书
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
2023/05/08 MySQL