基于Python制作的2048小游戏

基于 Python 制作的 2048 小游戏 导语 感觉好久没和大家一起写小游戏玩了,今天恰巧有空,那就过来补一期 python 制作小游戏系列的文章呗

本文包含相关资料包-----> 点击直达获取<-------

基于 Python 制作的 2048 小游戏

导语

感觉好久没和大家一起写小游戏玩了,今天恰巧有空,那就过来补一期 python 制作小游戏系列的文章呗。这次我们来做个 2048 小游戏吧。废话不多说,让我们愉快地开始吧~

开发工具

Python 版本: 3.6.4

相关模块:

pygame 模块;

以及一些 Python 自带的模块。

环境搭建

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

先睹为快

在 cmd 窗口运行如下命令即可:

python Game23.py

效果如下:

原理简介

不瞒大家说,我以前还真没玩过 2048 这个小游戏。于是找了个网页版的 2048 小游戏先体验了一下:

https://newdoku.com/zh/2048.php

感觉玩法还是挺简单的,无非就是:

使用方向键移动方块,两个数字相同的方块撞在一起后,将会合并为一个数字是原来两倍的新方块。游戏的时候尽可能多地合并这些数字方块就行了。"

大概了解了游戏规则之后,我们就可以开始写这个游戏啦~首先,进行一下游戏初始化操作并播放一首自己喜欢的游戏背景音乐:

```

游戏初始化

pygame.init() screen = pygame.display.set_mode(cfg.SCREENSIZE) pygame.display.set_caption('2048 —— 微信公众号:Charles的皮卡丘')

播放背景音乐

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

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

python '''根据指定的方向, 移动所有数字块''' 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 啦

```python

游戏主循环

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

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

大功告成,完整源代码详见相关文件~

参考文献

  • 基于B/S架构的酷跑社区系统的设计与实现(内蒙古大学·张晓乐)
  • 基于Web的竞赛软件的设计与实现(河北科技大学·马丽红)
  • 基于J2EE平台的工作流管理系统的运行引擎和客户端及管理工具的设计与实现(西北大学·门浩)
  • 基于Python Web的运动社交微信小程序(大连理工大学·赵兴东)
  • 基于J2EE平台的工作流管理系统的运行引擎和客户端及管理工具的设计与实现(西北大学·门浩)
  • 在线旅游管理信息系统的设计与实现(电子科技大学·任缘)
  • 基于Android平台的手机游戏的设计与开发(云南大学·秦成)
  • 基于WEB技术的新闻发布系统的设计与实现(电子科技大学·黄红)
  • 基于WEB技术的新闻发布系统的设计与实现(电子科技大学·黄红)
  • 基于B/S结构的新闻发布系统(吉林大学·郭蕊)
  • 基于Web的竞赛软件的设计与实现(河北科技大学·马丽红)
  • 基于B/S结构的新闻发布系统(吉林大学·郭蕊)
  • 基于网络爬虫的论坛数据分析系统的设计与实现(华中科技大学·黎曦)
  • 基于J2EE平台的工作流管理系统的运行引擎和客户端及管理工具的设计与实现(西北大学·门浩)
  • 基于Web的竞赛软件的设计与实现(河北科技大学·马丽红)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设项目助手 ,原文地址:https://m.bishedaima.com/yuanma/36066.html

相关推荐

  • 基于Python实现损失函数的参数估计

    1, 实验目的 理解逻辑回归模型,掌握逻辑回归模型的参数估计算法, 2, 实验要求 实现两种损失函数的参数估计(1,无惩罚项;2,加入对参数的惩罚),可以采用梯度下降
    2024年05月14日
    1 1 1
  • 基于jsp和mysql实现的个人博客系统

    基于jsp和mysql实现的个人博客系统 1,项目简介 1,1 项目概述 这是一个简单的个人博客系统,个人练手,完成会部署到云服务器作为记录自己生活学习的点点滴滴的一个工具
    2024年05月14日
    17 1 3
  • 在线文档管理系统

    这是一个🔥🔥基于SpringBoot框架的在线文档管理系统设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    1 1 1
  • 基于JSP和MySQL的宠物网站设计与实现

    基于JSP和MySQL的宠物网站设计与实现 摘 要 本系统是采用Java技术来构建的一个基于Web技术的B/S结构的宠物网站,该网站建立在Spring和Struts2框架之上
    2024年05月14日
    11 1 2
  • Java+SSH酒店预订管理网站

    这是一个🔥🔥SSH酒店预订管理网站🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 酒店预订开发技术栈为SSH项目,可以作为毕业设计课程设计作业基于Java+SSH技术(Struts2
    2024年05月23日
    3 1 1
  • 基于Java+SSM的房屋租赁管理系统、javaweb+mysql框架

    房屋租赁管理系统在当今社会扮演着重要角色,随着城市化进程的不断加快,人们对于房屋租赁的需求也日益增长,基于Java+SSM的房屋租赁管理系统具有极大的应用潜力,本论文旨在探讨如何利用Javaweb技术开发一个全面而高效的房屋租赁管理系统
    2024年05月07日
    3 1 1
  • 基于Python实现的新闻网络爬虫程序

    基于Python实现的新闻网络爬虫程序 1,简介 1,1 引用术语与缩写解释 缩写,术语 解 释 Python 一种简洁而强大的解释型脚本语言 pyodbc Python下的ODBC数据库访问组件 SQLAlchemy Python下的ORM数据访问组件 pywin32 Python下的Win32接口访问组件 requests Python下的Web访问组件 Pillow Python下的图像处理组件 解释型语言 无需编译源码可敏捷部署并执行的语言 IOC 控制反转
    2024年05月14日
    3 1 2
  • 基于ASR的语音词频提取云平台(python)

    基于ASR的语音词频提取云平台(python) 摘要 随着互联网的发展,语音文件成为了人们接触得越来越多文件,如何高效的从一段录音中提取出关键信息
    2024年05月14日
    2 1 2
  • 基于Java+SSH的在线教学交流平台、基于JavaWeb的在线教学交流平台

    在当今信息化时代,教育行业迎来了数字化转型的浪潮,基于Java+SSH框架(struts2+spring+hibernate)的在线教学交流平台应运而生,本研究旨在设计和开发一个全面的师生学习交流平台
    2024年05月07日
    6 1 3
  • 基于Java Web和MySQL的学生信息管理系统

    基于Java Web和MySQL的学生信息管理系统 1,系统概述 1,1 课设目的 复习,巩固JavaWeb,数据库,AJAX,JQuery,HTML的基础知识
    2024年05月14日
    2 1 1

发表回复

登录后才能评论