当前位置: 移动技术网 > IT编程>脚本编程>Python > python实现2048小游戏

python实现2048小游戏

2019年06月14日  | 移动技术网IT编程  | 我要评论

罗耀明,成年身份证,萌兽太子妃

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()

演示图

以上所述就是本文的全部内容了,希望大家能够喜欢。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网