iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >用Python手把手教你实现2048小游戏
  • 660
分享到

用Python手把手教你实现2048小游戏

Python2048小游戏python游戏 2022-06-02 22:06:54 660人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一、开发环境二、环境搭建三、原理介绍四、效果图一、开发环境 python版本:3.6.4 相关模块: pygame模块; 以及一些Python自带的模块。 二、环境搭建 安装Python并添加到环境变量,pip安

目录
  • 一、开发环境
  • 二、环境搭建
  • 三、原理介绍
  • 四、效果图

一、开发环境

python版本:3.6.4
相关模块:
pygame模块;
以及一些Python自带的模块。

二、环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

三、原理介绍

“使用方向键移动方块,两个数字相同的方块撞在一起后,将会合并为一个数字是原来两倍的新方块。游戏的时候尽可能多地合并这些数字方块就行了。”
大概了解了游戏规则之后,我们就可以开始写这个游戏啦~首先,进行一下游戏初始化操作并播放一首自己喜欢的游戏背景音乐:


# 游戏初始化
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('2048 —— 彳余大胆')
# 播放背景音乐
pygame.mixer.music.load(cfg.BGMPATH)
pygame.mixer.music.play(-1, 30)

接着,我们来定义一个2048游戏类,里面主要负责实现2048的各种游戏规则:


'''2048游戏'''
class Game2048(object):
  def __init__(self, matrix_size=(4, 4), max_score_filepath=None, **kwargs):
    # matrix_size: (num_rows, num_cols)
    self.matrix_size = matrix_size
    # 游戏最高分保存路径
    self.max_score_filepath = max_score_filepath
    # 初始化
    self.initialize()

具体而言,我们先用一个二维的列表来保存当前的游戏状态:


self.game_matrix = [['null' for _ in range(self.matrix_size[1])] for _ in range(self.matrix_size[0])]

其中null表示当前的块里没有数字。否则,对应的位置则用当前的数字表示。很显然地,2048小游戏的当前游戏状态是可以用一个4*4的列表表示的:

在这里插入图片描述

游戏一开始,我们需要在这个二维列表里随机地选择两个位置生成数字(即2或者4):


'''在新的位置随机生成数字'''
def randomGenerateNumber(self):
  empty_pos = []
  for i in range(self.matrix_size[0]):
    for j in range(self.matrix_size[1]):
      if self.game_matrix[i][j] == 'null': empty_pos.append([i, j])
  i, j = random.choice(empty_pos)
  self.game_matrix[i][j] = 2 if random.random() > 0.1 else 4

self.randomGenerateNumber()
self.randomGenerateNumber()

然后,当玩家按下方向键(↑↓←→)时,这个二维列表要根据玩家的操作指令进行更新,主要分为两个部分:
移动所有的数字块并进行必要的合并和记分;
随机地在一个还没有数字的位置上生成一个数字。
具体而言,代码实现如下:


'''更新游戏状态'''
def update(self):
  game_matrix_before = copy.deepcopy(self.game_matrix)
  self.move()
  if game_matrix_before != self.game_matrix: self.randomGenerateNumber()

其中,移动所有的数字并进行必要的合并的代码实现如下:


'''根据指定的方向, 移动所有数字块'''
def move(self):
  # 提取非空数字
  def extract(array):
    array_new = []
    for item in array:
      if item != 'null': array_new.append(item)
    return array_new
  # 合并非空数字
  def merge(array):
    score = 0
    if len(array) < 2: return array, score
    for i in range(len(array)-1):
      if array[i] == 'null':
        break
      if array[i] == array[i+1]:
        array[i] *= 2
        array.pop(i+1)
        array.append('null')
        score += array[i]
    return extract(array), score
  # 不需要移动的话直接return
  if self.move_direction is None: return
  # 向上
  if self.move_direction == 'up':
    for j in range(self.matrix_size[1]):
      col = []
      for i in range(self.matrix_size[0]):
        col.append(self.game_matrix[i][j])
      col = extract(col)
      col.reverse()
      col, score = merge(col)
      self.score += score
      col.reverse()
      col = col + ['null',] * (self.matrix_size[0] - len(col))
      for i in range(self.matrix_size[0]):
        self.game_matrix[i][j] = col[i]
  # 向下
  elif self.move_direction == 'down':
    for j in range(self.matrix_size[1]):
      col = []
      for i in range(self.matrix_size[0]):
        col.append(self.game_matrix[i][j])
      col = extract(col)
      col, score = merge(col)
      self.score += score
      col = ['null',] * (self.matrix_size[0] - len(col)) + col
      for i in range(self.matrix_size[0]):
        self.game_matrix[i][j] = col[i]
  # 向左
  elif self.move_direction == 'left':
    for idx, row in enumerate(copy.deepcopy(self.game_matrix)):
      row = extract(row)
      row.reverse()
      row, score = merge(row)
      self.score += score
      row.reverse()
      row = row + ['null',] * (self.matrix_size[1] - len(row))
      self.game_matrix[idx] = row
  # 向右
  elif self.move_direction == 'right':
    for idx, row in enumerate(copy.deepcopy(self.game_matrix)):
      row = extract(row)
      row, score = merge(row)
      self.score += score
      row = ['null',] * (self.matrix_size[1] - len(row)) + row
      self.game_matrix[idx] = row
  self.move_direction = None

懒得动脑子了(反正就4*4那么大T_T),所以直接遍历了这个二维列表以实现我们想要的所有操作了。最后,我们再写个函数以根据当前的游戏状态来判断游戏是否结束就ok啦:


'''游戏是否结束'''
@property
def isgameover(self):
  for i in range(self.matrix_size[0]):
    for j in range(self.matrix_size[1]):
      if self.game_matrix[i][j] == 'null': return False
      if (i == self.matrix_size[0] - 1) and (j == self.matrix_size[1] - 1):
        continue
      elif (i == self.matrix_size[0] - 1):
        if (self.game_matrix[i][j] == self.game_matrix[i][j+1]):
          return False
      elif (j == self.matrix_size[1] - 1):
        if (self.game_matrix[i][j] == self.game_matrix[i+1][j]):
          return False
      else:
        if (self.game_matrix[i][j] == self.game_matrix[i+1][j]) or (self.game_matrix[i][j] == self.game_matrix[i][j+1]):
          return False
  return True

其实很简单,如果二维列表被数字填满,且数字不能再进行合并的话,这局游戏就结束了,否则,游戏就没有结束。
定义完2048游戏类,我们的游戏基本上算是写完了。只需要在游戏主循环里根据用户操作来更新当前的游戏状态并将游戏里所有必要的元素显示在屏幕上就ok啦:


# 游戏主循环
clock = pygame.time.Clock()
is_running = True
while is_running:
  screen.fill(pygame.Color(cfg.BG_COLOR))
  # --按键检测
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      sys.exit()
    elif event.type == pygame.KEYDOWN:
      if event.key in [pygame.K_UP, pygame.K_DOWN, pygame.K_LEFT, pygame.K_RIGHT]:
        game_2048.setDirection({pygame.K_UP: 'up', pygame.K_DOWN: 'down', pygame.K_LEFT: 'left', pygame.K_RIGHT: 'right'}[event.key])
  # --更新游戏状态
  game_2048.update()
  if game_2048.isgameover:
    game_2048.saveMaxScore()
    is_running = False
  # --将必要的游戏元素画到屏幕上
  drawGameMatrix(screen, game_2048.game_matrix, cfg)
  start_x, start_y = drawScore(screen, game_2048.score, game_2048.max_score, cfg)
  drawGameIntro(screen, start_x, start_y, cfg)
  # --屏幕更新
  pygame.display.update()
  clock.tick(cfg.FPS)
return endInterface(screen, cfg)

四、效果图

最后的效果大概是这样的:

在这里插入图片描述
在这里插入图片描述

玩这个我还是一个菜鸡,嘿嘿~

到此这篇关于用Python手把手教你实现2048小游戏的文章就介绍到这了,更多相关Python2048小游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 用Python手把手教你实现2048小游戏

本文链接: https://www.lsjlt.com/news/10863.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 手把手教你用vue3开发一个打砖块小游戏
    前言 用vue3写了几个实例,感觉Vue3的composition Api设计得还是很不错,改变了一下习惯,但写多两个就好了。 这次写一个也是儿时很觉得很好玩的游戏-打砖块, 无聊...
    99+
    2024-04-02
  • 手把手教你利用Python创建一个游戏窗口
    目录前言 安装Pyagme检查是否安装Pygame:  一 (检查python是否配置环境变量)检查是否安装Pygame:  二 (检查pygame是否...
    99+
    2024-04-02
  • 怎么用Python实现2048小游戏
    这篇文章主要介绍怎么用Python实现2048小游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、开发环境Python版本:3.6.4相关模块:pygame模块;以及一些Python自带的模块。二、环境搭建安装P...
    99+
    2023-06-15
  • 手把手教你用322行Python代码编写贪吃蛇游戏
    目录效果图安装和导入 规则初始化设定Surface,变量和显示数字的坐标 函数线程 主要部分总结源码下载 效果图 贪吃蛇是一个很常见的小游戏...
    99+
    2023-02-04
    用python写贪吃蛇 python简易贪吃蛇 python贪吃蛇项目介绍
  • 手把手教你使用Python写贪吃蛇游戏(pygame,附源码)
    贪吃蛇游戏是有史以来最受欢迎的街机游戏之一。在这个游戏中,玩家的主要目标是在不撞墙或不撞墙的情况下抓住最大数量的水果。在学习 Python 或 Pygame 时,可以将创建蛇游戏视为一项挑战。这是每个新手程序员都应该接受的最好的初学者友好项...
    99+
    2023-08-31
    pygame python 算法 开发语言
  • 手把手教你使用TensorFlow2实现RNN
    目录概述权重共享计算过程:案例数据集RNN 层获取数据完整代码概述 RNN (Recurrent Netural Network) 是用于处理序列数据的神经网络. 所谓序列数据, 即...
    99+
    2024-04-02
  • Python怎么实现简单2048小游戏
    这篇文章主要介绍了Python怎么实现简单2048小游戏,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。简单的2048小游戏不多说,直接上图,这里并未实现GUI之类的,需要的话...
    99+
    2023-06-15
  • 手把手教你实现一个 Python 计时器
    为了更好地掌握 Python 计时器的应用,我们后面还补充了有关Python类、上下文管理器和装饰器的背景知识。因篇幅限制,其中利用上下文管理器和装饰器优化 Python 计时器,将在后续文章学习,不在本篇文章范围内。Python 计时器首...
    99+
    2023-05-14
    Python 编程语言 计时器
  • 小程序怎么实现2048小游戏
    这篇文章主要介绍“小程序怎么实现2048小游戏”,在日常操作中,相信很多人在小程序怎么实现2048小游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”小程序怎么实现2048小游戏”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-26
  • 手把手教你在Python里使用ChatGPT
    目录前言知识点实现代码后话前言 近来chatGPT挺火的,也试玩了一下,确实挺有意思。这里记录一下在Python中如何去使用chatGPT。 本篇文章的实现100%基于 chatGP...
    99+
    2022-12-19
    python使用chatgpt 如何使用chatgpt chatgpt怎么玩
  • 手把手教学,Python 游戏编程之实现飞机大战(含源代码)
    文章目录 一、游戏设定 1、游戏界面展示和设定 二、实现过程 1.我方飞机 2、敌方飞机 3、定义武器 4、武器补充库 5、主模块 总结: 前言 我想大家都是有玩过类似飞机大战的射击类游戏,也享受目...
    99+
    2023-09-12
    python 游戏 开发语言
  • java实现2048小游戏(含注释)
    本文实例为大家分享了java实现2048小游戏的具体代码,供大家参考,具体内容如下 实现文件 APP.java import javax.swing.*; public cla...
    99+
    2024-04-02
  • 手把手教你实现Python重试超时装饰器
    目录一、前言二、简单分析三、代码模拟实现重试装饰器-初版重试装饰器-改进版重试装饰器-加强版重试装饰器-最终版修改记录一、前言 在写业务代码时候,有许多场景需要重试某块业务逻辑,例如...
    99+
    2023-05-18
    Python重试超时装饰器 Python超时重试
  • 手把手教你Vue3实现路由跳转
    目录一、安装 vue-router二、新建 vue 页面2.1 login.vue2.2 register.vue三、新建路由文件3.1 新建 index.js3.2 新建 rout...
    99+
    2024-04-02
  • 【Linux】手把手教你实现udp服务器
    网络套接字~ 文章目录 前言一、udp服务器的实现总结 前言 上一篇文章中我们讲到了很多的网络名词以及相关知识,下面我们就直接进入udp服务器的实现。 一、udp服务器的实现 首先我们需要创建五个文件(文件名可以自己命...
    99+
    2023-08-31
    c++ 后端 linux udp 服务器 网络协议 运维
  • 手把手教你vue实现动态路由
    目录1、什么是动态路由?2、动态路由的好处3、动态路由如何实现总结1、什么是动态路由? 动态路由,动态即不是写死的,是可变的。我们可以根据自己不同的需求加载不同的路由,做到不同的实现...
    99+
    2024-04-02
  • 手把手教你写--FTP(基于python)
    ftp需求分析1. 多用户同时登陆(客户端合法性验证)2. 用户登陆,加密认证--(hamc or md5)3. 注册功能4. 上传/下载文件,保证文件一致性5. 不同用户家目录不同,且只能访问自己的家目录6. 对用户进行磁盘配额、不同用户...
    99+
    2023-01-30
    手把手教你 FTP python
  • 手把手教你用js实现瀑布流布局
    它可以有效的降低页面的复杂度,节省很多的空间;并且,瀑布流的参差不齐的排列方式,可以通过界面展示给用户多条数据,并且让用户可以有向下浏览的冲动,提供了很好的用户体验!例如淘宝的页面就采用了这种布局方式,给大家看看淘宝的瀑布流布局的效果图(手...
    99+
    2023-05-14
    JavaScript
  • 手把手教你用C语言实现三子棋
    目录1.设计简单菜单2.创建棋盘3.下棋过程的实现 3.1玩家下棋 3.2电脑下棋3.3判断输赢4.游戏源码总结1.设计简单菜单 相信大家在玩游戏时会发现,进入游...
    99+
    2024-04-02
  • 手把手教你用Javascript实现观察者模式
    目录什么是观察者模式?场景模拟代码实现重构代码总结 什么是观察者模式? 观察者模式一种设计模式。 观察者模式定义了对象间的一种 一对多 的依赖关系,当一个对象的状态...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作