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 26 Python
Python实现的简单算术游戏实例
May 26 Python
约瑟夫问题的Python和C++求解方法
Aug 20 Python
详解Python 2.6 升级至 Python 2.7 的实践心得
Apr 27 Python
Python2.7读取PDF文件的方法示例
Jul 13 Python
Python中交换两个元素的实现方法
Jun 29 Python
python使用epoll实现服务端的方法
Oct 16 Python
python 返回列表中某个值的索引方法
Nov 07 Python
python实现逐个读取txt字符并修改
Dec 24 Python
关于Numpy数据类型对象(dtype)使用详解
Nov 27 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
Python range与enumerate函数区别解析
Feb 28 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
Smarty保留变量用法分析
2016/05/23 PHP
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
JavaScript中数据结构与算法(五):经典KMP算法
2015/06/19 Javascript
JavaScript实现模仿桌面窗口的方法
2015/07/18 Javascript
使用JQuery在线制作ppt并在线演示源码特效
2015/09/08 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
Javascript使用uploadify来实现多文件上传
2016/11/16 Javascript
vue.js事件处理器是什么
2017/03/20 Javascript
javascript  删除select中的所有option的实例
2017/09/17 Javascript
clipboard.js在移动端复制失败的解决方法
2018/06/13 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
修改vue源码实现动态路由缓存的方法
2020/01/21 Javascript
介绍Python中的文档测试模块
2015/04/28 Python
Python中random模块用法实例分析
2015/05/19 Python
Python中字典的setdefault()方法教程
2017/02/07 Python
Python三级菜单的实例
2017/09/13 Python
PyQt QListWidget修改列表项item的行高方法
2019/06/20 Python
python的sys.path模块路径添加方式
2020/03/09 Python
全球才华横溢工匠的家居装饰、珠宝和礼物:NOVICA
2021/01/22 全球购物
如何理解transaction事务的概念
2015/05/27 面试题
大三在校生电子商务求职信
2013/10/29 职场文书
教师学习培训邀请函
2014/02/04 职场文书
2014年母亲节演讲稿范文
2014/05/07 职场文书
军训拉歌口号
2014/06/13 职场文书
2014年无财产无子女离婚协议书范本
2014/10/09 职场文书
运动会广播稿200字
2014/10/18 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
讲座新闻稿
2015/07/18 职场文书
2015年新农村建设指导员工作总结
2015/07/24 职场文书
医院感染管理制度
2015/08/05 职场文书
2016年小学生新年寄语
2015/08/18 职场文书