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 相关文章推荐
Python3实现的腾讯微博自动发帖小工具
Nov 11 Python
使用python实现递归版汉诺塔示例(汉诺塔递归算法)
Apr 08 Python
使用Python装饰器在Django框架下去除冗余代码的教程
Apr 16 Python
Python实现简单的多任务mysql转xml的方法
Feb 08 Python
Python实现调度算法代码详解
Dec 01 Python
python list元素为tuple时的排序方法
Apr 18 Python
详谈pandas中agg函数和apply函数的区别
Apr 20 Python
Python hashlib模块加密过程解析
Nov 05 Python
Python实现实时数据采集新型冠状病毒数据实例
Feb 04 Python
Python 格式化打印json数据方法(展开状态)
Feb 27 Python
执行Python程序时模块报错问题
Mar 26 Python
使用keras2.0 将Merge层改为函数式
May 23 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 网页过期时间的控制代码
2009/06/29 PHP
header跳转和include包含问题详解
2012/09/08 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
2013/09/30 PHP
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
php关联数组快速排序的方法
2015/04/17 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
2020/02/23 PHP
JXTree对象,读取外部xml文件数据,生成树的函数
2007/04/02 Javascript
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
jQuery元素选择器用法实例
2014/12/23 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
JavaScript面向对象分层思维全面解析
2016/11/22 Javascript
JS简单判断滚动条的滚动方向实现方法
2017/04/28 Javascript
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
2017/05/26 jQuery
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
基于vue2.x的电商图片放大镜插件的使用
2018/01/22 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
[46:02]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第二局
2016/02/28 DOTA
分析Python中解析构建数据知识
2018/01/20 Python
详解python中自定义超时异常的几种方法
2019/07/29 Python
python实现用户名密码校验
2020/03/18 Python
奥地利度假券的专家:we-are.travel
2019/04/10 全球购物
淘宝客服专员岗位职责
2014/04/11 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
2014年自愿离婚协议书
2014/10/10 职场文书
2015年党务公开工作总结
2015/05/19 职场文书
入党积极分子群众意见
2015/06/01 职场文书
纯CSS实现酷炫的霓虹灯效果
2021/04/13 HTML / CSS
MySQL 视图(View)原理解析
2021/05/19 MySQL
Python matplotlib多个子图绘制整合
2022/04/13 Python