学习Python开发小游戏(五)----- 拼图
程序员文章站
2022-03-20 11:26:00
...
前提条件:
需要安装pygame,pgzero,numpy(windows:1.19.3)
功能:
1.初始化界面随机从存在的图片中抽取一张图片,并显示一个4*4错乱布局的界面
2.使用鼠标交换两个图片的位置
3.当全部图片拼完成后,停止游戏
4.示例中涉及到的图片分隔的内容请参照上一边内容《Python使用PIL库分割以及压缩图片》
附:
代码中涉及到的素材来自异步社区:《Python游戏趣味编程》一书中提供的素材:https://www.epubit.com/bookDetails?id=UB72096d97d6149
以下是代码:
import pgzrun, random
TITLE = '拼图'
TILE_SIZE = 175
WIDTH = 4 * TILE_SIZE
HEIGHT = 4 * TILE_SIZE + 120
# 存储所有的图片
image_list = []
# 加载图片
index = 1
# 开局随机加载一张图片
start_image_index = random.randint(1, 5)
start_image = Actor(str(start_image_index))
# 原图的坐标
start_image.left = 2 * TILE_SIZE - 50
start_image.top = 4 * TILE_SIZE + 10
for i in range(4):
for j in range(4):
image = Actor(str(start_image_index) + '_' + str(index))
# 图片的坐标
image.left = i * TILE_SIZE
image.top = j * TILE_SIZE
image_list.append(image)
index += 1
# 交换两个图片的位置
def change_position(first, second):
temp = first.pos
first.pos = second.pos
second.pos = temp
# 打乱所有图片的位置
for k in range(20):
first = random.randint(0, 15)
second = random.randint(0, 15)
change_position(image_list[first], image_list[second])
# 记录鼠标第一次点击的图片,每两次为一个循环
click_first = -1
# 记录鼠标第二次点击的图片
click_second = -1
# 鼠标点击的次数
mouse_click_time = 0
# 游戏是否成功
is_success = False
# 绘制内容
def draw():
# 背景颜色:黑色
screen.fill('black')
# 清除屏幕
screen.clear()
# 绘制图片
for img in image_list:
img.draw()
# 绘制原图
start_image.draw()
# 如果游戏成功,则界面输出对应信息
if is_success:
screen.draw.text('游戏胜利', (WIDTH / 2 - 80, (HEIGHT - 120) / 2), fontsize=50, fontname='s', color='blue')
# 鼠标点击事件
def on_mouse_down(pos, button):
global mouse_click_time, click_first, click_second, is_success, index
# 如果游戏成功,直接返回
if is_success:
return
# 记录本次鼠标点击的是哪个图片
image_index = -1
for i in range(16):
# 鼠标点击的地方是在哪个图片的区域
if image_list[i].collidepoint(pos):
image_index = i
break
# 鼠标点击的次数,每两次为一个循环 第二次点击后两个图片互换位置
if mouse_click_time % 2 == 0:
click_first = image_list[image_index]
elif mouse_click_time % 2 == 1:
click_second = image_list[image_index]
# 交换两个图片的位置
change_position(click_first, click_second)
# 鼠标点击次数加1
mouse_click_time += 1
# 判断是否胜利
is_success = True
index = 0
for i in range(4):
for j in range(4):
img = image_list[index]
# 判断当前是否所有的图片都移到指定位置
if img.left != i * TILE_SIZE or img.top != j * TILE_SIZE:
is_success = False
break
index += 1
pgzrun.go()
运行后的界面:
拼图完成的效果:
上一篇: Qt5.11 Qt 3D入门(一)