小学生python游戏编程5----拼图游戏继

  • 前言
  • 应用知识点
    • 1、python知识点
      • 1.1 通过点击图块的次数,交换图块
      • 1.2 输赢确定
      • 1.3 对方块进行描边及选中的方块显红框
      • 1.4 读取文件及写入成绩
    • 2、pygamezero知识点
      • 2.1 点击图块,互换位置
      • 2.2 判断输赢
      • 2.3 改进,点击图片时进行划红框,每块显示绿框
      • 2.4 增加底框
  • 总结
  • 源码获取

前言

接前两篇文章,小学生python游戏编程3----拼图游戏-准备,小学生python游戏编程4----拼图游戏今天此主拼图游戏做完整 ,上次写到可以打乱图片,拼成游戏界面,今天主要写要如何通过点击图块互换位置,如何全局判断输赢,显示用时间及历史最高记录。

应用知识点

1、python知识点

1.1 通过点击图块的次数,交换图块

if clickTime % 2 == 0:  # 点击偶数次clickId1 = k  # 第一个要交换的小拼图块序号clickTime += 1  # 点击次数加1
elif clickTime % 2 == 1:  # 点击奇数次clickId2 = k  # 第二个要交换的小拼图块序号clickTime += 1  # 点击次数加1jiaohuanFk(clickId1, clickId2)  # 交换两个小拼图块位置

1.2 输赢确定

通过全局变量 allRight 进行设置,通过浏览每个小方块的位置与最初的方块集(打乱顺序前的)位置进行比对,如都一致则拼对了。
allRight = True # 假设全拼对了
for i in range(3):
for j in range(3):
tile = grid[i*3+j]
# 遍历,只要有一个小拼图的位置不对,就没有全拼对
# print(‘第’,i,j,tile.left,tile.top)
# print(tile.left,j * TILE_SIZE_w,‘后’,tile.top,i * TILE_SIZE_h)
if tile.left != j * TILE_SIZE_w or tile.top != i * TILE_SIZE_h:
allRight = False # 拼错了
break
# 如果上面的if语句都不执行,则表示全拼对了

1.3 对方块进行描边及选中的方块显红框

    for i in range(x):  # 画两条横线、两条竖线screen.draw.line((0, i * TILE_SIZE_h), (WIDTH, i * TILE_SIZE_h), 'green')screen.draw.line((i * TILE_SIZE_w, 0), (i * TILE_SIZE_w, y * TILE_SIZE_h), 'green')if clickId1 != -1:  # 为选中的第一个小拼图块画一个红色框screen.draw.rect(Rect((grid[clickId1].left, grid[clickId1].top), (TILE_SIZE_w, TILE_SIZE_h)), 'red')

1.4 读取文件及写入成绩

读取文件,设置变量
txtFile = open(‘dangan.txt’, ‘r’) # 打开最佳时间记录存档文件
line = txtFile.readline() # 读取一行字符串
oldTime = int(line) # 将记录的秒数转换为整型存储
txtFile.close() # 关闭文件
start = datetime.datetime.now() # 程序运行开始计时
newTime = 0 # 这次游戏花了多长时间
游戏结束时,对比成绩,如有新战绩把新绩写入文档
if allRight:
if newTime < oldTime: # 看看是否更新最短时间记录
txtFile = open(‘rank.txt’, ‘w’)
txtFile.write(str(newTime))
txtFile.close()
具体细节多看下面的原码,想试试效果的可直接复制下来运行,还是希望你按自己的想法录一篇,会体会更深。

2、pygamezero知识点

2.1 点击图块,互换位置

效果:

代码:

import pgzrun  # 导入游戏库
from pgzero.actor import Actor
from pgzero.screen import Screen
screen: Screen  # 类型标注TILE_SIZE_w = 132 # 根据小图块的宽设置
TILE_SIZE_h = 118  #  根据小图块的高设置
x = 5  # 横向方块数
y = 5  # 纵向方块数
WIDTH = x*TILE_SIZE_w  # 设置窗口的宽度
HEIGHT = y*TILE_SIZE_h  # 设置窗口的高度
TITLE = '拼图小游戏'clickTime = 0  # 记录鼠标点击了多少次
clickId1 = clickId2 = -1 # 两次点击的小拼图块的序号fk_list =[]
for i in range(1,x*y+1):fk_list.append(Actor('fenge\\df-'+str(i)))grid = [] # 列表,用来存放最终所有拼图信息
for i in range(x): # 对行循环for j in range(y): # 对列循环# print(i*x+j)fangkuai = fk_list[i*x+j] # 导入拼图方块图片fangkuai.left = j * TILE_SIZE_w # 拼图方块图片最左边的x坐标fangkuai.top = i * TILE_SIZE_h  # 拼图方块图片最顶部的y坐标grid.append(fangkuai) # 将当前拼图加入到列表中# 以下函数实现两个小拼图块位置的交换
def jiaohuanFk(a, b):# i,j为要交换的两个小拼图块的序号# 以下利用tempPos中间变量,实现两个小拼图块位置的交换tempPos = grid[a].posgrid[a].pos = grid[b].posgrid[b].pos = tempPosimport random
# 重复随机交换多次小拼图的位置
for k in range(x*y-1):i = random.randint(0, x*y-1)  # 第一个小拼图块的序号j = random.randint(0, x*y-1)  # 第二个小拼图块的序号jiaohuanFk(i, j) # 调用函数交换两个小拼图块的位置print('ok')
def draw():  # 绘制模块,每帧重复执行screen.clear()  # 每帧清除屏幕,便于重新绘制for fk in grid:fk.draw()  # 绘制小拼图块def on_mouse_down(pos, button): # 当鼠标按键时执行global clickTime, clickId1, clickId2for k in range(x*y): # 对所有grid中的小拼图块遍历if grid[k].collidepoint(pos): # 如果小拼图与鼠标位置碰撞print(k) # 输出拼图块序号break    # 跳出当前循环if clickTime % 2 == 0:  # 点击偶数次clickId1 = k  # 第一个要交换的小拼图块序号clickTime += 1  # 点击次数加1elif clickTime % 2 == 1:  # 点击奇数次clickId2 = k  # 第二个要交换的小拼图块序号clickTime += 1  # 点击次数加1jiaohuanFk(clickId1, clickId2)  # 交换两个小拼图块位置pgzrun.go()  # 开始执行游戏

2.2 判断输赢

效果:

代码:

import pgzrun  # 导入游戏库
from pgzero.actor import Actor
from pgzero.screen import Screen
screen: Screen  # 类型标注TILE_SIZE_w = 132 # 根据小图块的宽设置
TILE_SIZE_h = 118  #  根据小图块的高设置
x = 5  # 横向方块数
y = 5  # 纵向方块数
WIDTH = x*TILE_SIZE_w  # 设置窗口的宽度
HEIGHT = y*TILE_SIZE_h  # 设置窗口的高度
TITLE = '拼图小游戏'clickTime = 0  # 记录鼠标点击了多少次
clickId1 = clickId2 = -1 # 两次点击的小拼图块的序号
allRight = False  # 是否小拼图的位置全对了fk_list =[]
for i in range(1,x*y+1):fk_list.append(Actor('fenge\\df-'+str(i)))grid = [] # 列表,用来存放最终所有拼图信息
for i in range(x): # 对行循环for j in range(y): # 对列循环# print(i*x+j)fangkuai = fk_list[i*x+j] # 导入拼图方块图片fangkuai.left = j * TILE_SIZE_w # 拼图方块图片最左边的x坐标fangkuai.top = i * TILE_SIZE_h  # 拼图方块图片最顶部的y坐标grid.append(fangkuai) # 将当前拼图加入到列表中# 以下函数实现两个小拼图块位置的交换
def jiaohuanFk(a, b):# i,j为要交换的两个小拼图块的序号# 以下利用tempPos中间变量,实现两个小拼图块位置的交换tempPos = grid[a].posgrid[a].pos = grid[b].posgrid[b].pos = tempPosimport random
# 重复随机交换多次小拼图的位置
for k in range(x*y-1):i = random.randint(0, x*y-1)  # 第一个小拼图块的序号j = random.randint(0, x*y-1)  # 第二个小拼图块的序号jiaohuanFk(i, j) # 调用函数交换两个小拼图块的位置# print('ok')
def draw():  # 绘制模块,每帧重复执行screen.clear()  # 每帧清除屏幕,便于重新绘制for fk in grid:fk.draw()  # 绘制小拼图块def on_mouse_down(pos, button): # 当鼠标按键时执行global clickTime, clickId1, clickId2, allrightfor k in range(x*y): # 对所有grid中的小拼图块遍历if grid[k].collidepoint(pos): # 如果小拼图与鼠标位置碰撞print(k) # 输出拼图块序号break    # 跳出当前循环if clickTime % 2 == 0:  # 点击偶数次clickId1 = k  # 第一个要交换的小拼图块序号clickTime += 1  # 点击次数加1elif clickTime % 2 == 1:  # 点击奇数次clickId2 = k  # 第二个要交换的小拼图块序号clickTime += 1  # 点击次数加1jiaohuanFk(clickId1, clickId2)  # 交换两个小拼图块位置allRight = True # 假设全拼对了for i in range(3):for j in range(3):tile = grid[i*3+j]# 遍历,只要有一个小拼图的位置不对,就没有全拼对# print('第',i,j,tile.left,tile.top)# print(tile.left,j * TILE_SIZE_w,'后',tile.top,i * TILE_SIZE_h)if tile.left != j * TILE_SIZE_w or tile.top != i * TILE_SIZE_h:allRight = False # 拼错了break# 如果上面的if语句都不执行,则表示全拼对了pgzrun.go()  # 开始执行游戏

2.3 改进,点击图片时进行划红框,每块显示绿框

效果:

代码:

import pgzrun  # 导入游戏库
from pgzero.actor import Actor
from pgzero.screen import Screenimport random
screen: Screen  # 类型标注TILE_SIZE_w = 132 # 根据小图块的宽设置
TILE_SIZE_h = 118  #  根据小图块的高设置
x = 5  # 横向方块数
y = 5  # 纵向方块数
WIDTH = x*TILE_SIZE_w  # 设置窗口的宽度
HEIGHT = y*TILE_SIZE_h  # 设置窗口的高度
TITLE = '拼图小游戏'clickTime = 0  # 记录鼠标点击了多少次
clickId1 = clickId2 = -1 # 两次点击的小拼图块的序号
allRight = False  # 是否小拼图的位置全对了fk_list =[]
for i in range(1,x*y+1):fk_list.append(Actor('fenge\\df-'+str(i)))grid = [] # 列表,用来存放最终所有拼图信息
for i in range(x): # 对行循环for j in range(y): # 对列循环# print(i*x+j)fangkuai = fk_list[i*x+j] # 导入拼图方块图片fangkuai.left = j * TILE_SIZE_w # 拼图方块图片最左边的x坐标fangkuai.top = i * TILE_SIZE_h  # 拼图方块图片最顶部的y坐标grid.append(fangkuai) # 将当前拼图加入到列表中# 以下函数实现两个小拼图块位置的交换
def jiaohuanFk(a, b):# i,j为要交换的两个小拼图块的序号# 以下利用tempPos中间变量,实现两个小拼图块位置的交换tempPos = grid[a].posgrid[a].pos = grid[b].posgrid[b].pos = tempPos# 重复随机交换多次小拼图的位置
for k in range(x*y-1):i = random.randint(0, x*y-1)  # 第一个小拼图块的序号j = random.randint(0, x*y-1)  # 第二个小拼图块的序号jiaohuanFk(i, j) # 调用函数交换两个小拼图块的位置# print('ok')
def draw():  # 绘制模块,每帧重复执行screen.clear()  # 每帧清除屏幕,便于重新绘制for fk in grid:fk.draw()  # 绘制小拼图块if allRight:  # 输出游戏胜利信息screen.draw.text("游戏胜利!", (40, 10),fontsize=50, fontname='simhei', color='blue')else:  # 如果没有成功,可以画几条提示线for i in range(x):  # 画两条横线、两条竖线screen.draw.line((0, i*TILE_SIZE_h), (WIDTH, i*TILE_SIZE_h), 'green')screen.draw.line((i*TILE_SIZE_w, 0), (i*TILE_SIZE_w, y*TILE_SIZE_h), 'green')if clickId1 != -1:  # 为选中的第一个小拼图块画一个红色框screen.draw.rect(Rect((grid[clickId1].left, grid[clickId1].top), (TILE_SIZE_w, TILE_SIZE_h)), 'red')def on_mouse_down(pos, button): # 当鼠标按键时执行global clickTime, clickId1, clickId2, allRightfor k in range(x*y): # 对所有grid中的小拼图块遍历if grid[k].collidepoint(pos): # 如果小拼图与鼠标位置碰撞print(k) # 输出拼图块序号break    # 跳出当前循环if clickTime % 2 == 0:  # 点击偶数次clickId1 = k  # 第一个要交换的小拼图块序号clickTime += 1  # 点击次数加1elif clickTime % 2 == 1:  # 点击奇数次clickId2 = k  # 第二个要交换的小拼图块序号clickTime += 1  # 点击次数加1jiaohuanFk(clickId1, clickId2)  # 交换两个小拼图块位置allRight = True # 假设全拼对了for i in range(x):for j in range(y):tile = grid[i*x+j]# 遍历,只要有一个小拼图的位置不对,就没有全拼对# print('第',i,j,tile.left,tile.top)# print(tile.left,j * TILE_SIZE_w,'后',tile.top,i * TILE_SIZE_h)if tile.left != j * TILE_SIZE_w or tile.top != i * TILE_SIZE_h:allRight = False # 拼错了break# 如果上面的if语句都不执行,则表示全拼对了pgzrun.go()  # 开始执行游戏

2.4 增加底框

效果:

代码:

import pgzrun  # 导入游戏库
from pgzero.actor import Actor
from pgzero.screen import Screen
import datetime  # 导入日期和时间库
from pgzero.rect import Rect  # Rect类引入
import random
screen:Screen  # 类型标注TILE_SIZE_w = 132 # 根据小图块的宽设置
TILE_SIZE_h = 118  # 根据小图块的高设置
x = 5  # 横向方块数
y = 5  # 纵向方块数
WIDTH = x * TILE_SIZE_w  # 设置窗口的宽度
HEIGHT = y * TILE_SIZE_h + 60  # 设置窗口的高度,增加下框
TITLE = '拼图小游戏'clickTime = 0  # 记录鼠标点击了多少次
clickId1 = clickId2 = -1  # 两次点击的小拼图块的序号
allRight = False  # 是否小拼图的位置全对了txtFile = open('dangan.txt') # 打开最佳时间记录存档文件
line = txtFile.readline()  # 读取一行字符串
oldTime = int(line)  # 将记录的秒数转换为整型存储
txtFile.close()  # 关闭文件
start = datetime.datetime.now()  # 程序运行开始计时
newTime = 0  # 这次游戏花了多长时间fk_list = []
for i in range(1, x * y + 1):fk_list.append(Actor('fenge\\df-' + str(i)))grid = []  # 列表,用来存放最终所有拼图信息
for i in range(x):  # 对行循环for j in range(y):  # 对列循环# print(i*x+j)fangkuai = fk_list[i * x + j]  # 导入拼图方块图片fangkuai.left = j * TILE_SIZE_w  # 拼图方块图片最左边的x坐标fangkuai.top = i * TILE_SIZE_h  # 拼图方块图片最顶部的y坐标grid.append(fangkuai)  # 将当前拼图加入到列表中# 以下函数实现两个小拼图块位置的交换
def jiaohuanFk(a, b):# i,j为要交换的两个小拼图块的序号# 以下利用tempPos中间变量,实现两个小拼图块位置的交换tempPos = grid[a].posgrid[a].pos = grid[b].posgrid[b].pos = tempPos# 重复随机交换多次小拼图的位置
for k in range(x * y - 1):i = random.randint(0, x * y - 1)  # 第一个小拼图块的序号j = random.randint(0, x * y - 1)  # 第二个小拼图块的序号jiaohuanFk(i, j)  # 调用函数交换两个小拼图块的位置# print('ok')
def draw():  # 绘制模块,每帧重复执行screen.clear()  # 每帧清除屏幕,便于重新绘制for fk in grid:fk.draw()  # 绘制小拼图块if allRight:  # 输出游戏胜利信息screen.draw.text("游戏胜利!", (WIDTH/3-60, HEIGHT - 60),fontsize=50, fontname='simhei', color='blue')else:  # 如果没有成功,可以画几条提示线for i in range(x):  # 画两条横线、两条竖线screen.draw.line((0, i * TILE_SIZE_h), (WIDTH, i * TILE_SIZE_h), 'green')screen.draw.line((i * TILE_SIZE_w, 0), (i * TILE_SIZE_w, y * TILE_SIZE_h), 'green')if clickId1 != -1:  # 为选中的第一个小拼图块画一个红色框screen.draw.rect(Rect((grid[clickId1].left, grid[clickId1].top), (TILE_SIZE_w, TILE_SIZE_h)), 'red')screen.draw.text("最佳记录:" + str(oldTime) + '秒', (WIDTH/2-60, HEIGHT - 60), fontsize=25,fontname='simhei', color='red')screen.draw.text("游戏运行:" + str(newTime) + '秒', (WIDTH/2-60, HEIGHT - 30), fontsize=25,fontname='simhei', color='red')def on_mouse_down(pos, button):  # 当鼠标按键时执行global clickTime, clickId1, clickId2, allRightfor k in range(x * y):  # 对所有grid中的小拼图块遍历if grid[k].collidepoint(pos):  # 如果小拼图与鼠标位置碰撞# print(k)  # 输出拼图块序号break  # 跳出当前循环if clickTime % 2 == 0:  # 点击偶数次clickId1 = k  # 第一个要交换的小拼图块序号clickTime += 1  # 点击次数加1elif clickTime % 2 == 1:  # 点击奇数次clickId2 = k  # 第二个要交换的小拼图块序号clickTime += 1  # 点击次数加1jiaohuanFk(clickId1, clickId2)  # 交换两个小拼图块位置allRight = True  # 假设全拼对了for i in range(x):for j in range(y):tile = grid[i * x + j]# 遍历,只要有一个小拼图的位置不对,就没有全拼对# print('第',i,j,tile.left,tile.top)# print(tile.left,j * TILE_SIZE_w,'后',tile.top,i * TILE_SIZE_h)if tile.left != j * TILE_SIZE_w or tile.top != i * TILE_SIZE_h:allRight = False  # 拼错了break# 如果上面的if语句都不执行,则表示全拼对了if allRight:if newTime < oldTime:  # 看看是否更新最短时间记录txtFile = open('dangan.txt', 'w')txtFile.write(str(newTime))txtFile.close()def update():  # 更新模块,每帧重复操作global newTimeif not allRight:end = datetime.datetime.now()newTime = (end - start).seconds  # 程序运行了多少秒pgzrun.go()  # 开始执行游戏

总结

通过此次的《拼图游戏》游戏三连发实现,让我对python的相关知识有了进一步的了解,对拼图游戏有了一些想法,如何更进一步的设计实现新功能,用于学习。

源码获取

关注博主后,私聊博主免费获取
需要技术指导,育娃新思考,企业软件合作等更多服务请联系博主

今天是以此模板持续更新此育儿专栏的第 5 /50次。
可以关注我,点赞我、评论我、收藏我啦。

小学生python游戏编程5----拼图游戏继相关推荐

  1. 小学生python游戏编程4----拼图游戏

    小学生python游戏编程4----拼图游戏 主要设计 应用知识点 1.python知识点 1.1 函数定义与使用 1.2 random 2.pygamezero知识点 2.1 基本框架,取上节中讲到 ...

  2. python游戏编程入门书籍推荐-游戏编程入门书籍推荐:想要游戏编程尽快入门这些书不要错过...

    游戏编程一直都是编程之中的一大热点,这也是由于游戏本身的火热造成的结果,所以每年都有很多人在关注着游戏编程.介于此小编今天就来将一些好的游戏编程入门书籍推荐给大家,希望对想要了解和学习游戏编程的朋友能 ...

  3. 有趣的Python Challenge编程解谜游戏攻略二(5-9关)

    **有趣的Python Challenge编程解谜游戏攻略二(5-9关)** 介绍 游戏介绍 0-4关攻略 写在前面 关卡 第5关 第6关 第7关 第8关 第9关 链接总结 第10关预告 介绍 游戏介 ...

  4. 3D游戏编程与设计——游戏的本质章节作业与练习

    3D游戏编程与设计--游戏的本质章节作业与练习 18342138 郑卓民 3D游戏编程与设计--游戏的本质章节作业与练习 作业与练习: 游戏名称及简介: 游戏的随机性 游戏的玩法与目标 游戏的冲突 游 ...

  5. 微信小游戏入门案例——拼图游戏

    微信小游戏入门案例--拼图游戏 涉及内容:canvas组件.小程序界面绘图API 目录结构: pages\game\game.js // pages/game/game.js // 方块的初始位置 v ...

  6. html5拼图游戏开题报告,拼图游戏开题报告-20210406005939.doc-原创力文档

    拼图游戏开题报告 拼图游戏不仅可以帮助 ___打发时间,还可以用于锻炼儿童脑力,帮助少儿 ___大脑思维是Android平台游戏的一个特点. 智能 ___作为一种兼具通讯.办公.娱乐为一体的便携式工具 ...

  7. python游戏编程书_Python游戏编程快速上手 第4版 (斯维加特著) 中文pdf扫描版[41MB]...

    Python是一种高级程序设计语言,因其简洁.易读及可扩展性日渐成为程序设计领域备受推崇的语言. Python游戏编程快速上手 (第4版)通过编写一个个小巧.有趣的游戏来教授Python编程,并且采用 ...

  8. python小欢喜(七)游戏编程 (2) 挡球游戏的改进:使用中文提示并添加声音效果

    在前面的文章<python小欢喜(六)动画 (1) pygame的安装与初步使用>中介绍了如何安装pygame. <python小欢喜(七)游戏编程 (1) 挡球>实现了一个小 ...

  9. python趣味编程-简单乒乓游戏(多人游戏)

    ​​ 在上一期我们用Python实现了一个简单的计算器的游戏,这一期我们继续使用Python实现一个简单的乒乓球游戏,让我们开始今天的旅程吧~ 简单乒乓游戏(多人游戏) 简单乒乓游戏(多人游戏)是一个 ...

  10. python趣味编程-高速公路汽车游戏

    在上一期我们用Python实现了一个太空大战的游戏,这一期我们继续使用Python实现一个简单的高速公路汽车游戏,让我们开始今天的旅程吧~ Python 中的高速公路汽车游戏免费源代码 Python  ...

最新文章

  1. python判断远程文件是否存在
  2. saiku+kettle整合(二)数据装载
  3. mysql 数据库的同步问题
  4. Oracle数据库的安装和配置
  5. ActiveMQ (二) 常用配置简介
  6. DHL:jQuery框架学习使用总结,插件,继续中...
  7. AI云原生浅谈:好未来AI中台实践
  8. 时尚美妆图片,让你饱眼福的唯美壁纸
  9. js dojo 保存txt文件
  10. python数据结构-列表-1
  11. Ubuntu下安装的qq的下载文件地址
  12. 全国软考中级软件设计师 学习笔记-数据流图部分
  13. 02初尝有限元分析——悬臂梁案例
  14. (PKCS1)RSA公私钥pem文件解析
  15. 测开面试题大全及答案(含测试基础|实例介绍|软件本地化测试等)
  16. WIN7中修改Jar文件打开方式的方法
  17. c#调用新浪微博开放平台接口
  18. android国际化-判断国家
  19. 5.12日,好多人的ksjsb遇到签名认证啦~ 勉强跑跑吧~
  20. 【智能驾驶】最全、最强的无人驾驶技术学习路线

热门文章

  1. Unix 环境高级编程书(第三版)源码编译(apue.3e)
  2. 读Doom启示录 有感
  3. 锐捷客户端显示无法连接认证服务器,锐捷客户端连接失败怎么办 锐捷连不上解决办法...
  4. 如何安装 Microsoft Office 兼容包,以便您可以在早期版本的 Microsoft Office 中打开和保存 Office Open XML 格式...
  5. 数据结构严蔚敏清华大学pdf_2021年清华(清华大学)电子信息考研
  6. 用JavaScript实现按钮点击全选和下拉列表根据省份复选框显示对应城市功能
  7. 系统集成项目管理工程师历年案例考试汇总
  8. 卡巴斯基KEY 、NOD32注册机——最新版
  9. 指标公式c语言源码下载,通达信最全指标公式源码,给大家分享实用的技术指标...
  10. 使用Python读取和播放音频文件