Python+Pygame制作简易版2048小游戏
作者:嗨!栗子同学 发布时间:2022-12-01 18:05:03
标签:Python,Pygame,2048
导语
哈喽!大家好,我是栗子,感谢大家的支持!
新的一天,新气象,程序猿们的日常开始敲敲敲,改改改——今天给大家来一款简单的小游戏!
2048小游戏——准确的来说确实是一个简单版本的!
呐呐呐 ,主要是担心很多小伙伴儿直接上界面版本的看不懂,所以做了这款简单的2048,先看这篇简单版本的吧!
为了搞懂这个游戏的规则,小编去直接下载了一款2048的小游戏,上手玩了一波!
然后.........完全停不下来!23333~
玩法: 用手指或键盘上下左右滑动,将两个相同的数字合并,例如:2 + 2 = 4, 4 + 4 = 8... 直到
1024 + 1024 = 2048!
主要代码
# 练习1:定义函数,将列表中0元素,移动到末尾。
# [2,0,2,0] --> [2,2,0,0]
# [0,4,2,4] --> [4,2,4,0]
# 适合零基础同学
def zero_to_end(list_target):
# 选出非零元素 形成新列表
# [2, 0, 2, 0] --> [2, 2]
new_list = []
for item in list_target:
if item != 0:
new_list.append(item)
# 追加零元素 [2, 2] --> [2,2,0,0]
# 判断原列表零元素数量: list_target.count(0)
for i in range(list_target.count(0)):
new_list.append(0)
# 返回新列表
return new_list
# def zero_to_end(list_target):
# # 选出非零元素 形成新列表
# # [2, 0, 2, 0] --> [2, 2]
# new_list = [item for item in list_target if item != 0]
# # 重复生成零元素 [0] * list_target.count(0)
# new_list += [0] * list_target.count(0)
# # 返回新列表
# return new_list
# 同学方法
# def zero_to_end(list_target):
# # 删除零元素 在后面追加
# for item in list_target:
# if item == 0:
# list_target.remove(0)
# list_target.append(item)
# # 返回新列表
# return list_target
# 测试
# print(zero_to_end([1, 0, 0, 2]))
# print(zero_to_end([0, 4, 2, 4]))
# 练习2:定义合并相同(不相邻也可以)列表元素的函数
# [2,2,0,0] --> [4,0,0,0]
# [2,0,2,0] --> [4,0,0,0]
# [2,2,2,0] --> [4,2,0,0]
# [4,2,0,4] --> [4,2,4,0]
# [0,0,2,4] --> [2,4,0,0]
# 提示:
# 0元素移动到末尾
# 相邻相同合并
# list[0] == list[1]
def merge(list_target):
# 1.将零元素移动到末尾 [2,0,2,0] --> [2,2,0,0]
list_target = zero_to_end(list_target)
# 2. 合并
for i in range(len(list_target) - 1):
# 如果非零元素 相邻且相同
if list_target[i] != 0 and list_target[i] == list_target[i + 1]:
# 将后一个元素累加到前一个元素上
list_target[i] += list_target[i + 1]
# 讲后一个元素清零
list_target[i + 1] = 0
# 3. 将零元素移动到末尾 [2,2,2,0] --> [4,0,2,0] -->[4,2,0,0]
list_target = zero_to_end(list_target)
return list_target
# print(merge([2,2,2,0]))
# 练习3:定义在控制台中绘制2048地图的函数 11:33
def print_atlas(list_atlas):
# 00 01 02 03
for r in range(len(list_atlas)):
for c in range(len(list_atlas[r])):
print(list_atlas[r][c], end=" ")
print()
atlas01 = [
[2, 0, 0, 2],
[8, 0, 4, 4],
[2, 2, 0, 4],
[0, 2, 4, 0],
]
print_atlas(atlas01)
# 练习4:在控制台中打印第二行,与第四行元素。
# 第一列,与第三列元素。
# 第二行
# for c in range(4):
# print(atlas01[1][c], end=" ")
# print()
# # 第四行
# for c in range(4):
# print(atlas01[3][c], end=" ")
# print()
# # 第一列
# for r in range(4):
# print(atlas01[r][0])
# # 第三列
# for r in range(4):
# print(atlas01[r][2])
# 练习5,定义向上移动的函数
# 提示:将二维列表每列元素形成一维列表,交给合并merge函数,再还给二维列表
def move_up(atlas): # 15:30
# 将二维列表第一列元素形成一维列表,
# 00 10 20 30
for c in range(4):
list_merge = []
for r in range(4):
list_merge.append(atlas[r][c])
# 交给合并merge函数
list_merge = merge(list_merge)
# 再还给二维列表
for r in range(4):
atlas[r][c] = list_merge[r]
return atlas
# resutl = move_up(atlas01)
# print_atlas(resutl)
# 扩展作业1:定义向左移动的函数
def move_left(atlas):
for r in range(4):
# 从左到右依次获取行
list_merge = []
for c in range(4):
# 00 01 02 03
list_merge.append(atlas[r][c])
list_merge = merge(list_merge)
for c in range(4):
atlas[r][c] = list_merge[c]
return atlas
# resutl = move_left(atlas01)
# print_atlas(resutl)
# 扩展作业2:定义向下移动的函数
# 30 20 10 00
def move_down(atlas):
for c in range(4):
list_merge = []
# 从下至上获取二维列表列元素
for r in range(3,-1,-1):
list_merge.append(atlas[r][c])
list_merge = merge(list_merge)
# 从左至右获取一维列表元素
# 从下至上还给二维列表
for r in range(3, -1, -1):
atlas[r][c] = list_merge[3 -r] # 0 1 2 3
return atlas
def move_right(atlas):
for r in range(4):
list_merge = []
for c in range(3, -1, -1):
list_merge.append(atlas[r][c])
list_merge=merge(list_merge)
for c in range(3, -1, -1):
atlas[r][c] = list_merge[3 - c]
return atlas
# resutl = move_down(atlas01)
# print_atlas(resutl)
# 扩展作业3:定义向右移动的函数
while True:
shell = input("请输入玩家指令wsad:")
if shell=="w":
move_up(atlas01)
print_atlas(atlas01)
elif shell=="s":
move_down(atlas01)
print_atlas(atlas01)
elif shell=="a":
move_left(atlas01)
print_atlas(atlas01)
elif shell=="d":
move_right(atlas01)
print_atlas(atlas01)
else:
print("输入错误")
效果图
来源:https://blog.csdn.net/xy258009/article/details/122641062


猜你喜欢
- OpenCV转换成PIL.Image格式:import cv2 from PIL import Image import numpy img
- 如何用net/http构建一个简单的web服务Golang提供了简洁的方法来构建web服务package main import ( &nb
- 本文主要介绍了IDEA配置连接MYSQL数据库遇到Failed这个问题解决,分享给大家,具体如下: &nb
- Pycharm Database Navigator连接mysql1.安装Database Navigator由于使用的是Pycharm C
- 我们知道**代表次方。如下>>>12 * 12144>>>12 ** 2144>>>a
- 先让我们看一个例子,了解什么是模式化窗口。以下是QQ秀商城在非登录时提示登录的一种状态。当我在非登录状态,通过保存形象的方式买一件衣服时,弹
- 近又开始做网页,发现之前写的页面不规范,这次从头在来,希望一次比一次进步,先从CSS中的标点符号开始吧,这篇做为草稿已经放了很长时间了,还是
- 误区 #11:镜像在检测到故障后瞬间就能故障转移错误 数据库镜像的故障转移既可以自动发起,也可以手动发起
- 通信信息包是发送至MySQL服务器的单个SQL语句,或发送至客户端的单一行。在MySQL 5.1服务器和客户端之间最大能发送的可能信息包为1
- 通过本接口可以查询圆通快递、申通快递、ems快递、韵达快递等快递单号查询信息,无需其他额外开发,非常方便首先到www.aikuaidi.cn
- ASP.NET利用它可以实现在线备份、还原数据库等各种功能。由于客户的数据库和WEB服务不再同一台服务器,把网站部署在服务器上以后,运行程序
- 一个更易读的网站意味着网站使用性的改良以及提供愉悦的阅读体验。我们希望浏览者们能或者这些好处不是吗?这篇文章我们将介绍5个简单的方法让你能提
- python time模块计算时间之间的差距练习题1. 当前月1号对应的0点的时间戳# 定义一个当前月分的一号0点字符串格式的时间 now_
- 我一直不很明白在中国国内流行的设计风格,象在国外的很多地方都有鲜明的设计大方向,比如韩国站点设计一般比较花哨,所以动画很多,我们常常看到韩国
- 网上的SQL优化的文章实在是很多,说实在的,我也曾经到处找这样的文章,什么不要使用IN了,什么OR了,什么AND了,很多很多,还有很多人拿出
- 默认情况下IDE goland 是不支持protobuf协议文件类型".proto"的,为了更快高效的编写proto文件
- 一、实现过程终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关转义序列是以ESC开头,即用\033来完成(ESC
- 枚举类Enum枚举类,在企业开发中用的比较多当我们需要定义常量时,一个办法是用大写的变量通过整数来定义,例如月份:# 当项目中需要使用12个
- 作者: Terrance译者:Sheneyan(子乌)时间:2010.2.6英文原文:13 Useful WordPress SQL Que
- 前言虽然现在文件上传下载工具多如牛毛,比如http、ftp、sftp、scp等方案都可以用于文件传输,但都是需要安装服务器甚至客户端。有一种