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中的列表推导浅析
Apr 26 Python
Python中unittest用法实例
Sep 25 Python
Python学习笔记整理3之输入输出、python eval函数
Dec 14 Python
python中利用Future对象异步返回结果示例代码
Sep 07 Python
详解如何用OpenCV + Python 实现人脸识别
Oct 20 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
May 16 Python
python数据批量写入ScrolledText的优化方法
Oct 11 Python
Python简单过滤字母和数字的方法小结
Jan 09 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 Python
使用PyQt4 设置TextEdit背景的方法
Jun 14 Python
Python数据可视化:顶级绘图库plotly详解
Dec 07 Python
python调用私有属性的方法总结
Jul 24 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/11/28 PHP
PHP实现的简单对称加密与解密方法实例小结
2017/08/28 PHP
JsEasy简介 JsEasy是什么?与下载
2007/03/07 Javascript
JS类的封装及实现代码
2009/12/02 Javascript
javascript对象之内置对象Math使用方法
2010/04/16 Javascript
Jquery异步请求数据实例代码
2011/12/28 Javascript
jqplot通过ajax动态画折线图的方法及思路
2013/12/08 Javascript
jquery实现表单输入时提示文字滑动向上效果
2015/08/10 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
详解Javascript中DOM的范围
2017/02/13 Javascript
老生常谈angularjs中的$state.go
2017/04/24 Javascript
VUE前端cookie简单操作
2017/10/17 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
vue实现移动端图片上传功能
2019/12/23 Javascript
微信小程序实现多张图片上传功能
2020/11/18 Javascript
python模拟新浪微博登陆功能(新浪微博爬虫)
2013/12/24 Python
Windows系统配置python脚本开机启动的3种方法分享
2015/03/10 Python
python写程序统计词频的方法
2019/07/29 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
2020/02/25 Python
基于css3实现漂亮便签样式
2013/03/18 HTML / CSS
HTML5中外部浏览器唤起微信分享
2020/01/02 HTML / CSS
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
Yahoo-PHP面试题2
2014/12/06 面试题
J2EE中的容器都包括哪些
2013/08/21 面试题
员工试用期考核自我鉴定
2014/04/13 职场文书
小学生个人先进事迹材料
2014/05/08 职场文书
新闻工作者先进事迹
2014/05/26 职场文书
护校行动方案
2014/05/31 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
永远是春天观后感
2015/06/12 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
python绘图subplots函数使用模板的示例代码
2021/04/30 Python
进行数据处理的6个 Python 代码块分享
2022/04/06 Python
CentOS安装Nginx并部署vue
2022/04/12 Servers