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模拟登陆类
Mar 29 Python
利用Python批量压缩png方法实例(支持过滤个别文件与文件夹)
Jul 30 Python
python 递归遍历文件夹,并打印满足条件的文件路径实例
Aug 30 Python
python验证身份证信息实例代码
May 06 Python
Python安装与基本数据类型教程详解
May 29 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
python读写csv文件的方法
Aug 13 Python
解决os.path.isdir() 判断文件夹却返回false的问题
Nov 29 Python
使用pygame编写Flappy bird小游戏
Mar 14 Python
文件上传服务器-jupyter 中python解压及压缩方式
Apr 22 Python
Python基于xlutils修改表格内容过程解析
Jul 28 Python
8种常用的Python工具
Aug 05 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
一条久听不愿放下的DIY森海MX500,三言两语话神奇
2021/03/02 无线电
jquery获取多个checkbox的值异步提交给php的方法
2015/06/24 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
2018/05/12 PHP
Alliance vs Liquid BO3 第一场2.13
2021/03/10 DOTA
javascript 设置文本框中焦点的位置
2009/11/20 Javascript
Js 刷新框架页的代码
2010/04/13 Javascript
jQuery版Tab标签切换
2011/03/16 Javascript
js中对象的声明方式以及数组的一些用法示例
2013/12/11 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
2015/05/16 Javascript
jquery实现模拟百分比进度条渐变效果代码
2015/10/29 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
微信小程序实战之自定义抽屉菜单(7)
2017/04/18 Javascript
详解使用Typescript开发node.js项目(简单的环境配置)
2017/10/09 Javascript
Vue实现购物车实例代码两则
2020/05/30 Javascript
Python实现的栈(Stack)
2018/01/26 Python
python实现list由于numpy array的转换
2018/04/04 Python
Python实现检测文件MD5值的方法示例
2018/04/11 Python
Python编程实现tail-n查看日志文件的方法
2019/07/08 Python
如何关掉pycharm中的python console(图解)
2019/10/31 Python
Python 给下载文件显示进度条和下载时间的实现
2020/04/02 Python
python中执行smtplib失败的处理方法
2020/07/01 Python
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
StubHub智利:购买和出售您的门票
2016/11/23 全球购物
Capitol Lighting的1800lighting.com:住宅和商业照明
2019/04/10 全球购物
社区平安建设方案
2014/05/25 职场文书
环保小标语
2014/06/13 职场文书
环保志愿者活动方案
2014/08/14 职场文书
2015年父亲节寄语
2015/03/23 职场文书
旷工辞退通知书
2015/04/17 职场文书
最新的离婚协议书范本!
2019/07/02 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS
详解NodeJS模块化
2021/06/15 NodeJs