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结合ImageMagick实现多张图片合并为一个pdf文件的方法
Apr 24 Python
网红编程语言Python将纳入高考你怎么看?
Jun 07 Python
python3爬虫学习之数据存储txt的案例详解
Apr 24 Python
python使用tkinter库实现五子棋游戏
Jun 18 Python
win8.1安装Python 2.7版环境图文详解
Jul 01 Python
opencv调整图像亮度对比度的示例代码
Sep 27 Python
40个你可能不知道的Python技巧附代码
Jan 29 Python
Python 改变数组类型为uint8的实现
Apr 09 Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
May 15 Python
Pandas中DataFrame基本函数整理(小结)
Jul 20 Python
Python标准库之typing的用法(类型标注)
Jun 02 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
用php获取远程图片并把它保存到本地的代码
2008/04/07 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
php创建图像具体步骤
2017/03/13 PHP
Thinkphp5.0框架使用模型Model的获取器、修改器、软删除数据操作示例
2019/10/11 PHP
Yii 框架使用Forms操作详解
2020/05/18 PHP
javascript中巧用“闭包”实现程序的暂停执行功能
2007/04/04 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
用jquery写的菜单从左往右滑动出现
2014/04/11 Javascript
javascript实现支持移动设备画廊
2015/08/24 Javascript
基于PHP和Mysql相结合使用jqGrid读取数据并显示
2015/12/02 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
2016/01/05 Javascript
JQuery控制图片由中心点逐渐放大效果
2016/06/26 Javascript
微信小程序 地图map详解及简单实例
2017/01/10 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
浅析Vue.js 中的条件渲染指令
2018/11/19 Javascript
JS实现打字游戏
2019/12/17 Javascript
[01:10]DOTA2英雄背景故事第四期之混沌法则混沌骑士
2020/07/16 DOTA
python列出目录下指定文件与子目录的方法
2015/07/03 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
python绘制已知点的坐标的直线实例
2019/07/04 Python
使用Python的Turtle库绘制森林的实例
2019/12/18 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
pygame实现飞机大战
2020/03/11 Python
Python reques接口测试框架实现代码
2020/07/28 Python
京东港澳售:京东直邮港澳台
2018/01/31 全球购物
最新销售员个人自荐信
2013/09/21 职场文书
酒店门卫岗位职责
2013/12/29 职场文书
大学生军训广播稿
2014/01/24 职场文书
酒店端午节促销方案
2014/02/18 职场文书
八荣八耻的活动方案
2014/08/16 职场文书
推广普通话共筑中国梦演讲稿
2014/09/21 职场文书
优秀团员自我评价
2015/03/10 职场文书
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫