当前位置: 首页 > 编程笔记 >

200行python代码实现2048游戏

薛涛
2023-03-14
本文向大家介绍200行python代码实现2048游戏,包括了200行python代码实现2048游戏的使用技巧和注意事项,需要的朋友参考一下

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 本文向大家介绍200 行python 代码实现 2048 游戏,包括了200 行python 代码实现 2048 游戏的使用技巧和注意事项,需要的朋友参考一下 创建游戏文件 2048.py 首先导入需要的包: 主逻辑 用户行为 所有的有效输入都可以转换为"上,下,左,右,游戏重置,退出"这六种行为,用 actions 表示 有效输入键是最常见的 W(上),A(左),S(下),D(右),R(重置),

  • 本文向大家介绍java实现2048游戏源代码,包括了java实现2048游戏源代码的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java实现2048游戏源代码,供大家参考,具体内容如下 一.主要功能: 1、游戏初始化:新建游戏4×4的16宫格画布,随机格子上生成2或者4两个数字 2、格子的移动:先判断能否移动,移动后判断能否合并,合并后改变格子颜色和数字 3、新格子的生成:移动一次

  • 本文向大家介绍C语言代码实现2048游戏,包括了C语言代码实现2048游戏的使用技巧和注意事项,需要的朋友参考一下 我是大一新生,在寒假的实训课上老师让我们用c语言分组编程一个小游戏,我们组选的是“2048”。由于我们组上有一个大神,于是我们把大部分的工作交给了大神做,但是实训完成之后我感觉到碌碌无为,什么也没学到,自己对于c语言的理解也仅仅局限于书本之上,想到那些大神们已经基本可以自己编程一些小

  • 本文向大家介绍python实现2048小游戏,包括了python实现2048小游戏的使用技巧和注意事项,需要的朋友参考一下 2048的python实现。修改自某网友的代码,解决了原网友版本的两个小bug: 1. 原版游戏每次只消除一次,而不是递归消除。如 [2 ,2 ,2 ,2] 左移动的话应该是 [4, 4, 0, 0] , 而不是[8 , 0 , 0 ,0] 2. 对游戏结束的侦测有bug,已

  • 本文向大家介绍python pygame实现2048游戏,包括了python pygame实现2048游戏的使用技巧和注意事项,需要的朋友参考一下 实现2048相对来说比较简单,用4*4的二维数组保存地图,pygame.key.get_pressed()获取键盘操作,详见代码。 效果图 代码 后续可以考虑实现动画和AI。 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程

  • 本文向大家介绍Python实现简单的2048小游戏,包括了Python实现简单的2048小游戏的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Python实现简单的2048小游戏的具体代码,供大家参考,具体内容如下 运行效果: 1.项目结构 2.代码 configs.py main.py Game2048.py 注意这里需要导入两个包(numpy,pygame),然后运行main文件