Python加pyGame实现的简单拼图游戏实例


Posted in Python onMay 15, 2015

本文实例讲述了Python加pyGame实现的简单拼图游戏。分享给大家供大家参考。具体实现方法如下:

import pygame, sys, random
from pygame.locals import *
# 一些常量
WINDOWWIDTH = 500
WINDOWHEIGHT = 500
BACKGROUNDCOLOR = (255, 255, 255)
BLUE = (0, 0, 255)
BLACK = (0, 0, 0)
FPS = 40
VHNUMS = 3
CELLNUMS = VHNUMS*VHNUMS
MAXRANDTIME = 100
# 退出
def terminate():
  pygame.quit()
  sys.exit()
# 随机生成游戏盘面
def newGameBoard():
  board = []
  for i in range(CELLNUMS):
    board.append(i)
  blackCell = CELLNUMS-1
  board[blackCell] = -1
  for i in range(MAXRANDTIME):
    direction = random.randint(0, 3)
    if (direction == 0):
      blackCell = moveLeft(board, blackCell)
    elif (direction == 1):
      blackCell = moveRight(board, blackCell)
    elif (direction == 2):
      blackCell = moveUp(board, blackCell)
    elif (direction == 3):
      blackCell = moveDown(board, blackCell)
  return board, blackCell
# 若空白图像块不在最左边,则将空白块左边的块移动到空白块位置 
def moveRight(board, blackCell):
  if blackCell % VHNUMS == 0:
    return blackCell
  board[blackCell-1], board[blackCell] = board[blackCell], board[blackCell-1]
  return blackCell-1
# 若空白图像块不在最右边,则将空白块右边的块移动到空白块位置 
def moveLeft(board, blackCell):
  if blackCell % VHNUMS == VHNUMS-1:
    return blackCell
  board[blackCell+1], board[blackCell] = board[blackCell], board[blackCell+1]
  return blackCell+1
# 若空白图像块不在最上边,则将空白块上边的块移动到空白块位置 
def moveDown(board, blackCell):
  if blackCell < VHNUMS:
    return blackCell
  board[blackCell-VHNUMS], board[blackCell] = board[blackCell], board[blackCell-VHNUMS]
  return blackCell-VHNUMS
# 若空白图像块不在最下边,则将空白块下边的块移动到空白块位置 
def moveUp(board, blackCell):
  if blackCell >= CELLNUMS-VHNUMS:
    return blackCell
  board[blackCell+VHNUMS], board[blackCell] = board[blackCell], board[blackCell+VHNUMS]
  return blackCell+VHNUMS
# 是否完成
def isFinished(board, blackCell):
  for i in range(CELLNUMS-1):
    if board[i] != i:
      return False
  return True
# 初始化
pygame.init()
mainClock = pygame.time.Clock()
# 加载图片
gameImage = pygame.image.load('pic.bmp')
gameRect = gameImage.get_rect()
# 设置窗口
windowSurface = pygame.display.set_mode((gameRect.width, gameRect.height))
pygame.display.set_caption('拼图')
cellWidth = int(gameRect.width / VHNUMS)
cellHeight = int(gameRect.height / VHNUMS)
finish = False
gameBoard, blackCell = newGameBoard()
# 游戏主循环
while True:
  for event in pygame.event.get():
    if event.type == QUIT:
      terminate()
    if finish:
      continue
    if event.type == KEYDOWN:
      if event.key == K_LEFT or event.key == ord('a'):
        blackCell = moveLeft(gameBoard, blackCell)
      if event.key == K_RIGHT or event.key == ord('d'):
        blackCell = moveRight(gameBoard, blackCell)
      if event.key == K_UP or event.key == ord('w'):
        blackCell = moveUp(gameBoard, blackCell)
      if event.key == K_DOWN or event.key == ord('s'):
        blackCell = moveDown(gameBoard, blackCell)
    if event.type == MOUSEBUTTONDOWN and event.button == 1:
      x, y = pygame.mouse.get_pos()
      col = int(x / cellWidth)
      row = int(y / cellHeight)
      index = col + row*VHNUMS
      if (index == blackCell-1 or index == blackCell+1 or index == blackCell-VHNUMS or index == blackCell+VHNUMS):
        gameBoard[blackCell], gameBoard[index] = gameBoard[index], gameBoard[blackCell]
        blackCell = index
  if (isFinished(gameBoard, blackCell)):
    gameBoard[blackCell] = CELLNUMS-1
    finish = True
  windowSurface.fill(BACKGROUNDCOLOR)
  for i in range(CELLNUMS):
    rowDst = int(i / VHNUMS)
    colDst = int(i % VHNUMS)
    rectDst = pygame.Rect(colDst*cellWidth, rowDst*cellHeight, cellWidth, cellHeight)
    if gameBoard[i] == -1:
      continue
    rowArea = int(gameBoard[i] / VHNUMS)
    colArea = int(gameBoard[i] % VHNUMS)
    rectArea = pygame.Rect(colArea*cellWidth, rowArea*cellHeight, cellWidth, cellHeight)
    windowSurface.blit(gameImage, rectDst, rectArea)
  for i in range(VHNUMS+1):
    pygame.draw.line(windowSurface, BLACK, (i*cellWidth, 0), (i*cellWidth, gameRect.height))
  for i in range(VHNUMS+1):
    pygame.draw.line(windowSurface, BLACK, (0, i*cellHeight), (gameRect.width, i*cellHeight))
  pygame.display.update()
  mainClock.tick(FPS)

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
Python struct.unpack
Sep 06 Python
Python tkinter模块中类继承的三种方式分析
Aug 08 Python
快速了解Python中的装饰器
Jan 11 Python
django 通过ajax完成邮箱用户注册、激活账号的方法
Apr 17 Python
使用python3+xlrd解析Excel的实例
May 04 Python
Python字典中的键映射多个值的方法(列表或者集合)
Oct 17 Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 Python
用Python实现最速下降法求极值的方法
Jul 10 Python
详解python pandas 分组统计的方法
Jul 30 Python
判断Threading.start新线程是否执行完毕的实例
May 02 Python
Python基于staticmethod装饰器标示静态方法
Oct 17 Python
教你如何使用Python下载B站视频的详细教程
Apr 29 Python
Python实现从URL地址提取文件名的方法
May 15 #Python
Python基础入门之seed()方法的使用
May 15 #Python
Python中的random()方法的使用介绍
May 15 #Python
Python的randrange()方法使用教程
May 15 #Python
Python中的choice()方法使用详解
May 15 #Python
Python中利用sqrt()方法进行平方根计算的教程
May 15 #Python
简单介绍Python中的round()方法
May 15 #Python
You might like
PHP小技巧之函数重载
2014/06/02 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
xml转json的js代码
2012/08/28 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
JQuery包裹DOM节点的方法
2015/06/11 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
AngularJS实现按钮提示与点击变色效果
2016/09/07 Javascript
浅谈JavaScript的闭包函数
2016/12/08 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
vue单页应用中如何使用jquery的方法示例
2017/07/27 jQuery
jquery easyui如何实现格式化列
2017/07/30 jQuery
React Native之TextInput组件解析示例
2017/08/22 Javascript
JavaScript遍历DOM元素的常见方式示例
2019/02/16 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python登录QQ邮箱发信的实现代码
2013/02/10 Python
python检测服务器是否正常
2014/02/16 Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
2017/09/22 Python
python调用百度语音识别api
2018/08/30 Python
使用Python向C语言的链接库传递数组、结构体、指针类型的数据
2019/01/29 Python
Python使用指定字符长度切分数据示例
2019/12/05 Python
使用 Python ssh 远程登陆服务器的最佳方案
2020/03/06 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
24岁生日感言
2014/01/13 职场文书
大学生村官事迹材料
2014/01/21 职场文书
网络教育自我鉴定
2014/02/04 职场文书
美容院营销方案
2014/03/05 职场文书
寄语学生的话
2014/04/10 职场文书
孕妇病假条怎么写
2015/08/17 职场文书
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技
python中redis包操作数据库的教程
2022/04/19 Python
Vue Element plus使用方法梳理
2022/12/24 Vue.js