200行python代码实现2048游戏


Posted in Python onJuly 17, 2019

Python实战系列用于记录实战项目中的思路,代码实现,出现的问题与解决方案以及可行的改进方向

本文为第2篇?200行Python代码实现2048

一、分析与函数设计

1.1 游戏玩法

2048这款游戏的玩法很简单,每次可以选择上下左右滑动,每滑动一次,所有的数字方块都会往滑动的方向靠拢,系统也会在空白的地方乱数出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。(介绍来自百度百科)

1.2 函数设计

  • _init _() 初始化4*4游戏地图,分数等游戏基本数据
  • is_gameover() 判断是否结束游戏
  • rannumber() 玩家每次移动时在地图上随机生成2、4
  • show() 在控制台打印出4*4游戏地图
  • print_score() 在控制台打印出当前分数
  • up(), upmove() 上移
  • down(), downmove() 下移
  • left(), leftmove() 左移
  • right(), rightmove() 右移
  • nextstep() 读取玩家按键

二、代码实现

注:IDE为Spyder,Python版本为3.6

# -*- coding: utf-8 -*-
"""
Created on Sat Sep 29 16:29:04 2018

@author: PastoralDog
"""
import random

class game2048(object):
  def __init__(self):
    self.score=0
    self.number=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]
    self.move=0
    seed=random.randint(0,15)
    line=int(seed/4)
    row=seed%4
    self.number[line][row]=2    
  
  def is_gameover(self):
    numbersum=0
    for i in range(4):
      for j in range(4):
        if (self.number[i][j]!=0):
          numbersum+=1
    if(numbersum!=16): return False
    for i in range(4):
      for j in range(3):
        if(self.number[i][j+1]==self.number[i][j]): return False
    for i in range(3):
      for j in range(4):
        if(self.number[i+1][j]==self.number[i][j]): return False
    print("游戏结束")
    print("您的得分为:"+str(self.score))
    self.__init__()
    return True
  
  def rannumber(self):
    rannumber=random.randint(1,10)   
    if(rannumber<=8): rannumber=2
    else: rannumber=4
    done=0
    count=0
    for i in range(4):
      for j in range(4):
        if(self.number[i][j]==0):
          count+=1
    while(done==0 and count!=0):
      ranplace=random.randint(0,15)
      line=int(ranplace/4)
      row=ranplace%4
      if(self.number[line][row]==0):
        done=1
        self.number[line][row]=rannumber      
    
  def show(self):
    print(self.number[0])
    print(self.number[1])
    print(self.number[2])
    print(self.number[3])
    
  def print_score(self):
    print("得分:"+str(self.score))
    
  def upmove(self):
    for i in range(1,4):
      for j in range(4):
        temp=i
        while(temp>=1 and self.number[temp-1][j]==0):
          box=self.number[temp-1][j]
          self.number[temp-1][j]=self.number[temp][j]
          self.number[temp][j]=box
          if(self.number[temp][j]!=0):self.move=1
          temp-=1
  
  def up(self):
    self.upmove()
    for i in range(1,4):
      for j in range(4):
        if(self.number[i-1][j]==self.number[i][j]):
          if(self.number[i-1][j]!=2048):
            self.score+=self.number[i][j]
            self.number[i][j]=0
            self.number[i-1][j]=2*self.number[i-1][j]         
    self.upmove()      
    if(self.move!=0):self.rannumber()
    self.move=0
    self.show()
    self.is_gameover()
    self.print_score()
  
  def downmove(self):
     for i in range(2,-1,-1):
       for j in range(4):
        temp=i
        while(temp<=2 and self.number[temp+1][j]==0 ):
          box=self.number[temp+1][j]
          self.number[temp+1][j]=self.number[temp][j]
          self.number[temp][j]=box
          if(self.number[temp+1][j]!=0):self.move=1
          temp+=1
      
  def down(self):
    self.downmove()
    for i in range(2,-1,-1):
      for j in range(4):
        if(self.number[i+1][j]==self.number[i][j]):
          if(self.number[i+1][j]!=2048):
            self.score+=self.number[i][j]
            self.number[i][j]=0
            self.number[i+1][j]=2*self.number[i+1][j] 
    self.downmove()
    if(self.move!=0):self.rannumber()
    self.move=0
    self.show()
    self.is_gameover()
    self.print_score()
  
  def leftmove(self):
    for i in range(4):
      for j in range(1,4):    
        temp=j
        while(temp>=1 and self.number[i][temp-1]==0 ):
          box=self.number[i][temp-1]
          self.number[i][temp-1]=self.number[i][temp]
          self.number[i][temp]=box
          if(self.number[i][temp-1]!=0):self.move=1
          temp-=1
  
  def left(self):
    self.leftmove()
    for i in range(4):
      for j in range(0,3):
        if(self.number[i][j+1]==self.number[i][j]):
          if(self.number[i][j+1]!=2048):
            self.score+=self.number[i][j]
            self.number[i][j+1]=0
            self.number[i][j]=2*self.number[i][j] 
    self.leftmove()
    if(self.move!=0):self.rannumber()
    self.move=0
    self.show()
    self.is_gameover()
    self.print_score()
  
  def rightmove(self):
    for i in range(4):
      for j in range(2,-1,-1):    
        temp=j
        while(temp<=2 and self.number[i][temp+1]==0 ):
          box=self.number[i][temp+1]
          self.number[i][temp+1]=self.number[i][temp]
          self.number[i][temp]=box
          self.move=1
          temp+=1
  
  def right(self):
    self.rightmove()
    for i in range(4):
      for j in range(2,-1,-1):
        if(self.number[i][j+1]==self.number[i][j]):
          if(self.number[i][j+1]!=2048):
            self.score+=self.number[i][j]
            self.number[i][j]=0
            self.number[i][j+1]=2*self.number[i][j+1] 
    self.rightmove()
    if(self.move!=0):self.rannumber()
    self.move=0
    self.show()
    self.is_gameover()
    self.print_score()
  
  def nextstep(self,step):
    if(step=='w'): self.up()
    elif(step=='s'): self.down()
    elif(step=='a'): self.left()  
    elif(step=='d'): self.right()
    else: pass
       
if __name__ == '__main__':
  game=game2048()
  game.show()
  while(True):
    step=input()
    if(step=='b'):break
    game.nextstep(step)

三、问题与解决方案

1.地图的储存与表示:目前没有界面设计,因此就用二维数组直接储存与表示

2.数组越界:调试代码中遇到过五六次,除了牢记要边缘检测外, and 语句左右条件顺序也要有讲究。

例:while(temp<=2 and self.number[temp+1][j]==0 ) 注:self.number为4*4的二维数组
temp=3时,语句在temp<=2 被阻塞,不会执行self.number[temp+1][j]==0,此时没有问题;
若语句改为while(self.number[temp+1][j]==0 and temp<=2), 先执行self.number[temp+1][j]==0,此时编译器报错数组越界

四、可行的改进方向

1.添加可视化界面,可考虑Tkinter,QT等

2.拓展游戏地图大小为N x N

本人水平有限,欢迎大家提出问题与建议。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基础教程之序列详解
Aug 29 Python
Python深入学习之特殊方法与多范式
Aug 31 Python
Python Tkinter GUI编程入门介绍
Mar 10 Python
举例讲解Django中数据模型访问外键值的方法
Jul 21 Python
发布你的Python模块详解
Sep 15 Python
Python爬取APP下载链接的实现方法
Sep 30 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
python一行sql太长折成多行并且有多个参数的方法
Jul 19 Python
python中pygame安装过程(超级详细)
Aug 04 Python
python实现多线程端口扫描
Aug 31 Python
python 实现在shell窗口中编写print不向屏幕输出
Feb 19 Python
Python 实现进度条的六种方式
Jan 06 Python
Django后端接收嵌套Json数据及解析详解
Jul 17 #Python
Python制作微信好友背景墙教程(附完整代码)
Jul 17 #Python
python代码编写计算器小程序
Mar 30 #Python
Django Channels 实现点对点实时聊天和消息推送功能
Jul 17 #Python
Python Django的安装配置教程图文详解
Jul 17 #Python
python按键按住不放持续响应的实例代码
Jul 17 #Python
python数据预处理之数据标准化的几种处理方式
Jul 17 #Python
You might like
一个odbc连mssql分页的类
2006/10/09 PHP
ThinkPHP模板输出display用法分析
2014/11/26 PHP
php生成酷炫的四个字符验证码
2016/04/22 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
ThinkPHP实现附件上传功能
2017/04/27 PHP
jquery.validate使用攻略 第五步 正则验证
2010/07/01 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
jQuery实现360°全景拖动展示
2015/03/18 Javascript
JavaScript每天定时更换皮肤样式的方法
2015/07/01 Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
2016/05/31 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
2017/03/25 Javascript
js实现移动端导航点击自动滑动效果
2017/07/18 Javascript
基于ES6 Array.of的用法(实例讲解)
2017/09/05 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
vuex 多模块时 模块内部的mutation和action的调用方式
2020/07/24 Javascript
vue实现虚拟列表功能的代码
2020/07/28 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python简单猜数游戏实例
2015/07/09 Python
Python模拟鼠标点击实现方法(将通过实例自动化模拟在360浏览器中自动搜索python)
2017/08/23 Python
Python矩阵常见运算操作实例总结
2017/09/29 Python
Python编程pygal绘图实例之XY线
2017/12/09 Python
python编写暴力破解zip文档程序的实例讲解
2018/04/24 Python
Python学习_几种存取xls/xlsx文件的方法总结
2018/05/03 Python
Python实现的旋转数组功能算法示例
2019/02/23 Python
Tensorflow加载Vgg预训练模型操作
2020/05/26 Python
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
机械专业毕业生自荐信
2013/11/02 职场文书
食品行业求职人的自我评价
2014/01/19 职场文书
大三学习计划书范文
2014/05/02 职场文书
经销商年会策划方案
2014/05/29 职场文书
会计电算化实训报告
2014/11/04 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
导盲犬小Q观后感
2015/06/11 职场文书
英语读书笔记
2015/07/02 职场文书
原生JavaScript实现简单五子棋游戏
2021/06/28 Javascript