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入门篇之对象类型
Oct 17 Python
Python实现一个简单的MySQL类
Jan 07 Python
python常用知识梳理(必看篇)
Mar 23 Python
Python基础知识_浅谈用户交互
May 31 Python
Python pycharm 同时加载多个项目的方法
Jan 17 Python
实例详解Python装饰器与闭包
Jul 29 Python
python scrapy爬虫代码及填坑
Aug 12 Python
Python random库使用方法及异常处理方案
Mar 02 Python
在脚本中单独使用django的ORM模型详解
Apr 01 Python
jupyter lab文件导出/下载方式
Apr 22 Python
python mysql中in参数化说明
Jun 05 Python
Python类型转换的魔术方法详解
Dec 23 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
一个目录遍历函数
2006/10/09 PHP
php disk_free_space 返回目录可用空间
2010/05/10 PHP
php生成不重复随机数、数组的4种方法分享
2015/03/30 PHP
为你总结一些php信息函数
2015/10/21 PHP
PHP中error_reporting函数用法详细介绍
2017/06/11 PHP
php7安装mongoDB扩展的方法分析
2017/08/02 PHP
Ajax请求在数据量大的时候出现超时的解决方法
2014/02/27 Javascript
浅谈JavaScript中null和undefined
2015/07/09 Javascript
jQuery EasyUI Dialog拖不下来如何解决
2015/09/28 Javascript
js代码实现点击按钮出现60秒倒计时
2021/01/28 Javascript
jQuery中hover与mouseover和mouseout的区别分析
2015/12/24 Javascript
莱鸟介绍javascript onclick事件
2016/01/06 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
JS实现的新闻列表自动滚动效果示例
2019/01/30 Javascript
javascript实现函数柯里化与反柯里化过程解析
2019/10/08 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
[01:09:01]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第一场 10.28
2020/10/28 DOTA
浅谈Python中带_的变量或函数命名
2017/12/04 Python
Python+OpenCV目标跟踪实现基本的运动检测
2018/07/10 Python
利用python和百度地图API实现数据地图标注的方法
2019/05/13 Python
简单介绍python封装的基本知识
2019/08/10 Python
python创建子类的方法分析
2019/11/28 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
Python bisect模块原理及常见实例
2020/06/17 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
详解HTML5中垂直上下居中的解决方案
2017/12/20 HTML / CSS
Nice Kicks网上商店:ShopNiceKicks.com
2018/12/25 全球购物
NYX Professional Makeup官方网站:专业彩妆和美容产品
2019/10/29 全球购物
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
会计核算科岗位职责
2014/03/19 职场文书
四查四看自我剖析材料
2014/09/19 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
婚内分居协议书范文
2014/11/26 职场文书
pytorch 中nn.Dropout的使用说明
2021/05/20 Python
浅谈pytorch中的dropout的概率p
2021/05/27 Python
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS